1.前因:CAN仅仅规定了第一层(物理层)、第二层(数据链路层),实际设计中,这两层完全由硬件实现,设计人员无需再为此开发相关软件或固件,CAN 没有规定应用层。
也就是没有规定与实际应用相关的逻辑,比如开关量输入输出,模拟量输入输出。所以本身对于应用来说,是不完整的。
像铁矿石(物理层)冶炼成铁锭(数据链路层),然后针对具体应用,再加工做成汽车、轮船、钢筋、坦克、钢结构建筑等等。
2.后果:
因此需要一个开放的、标准化的高层协议:这个协议支持各种 CAN 厂商设备的互用性、互换性,能够实现在 CAN 网络中提供标准的、统一的系统通讯模式,提供设备功能描述方式,执行网络管理功能。其中包括
应用层(Application layer):为网络中每一个有效设备都能够提供一组有用的服务与协议。
通讯描述(Communication profile):提供配置设备、通讯数据的含义,定义数据通讯方式。
设备描述(Device proflile):为设备(类)增加符合规范的行为。
3.CANopen子协议:(在 CANopen 基础协议——CiA 301 之上,对各个行业不断推出设备子协议,使 CANopen 协议在各个行业得到更快的发展与推广)
子协议就是针对不同行业的应用对象,对 CANopen 内部的数据含义进行重新定义,或者添加新的控制逻辑。
CiA 421 series: Train vehicle control system 列车车辆控制系统
CiA 423 series: Diesel engine control system 柴油机控制系统
CiA 424 series: Door control system 门控制系统
CiA 426 series: Exterior light control system 外部灯控制系统
CiA 430 series: Auxiliary equipment control system 辅助设备控制系统
CiA 433 series: Interior light control system 内部灯控制系统
4.NMT与特殊协议的CAN-ID定义
5.过程数据对象和服务数据对象
过程数据对象:PDO(生产者-消费者模型)
PDO 分 两 种 用 法 , 发 送 和 接 收,支 持 TPDO 的CANopen 设备称为 PDO 生产者,支持 RPDO 的称为 PDO 消费者。
由对象字典提供 PDO 数据和配置的接口,数据字典中对应的映射结构决定了一个 PDO 的数据类型和映射关系。
PDO 由 PDO 通讯参数和 PDO 映射参数描述。
1.传输模式
同步传输
事件驱动传输
2.触发模式
事件和定时器驱动
远程请求
同步触发
3.PDO服务
PDO写服务
PDO 写服务是推模式。可以0-多个 PDO 消费者,但 PDO 生产者只能有一个。
PDO 读服务
PDO 读服务是拉模式。有1-N个 PDO 消费者。但只有一个 PDO 生产者。
4.PDO协议
PDO 写协议
PDO 生产者将 PDO 过程数据发到网络上。网络上可能有 0 到 n 个 PDO 消费者。 在 PDO 消费者(们)接收到有效的 PDO 报文后执行相关操作
PDO 读协议
该 PDO 读服务须应答。一或多个 PDO 消费者发送 RTR 到网络上,PDO 生产者收到 RTR 后回复相应的PDO,所有该 PDO 的关联消费者接收执行。
PDO 消费者数量 1 到 n 个,读服务是可选的,取决于硬件条件。
5.寻址 PDO(MPDO)
MPDO 提供了直接访问 CANopen 设备对象字典的服务。限制最大 4 字节数据
有两种 MPDO 使用方法。
第一是目的地址模式(DAM)MPDO,
第二是源地址模式(SAM)MPDO
支持发送 MPDO的 CANopen 设备称为 MPDO 生产者,支持接收 MPDO 的称为 MPDO 消费者。
对象字典提供了 MPDO 数据和配置的接口。
MPDO 服务
MPDO 写服务
MPDO 写服务是推模式。可以有多个的 MPDO 消费者,也可以没有,但 MPDO 生产者只有一个。
MPDO 协议
MPDO 写协议
MPDO 写服务无应答。MPDO 生产者发送 MPDO 过程数据到网络。可能是有 0 到 n 个 MPDO 消费者,取决于
给定的 node-ID。MPDO 消费者(们)接收到有效的 PDO 应接收处理。
6.TPDO和RPDO
TPDO和 RPDO 分别有 4 个数据对象,每种数据对象就是 1 条 CAN 报文封装。
服务数据对象:SDO(服务器-客户端模型)
SDO属于服务数据,有指定被接受节点的地址(Node-ID),并且需要指定的节点回应CAN报文来确认已经接收,如果超时没有确认,则发送节点会重新发送原报文。
对象字典:
每个对象采用一个 16 位的索引值来寻址,这个索引值通常被称为索引,其范围在 0x0000到 0xFFFF 之间。为了避免数据大量时无索引可分配,所以在某些索引下也定义了一个 8 位的索引值,这个索引值通常被称为子索引,其范围是 0x00 到 0xFF 之间。
CANopen 协议的核心描述子协议是 DS301,其包括了 CANopen 协议应用层及通信结构描述,其它的协议子协议都是对 DS301 协议描述文本的补充与扩展。在不同的应用行业都会起草一份 CANopen 设备子协议,子协议编号一般是 DS4xx 。
通讯对象子协议区:
定义了所有和通信有关的对象参数,所有CANopen节点都必须具备这些索引,否则无法加入CANopen网络。
1.通用通讯对象(Communication Parameters):
0x1000--VAR变量--Device type设备类型。0x1001--VAR变量--Error register 错误寄存器。0x1002--VAR变量--Manufacturer status register 制造商状态寄存器。
0x1003--ARRAY 数组--Pre-defined error field 预定义错误场。0x1005--VAR变量--COB-ID Sync message 同步报文 COB 标识符。0x1006--VAR变量--Communication cycle period 同步通信循环周期(单位 us)。
0x1007--VAR变量--Synchronous windows length 同步窗口长度(单位 us)。0x1008--ARRAY 数组--Manufacturer device name 制造商设备名称。0x1009--VAR变量--Manufacturer hardware version 制造商硬件版本。
0x100A--VAR变量--Manufacturer software version 制造商软件版本。0x100C--VAR变量--Guard time 守护时间(单位 ms)。0x100D--VAR变量--Life time factor 寿命因子(单位 ms)。
0x1010--VAR变量--Store parameters 保存参数。0x1011--VAR变量--Restore default parameters 恢复默认参数。0x1012--VAR变量--COB-ID time stamp 时间报文 COB 标识符(发送网络时间)。
0x1013--VAR变量--COB-ID time stamp 时间报文 COB 标识符(发送网络时间)。0x1014--VAR变量--COB-ID emergency 紧急报文 COB 标识符。0x1015--VAR变量--Inhibit time emergency 紧急报文禁止时间(单位 100us)。
0x1016--VAR变量--Consumer heartbeat time 消费者心跳时间间隔(单位 ms)。0x1017--VAR变量--Producer heartbeat time 生产者心跳时间间隔(单位 ms)。0x1018--VAR变量--Identity object 厂商 ID 标识对象。
0x1019--VAR变量--Sync.counter overflow value 同步计数溢出值。0x1020--VAR变量--Verify configuration 验证配置。0x1021--VAR变量--Store EDS 存储 EDS。
0x1022--VAR 变量--Storage format 存储格式。0x1023--RECORD 记录--OS command 操作系统命令。0x1024--VAR 变量--OS command mode 操作系统命令模式
0x1025--RECORD 记录--OS debugger interface 操作系统调试接口。0x1026--ARRAY 数组--OS prompt 操作系统提示。0x1027--ARRAY 数组--Module list 模块列表
0x1028--ARRAY 数组--Emergency consumer 紧急报文消费者。0x1029--ARRAY 数组--Error behavior 错误行为
其中0x1018有各种子索引,也代表不同的意思。
2.制造商特定子协议区(Manufacturer-specific)0x2000--0x5fff
存放子协议的应用数据。
3.标准化设备子协议区(Standardized Interface Profile)0x6000--0x9fff
为各种行业不同类型的标准设备定义对象字典中的对象。目前已有十几种为不同类型的设备定义的子协议,例如 DS401、DS402、DS406 等。
4.网络管理NMT(Network management) 与 CANopen主站。
4.1NMT节点状态:(CANopen节点从上电开始6种状态均由NMT管理)
1.初始化,上电后节点部件包括CAN控制器的初始化。
2.应用层复位:应用程序复位,如开关量输出、模拟量输出的初始值。
3.通讯复位:CANopen通讯复位,之后CANopen节点就可以CANopen通讯了。
4.预操作状态:此时不可以PDO通信,可以SDO通讯进行参数配置和NMT网络管理的操作。
5.操作状态:节点收到NMT主机命令后,激活CANopen通讯,PDO通信启动后,按照对象字典规定的规则进行传输,同样SDO可以对节点进行数据传输和参数修改。
6.停止状态:节点收到NMT主机发来的停止命令后,节点PDO通信被停止,但SDO和NMT网络管理依然可以对节点进行操作。
除了始化状态,NMT主机通过NMT命令可以让网络中任意一个的CANopen节点进行其他5种状态的切换。
4.2NMT节点上线报文
CANopen从站上线必须发出节点上线报文(boot-up),报文ID为0x700+Node-ID,数据为1个字节0;
4.3NMT节点状态与心跳报文
CANopen要求从站定时发送状态报文(心跳报文),便于主站确认从站事发后故障、脱离网络。
心跳报文ID为0x700+Node-ID,主句为个字节,代表当前状态,0x04为停止状态,0x05为操作状态,0x7F为预操作状态。
CANopen 从站按其对象字典中 1017h 中填写的心跳生产时间(ms)进行心跳报文的发送,而 CANopen 主站(NMT 主站)则会按其 1016h 中填写的心跳消费时间进行检查,假设超过诺干次心跳消费时间没有收到从站的心跳报文,则认为从站已经离线或者损坏。
4.4NMT节点守护
早起CANopen应用中有节点守护模式,方式是通过轮询模式监视从站状态,它与心跳报文模式不能共存,原理如下:
NMT-Master节点发送标准远程帧,帧报文COB-ID:0x700+Node-ID
NMT-Slave节点应答发送数据帧数据为1字节,帧报文COB-ID:0x700+Node-ID,Byte0:bit7:toggle,bit6-0:状态。
数据部分包括一个触发位(bit7),触发位必须在每次节点保护应答中交替置“0”或者“1”。触发位在第一次节点保护请求时置为“0”。位 0 到位 6(bits0~6)表示节点状态(0x04为停止状态,0x05为操作状态,0x7F为预操作状态),
由于远程帧在 CAN 发展中逐渐被淘汰,而节点守护由于需要更多的主站开销与增加网络负载,CiA 协会已经不建议使用,被心跳报文所取代。
4.5NMT节点状态切换命令:
NMT节点状态切换命令是NMT网络管理的核心。
CANID均为0x000,具备最高的CAN优先级,数据为2字节。
Byte0表示命令类型:
0x01:启动命令(让节点进入操作状态)
0x02:停止命令(让节点进入停止状态)
0x80:进入预操作状态(让节点进入预操作状态)
0x81:复位节点应用层(让节点的应用恢复初始状态,比如列车门都恢复打开状态)
0x82:复位节点通讯(让节点的CAN和CANopen通讯重新初始化,一般用于总线收到干扰,导致节点总线错误被动,或者总线关闭时。)
Byte1:表示被控制节点的Node-ID(如果想同时控制整个网络的节点,值为0即可。)
4.6CANopen主站设备:(也就是NMT主站)
作为一个完整的NMT主站,设备模型如下,需要具备如下功能:
1.支持PDO、SDO发送与接收。
2.支持NMT网络管理。
3.支持PDO通讯类型并能够支持监控每一个PDO目标。
4.LSS层设置功能:从站波特率设置,从站节点编号设置。
5.支持从站管理功能:类型与名称读取,对象字典读写。
6.发送紧急报文功能。
7.扩展CANopen标准指示灯功能。
目前有二种形式的主站:
1. 作为一个属于可编程控制器(PLC)中的一个单元,该单元内部集成了CANopen 的主站功能并可以连接到 CANopen 总线,同时因为它是 PLC 中的一个单元,它能与 PLC 的 CPU 交换数据,
因此通过编写 PLC 程序对它所连接的 CANopen 从站进行管理和控制。
2. 另一种是通过 PC 扩展一个 CANopen 主站通信卡,从而令 PC 具有管理 CANopen 通信网络的能力。推荐使用 PCI 总线或 USB 总线来扩展 CANopen 通信卡,比如广州致远电子
股份有限公司的 PCI-5010-P 或 USBCAN-E-P 主站卡,如图 6.8 所示。使用它们不仅可以令PC 成为一个 CANopen 网络的管理节点,还可以开发或测试 CANopen 网络、拓展连接其他网络。
5.过程数据对象PDO
5.1PDO的CANID定义:
PDO预定义中,规定了TPDO和RPDO,规定了Node-ID在PDO中的位置,规定的PDO的编号:
TPDO和RPDO分别有4个数据对象,每种数据对象就是1条CAN报文封装。
如果某个节点的资源特别多,例如有出现TPDO5之类的数据对象,而他们的CAN-ID定义就要打破预定义的规则,比如可以定义Node-ID为1的节点中TPDO5是0x182(这里PDO的COB-ID中的低7位不在表示Node-ID,其实所有PDO的COB-ID与Node-ID都没有必然上的联系。)
5.2PDO的传输形式:
1.异步传输(特定事件触发)
触发方式可有两种,1.由设备子协议中规定的对象特定事件来触发(例如,定时传输,数据变化传输等)。
2.通过发送与 PDO 的 COB-ID 相同的远程帧来触发 PDO的发送。(目前应用中的异步传输基本都采用第一种)
2.同步传输(通过接收同步对象实现同步)
同步传输就是通过同步报文让所有节点能在同一时刻进行上传数据或者执行下达的应用指令,可以有效避免异步传输导致的应用逻辑混乱和总线负载不平衡的问题。一般发送同步报文的节点是 NMT 主机。
同步传输又可分为周期传输(循环)和非周期传输(无循环)。
周期传输则是通过接收同步对象(SYNC)来实现,可以设置 1~240 个同步对象触发。
非周期传输是由远程帧预触发或者由设备子协议中规定的对象特定事件预触发传送。
5.3.PDO 通信参数
通信参数,定义了该设备所使用的 COB-ID、传输类型、定时周期等。
RPDO 通讯参数位于对象字典索引的 1400h to 15FFh,TPDO 通讯参数位于对象字典索引的 1800h to19FFh。
每条索引代表一个 PDO 的通信参数集,其中的子索引分别指向具体的各种参数,如表:
对象字典的TPDO如下(RPDO类似)。
也有的说subindex的02,值为01表示同步报文传输、0xff表示定时器传输。
5.4PDO映射参数
RPDO 映射参数 1600h to 17FFh,数据存放为 2000h 之后厂商自定义区域;
TPDO 映射参数 1A00h to 1BFFh,数据存放为 2000h 之后厂商自定义区域。
6.服务数据对象SDO
客户端-服务器模型,CANopen从节点作为服务器,CANopen主节点作为客户端。
SDO 客户端通过索引和子索引,能够访问 SDO 服务器上的对象字典。这样 CANopen 主节点可以访问从节点的任意对象字典项的参数,并且 SDO 也可以传输任何长度的数据(当数据长度超过 4 个字节时就拆分成多个报文来传输)
6.1通讯原则:
发送方(客户端)发送 CAN-ID 为 600h+Node-ID 的报文,其中 Node-ID 为接收方(服务器)的节点地址,数据长度均为 8 字节;
接收方(服务器)成功接收后,回应 CAN-ID 为 580h+Node-ID 的报文。这里的 Node-ID依然是接收方(服务器)的节点地址,数据长度均为 8 字节。
6.2快速SDO协议
最常用最常见的SDO协议是快速SDO,快速SDO就是1次来回就搞定,前提是读取和写入的值不能大于32位。
下图为快速 SDO 协议的示意图,其命令中直接包含了要读写的索引、子索引、数据。可谓直接命中:
通过快速 SDO,可以直接对 CANopen 节点的对象字典中的值进行读取和修改,所以在做参数配置之外,也经常作为关键性数据传输之用。
比如 CANopen 控制机器人的电机转动角度时,就使用 SDO 来传输,保证可靠到达。
6.3普通SDO协议
如果需要传输的值超过32位,就需要使用普通SDO进行分帧传输,一般用于 CANopen 节点的程序固件升级,或者做网关转换MVB 总线之类数据最大可达 256 位的应用。
普通 SDO 协议难点在于分包逻辑与 CS 命令符的变化。依然难以记忆,需要读者将以下示意图进行收藏。
普通SDO的CAN帧ID与快速SDO相同。
7.特殊协议
为了方便 CANopen 主站对从站管理。在 CANopen 协议中,已经为特殊的功能预定义了 COB-ID,其主要有以下几种特殊报文。
7.1同步协议(Sync Protocol)
该报文对象主要实现整个网络的同步传输。每个节点都以该同步报文作为 PDO 触发参数,因此该同步报文的 COB-ID 具有比较高的优先级以及最短的传输时间。
一般选用 80h 作为同步报文的 CAN-ID。
一般同步报文由NMT主机发出,CAN报文数据为0字节,但如果一个网络内有两个同步机制,就需要设置不同的同步节拍,比如某些节点按1个同步帧发送1次PDO,其他的节点收到2个同步帧才发送1次PDO,所以这里PDO参数中的同步起始值就起了作用。
同步协议中,有 2 个约束条件:
1.同步窗口时间:索引 1007h 约束了同步帧发送后,从节点发送 PDO 的时效,即在这个时间内发送的 PDO 才有效,超过时间的 PDO 将被丢弃;
2.通讯循环周期:索引 1006h 规定了同步帧的循环周期。
7.2时间戳协议(ime-stamp protocol)
NMT 主机发送自身的时钟,为网络各个节点提供公共的时间参考,即网络对时。
这在故障诊断中非常需要,比如列车中火灾报警,检修人员需要准确获知报警的时刻,然后关联查看其它设备在这个时刻的工作状态。
时间戳协议采用广播方式,无需节点应答,CAN-ID 为 100h,数据长度为 6,数据为当前时刻与 1984 年 1 月 1 日 0 时的时间差。
如图 9.4 所示。节点将此时间存储在对象字典 1012h的索引中
协议中可以查找时间换算函数。
7.3紧急报文协议(Emergency Protocol)
当设备内部发生错误,触发该对象。发送设备内部错误代码,提示 NMT 主站。紧急报文属于诊断性报文,一般不会影响 CANopen 通讯,
其 CAN-ID存储在 1014h 的索引中,一般会定义为 080h +node-ID,数据包含 8 个字节。
与 PDO 的生产禁止时间类似,紧急报文也有生产禁止时间,存储在对象字典的 0x1015中,为了限制节点不断发送紧急报文,导致总线负载过大。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架