canopen学习总结(二)——PDO循环同步和非循环同步

前言:

PDO 属于过程数据用来传输实时数据 ,即单向传输,无需接收节点回应CAN 报文来确认,属于“生产消费”模型。
PDO两种传输方式:同步传输和异步传输,今天我们主要讲解同步传输。

[1-1]同步传输分为: 周期传输(循环)和非周期传输(无循环)

同步传输:就是通过同步报文让所有节点能在同一时刻进行上传数据或者执行下达的应用指令。(有效避免异步传输导致的应用逻辑混乱和总线负载不平衡的问题。一般发送同步报文的节点是 NMT 主机。)
在这里插入图片描述
在这里插入图片描述
由上图我们可以看到,循环和非循环同步的区别。
无论循环还是非循环同步都需要==消费者(主机)==发送同步报文来触发生产者发送PDO报文。

[1-2] 主机同步帧的发送

同步帧是怎么样的?
答:如图,其实就是nmt主机发送CAN-ID 0x80。
在这里插入图片描述
canfestival中如何去设置?

			msg.cob_id = (UNS16)0x80;
			msg.len = (UNS8)0x00;
			msg.rtr = (UNS8)0;
			canSend(&master_objdict_Data.canHandle,&msg);

当然我们也可以用can工具直接发送,模拟这个同步帧,如下图:
在这里插入图片描述

[1-3] 非周期循环

(1)在本例程中我们使用0x1800,来做例子,
在这里插入图片描述
(2)从机canfestival的配置
重点:slave_objdict_obj1800_Transmission_Type 如果是0就是非周期循环,为什么呢?
答:下图中的Transmission type值为0就是非循环同步
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

(3)我们知道和循环同步比,非循环同步还需要一个内部事件才能使得PDO发送。
这个内部事件又是什么呢?答:映射值的改变就是这个内部事件。
所以我们在应用中,改变这个变量的值,PDO才会发送数值出来。

	pdo1TransmitDate++;//只要改变该值即可,程序会自动发送

(4)那么TPDO又是如何发送的呢?
当我们从机收到了can-id 0x80的同步报文后触发proceedSYNC(d)函数,下图按照顺序依次触发,如果值不改变,非周期同步,即使收到了发来的同步帧,也不能发送。
在这里插入图片描述
非周期循环例程有偿下载

[1-4] 周期循环

[1-4-1]从机canfestival的配置

(1)修改Transmission Type
在这里插入图片描述
这边为什么是05h不是01h呢?
答:UNS8 slave_objdict_obj1800_Transmission_Type = 0x5; /* 1 */设置成1-253代表接收到1-253个同步帧后,从机才发送PDO通信。05这边的数值可以是1-253个中的任何一个,设置成5,就是接收到5个同步信号后发送PDO。

其他设置和非循环同步发送配置一样。只是循环同步不需要等待事件的发生。

(2)发送流程:
在这里插入图片描述
(3)实验:
pdo1TransmitDate的初值是0xAA
在这里插入图片描述
循环周期例程有偿下载

  • 6
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

mhj258258

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值