CANopen学习笔记

CANopen学习笔记

文章目录

1、NMT

参考:https://zhuanlan.zhihu.com/p/57825825 和《CANopen轻松入门(周立功)》

network management网络管理。网络管理对象负责层管理、网络管理和ID分配服务(负责CAN 网络上的初始化、配置和故障处理),例如,初始化、配置和网络管理。网络管理中,同一个网络中只允许有一个主节点、一个或多个从节点,并遵循主/从模式。

6种节点状态

NMT网络管理主要包含以下6种状态

1.初始化(Initializing): 节点上电后对功能部件包括 CAN 控制器进行初始化;

2.应用层复位(Application Reset): 节点中的应用程序复位(开始),比如开关量输出、模拟量输出的初始值;

3.通讯复位(Communication reset): 节点中的CANopen通讯复位(开始),从这个时刻起,此节点就可以进行CANopen通讯了;

4.预操作状态(Pre-operational): 节点的CANopen通讯处于操作就绪状态,此时此节点不能进行PDO通信,而可以进行SDO进行参数配置和NMT网络管理的操作;

5.操作状态(operational): 节点收到NMT主机发来的启动命令后, CANopen通讯被激活, PDO通信启动后, 按照对象字典里面规定的规则进行传输,同样SDO也可以对节点进行数据传输和参数修改;

6.停止状态(Stopped): 节点收到NMT主机发来的停止命令后,节点的PDO通信被停止,但SDO和NMT网络管理依然可以对节点进行操作;

img

NMT网络管理6种状态如上图所示,其中1 — 15各处代表含义: **(1):**Power on上电初始化

(2): Automatic switch to Pre-operational自动切换预操作状态

(3) 、(6): NMT switch to Operational网络管理切换到操作状态

(4)、(7): NMT switch to Pre-operational网络管理切换到预操作状态

(5)、(8): NMT switch to Stopped网络管理切换到停止状态

(9)、(10)、(11): NMT switch to Application reset网络管理切换到应用层复位状态

(12)、(13)、(14): NMT switch to Communication reset网络管理切换到通讯复位状态

(15): Power-off or hardware reset掉电或硬件复位

1.1、NMT的Boot_up (节点上线报文)

任何一个 CANopen 从站上线后,为了提示主站它已经加入网络(便于热插拔),或者 避免与其他从站 Node-ID 冲突。这个从站必须发出节点上线报文(boot-up),如下图所示, 节点上线报文的 ID 为 700h+Node-ID,数据为 1 个字节 0。生产者为 CANopen 从站。

节点上线报文的 ID 为:700h + Node-ID, 数据规定为0。 生产者(Producer)为 CANopen 从站

img

1.2、NMT 节点状态与心跳报文

为了监控 CANopen 节点是否在线与目前的节点状态。CANopen 应用中通常都要求在线 上电的从站定时发送状态报文(心跳报文),以便于主站确认从站是否故障、是否脱离网络。 如图 下图所示,为心跳报文发送的格式,CANID 与节点上线报文相同为700h+Node-ID, 数据为 1 个字节,代表节点目前的状态,04h为停止状态,05h为操作状态,7Fh为预操作状态。

img

CANopen 从站按其对象字典中 1017h 中填写的心跳生产时间(ms)进行心跳报文的发 送,而 CANopen 主站(NMT 主站)则会按其 1016h 中填写的心跳消费时间进行检查,假设 超过诺干次心跳消费时间没有收到从站的心跳报文,则认为从站已经离线或者损坏。

主站以“监督时间”周期性的发送报文到从站,从站接收到后即回应,如果超过“监督时间*寿命因子”时间后,主站还没有收到从站回应的报文,那么主站判断从站出错!

主站请求报文格式—(0x700+节点号)(该报文无数据)

从站响应报文格式—(0x700+节点号)+状态

从站应答报文:

COB-IDByte 0
0x700+Node_IDBit7:触发位 Bit6-Bit0:状态

从站应答报文状态值含义:

状态值含义
0初始化(Initializing)
1未连接(Disconnected)
2连接(Connecting)
3准备(Preparing)
4停止(Stopped)
5运行(Operational)
127(0x7F)预操作(Pre-operation)

状态—数据部分包括一个触发位(bit7),触发位必须在每次节点保护应答中交替置“0”或者“1”。触发位在第一次节点保护请求时置为“0”。位0到位6(bit0-bit6)则用来表示节点状态。

标准的CAN从站一般只支持一种节点保护方式,一个节点不能够同时支持节点保护和心跳报文,只能选其中一种作为保护。

例子:

Master---->Slave : 07 01 00

Slave------>Master:07 01 01 7F

从站“监督时间”周期性的发送报文到主站,如果超过“心跳消费者时间”后主站还没有收到从站的下一个心跳报文,那么主站判断从站出错!

心跳报文格式:

COB-IDByte 0
0x700+Node_ID状态

状态值含义:

状态值含义
0x00启动(boot-up)
0x04停止(Stopped)
0x05运行(Operational)
0x7F预操作(Pre-operational)

当一个Heartbeat节点启动后它的Boot-up报文是其第一个Heartbeat报文。

例子:

Slave—>Master : 07 01 01 00

1.3、NMT节点守护

在早期 CANopen 应用中,还有一种可以通过轮询模式监视从站状态的节点守护模式, 它与心跳报文模式二者不能并存。通过节点守护,MNT 主机可以检查每个节点的当前状态。

NMT-Master 节点发送标准远程帧(无数据)如下:

img

NMT-Slave 节点应答发送数据帧,数据为 1 个字节:

img

数据部分包括一个触发位(bit7),触发位必须在每次节点保护应答中交替置“0”或者 “1”。触发位在第一次节点保护请求时置为“0”。位 0 到位 6(bits0~6)表示节点状态, 可为下表中的数值。

img

由于远程帧在 CAN 发展中逐渐被淘汰,而节点守护由于需要更多的主站开销与增加网 络负载,CiA 协会已经不建议使用,被心跳报文所取代。

1.4 、NMT节点状态切换命令

NMT 网络管理中,最核心的就是 NMT 节点状态切换命令,这是 NMT 主站所进行网 络管理的“命令”报文。使用者必须牢记这些命令。

CANID 均为 000h,具备最高的 CAN 优先级。数据为 2 个字节:

第 1 个字节代表命令类型 :

01h 为启动命令(让节点进入操作状态);

02h 为停止命令(让节点进入停止状态);

80h 为进入预操作状态(让节点进入预操作状态);

81h 为复位节点应用层(让节点的应用恢复初始状态,比如列车门都恢复打开状态);

82h 为复位节点通讯(让节点的 CAN 和 CANopen 通讯重新初始化,一般用于总线收到 干扰,导致节点总线错误被动,或者总线关闭时)。

第二个字节代表被控制的节点 Node-ID如果要对整个网络所有节点同时进行控制,则这个数值为 0 即可。

img

例子:

Master---->Slave : 00 00 02 01 00

CAN_ID: 0x00 0x00;

DLC:0x02

CS:0x01

Node_ID:00(全体)

2、CANopen主站设备

通常 NMT 主站也称为 CANoepn 主站,上文所述为 CANopen 最基本的 NMT 操作,而 作为一个完整的 CANopen 主站设备 。

为了满足管理整个 CANopen 网络的从站设备,需要具备以下功能:

  • 支持 PDO、SDO 发送与接收;
  • 支持 NMT 网络管理;
  • 支持 PDO 通信类型并能够支持监控每一个 PDO 目标;
  • LSS 层设置功能:从站波特率设置、从站节点编号设置;
  • 支持从站管理功能:类型与名称读取、对象字典读写;
  • 紧急报文发送功能;
  • 扩展 CANopen 标准指示灯功能。

img

3、过程数据对象PDO(Process Data Object)

如前文所述 PDO 属于过程数据用来传输实时数据,即 单向传输 \textcolor{red}{单向传输} 单向传输,无需接收节点回应 CAN 报文来确认,从通讯术语上来说是属于“生产消费”模型 PDO 。

数据长度被限制为 1~8 字节。最多只要 1 帧就可以把一条信息或者一个变量传递结束。

3.1、PDO的CAN-ID定义

PDO 通信比较灵活,广义上只要符合 PDO 范围内的所有 CANID 都可以作为节点自身 的 TPDO 或者 RPDO 使用,也称为 COB-ID,不受功能码和 Node-ID 限制 。

img

而在 PDO 预定义中,人为规定了 TPDO 和 RPDO,规定了 Node-ID 在 PDO 中的位置, 规定了 PDO 的编号。

img

PDO 分为 TPDO(发送 PDO)和(接收 RPDO)发送和接收是以 CANopen 节点自身 为参考(如果 CAN 主站或者其他从站就相反)。TPDO 和 RPDO 分别有 4 个数据对象,每 种数据对象就是 1 条 CAN 报文封装,这些都是数据收发的容器。

3.2、PDO的传输形式

PDO 的两种传输方式:同步传输和异步传输。 如下图所示,1、2 为异步传输,3、4 为同步传输 。

img

异步传输(由特定事件触发)

其触发方式可有两种,第一种是由设备子协议中规定的对象特定事件来触发(例如,定时传输,数据变化传输等)。第二种是通过发送与 PDO 的 COB-ID 相同的远程帧来触发 PDO 的发送。目前应用中的异步传输基本都采用第一种

同步传输(通过接收同步对象实现同步)

同步传输就是通过同步报文让所有节点能在同一时刻进行上传数据或者执行下达的应 用指令,可以有效避免异步传输导致的应用逻辑混乱和总线负载不平衡的问题。一般发送同步报文的节点是 NMT 主机 。

同步传输又可分为周期传输(循环)和非周期传输(无循环)。周期传输则是通过接收 同步对象(SYNC)来实现,可以设置 1~240 个同步对象触发。 非周期传输是由远程帧预 触发或者由设备子协议中规定的对象特定事件预触发传送 。

  • 同步非周期模式:收到同步报文之后,启动 p d o 事件 \textcolor{red}{同步非周期模式:收到同步报文之后,启动pdo事件} 同步非周期模式:收到同步报文之后,启动pdo事件
  • 同步周期模式:收到指定个同步报文后,启动 p d o 事件 \textcolor{red}{同步周期模式:收到指定个同步报文后,启动pdo事件} 同步周期模式:收到指定个同步报文后,启动pdo事件
  • 同步远程模式:收到同步报文后准备好 p d o 报文,等待接收到远程请求帧时发送报文 \textcolor{red}{同步远程模式:收到同步报文后准备好pdo报文,等待接收到远程请求帧时发送报文} 同步远程模式:收到同步报文后准备好pdo报文,等待接收到远程请求帧时发送报文
  • 异步远程模式:收到远程请求帧时,构建 p d o 报文并发送 \textcolor{red}{异步远程模式:收到远程请求帧时,构建pdo报文并发送} 异步远程模式:收到远程请求帧时,构建pdo报文并发送
  • 异步特殊模式: p d o 报文初始化或接收到远程请求帧时,启动 p d o 事件。特殊事件无视直接禁止时间,直接取消禁止然后构建 p d o 报文并发送 \textcolor{red}{异步特殊模式:pdo报文初始化或接收到远程请求帧时,启动pdo事件。特殊事件无视直接禁止时间,直接取消禁止然后构建pdo报文并发送} 异步特殊模式:pdo报文初始化或接收到远程请求帧时,启动pdo事件。特殊事件无视直接禁止时间,直接取消禁止然后构建pdo报文并发送

3.3、PDO的通信参数

PDO 通信参数,定义了该设备所使用的 COB-ID、传输类型、定时周期等。RPDO 通讯 参数位于对象字典索引的 1400h to 15FFh,TPDO 通讯参数位于对象字典索引的 1800h to 19FFh。每条索引代表一个 PDO 的通信参数集,其中的子索引分别指向具体的各种参数。

img

  • Number of entries 参数条目数量: 即本索引中有几条参数;
  • COB-ID: 即这个 PDO 发出或者接收的对应 CAN 帧 ID;
  • 发送类型: 即这个 PDO 发送或者接收的传输形式,通常使用循环同步和异步制造 商特定事件较多;
  • Inhibit time 生产禁止约束时间(1/10ms): 约束 PDO 发送的最小间隔,避免导致总 线负载剧烈增加,比如数字量输入过快,导致状态改变发送的 TPDO 频繁发送, 总线负载加大,所以需要一个约束时间来进行“滤波”,这个时间单位为 0.1ms;
  • Event timer 事件定时器触发的时间(单位 ms): 定时发送的 PDO,它的定时时间, 如果这个时间为 0,则这个 PDO 为事件改变发送。
  • SYNC start value 同步起始值: 同步传输的 PDO,收到诺干个同步包后,才进行发 送,这个同步起始值就是同步包数量。比如设置为 2,即收到 2 个同步包后才进行 发送

3.4、PDO的映射参数

PDO 映射参数是初学者学习 CANopen 时的一个难点,它包含了一个对象字典中的对 象列表,这些对象映射到相应的 PDO,其中包括数据的长度(单位,位),对于生产者和 消费者都必须要知道这个映射参数,才能够正确的解释 PDO 内容。就是将通信参数、应用 数据和具体 CAN 报文中数据联系起来。

RPDO 通讯参数 1400h to 15FFh,映射参数 1600h to 17FFh,数据存放为 2000h 之后厂商 自定义区域;TPDO 通讯参数 1800h to 19FFh,映射参数 1A00h to 1BFFh,数据存放为 2000h 之 后厂商自定义区域。

为了更加直观地表现映射,下表模拟 TPDO1,将参数、应用数据、CAN 报文数据联合起来展示,不同的映射采用不同的颜色。

img

img

报文参考:https://blog.csdn.net/qq_28317769/article/details/107423390

PDO映射配置参考:https://www.cnblogs.com/21207-iHome/p/6050457.html

3.5、映射配置

PDO Mapping

PDO只是个载体,它好比一辆货车,车厢里装什么货,是可以配置的,这些由PDO映射来完成。PDO映射用来指定把对象字典的那些对象装进PDO,或者从接收的PDO中将数据放到那些对象中。PDO mapping is a convention that maps an object from the object dictionary (data payload) to a PDO. Once mapped, the PDO can carry the assigned data items without explicit reference to the object dictionary, thereby saving on communication and CPU overhead. Some of the objects in the object dictionary can be mapped to a PDO, which can either receive or transmit. The mapping of an RPDO enables reception of commands and variables — for example, efficient transmission of high-speed online motion commands to the drive — whereas the mapping of a TPDO enables the drive to send a predefined message in response to an event such as end of motion.

An RPDO is buffered upon reception; it is sent for interpretation immediately (when defined as asynchronous) or upon receipt of the next SYNC signal (when defined as synchronous). 即当RPDO设为异步时(transmission type=254/255),节点接收到后会立刻处理,不用等待同步信号。

Objects 0x1A00 0x1A03 contain the objects mapped to TPDOs. Objects 0x1600 – 0x1603 contain the objects mapped to RPDOs. The data type of PDO mapping is described in object 0x21. 由下表可知,对子索引0对应要映射对象的数目,子索引1~8分别对应要映射的对象。

img

Transmission Type

PDO通讯具有三种触发模式:内部事件驱动或内部定时器触发、同步触发、远程请求触发。

1) 同步触发。同步触发PDO是指CANopen节点收到由管理节点发出的同步报文(同步对象SYNC)之后,根据触发报文条件向总线发出PDO报文。同步传输又分为周期性和非周期性,周期性是指CANopen节点接收到一定数量的同步报文之后才开始发送;非周期性PDO是指PDO触发条件成立之后,当收到下一个同步对象后马上发送PDO。同步传输在实际应用中的优势很多,它能提供一致的系统节拍,使得总线的数据尽量保证同步。同步传输的最重要应用是多轴同步控制,沒有这种同步机制,多轴传动功能是沒有办法实现的。
SYNC就相当于一个网络节拍,数据根据节拍来进行固定周期的过程数据传输。比如网络中有一个压力传感器,一个温度传感器,一个物位传感器,网络中有一个监控终端来实时监控三个传感器采集的数据。压力传感器可能检测的是一个快速的压力变化,那可以每隔200ms更新一次数据,温度可能需要1s更新一次数据,物位可能5s更新一次数据。现在我可以设置一个200ms周期的SYNC消息,压力传感器每收到一个SYNC就传输一次数据,温度传感器可以每隔5个SYNC传输一次数据,同样物位传感器就是每收到25个SYNC发送一次数据。这种通讯方式显得比较规矩,好管理,系统运行效率高,适合周期性数据更新的应用。

2) 内部事件驱动或内部定时器触发。通讯由某一事件触发。例如数字I/O口状态改变,超过预先设定的值、定时器中断等都会触发节点发送一个PDO。这种模式可使总线负载达到最小,在相对低的波特率下获得比较高的通讯特性。内部定时发送有别于SYNC同步触发,它是在本节点上实现周期发送,通过设置PDO参数,确定一个周期,每隔固定的时间向网络上发送一次PDO,它与SYNC无关。在网络设计中主要按照传感器的数据采集速度和数据更新要求来设定定时周期.

3) 远程请求触发。PDO消费者可以给PDO生产者发送远程PDO请求,相应PDO生产者将对远程帧做出响应,向总线上发送相应的PDO数据。

PDO传输类型定义表:

img

If the RPDO transmission type is 1, the received message is buffered but actually transmitted for execution at the next SYNC message. With TPDOs, the message is transmitted according to transmission type value, which can range from 1 to 240, where 1 indicates on each single SYNC, 2 means every second SYNC message,and so on.

Communication Parameter

每个PDO在对象字典中由两个对象描述:通信参数和映射参数。PDO通信参数指明使用哪个COB-ID、传输类型、禁用时间和定时时间;PDO 映射参数用于设定PDO报文中的数据的映射关系,确定要传输的数据在 CAN 报文数据域中的定位。

一个PDO可以指定一个禁止时间,即定义两个连续PDO传输的最小间隔时间,避免由于高优先级信息的数据量太大,始终占据总线,而使其它优先级较低的数据无力竞争总线的问题。禁止时间由16 位无符号整数定义,单位为100us。If sub index 3 is set to 0, then the minimum time interval to transmit TPDO is disabled.

一个 PDO可以指定一个事件定时周期,当超过定时时间后,一个PDO传输可以被触发。事件定时周期由16位无符号整数定义,单位为1ms。When a TPDO transmission type is 254 or 255, an event timer defined by sub index 5 can be used. The timer defines the maximum interval for TPDO transmission. The event occurs when the time is elapsed. The event timer resolution is 1ms. The event causes the transmission of this TPDO in addition to other asynchronous events. The occurrence of an event sets the timer again. A value of 0 disables this function.

在开始PDO传输前要先配置好PDO通信参数,在0x20处描述了其格式。Transmit PDO communication parameter:Objects 0x1800 - 0x1803;Receive PDO communication parameter:Objects 0x1400 - 0x1403

img

=====================================================================================

PDO 映射事例:将下表中3个对象映射到PDO1-Transmit, 为异步周期性类型,周期时间 10ms,禁止时间 2ms

img

1) ① Clear mapping TPDO1 (To change the PDO mapping, sub-index 0 must be set to 0 (mapping is deactivated). Only then can the objects be remapped)

number_of_mapped_objects(1A00 h: 00 h) = 0
Disable TPDO1
为了设置通信参数,必须要先将通信参数对象子地址1h的第31位置1,即要先使TPDO1失效才能配置其通信参数,否则会产生错误。It is not allowed to change bit 0 to 30 while the PDO exists and is valid (bit 31 = 0b). In this case, when attempting to change the values from bit 0 to bit 30, the devise responds with the SDO abort transfer service. 发送如下指令使TPDO1失效:

img

2)设置映射对象参数(Modify mapping by changing the values of the corresponding sub-indices.)
Index = 6041h Subindex = 00h Length = 10h ⇒ 1st_mapped_object(1A00 h: 01 h) = 60410010 h
Index = 6061h Subindex = 00h Length = 08h ⇒ 2st_mapped_object(1A00 h: 02 h) = 60610008 h
Index = 6064h Subindex = 00h Length = 20h ⇒ 3st_mapped_object(1A00 h: 03 h) = 60640020 h

注意:The sub-indexes from 1 to number of entries contain the information about the mapped application variables. These entries describe the PDO contents by their index, sub-index and length. 即设置映射对象参数时要按照如下所示的格式(映射对象地址+对象子地址+映射数据的长度,按小端模式发送)

img

假设设备节点ID为1,则发送一帧完整的SDO报文配置PDO,需要发送的格式如下:
img

3)设置 number_of_mapped_objects(Enable mapping by setting sub-index 0 to the number of mapped objects.)
number_of_mapped_objects(1A00 h: 00 h) = 3

注意:When sub-index 0 is set to a value greater than 0, the device may validate the new PDO mapping before transmitting the response of the SDO service. If an error is detected, the Elmo drive transmits the Abort SDO Transfer Service with abort codes.

4)设置 PDO 通讯参数
PDO1-Transmit为异步周期性类型 ⇒ transmission_type (1800 h: 02 h)= FF h (TPDO1传输类型默认值为0xFF,即默认异步传输)
禁止时间 2ms(20×100us) ⇒ inhibit_time (1800 h: 03 h) = 14 h
周期时间 10ms(10×1ms) ⇒ event_time (1800 h: 05 h) = 0A h
设置COB-ID(PDO1-Transmit) ⇒ COB-ID (1800 h: 01 h) = 0181 h

通信参数对象子地址1h处包含了COB-ID,但其数据类型为32位(参照0x20描述),其它几位定义如下:

imgThe bit valid (bit 31) enables TPDOs. There may be TPDOs configured but not used, and therefore set to not valid.

则发送如下指令来Enable TPDO1:

img

5)PDO 映射完成(Finally, the PDO is created by writing to its communication parameter COB-ID.)

=====================================================================================

PDO 映射事例:将Controlword对象0x6040和Interpolated data record对象0x60C1:1h映射到RPDO1,传输类型为同步类型

1) Disable RPDO1(COB-ID 0x201),client sends:

0x601 0x22 0x00 0x14 0x01 0x01 0x02 0x00 0x80

Clear mapping RPDO1,client sends:

0x601 0x22 0x00 0x16 0x00 0x00 0x00 0x00 0x00

2) Set CW, object 0x6040, 16 bit length in sub index 1 of RPDO1

0x601 0x22 0x00 0x16 0x01 0x10 0x00 0x40 0x60

Set Interpolated data record, object 0x60C1, Sub index 1, 32 bit length in sub index 2 of RPDO1

0x601 0x22 0x00 0x16 0x02 0x20 0x01 0xC1 0x60

3) Set transmission type synchronous, every SYNC (RPDO默认传输类型值为255,即默认异步传输)

0x601 0x22 0x00 0x14 0x02 0x01 0x00 0x00 0x00

4)Set 2 objects are mapped

0x601 0x22 0x00 0x16 0x00 0x02 0x00 0x00 0x00

Enalbe RPDO1

0x601 0x22 0x00 0x14 0x01 0x01 0x02 0x00 0x00

  • SYNC

SYNC主节点定时发送 SYNC 对象,SYNC从节点收到后同步执行任务。SYNC报文的COB-ID固定为080****h,SYNC报文可以不传送数据以使报文尽可能短(注意:数据帧的数据段可以发送0~8个字节的数据,控制段表示数据段的字节数。而SDO报文数据段长度始终为8字节,不够的要补0)

img

3.6、PDO报文测试

3.6.1 TPDO同步非循环报文测试

测试方法1(修改底层):首先,修改对象字典对象地址1800h,子索引为02h的通讯类型为非循环同步(类型0)类型,如下图所示:

img

然后修改1800h对应映射参数1A00h的数据内容,即将映射对象地址2000h,子索引00h,数据位08h(8bit),如下图所示:

img

启动程序进入Debug在线仿真模式,并全速运行。

启动NMT,发送两次同步帧后,修改对象地址2000h的值,如下图,观察报文情况。

img

img

测试结果:

img

结论:在第一帧同步信号后收到一帧TPDO,在参数未改变的情况下,在第二帧同步信号后未返回TPDO,参数改变后在第三帧同步信号后再次返回TPDO,符合预期(传输类型:0)。

测试方法2(报文修改):设置报文如下:

1、使PDO进入预操作态(在预操作状态下才可修改参数,否侧容易报错);

2、清空映射参数;

3、失能TPDO1(修改参数前需要失能,否侧不能更改参数)

4、设置映射参数;

5、设置TPDO1传输类型(类型0);

6、设置映射参数条数;

7、使能映射参数;

8、使TPDO1进入操作模式。

测试结果:

img

结论:(同上)在第一帧同步信号后收到一帧TPDO,在参数未改变的情况下,在第二帧同步信号后未返回TPDO,参数改变后在第三帧同步信号后再次返回TPDO,符合预期(传输类型:0)。

3.6.2 TPDO同步循环报文测试

测试方法1(修改底层):修改对象字典对象地址1800h,子索引为02h的通讯类型为0Ah(01h-FBh)类型,即每传输10条同步信号,返回一条TPDO,如下图所示:

img

观察报文情况。

测试结果:

img

结论:每传输10帧同步信号收到返回的一个TPDO,符合预期(传输类型:0Ah)。

测试方法2(报文修改):设置报文如下:

1、使PDO进入预操作态(在预操作状态下才可修改参数,否侧容易报错);

2、失能TPDO1(修改参数前需要失能,否侧不能更改参数)

3、设置TPDO1传输类型(类型0Ah);

4、使能映射参数;

5、使TPDO1进入操作模式。

测试结果:

img

结论:(同上)每传输10帧同步信号收到返回的一个TPDO,符合预期(传输类型:0Ah)。

3.6.3 TPDO同步远程帧报文测试

测试方法1(底层修改):修改对象字典对象地址1800h,子索引为02h的通讯类型为FCh类型(同步远程类型),观察报文情况。

测试结果:

img

结论:传输同步/远程帧后收到TPDO,符合预期。

测试方法2(报文修改):设置报文如下(参考上文):

1、使PDO进入预操作态(在预操作状态下才可修改参数,否侧容易报错);

2、失能TPDO1(修改参数前需要失能,否侧不能更改参数)

3、设置TPDO1传输类型(类型FCh);

4、使能映射参数;

5、使TPDO1进入操作模式。

测试结果:

img

结论:传输同步/远程帧后收到TPDO,符合预期。

3.6.4 TPDO异步远程帧报文测试

测试方法1(底层修改):修改对象字典对象地址1800h,子索引为02h的通讯类型为FDh类型(异步远程类型),观察报文情况。

测试结果:

img

结论:传输远程帧后收到TPDO,符合预期。

测试方法2(报文修改):设置报文如下(参考上文):

1、使PDO进入预操作态(在预操作状态下才可修改参数,否侧容易报错);

2、失能TPDO1(修改参数前需要失能,否侧不能更改参数)

3、设置TPDO1传输类型(类型FDh);

4、使能映射参数;

5、使TPDO1进入操作模式。

测试结果:

img

结论:传输远程帧后收到TPDO,符合预期。

3.6.5 TPDO事件时间传输报文测试

测试方法1(底层修改):修改对象字典对象地址1800h,子索引为02h的通讯类型为FEh类型(异步,制造商特定事件类型),并将子索引位05h的事件间隔时间改为7D0h(2000ms),如下图,观察报文情况。

img

测试结果:

img

结论:传输TPDO事件按预期时间执行(2000ms),符合预期。

测试方法2(报文修改):设置报文如下(参考上文):

1、使PDO进入预操作态(在预操作状态下才可修改参数,否侧容易报错);

2、失能TPDO1(修改参数前需要失能,否侧不能更改参数)

3、设置TPDO1传输类型(类型FEh);

4、设置事件传输时间(7D0h,2000ms)

5、使能映射参数;

6、使TPDO1进入操作模式。

测试结果:

img

结论:传输TPDO事件按预期时间执行(2000ms),符合预期。

3.6.6 TPDO抑制时间报文测试

测试方法1(底层修改):修改对象字典对象地址1800h,子索引为02h的通讯类型为FEh类型(异步,制造商特定事件类型),子索引为03h的抑制时间为BB8h(3000/10 ms=300ms),并将子索引位05h的事件间隔时间改为01h(1ms),观察报文情况。

测试结果:

img

结论: 传输TPDO事件时间1ms,抑制时间300ms,TPDO传输正常按照满足抑制时间执行(约300ms),符合预期。

测试方法2(报文修改):设置报文如下(参考上文):

1、使PDO进入预操作态(在预操作状态下才可修改参数,否侧容易报错);

2、失能TPDO1(修改参数前需要失能,否侧不能更改参数)

3、设置TPDO1传输类型(类型FEh);

4、设置事件传输时间(01h,1ms)

5、设置抑制时间(BB8h,3000/10ms=300ms)

6、使能映射参数;

7、使TPDO1进入操作模式。

测试结果:

img

结论: 传输TPDO事件时间1ms,抑制时间300ms,TPDO传输正常按照满足抑制时间执行(约300ms),符合预期。

3.6.7 RPDO异步传输报文测试

测试方法1(底层修改):修改对象字典对象地址1400h,子索引为02h的通讯类型为FEh类型(异步,制造商特定事件类型),观察报文情况。

测试结果:

img

结论:传输RPDO后读取SDO,返回数据为RPDO传输数据,符合预期。

测试方法2(报文修改):设置报文如下(参考上文):

1、使PDO进入预操作态(在预操作状态下才可修改参数,否侧容易报错);

2、失能RPDO1(修改参数前需要失能,否侧不能更改参数)

3、设置RPDO1传输类型(类型FEh);

4、使能映射参数;

5、使RPDO1进入操作模式。

6、写入RPDO1映射参数;

7、读取映射参数。

测试结果:

img

结论:传输RPDO后读取SDO,返回数据为RPDO传输数据,符合预期。

3.6.8 RPDO同步传输报文测试

测试方法1(底层修改):承接RPDO异步传输报文测试,设置COB_ID为201h的值为08BBh,然后发送四次同步帧,在发送SDO读取数据,观察报文情况。

测试结果:

img

结论:传输RPDO后传输4帧同步帧后,读取SDO,返回数据为RPDO传输数据,满足预期。

测试方法2(报文修改):设置报文如下(参考上文):

1、 写入RPDO1映射参数;

2、 发送同步帧4次;

3、读取映射参数。

测试结果:

img

结论:传输RPDO后传输4帧同步帧后,读取SDO,返回数据为RPDO传输数据,满足预期。

4、 服务数据对象 SDO(Service data object)

SDO 主要用于 CANopen 主站对从节点的参数配置。服务确认是 SDO 的最大的特点, 为每个消息都生成一个应答,确保数据传输的准确性。如图 8.1 所示,这就像快递,需要 收方签收后,给寄方发送一个已经签收的确认才算完成一次投递。

在一个 CANopen 系统中,通常 CANopen 从节点作为 SDO 服务器,CANopen 主节点 作为客户端(称为 CS 通讯)。SDO 客户端通过索引和子索引,能够访问 SDO 服务器上的对 象字典。这样 CANopen 主节点可以访问从节点的任意对象字典项的参数,并且 SDO 也可以 传输任何长度的数据(当数据长度超过 4 个字节时就拆分成多个报文来传输)。

4.1、通讯原则(communication principle)

SDO 的通讯原则非常单一,发送方(客户端)发送 CAN-ID 为 600h+Node-ID 的报文, 其中 Node-ID 为接收方(服务器)的节点地址,数据长度均为 8 字节;

接收方(服务器)成功接收后,回应 CAN-ID 为 580h+Node-ID 的报文。这里的 Node-ID 依然是接收方(服务器)的节点地址,数据长度均为 8 字节。

img

4.2、快速 SDO 协议(Expedited SDO protocol)

最常用最常见的 SDO 协议是快速 SDO,所谓快速,就是 1 次来回就搞定。前提是读取 和写入的值不能大于 32 位。如图 8.3 所示,为快速 SDO 协议的示意图。命令中直接包含了 要读写的索引、子索引、数据。可谓直接命中。

img

通过快速 SDO,可以直接对 CANopen 节点的对象字典中的值进行读取和修改,所以在 做参数配置之外,也经常作为关键性数据传输之用。比如 CANopen 控制机器人的电机转动 角度时,就使用 SDO 来传输,保证可靠到达。

4.3、普通 SDO 协议(Normal SDO protocol)

当需要传输的值超过 32 位时,就不能使用快速 SDO 传输。必须使用普通 SDO 进行分 帧传输。在应用中较少用到,一般用于 CANopen 节点的程序固件升级,或者做网关转换 MVB 总线之类数据最大可达 256 位的应用。

普通 SDO 协议难点在于分包逻辑与 CS 命令符的变化。依然难以记忆,需要读者将以 下示意图进行收藏。

当然普通SDO的CAN帧ID与快速SDO相同,依然发送方(客户端)发送的报文CAN-ID 为 600h+Node-ID,接收方(服务器)成功接收后,回应 CAN-ID 为 580h+Node-ID 的报文。

1、下载协议 download protocol

img

2、上传协议 upload protocol

img

4.4 SDO错误

4.4.1 无该对象错误

测试方法:读取索引值为20CFh(对象字典不存在该地址)的对象字典对应值,观察报文情况。

测试结果:

img

结论:读响应命令字(CS)为80h,标识响应异常,错误码06020000h,查表可得该错误码表示无该对象错误,符合预期。

4.4.2 传输超时错误

暂无。

4.4.3 无该子索引错误

测试方法:读取索引值为20CEh,子索引01h(对象字典不存在该地址的子索引)的对象字典对应值,观察报文情况。

测试结果:

img

结论:读响应命令字(CS)为80h,标识响应异常,错误码06090011h,查表可得该错误码表示无该对象子索引错误,符合预期。

4.4.4 禁止读

测试方法:读取索引值为20CEh(此时设置该对象为只写(Only Write)属性)的对象字典对应值,观察报文情况。

测试结果:

img

结论:读响应命令字(CS)为80h,标识响应异常,错误码06010001h,查表可得该错误码表示禁止读,符合预期。

4.4.5 禁止写

测试方法:读取索引值为20CEh(此时设置该对象为只读(Only Read)属性)的对象字典对应值,观察报文情况。

测试结果:

img

结论:写响应命令字(CS)为80h,标识响应异常,错误码06010002h,查表可得该错误码表示禁止写,符合预期。

4.4.6 数据长度无效

测试方法:写入索引值为20CBh(此时设置该对象为8位长度)的对象字典对应值,写入命令字(CS)23h(写入四个字节),观察报文情况。

测试结果:

img

结论:写响应命令字(CS)为80h,标识响应异常,错误码06070010h,查表可得该错误码表示数据长路无效,符合预期。

4.4.7 非预操作态修改PDO通信参数

测试方法:首先将节点1切换到操作态,然后写入索引值为1800h(PDO参数传递地址索引,子索引02h,传输类型)的对象字典对应值,写入命令字(CS)2Fh(写入一个字节),观察报文情况。

测试结果:

img

结论:写响应命令字(CS)为80h,标识响应异常,错误码06090030h,查表可得该错误码表示非预操作态修改PDO通信参数,符合预期。

4.4.8 PDO COBID违规

测试方法:写入索引值为1800h(PDO参数传递地址索引,子索引01h,被PDO使用的COBID)的对象字典对应值,写入命令字(CS)2Fh(写入一个字节),观察报文情况。

测试结果:

img

结论:写响应命令字(CS)为80h,标识响应异常,错误码06090030h,查表可得该错误码表示PDO COBID违规,符合预期。

4.4.9 非预操作态修改映射参数

测试方法:首先将节点1切换到操作态,然后写入索引值为1600h(Receive PDO Mapping)的对象字典对应值,使NMT进入操作态后修改PDO映射参数,观察报文情况。

测试结果:

img

结论:写响应命令字(CS)为80h,标识响应异常,错误码06090030h,查表可得该错误码表示非预操作态修改映射参数,符合预期。

4.4.10 PDO未Destroy修改映射参数

暂无

4.4.11 PDO入口参数不为空修改映射参数

测试方法:首先读取索引值为1600h(Receive PDO Mapping)子索引为00h的对象字典对应值,即RPDO1映射参数不为空,然后对子索引01h的地址写入值,即修改RPDO映射参数,观察报文情况。

测试结果:

img

结论:写响应命令字(CS)为80h,标识响应异常,错误码06090030h,同时,RPDO1映射入口参数不为空情况下,修改RPDO映射参数,查表可得该错误码表示PDO入口参数不为空修改映射参数,符合预期。

4.4.12 传输字节长度错误

测试方法:下载48(30h)个数据到索引值为20CDh的对象字典地址,但20CDh对应地址的值存储大小为20个(14h),观察报文情况。

测试结果:

img

结论:下载响应命令字(CS)为80h,标识响应异常,错误码08000000h,传输字节大于存储字节,因此查表也可得该错误码表示传输字节长度,符合预期。

4.4.13 节点NodeID超限错误

测试方法:对SDO特殊字2098h,子索引00h,写入FFh(NodeID∈(00h,7Fh)),观察报文情况。

测试结果:

img

结论:写响应命令字(CS)为80h,标识响应异常,错误码08000000h,NodeID=FFh大于限定值7Fh,因此查表也可得该错误码表示节点NodeID超限,符合预期。

4.4.14 波特率不存在错误

测试方法:对SDO特殊字2099h,子索引00h,写入FFh(规定值:50、100、125、200、250、500、1000),观察报文情况。

测试结果:

img

结论:写响应命令字(CS)为80h,标识响应异常,错误码08000000h,波特率为FFh,不符合规定值(50、100、125、200、250、500、1000),因此查表可得该错误码表示波特率不存在,符合预期。

4.4.15 翻转位不匹配

测试方法:对索引字20CDh的对象字典地址上传20字节(14h)数据,首帧命令字(CS)10h(正确的为00h),观察报文情况。

测试结果:

img

结论:上传响应命令字(CS)为80h,标识响应异常,错误码05030000h,查表可得该错误码表示翻转位不匹配,符合预期。

4.4.16 存在未传输完的通道

测试方法:对索引字20CDh的对象字典地址执行两次上传数据命令,观察报文情况。

测试结果:

img

结论:上传响应命令字(CS)为80h,标识响应异常,错误码08000021h,查表可得该错误码表示存在未传输完的通道,符合预期。

4.4.17 常规参数不兼容

暂无常规参数不兼容(无消费者心跳)

5、 特殊协议(Special protocols)

为了方便 CANopen 主站对从站管理。在 CANopen 协议中,已经为特殊的功能预定义 了 COB-ID,其主要有以下几种特殊报文。

5.1、 同步协议(Sync protocol)

同步(SYNC),该报文对象主要实现整个网络的同步传输

每个节点都以该同步报文作为 PDO 触发参数,因此该同步报文的 COB-ID 具有比较高 的优先级以及最短的传输时间。 一般选用 80h作为同步报文的 CAN-ID,如下图所示。

img

一般同步报文由 NMT 主机发出,CAN 报文的数据为 0 字节。但如果一个网络内有 2 个同步机制,就需要设置不同的同步节拍,比如某些节点按 1 个同步帧发送 1 次 PDO,其 他的节点收到2个同步帧才发送1此PDO,所以这里PDO参数中的同步起始值就起了作用。

  • 同步窗口时间:索引 1007h约束了同步帧发送后,从节点发送 PDO 的时效,即在 这个时间内发送的 PDO 才有效,超过时间的 PDO 将被丢弃;
  • 通讯循环周期:索引 1006h规定了同步帧的循环周期。

5.2、 时间戳协议(Time-stamp protocol)

时间标记对象(Time Stamp),NMT 主机发送自身的时钟,为网络各个节点提供公共 的时间参考,即网络对时 。 这在故障诊断中非常需要,比如列车中火灾报 警,检修人员需要准确获知报警的时刻,然后关联查看其它设备在这个时刻的工作状态。

时间戳协议采用广播方式,无需节点应答,CAN-ID 为 100h,数据长度为 6,数据为当 前时刻与 1984 年 1 月 1 日 0 时的时间差。如图 9.4 所示。节点将此时间存储在对象字典 1012h 的索引中。

img

void DataTime(void)
{
   uint32 n,i,da;
   canopen_data;//定义网络的日期;
   canopen_msecond;//定义网络的时间(ms)
   /*计算年*/
   n= (canopen_data+671)/1461;//求有多少个 2 月 29 日
   Year=(canopen_data-n)/365+1984;//得到年
   if((canopen_data-n)%365==0){
       Year=Year-1;
    }
   /*计算月日*/
   if((Year%400==0)||(Year%4==0&&Year%100!=0))//判断闰年
   {
      m[2]=29;
   }else{
      m[2]=28;
   }
   da=canopen_data-((canopen_data-n)/365)*365-n;//减去该年前的前天,得到改年的第几天
   for(i=0;i<12;i++)
   {
      if(da>m[i])
      {
         da=da-m[i];//让天数减去每个月的天数
      }
      if(da==0)
      {
         Month=i+1;
         Day=m[i+1];
      }
      if(da<=m[i+1]&&da!=0)//如果得到小于或等于该月的天数,则可以确定为哪一天
      {
         Month=i+1;
         Day=da;
         break;
      }
 } 
 /*计算时分秒*/
 canopen_msecond=canopen_msecond/1000;//把毫秒转换为秒
 Hour=canopen_msecond%(3600*24)/3600;
 Minute=canopen_msecond%3600/60;
 Second=canopen_msecond%60;
}

5.3、 紧急报文协议(Emergency protocol)

紧急事件对象(Emergency),是当设备内部发生错误,触发该对象,发送设备内部错误代码,提示NMT 主站。紧急报文属于诊断性报文,一般不会影响 CANopen 通讯,其 CAN-ID 存储在1014h的索引中,一般会定义为 080h +node-ID,数据包含 8 个字节,如下图所示。

img

其中包括 EEC:紧急时间错误代码,ER:错误寄存器,MEF:厂商自定义的错误代码。 当然这些都需要查表才能获知,进行诊断。

img

与 PDO 的生产禁止时间类似,紧急报文也有生产禁止时间,存储在对象字典的 1015h 中,为了限制节点不断发送紧急报文,导致总线负载过大。

6、CiA301与CiA402

OSI七层模型、CAN、CiA、CANopen、CiA301CiA402和EtherCAT介绍:https://blog.csdn.net/y_q_m/article/details/119007985

6.1、CiA协议的差别

1、CiA 301 series:基础协议(框架)

2、CiA 401 series: IO 设备

3、CiA 402 series:运动设备(包括伺服驱动器、逆变器、步进电机驱动器等)

4、CiA 421 series: Train vehicle control system 列车车辆控制系统

5、CiA 423 series: Diesel engine control system 柴油机控制系统

6、CiA 424 series: Door control system 门控制系统

7、CiA 426 series: Exterior light control system 外部灯控制系统

8、CiA 430 series: Auxiliary equipment control system 辅助设备控制系统

9、CiA 433 series: Interior light control system 内部灯控制系统

6.2、CiA301子协议

img

img

img

img

img

在CANOPEN协议中,规定COB-ID的11位中包含4位的功能吗和7位的节点地址,节点地址范围 1-127. CANOPEN 中包含以下几种报文,及其功能码如下:

img

6.2、CiA402子协议

CANOPEN使用心得1-cia301、cia402简单提要:https://blog.csdn.net/qq_39856530/article/details/115309088

CIA 402协议中定义了运动控制相关的一些对象参数,状态机,和一些运行模式。

img

img

img

img

img

img

img

img

img对象字典参数简述

imgCIA 402 状态机

img

状态说明:

img

  • 10
    点赞
  • 50
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

hlpinghcg

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

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

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

打赏作者

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

抵扣说明:

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

余额充值