热度 5
2022-8-12 15:24
1357 次阅读|
0 个评论
CANopen 是位于 CAN 总线之上的应用层协议。 CAN 报文由 7 个不同的位域组成, CANopen 主要是规定了其中的仲裁域和数据域的使用情况。 一、 CANopen 报文格式 CANopen 的报文格式为 COB-ID+D0+D1+…..+D7 , 放入 CAN 帧的数据,低字节优先。例如数据 0x01020304 对应如下组织: COB-ID 04030201 。 COB-ID= Function Code+Node ID (或其他),如图所示。 Function Code (二进制): EMCY : 0001 ; PDO : 0011, 0100, 0101, 0110, 0111, 1000, 1001, 1010 ; SDOrx : 1011 ; SDOtx : 1100 ; NMT error control : 1110 ; NMT : 0000 ; SYNC : 0001 ; TIME STAMP : 0010 ; 例子: 182H=0001 1000 0010 ( B ) 11bit 为 0011 0000 010 :前四位 0011 为功能码 PDO ,后四位为节点, 10=2 即节点为 2. 二、 CANopen 报文测试 1. Boot-up 报文 CAN-ID=700+node_ID 当某个节点在 initializing 模式之后,进入 pre-operational 模式将发送 boot-up 报文,例如 CIO102 在上电之后会收到报文如下。这个 boot-up 报文其实也是第一个心跳报文。 2. NMT 报文 NMT 状态机: 1 ) Power on 上电 2 )自动切换到预操作状态 3 ) 6 )网络管理切换到操作状态。 4 ) 7 )网络管理切换到预操作状态。 5 ) 8 )网络管理切换到停止状态。 9 ) 10 ) 11 )网络管理切换到应用层复位状态。 12 ) 13 ) 14 )网络管理切换到通讯复位状态。 15 )掉电或者硬件复位。 NMT 协议: 11-bit 的 CAN 报文 ID 中只携带高 4-bit 的功能码, CANID 均为 000h ,具备最高的 CAN 优先级。数据为 Node-ID 放在数据域的 D1 处;具体的 NMT 命令编码放在数据域的 D0 处!例:将节点 1 设置为 operational 状态: 000 01 01 如果要对整个网络所有节点同时进行控制,则 D1 为 0 即可。例:将所有节点设置为 operational 状态 000 01 00 3. 心跳报文 Stare : 0=Boot-up 4=stopped 5=operational 7F=pre-operational CAN-ID 为 700+Node-ID 数据为一个字节。如图,设备上电后处于 pre-op 状态,通过 SDO 写入心跳周期 5s ,每隔 5s 自动发送一次设备的状态,通过 000 01 01 将设备的状态切换为 op. 。报文: 601 2B 17 10 00 88 13 00 00 : 601 为 CAN-ID ( 600+NODE_ID ), 2B 代表写两个字节, 17 10 表示索引(根据报文格式低位在前,此处代表对象 1017h ), 00 表示子索引, 88 13 00 00 代表数据内容(低位在前则该数据为 00 00 13 88=5000 ) . 4. Node guard 主站发送一帧远程帧,节点应答 700+Node_ID state State : 0= 初始化, 1= 断开连接, 2= 连接, 3= 准备, 4=stopped , 5=operational , 6=pre-operational 5. 同步报文 同步窗口时间索引: 1007 h 约束了同步帧发送后从节点发送 PDO 的时效即在这个时间内发送的 PDO 才有效超过时间的 PDO 将被丢弃;通讯循环周期:索引 1006 h 规定了同步帧的循环周期。 测试过程: 1 )令设备处于 op 状态 2 ) 1800 , 1802 的 transmission type 设为 3 6. SDO 1) 快速 SDO :用于读 / 写某个节点的对象字典,其数据内容不超过四个字节。例如 601 22 00 62 01 FF 00 00 00 : 601 ( 600+Node_ID ); 22 (不对传输数据的字节数做区分) =0010 0010 (如下图) 001 表示写, 0 表示没有用到的字节数, 00 表示剩下的字节数, 1 表示快速传输, 0 表示 data 区没有字节数指示; 01 表示子索引; FF 00 00 00 表示数据区的内容。 SDO 写: CCS: 客户端的命令码 X: unused bits n: 字节数 (n 表示后面 4 个字节数据剩余的数量 ) e: transfer expedited ( 快速传输,无分段 ) s: data 区是否为字节数指示: 0 表示 data 区无, 1 表示 data 区的数值为要写入的数据 SCS: 服务器命令码 SDO 读: CCS: 客户端命令码 n: 当快速模式时,表示 data 区内空余的字节数 e: transfer type : 1 表示快速传输,无分段 s: data size indicator SCS: 服务器端命令码 X: unused bits SDO 命令符 下图为 SDO 测试的过程,包括读 6200 01 和 6200 02 的读写操作。 2) 分段 SDO/ 块传输(用得比较少,了解即可):针对读写数据超过四个字节。报文以测试以分段传输为例。报文传输如下图所示, 601 40 08 10 00 00 00 00 表示读取 1008 索引 10 子索引。 41 01 10 00 0D 00 00 00 ; 60 00 00 00 00 00 00 00 ; 70 00 00 00 00 00 00 00 该为确认报文信息 00 68 69 70 65 63 73 2D ; 13 43 49 4F 31 30 32 00 为具体内容,其中 00 和 13 为命令码;其他通过查 ASCII 表 68:h;69:i;70:p;65:e;63:c;73:s;2D:-;43:C;49:I;4F:O;31:1;30:0;32:2;00:NULL; 即内容为: hipecs-CIO02. 7. PDO PDO 有三种触发机制:事件触发、远程帧、同步 PDO 的 COB-ID 组成 31 30 29 28 - 11 10 - 0 0/1 0/1 0 0 11-bit Identifier 0/1 0/1 1 29 bit identifier Bit Value Meaning 31 0 PDO exist/is valid 1 PDO does not exist/is not valid 30 0 RTR allowed on this PDO 1 No RTR allowed on this PDO 29 0 11 bit ID (CAN 2.0A) 1 29 bit ID (CAN 2.0 B) 28-11 0 If bit29 = 0 X For 29 bit COB-ID if bit29 = 1 10-0 X Bit 10-0 of COB-ID 此处为什么要再提 COB-ID 呢?他与开头讲的 COB-ID= Function Code+Node ID 有什么区别? (该处的 COB-ID 就是开头所讲的其他的情况)这一应用主要在修改 PDO 映射中。其中 PDO 的 COB-ID 主要有以下这些 PDO 通讯中有两个重要的概念,通讯参数与映射参数( CiA301 中规定了他们的对象),通讯参数中定义了该设备所使用的 COB-ID 、传输类型、禁止时间、事件定时器触发时间、同步起始值