1,PDO Parameter Callbacks设置调用:PDO初始化程序中,会设置其三个参数Transmission type、Inhibit time、Event timer对应的回调函数,当这三个值改变时会发送一个PDO帧(帧内容与上一次一致则不发送)。
2,PDO Mapping Callbacks设置调用:
1)此处的回调函数在其对应的参数变量发生改变时调用:在收到处理合法的PDO帧时,在setODentry()(即_setODnetry())函数中,将对应的参数变量赋值后,调用相应变量的回调函数。
2)本地调用writeLocalDict()(即_setODentry())设置变量值后会调用其回调函数
3,SDO_BLOCK_SIZE is the number of segment per block. The value must be between 1 and 127.
4,readNetworkDict and getReadResultNetworkDict are to be used exactly the same way for block or segmented transfer. You just put the last argument to 1 in readNetworkDict when you want to use block mode.
5,尽量不要是使用SDO Block传输数据,因为可能会由于USB2CAN设备等原因,使得原本按顺序发送的数据,传输到PC端却顺序发生变化,传输失败(CanFestival不能重新排序)。
6,The node life time is given by the guard time multiplied by the life time factor.
7,The synchronous mechanism is intended for transferring commanded values and actual values on a fixed timely base.
8,在setNodeId函数中,会将对象字典中的与COB_ID相关的参数利用给定的NodeIDea值进行初始化。包括SDO Server(仅有一个),PDO Receive(仅初始化0x1400~0x1403四个索引),PDO Transmit(仅初始化0x1800~0x1803四个索引),以及EMCY COB_ID。
9,只能是SDO Client向SDO Server发出请求进行读或者写操作,同时发出请求的一方(即Client)需要将自己的Client SDO Parameter中的COB ID值设置成与Server端的Server SDO Parameter值一致才行(注:初始化过程中调用setNodeId会改变其参数值)。
10,对于s_state_communication newCommunicationState = {0, 1, 1, 1, 1, 0, 1}其相应的状态次序为csBoot_Up,csSDO,csEmergency,csSYNC,csLifeGuard,csPDO,csLSS,对应值为1而若当前状态为0的,再调用switchCommunicationState(d, &newCommunicationState)会初始化相应的部分功能(FuncStart)。若对应值为0而当前状态为1的则会停止该功能(FuncStop)。
11,为了更好更高效使用SDO传输,对SDO部分做出修改如下: SDO传输线回调函数参数修改。将typedef void (*SDOCallback_t)(CO_Data* d, UNS8 nodeId)修改为typedef void (*SDOCallback_t)(CO_Data* d, UNS8 nodeId, UNS8 line),同时修改此回调函数调用时的实参。这样在需要传输线相关状态参数时就不需要查找传输线号,直接使用,因为此传输线必定存在,否则不会调用此回调函数。
最后提供部分CanFestival中变量命名含义,仅供参考:
SDO所包含的各个部分
1 、Initiate SDO Download Request 初始化SDO 下载请求报文 (1 )、Node ID 从节点的ID标识 (2 )、Object Index 对象索引值 (3 )、Object Sub -index 对象子索引值 (4 )、Transfer Type 指示传输类型为快速传输还是一般的分段传输 (5 )、Size Indicator 指示报文是否标识了传输量 (6 )、Bytes Not Data 数据域中无效的字节数,只有快速传输才有效 (7 )、Bytes Downloaded 下载的数据字节数,只有分段传输才有效 (8 )、SDO Data SDO 数据域,只有快速传输才有效 2 、Initiate SDO Download Re sponse 初始化SDO 下载响应报文 (1 )、Node ID 从节点的ID标识 (2 )、Object Index 对象索引值 (3 )、Object Sub -index 对象子索引值 3 、Download SDO Segment Request SDO 分段下载请求报文 (1 )、Node ID 从节点的ID标识 (2 )、Toggle Bit 触发位 (3 )、Whether More Segments 标识是否最后一个分段 (4 )、Bytes Not Data 数据域中无效的字节数 (5 )、SDO Data SDO 数据域 4 、Download SDO Segment Response SDO 分段下载响应报文 (1 )、Node ID 从节点的ID标识 (2 )、Toggle Bit 触发位 5 、Initiate SDO Upload Request 初始化SDO 上传请求报文 (1 )、Node ID 从节点的ID标识 (2 )、Object Index 对象索引值 (3 )、Object Sub -index 对象子索引值 6 、Initiate SDO Upload Response 初始化SDO 上传响应报文 (1 )、Node ID 从节点的ID标识 (2 )、Object Index 对象索引值 (3 )、Object Sub -index 对象子索引值 (4 )、Transfer Type 指示传输类型为快速传输还是一般的分段传输 (5 )、Size Indicator 指示报文是否标识了传输量 (6 )、Bytes Not Data 数据域中无效的字节数,只有快速传输才有效 (7 )、Bytes Downloaded 上传的数据字节数,只有分段传输才有效 (8 )、SDO Data SDO 数据域,只有快速传输才有效 7 、Upload SDO Segment Request SDO 分段上传请求报文 (1 )、Node ID 从节点的ID标识 (2 )、Toggle Bit 触发位 8 、Upload SDO Segment Response SDO 分段上传响应报文 (1 )、Node ID 从节点的ID标识 (2 )、Toggle Bit 触发位 (3 )、Whether More Segments 标识是否最后一个分段 (4 )、Bytes Not Data 数据域中无效的字节数 (5 )、SDO Data SDO 数据域 9 、Abort SDO Transfer SDO 传输中止报文 (1 )、SDO Object SDO 通讯对象(是Serv er 还是Client) (2 )、Node ID 从节点的ID标识 (3 )、Object Index 对象索引值 (4 )、Object Sub -index 对象子索引值 (5 )、Abort Code 中止代码,表示传输中止的原因