在OD表中的配置如下:
如果0x1006索引的同步报文循环周期时间设置为0则禁用同步报文,这里要注意的就是,上面第一张图也提到了,时间单位是us。第二张图,我的0x1006就设置为0xF4240,也就是1s发送一次同步报文。
关于同步桢(同步计数器)的问题可以参考这篇文章:
我这里是介绍的sync桢带数据(同步计数值)的情况:
在struct struct_CO_Data结构体中的同步报文变量定义区域增加下面的成员变量
随后在同一个头文件data.h的下半部分增加下图的初始化语句。
同步桢发送方法的设置:
这里的63为循环次数,可以根据自己的项目情况自行设置,设置好之后,同步桢发送的情况就是:
将tpdo的SYNC_start_value改为非零值,意思是,接收到多少个同步信号后,上传该tpdo,也就是设置为同步触发模式。
更改_sendPDOevent()函数,将接收到的同步桢数据域传过来。
更改_sendPDOevent (CO_Data * d, UNS8 isSyncEvent)对数据部分(同步计数值)的处理
源码处理:
/* check if transmission type is SYNCRONOUS */
/* message transmited every n SYNC with n=TransmissionType */
if (isSyncEvent &&
(*pTransmissionType >= TRANS_SYNC_MIN) &&
(*pTransmissionType <= TRANS_SYNC_MAX) &&
(++d->PDO_status[pdoNum].transmit_type_parameter ==
*pTransmissionType))
{
/*Reset count of SYNC */
d->PDO_status[pdoNum].transmit_type_parameter = 0;
MSG_WAR (0x3964, " PDO is on SYNCHRO. Trans type : ",
*pTransmissionType);
memset(&pdo, 0, sizeof(pdo));
/*{
Message msg_init = Message_Initializer;
pdo = msg_init;
}*/
if (buildPDO (d, pdoNum, &pdo))
{
MSG_ERR (0x1906, " Couldn't build TPDO number : ",
pdoNum);
status = state11;
break;
}
status = state5;
/* If transmission RTR, with data sampled on SYNC */
}
更改后为:
将接收到的同步计数值数据与tpdo的SYNC_start_value参数做比较,如何相同,则开启pdo传输
修改后,实现的效果展示:
如上图,每次发送到数据为0x0A的同步桢后,就会收到pdo为0x186的数据桢。
当然,这样也是可以的: