CANopen学习笔记

1.CANopen的预定义报文ID分类

CANopen在设计时,对其定义为小网络、控制信号实时通讯

  • 报文传输采用CAN标准帧格式。即11bit的ID域,以尽量减小传输时间。
  • 网络控制报均采用数据最小字节数。比如心跳报文,只有1个字节数据。
  • 实时更新的过程数据无需接收方报文应答。即采用生产消费模型,降低总线负载。
  • 需要接收方确认的配置参数一般都时采用快速单字传输。即1个报文最多传达1个32bit的参数变量,避免了分帧引起的实时性降低。

以上这些定义都是为了节约时间开销,最大限度的保证实时性。同时为了减小简单网络的组态工作量,CANopen定义了强制性的缺省标识符(CAN帧ID)分配表,以减小使用者和维护者的学习时间,快速上手。

1.1 网络管理(NMT)与特殊协议(Special protocols)报文ID分类

为了CANopen网络的稳定可靠,都需要设置一个网络管理主机NMT-Master(Network Management-Master),就像是交响乐团的指挥家,指挥所有节点的启动、停止等。

NMT主机也被成为CANopen主站 ,相对应的其他CANopen节点就是NMT从机(NMT-slaves)。

NMT主机和NMT从机之间通讯的报文就称为NMT网络管理报文。网络管理报文负责层管理、网络管理和ID分配服务。例如,初始化、配置和网络管理(其中包括节点保护)。网络管理中,同一个网络中只允许有一个主节点、一个或多个从节点,并遵循主从模式。

另外,为了协调各个节点的同步、心跳、时间、错误提示 等通讯控制,CANopen还定义了一系列特殊协议报文。

1.2 过程数据对象(PDO)和服务数据对象(SDO)的报文ID分类

使用CANopen时,需要传递的配置信息和应用信息都是放在过程数据对象PDO(Process data object) 和**服务数据对象SDO(Service data object)**里面。

PDO和SDO的通讯区别在于,PDO属于过程数据,即单向传输,无需接收节点回应CAN报文来确认,从通讯术语上来说是属于"生产消费"模型

SDO属于服务数据,有指定被接收节点的地址(Node-ID),并且需要指定的接收节点回应CAN报文来确认已经接收,如果超时没有确认,则发送节点将会重新发送原报文。这种通讯方式属于常见的"服务器客户端"的通讯模型,即我们常说的轮询式。

强制性的缺省标识符(CAN-ID)分配表,将其划分为4bit的功能码(Function-ID)和7bit的节点号(Node-ID)。

在CANopen中通常把CAN-ID称为COB-ID(通讯对象编号)。

  • COB-ID:Communication Object Identifier,即CANopen中对某种通讯对象的报文帧ID,即CAN报文的11bitID。代表了一种通讯含义。
  • Node-ID:节点ID号,即CANopen网络中的节点地址,CANopen规定了逻辑上最大128个节点,所有Node-ID最大为128。

由于要区分每个CANopen节点的输入和输出,所以PDO分为TPDO(发送PDO)和RPDO(接收PDO)。TPDO和RPDO分别有4个数据对象,每种数据对象就是1条CAN报文封装

SDO就相对而言比较简单固定,发起通讯的"问"SDO的CAN帧ID就是0x600+Node-ID,而被问的节点应"答"SDO的CAN帧ID就是0x580+Node-ID。一般在CANopen网络中,只有NMT主机能发起SDO通讯,进行节点参数配置或关键性参数传递。当然从节点也可以对其他从节点发起SDO通讯。

2.对象字典OD(Object dictionary)

CANopen对象字典(OD:Object Dictionary)是CANopen协议最核心的概念 。所谓对象字典就是一个有序的对象组,描述了CANopen节点的所有参数,包括通讯数据的存放位置也列入其索引,这个表变成可以传递的形式就是EDS文件(电子数据文档 Electronic Data Sheet)

每个词典对象采用一个16bit的索引值来寻址,这个索引值通常被称为索引,其范围在0x0000到0xFFFF之间。为了避免数据大量时无索引可分配,所以在某些索引下也定义了一个8位的索引值,这个索引值通常被成为字索引,其范围0x00到0xFF之间。

每个索引内具体的参数,最大用32bit的变量来表示

每个CANopen设备都有一个对象字典。对于CANopen网络中的主节点来说,不需要对CANopen从节点的每个对象字典项都访问。

CANopen对象字典中的项由一系列子协议来描述子协议为对象字典中的每个对象都描述了它的功能、名字、索引、子索引,数据类型,以及这个对象是否必须,读写属性等等,以保证不同厂商的同类型设备兼容。

CANopen核心子协议描述时DS301。其它的协议都是不同应用行业对DS301的补充和拓展。

2.1 对象字典概述

Index range 索引范围 Description 描述
0x0000 Resorved 保留
0x0001-0x025F Data types 数据类型
0x0260-0x0FFF Reserved 保留
0x1000-0x1FFF Communication profile area 通讯对象子协议区
0x2000-0x5FFF Manufacturer-specific profile area 制造商特定子协议区
0x6000-0x9FFF Standardized profile area 标准化设备子协议区
0xA000-0xAFFF Network variables 网络变量
0xB000-0xBFFF System variables 用于路由网关的系统变量
0xC000-0xFFFF Reserved 保留
[对象字典概述]

绿色的通讯对象子协议区和制造商通讯子协议区是需要关注的区域。

2.2 通讯对象子协议区(Communication profile area)

Index range 索引范围 Description 描述
0x1000-0x1029 General communication objects 通用通讯对象
... ...

绿色的索引范围0x1000-0x1029为通用通讯对象,所有CAN节点必须具备这些索引,否则将无法加入CANopen网络

2.3 通用通讯对象(General communicator objects)

由于通用通讯对象十分重要,NMT主站(CANopen主站)在启动时,通常都全部或者部分读取所有从站中通用通讯对象中的索引,所以所有的通用通讯对象都必须在CANopen从站中实现。

2.4 制造商特定子协议

对象字典索引0x2000-0x5FFF为制造商特定子协议,通常是存放所应用子协议的应用数据。而通讯对象子协议区是存放这些应用数据的通信参数。

2.5 标准化设备子协议

标准化设备子协议,为各种行业不同类型的标准设备定义对象字典中的对象。如DS401、DS402等等。

3 网络管理 NMT(Network management)与CANopen主站

每个CANopen从节点的CANopen协议栈中,必须具备NMT管理的响应代码,这是节点具备CANopen协议的最基本要素。

3.1 NMT节点状态

CANopen节点从上电开始的6种状态,包括:

  • 初始化(Initalizing):节点上电后对功能部件包括CAN控制器进行初始化;
  • 应用层复位(Application Reset):节点中的CANopen通讯复位(开始),从这个时刻起,此节点就可以进行CANopen通讯了。
  • 预操作状态(Pre-operational):节点中的CANopen通讯处于操作就绪状态,此时此节点不能进行PDO通信,而可以进行SDO进行参数配置和NMT网络管理的操作。
  • 操作状态(operational):节点收到NMT主机发来的启动命令后,CANopen通讯被激活,PDO通信启动后,按照对象字典里面规定的规则进行传输,同样SDO也可以对节点进行数据传输和参数修改。
  • 停止状态(Stopped):节点收到NMT主机发来的停止命令后,节点的PDO通信被停止,但SDO和NMT网络管理依然可以对节点进行操作。

除了初始化状态,NMT主机通过NMT命令可以让网络中任意一个的CANopen节点进行其他5种状态的切换CANopen节点也可以程序自动完成这些状态的切换

3.2 NMT节点上线报文

CANopen从站上线时,为了通知主站它已经加入网络,或者避免与其他从站Node-ID冲突。这个从站必须发出节点上线报文(boot-up)。

节点上线报文的ID为0x700+Node-ID,数据为1个字节0。生产者为CANopen从站

3.3 NMT节点状态与心跳报文

主站为了监控CANopen节点是否在线与目前的节点状态。CANopen应用中通常都要求上电的从站定时发送状态报文(心跳报文)。

节点心跳包文与上线报文相同为0x700+Node-ID,数据为1个字节,代表节点目前的状态:

数据(1个字节) 状态
0x04 停止状态
0x05 操作状态
0x7F 预操作状态

3.4 NMT节点守护

已经过时了,不做介绍。它与心跳报文模式不能并存。

3.5 NMT节点状态切换命令

NMT网络管理中,最核心的就是NMT节点状态切换命令,这是NMT主站进行网络管理的命令报文。

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

第1个字节代表命令类型

  • 0x01:启动命令(让节点进入操作状态);
  • 0x02:停止命令(让节点进入停止状态);
  • 0x80:进入预操作状态(让节点进入预操作状态);
  • 0x81:复位节点应用层(让节点的应用恢复初始状态,比如列车门都恢复打开状态);
  • 0x82:复位节点通讯(让节点的CAN和CANopen通讯重新初始化,一般用于总线收到干扰,导致节点总线错误被动,或者总线关闭时。

第二个节点代表被控制的节点Node-ID。

如果要对整个网络所有节点同时进行控制,则这个数值为0即可。

3.6 CANopen主站设备

CANopen主站需要具备以下功能:

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

4. 过程数据对象PDO(Process data object)

PDO属于过程数据用来传输实时数据,即单向传输无需接收节点回应CAN报文来确认,从通讯术语上来说是属于"生产消费"模型PDO。

4.1 PDO的CAN-ID定义

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

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

Object对象 Specification 规范 CAN-ID(COB-ID)
TPDO1发送过程数据对象1 CiA301 0x181-0x1FF(0x180+node-ID)
RPDO1接收过程数据对象1 CiA301 0x201-0x27F(0x200+node-ID)
TPDO2发送过程数据对象2 CiA301 0x281-0x2FF(0x280+node-ID)
RPDO2接收过程数据对象2 CiA301 0x301-0x37F(0x300+node-ID)
TPDO3发送过程数据对象3 CiA301 0x381-0x3FF(0x380+node-ID)
RPDO3接收过程数据对象3 CiA301 0x401-0x47F(0x400+node-ID)
TPDO4发送过程数据对象4 CiA301 0x481-0x4FF(0x480+node-ID)
RPDO4接收过程数据对象4 CiA301 0x501-0x57F(0x500+node-ID)
[PDO的预定义]

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

如果某个节点需要传递的资源特别多,则有出现例如TPDO5之类的数据对象,而他们的CAN-ID定义就需要打破预定义的规则。

4.2 PDO的传输形式

4.2.1 同步传输

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

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

4.2.2 异步传输

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

4.3 PDO的通信参数

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

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

4.4 PDO的映射参数

PDO映射参数,就是将通信参数、应用数据和具体的CAN报文中数据联系起来

5. 服务数据对象 SDO(Service data object)

SDO主要用于CANopen主节点对从节点的参数配置。服务确认是SDO的最大特点,为每个消息都生成一个应答,确保数据传输的准确性

通常CANopen从节点作为SDO服务器,CANopen主节点作为客户端。SDO客户端通过索引和子索引,能够访问SDO服务器上的对象字典。并且SDO也可以传输任何长度的数据(当数据长度超过4个字节就拆分成多个报文来传输。

5.1 通讯原则(communication principle)

SDO的通讯原则非常单一,**发送方(客户端)发送CAN-ID为0x600+Node-ID的报文,其中Node-ID为接收方(服务器)的节点地址,数据长度为8字节(**DLC=8数据长度均为,不存在的补0)。

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

5.2 快速SDO协议(Expedited SDO protocol)

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

5.3 普通SDO协议(Normal SDO protocol)

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

6 特殊协议(Special protocols)

为了方便CANopen主站对从站的管理。在CANopen协议中,已经为特殊的功能预定义了COB-ID。

6.1 同步协议(Sync protocol)

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

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

6.2 时间戳协议(Time-stamp protocol)

时间戳协议采用广播方式,无需节点应答,CAN-ID为0x100,数据长度为6,数据为当前时刻与1984年1月1日0时的时间差。

6.3 紧急报文协议

设备内部发生错误,触发该对象,发送设备内部错误代码,提示NMT主站。其CAN-ID存储在0x1014的索引中,数据包含8个字节。

相关推荐
海绵波波10730 分钟前
Webserver(4.3)TCP通信实现
服务器·网络·tcp/ip
热爱跑步的恒川3 小时前
【论文复现】基于图卷积网络的轻量化推荐模型
网络·人工智能·开源·aigc·ai编程
云飞云共享云桌面4 小时前
8位机械工程师如何共享一台图形工作站算力?
linux·服务器·网络
音徽编程6 小时前
Rust异步运行时框架tokio保姆级教程
开发语言·网络·rust
幺零九零零8 小时前
【C++】socket套接字编程
linux·服务器·网络·c++
23zhgjx-NanKon8 小时前
华为eNSP:QinQ
网络·安全·华为
23zhgjx-NanKon8 小时前
华为eNSP:mux-vlan
网络·安全·华为
点点滴滴的记录8 小时前
RPC核心实现原理
网络·网络协议·rpc
Lionhacker9 小时前
网络工程师这个行业可以一直干到退休吗?
网络·数据库·网络安全·黑客·黑客技术
程思扬10 小时前
为什么Uptime+Kuma本地部署与远程使用是网站监控新选择?
linux·服务器·网络·经验分享·后端·网络协议·1024程序员节