Canopen学习笔记——sync同步报文增加数据域(同步计数器)

1.Canfestival同步报文sync的设置

在OD表中的配置如下:

如果0x1006索引的同步报文循环周期时间设置为0则禁用同步报文,这里要注意的就是,上面第一张图也提到了,时间单位是us。第二张图,我的0x1006就设置为0xF4240,也就是1s发送一次同步报文。

关于同步桢(同步计数器)的问题可以参考这篇文章:

canfestival同步帧(同步计数器的问题) - 哔哩哔哩关于canopen的SYNC同步帧,有两种方式:一种是sync没有数据,只有id.另一种是sync带有一个数据,这个数据可以循环计数,类似与单片机的计时器.这个计数的周期就存储在字典的1019h里面. 如果1019h里面存入的是4,那么sync数据部分就会依次发送01,02,03,04,---01,02,03,04,---01,02,03,04.......1019h这个参数 与 TPDO的通讯参数06h子索引是有联动的.06h中的参数代表了何时响应这个计数值.如果06h中的参数是3,那么就https://www.bilibili.com/read/cv12706894/

我这里是介绍的sync桢带数据(同步计数值)的情况:

2.同步报文的发送

在struct struct_CO_Data结构体中的同步报文变量定义区域增加下面的成员变量

随后在同一个头文件data.h的下半部分增加下图的初始化语句。

同步桢发送方法的设置:

这里的63为循环次数,可以根据自己的项目情况自行设置,设置好之后,同步桢发送的情况就是:

3.同步桢接收处理

3.1 TPDO 对象字典设置

将tpdo的SYNC_start_value改为非零值,意思是,接收到多少个同步信号后,上传该tpdo,也就是设置为同步触发模式。

3.2 SYNC处理函数处理

更改_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的数据桢。

当然,这样也是可以的:

相关推荐
智者知已应修善业21 小时前
【51单片机不用数组动态数码管显示字符和LED流水灯】2023-10-3
c++·经验分享·笔记·算法·51单片机
二哈赛车手1 天前
新人笔记---ES和kibana启动问题以及一些常用的linux的错误排查方法,以及ES,数据库泄密解决方案[超详细]
java·linux·数据库·spring boot·笔记·elasticsearch
幸福巡礼1 天前
【LangChain 1.2 实战(一)】 概述
笔记·学习·langchain
观无1 天前
MAUI笔记
笔记
Hello_Embed1 天前
Windows 安装 Claude Code 并接入 模型
windows·笔记·ai编程
大Mod_abfun1 天前
数字媒体艺术概论(课堂作业/笔记)
笔记·媒体
知识分享小能手1 天前
R语言入门学习教程,从入门到精通,R语言数据计算与分组统计(9)
开发语言·学习·r语言
笑鸿的学习笔记1 天前
qt-C++语法笔记之Qt Graphics View 框架中的类型辨析完全指南
c++·笔记·qt
lizhihai_991 天前
股市学习心得—半导体12种核心材料
大数据·人工智能·学习
U盘失踪了1 天前
调用大模型API上下文关联
笔记