CiA 309 Part 3:CANopen-TCP/IP 网关 ASCII 映射规范
CiA 309 定义 CANopen 网络与 TCP/IP 网络互联的网关规范,共三部分:Part 1 通用原理与服务、Part 2 Modbus/TCP 映射、Part 3 ASCII 映射(本篇,V1.1.0,2006-12-12 发布为公开草案)。Part 3 定位是给 CORBA/OPC 这类重型方案提供一个轻量级文本协议替代:网关设备暴露一个 ASCII 命令接口,客户端用可读字符串即可完成 SDO/PDO/NMT 全部操作。
命令语法核心
- 命令是不区分大小写的 ASCII 串(ISO/IEC 646),以 CRLF 结束,token 间任意空白分隔。文本协议天然规避字节序、数据尺寸、对齐问题。
- 请求结构:
[<sequence 4字节>] [[net] node] <command> [参数]。序号包在方括号里,响应必须原样回传同一序号;net/node 在网关只有单一接口或客户端预设时可省略;net/node 取值 0 表示广播所有网络/节点。 - 长命令 = 短命令(1-2 字母)+ 方括号部分拼接,如
r[ead]、w[rite]。 - 数据类型语法直接映射 CANopen 类型:
b/u8..u64/i8..i64基本整型(u8/u16/u32/i8/i16/i32 为强制支持,其余可选)、r32/r64浮点、t时刻、td时差、vs可见字符串、os八位串、usUnicode、d域。domain/octet string/unicode 一律用 MIME base64(RFC 2045)编码并去掉换行。 - 数字支持十进制、
0x十六进制、多种浮点写法(1.22、.22e10、22e3)。含空格的字符串用双引号包裹,内嵌双引号翻倍转义。
响应与错误码
响应 = 序号 + 值/OK/错误串/EMCY 列表。内部错误码分段:100-103 请求类(不支持/语法错/内部状态/超时)、200-205 守护与心跳类(丢失守护报文/断连/心跳开始与丢失/Boot-up)、300-305 CAN 总线类(error passive/bus off/缓冲溢出/初始化)、400-401 PDO 类(PDO 已占用/长度超限)。bus-off 后需发 init 复位 CAN 控制器。
事件触发消息
不带序号,由网络错误或被订阅的通讯对象产生:<event> ::= EMCY | ERROR | PDO | SYNC | USER。EMCY 事件返回 <emcy-code> <error-register> <m-error-code>(厂商错误码为 5 个十进制值)。
命令族速查
| 族 | 命令示例 | 说明 |
|---|---|---|
| SDO | r 0x1000 0 u32 / w 0x1016 0 u16 100 | 读写带数据类型断言;set sdo_timeout <ms> |
| PDO | set rpdo 1 0x180 event 3 u8 u8 u16 | 从网关视角命名:RPDO 收、TPDO 发;tx-type 为 rtr/event/sync0-240;删除 PDO 用 COB-ID bit31 |
| NMT | start / stop / preop / reset node / reset comm | 以及 enable guarding <t> <f>、enable heartbeat <ms> |
| 接口配置 | init <bitrate>(CiA305 波特率表索引)、`store/restore CFG | PDO |
| 网关管理 | set network / set node / info version | version 响应依次含 1018h 对象四件套+网关等级+协议版本 |
| 厂商自定义 | 命令以下划线 _ 开头,事件用 USER | 避免与标准命令语法冲突 |
工程要点
- 规范明确不推荐支持 RTR(建议置 COB-ID bit30 禁用)。
- 每个请求有且仅有一个响应,是同步语义——与 Modbus 映射(Part 2)相比 ASCII 映射更适合调试与脚本化集成(telnet 即可操作网关)。
- 与本机已有笔记的 CiA-102-CAN物理层规范工业应用、CANopen-CiA301-V4.2.0-中文注释版 构成协议栈上下层关系:301 是对象字典与通讯 profile 本体,309 是把它们桥到以太网的网关侧语法。
可行动点
- 自研 LIS/上位机要连 CANopen 网关时,先确认网关是否实现 CiA309-3 ASCII 接口,可直接用 socket 发文本命令调 SDO,无需 CAN 协议栈。
- 排查 bus-off 后通信不恢复的问题:检查应用是否有
init复位逻辑。