前言:
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
循环周期例程有偿下载