《CANOpen》 学习笔记4
《现场总线 CANopen 设计与应用》
第一章 通信和设备模型
1.1 通信层和参考模型
- 所有标准的工业通信系统均必须符合国际标准化组织(ISO)所定义的OSI(开放系统互联模型)开放协议标准。CANopen 以涵盖物理层和数据链路层功能的串行总线系统CAN(控制器局域网)为基础,所有的 CANopen 功能均被映射到一个或多个 CAN 报文。
- CAN 控制器中采用的 CAN 协议服务 ISO11898-1 规范标准。它包含的子层有 LLC(逻辑链路控制器),MAC(介质访问控制),PLS(物理信号)。
第二章 物理层
2.1 位定时和位填充
第三章 CAN协议
- 德国 Bosch 公司开发的 CAN 具有以下一些特点:
- 整个网路的范围比较小
- 能够快速传输少量数据
- 具有故障安全性
- 集成错误排除工具
- 成本低
- 串行总线系统多是基于同样的工作方式:待传输的数字信息经过发送次,按序逐个传输到物理媒介上;接收器对物理媒介进行扫描,将串行传输的信息重新转变为系统内部使用的并行数据。各种物理接口的主要区别在于对总线电平的判读方式。
3.1 报文格式
-
数据帧:
- 帧起始
-
标识符场(CAN-ID)。在标准格式的数据帧中,标识符场由11位组成,用于表示确定的待传输消息,其数值也作为待传输消息的优先级。
注意:同一个 CAN 网络中,不能够有两个节点同时发送具有相同标识符但却包括不同数据内容的帧。
-
数据段由 0~64 位组成,包含此帧传输的实际有效信息(0 ~ 8 字节)。通常,数据段的传输都是从第一个字节开始,并且是从每个字节的最高有效位开始。
-
远程帧可以用来请求有效数据。当一个网络设备的接收器收到一个远程帧时,该设备的发送器就会发送一个用于应答的数据帧。接收到的远程帧与发送出的数据帧应当使用同一个 CAN-ID 标识符。有些型号的 CAN 控制器会在收到远程帧之后自动发送数据帧,而大多数 CAN 控制器必须将远程帧及发送请求提交给微控制器。因此,有微控制器的场合,尽量不要使用远程帧。
第四章 应用层
- CANopen 应用层详细定义了通信服务和其他相关的通信协议。通信对象,过程参数和配置参数一起保存在设备的对象字典中。
- CANopen 的基本服务:
- 请求
- 指示
- 响应
- 确认
- CANopen 应用层的服务类型分为 2种,一种是仅在一个设备中执行的服务,比如:局部服务和提供者自启动的服务;另一种是多个设备通过网络进行通信的服务,比如:确认和未确认的服务。
- 在未确认的服务中有一个委托方和多个用户;而确认的服务只可以在2个设备之间进行。由于调用 CANopen 应用层服务通常没有统一的标准,所以 CANopen 协议规范中也没有定义统一的应用程序接口。
4.1 基本原理
- 通信单元由 CAN 收发器,CAN 控制器 以及 CANopen 协议栈组成。协议栈中包含实现通信的通信对象(如过程数据对象(PDO)和服务数据对象(SDO))和状态机。
- 对象字典是应用单元与通信单元之间的接口,实际上是设备的所有参数列表。应用单元和通信单元都可以访问这个参数列表。对象字典中的词目通过一个 16 位索引和一个 8 位子索引进行识别或定位,用户可以对词目进行读或写。
- CANopen 协议中定义了 3种不同类型的通信关系,分别是:主机-从机模型,客户端-服务器模型,生产者-消费者模型,它们表示了设备之间的数据交换模型。
- 主机-从机模型仅用于网络管理(NMT),因为只有在这种情况下,设备之间才会真正地具有主机-从机的功能。在主机-从机模型的网络中,只能有一个有效的 NMT 主机,而其他设备都是 NMT 从机。如果具有 NMT 主机功能的设备是 CANopen 设备,那么它必须也具有 NMT 从机功能。具有 NMT 主机功能,但是没有 NMT 从机功能的设备不是真正地 CANopen 设备,它只是一个可以用来控制 CANopen 设备的设备。本书的作者建议仅使用『真正地』CANopen 设备。
4.2 通信对象
- CANopen 应用层详细描述了各种不同类型的通信对象(COB),这些通信对象都是由一个或多个 CAN 报文来实现的。通信对象分为以下4种:
- 过程数据对象(PDO消息)
- 服务数据对象(SDO消息)
- 预定义对象(同步,时间和紧急报文)
- 网络管理对象(NMT消息)和检测设备(心跳,启动报文)
4.2.1 过程数据对象(PDO)
- 在集中式控制中,各种设备都可能会传输其所有的过程数据。
4.2.1.1 通信参数
- 通信参数用来描述 PDO 的特性。通信参数按照定义好的地址保存在设备对象字典中,如表所示,用户可以通过服务数据对象对通信参数进行访问。从索引 1400h(RPDO1)起,均为用于接收过程数据对象的通信参数,最多可以有 512 个 RPDO(RPDO512 索引为 15FFh)。索引 1800h(TPDO1) ~ 19FFh(TPDO512) 为用于发送过程数据对象的词目,每一个过程数据对象必须有一个对应的通信参数集。
- PDO 通信参数记录中有 5个可用的子条目:COB 标识符,传输类型,禁止时间,事件计时器,同步初始值。前两个参数是必选的。
4.2.1.2 PDOP 的 CAN 标识符
- COB 标识符(COB-ID)中除了包含几个控制位以外,其余的位用来标识数据,以及确定总线访问优先级的 CAN 标识符。
- COB 标识符位于通信参数的子索引 01h 上,COB 标识符是一个 32 位值,0 ~ 10 位(最低位)是 CAN 标准帧标识符。因为 COB 标识符有 32 位,所以还允许使用 29 位的 CAN 扩展标识符,另外标识符中还要设定一个位,即第 29 位。默认情况下 CANopen 的 COB 的标识位位 11 位。32 位中的最后一位为 PDO 的标志位,用于指示该 PDO 是否有效。COB 的第 30 位为 RTR 位,该位可允许或禁止其他 CANopen 设备的远程 PDO 请求。
- 要求只有在预操作状态下才可以对 PDO 的 COB 标识符进行写访问。
4.2.1.3 PDO 链路
注:这个最好参看书本上的图进行理解
- 如图所示,如果节点 1 ~ 4 的 CANopen 设备使用默认的 PDO 标识符,而节点 ID 为 5 的为可编程 CANopen 主机,那么经过配置后,主机可以接收所有其他设备的 TPDO,并且可以提供所有 RPDO 的对应的 TPDO,但是各个子机之间是无法通信的。
- 通过修改(如果可以修改的话)子机的 TPDO 和 RPDO,就可以实现子机与子机之间进行通信或是多个子机接收主机发送的同一条消息。
4.2.1.4 PDO 的通信类型
- 事件驱动:所谓事件驱动,就是当输入值发生变化时,数据立刻被发送出去。这种情况下,只发送变化的数据,可以大大减小总线的占用率。
- 远程请求或轮询:远程帧触发。
- 同步传输:
- PDO 的具体类型在子索引 02h 中进行配置,包括:
1 ~ 240. 同步传输方式
241 ~ 251. 保留
252, 253. 异步,远程帧
254, 255. 异步,事件驱动
4.2.1.5 禁止时间和事件计时器
- 禁止时间(子索引 03h)相当于 PDO 发送过滤器,在 PDO 输入数据第一次变化时无需等待地直接发送该 PDO 数据,之后 PDO 输入数据再次发生变化时,必须等待到禁止时间结束,才会发送出去。禁止时间定义了具有相同 CAN 标识符的两个 PDO 之间至少要间隔的时间。如果设置了禁止时间,用户就可以知道最大的总线负载以及最长的等待时间。
- 事件定时器(子索引 05h),用于异步 PDO 传输。事件定时器可以视为一种触发事件,它会触发相应的 TPDO 传输。如果在计时器运行周期内发生了应用程序定义的触发时间,定时器复位。
4.2.1.6 PDO 映射参数
- PDO 映射参数包含指向 PDO 需要发送的过程数据的指针(利用索引和子索引表示)。PDO 映射参数的子索引 00h 表示的是映射对象(过程数据)的数量。一个 PDO 映射参数集最多可以映射 8字节数据或 64个位变量。
- PDO 映射参数集位于对象字典中的索引 1600h ~ 17FFh(RPDO1 ~ RPDO512)和 1A00h ~ 1BFFh(TPDO1 ~ TPDO512)中,且被分为静态 PDO 映射,可变 PDO 映射和动态 PDO 映射3种类型。如果为静态 PDO 映射,则用户无法对其进行修改。可 PDO 映射表示在『预操作』状态中,可以根据要求给 PDO 填充过程数据,通过对 PDO 映射参数的条目进行 SDO 写访问来实现填充。
4.2.2 服务数据对象(SDO)
-
SDO 客户端可以对 SDO 服务器对象字典中的单个对象进行读 / 写。通常,我们把读操作称为『上传』,写操作称为『下传』。
在使用 SDO 服务器时,用户需要注意:
必须给额外的 SDO 分配 CAN 标识符,在任何情况下,禁止使用已经另有他用的 CAN 标识符。分配标识符可以通过 SDO 管理器来完成,这样可以避免标识符冲突。
这里需要参考书上的图来进行理解。建议:一个 CANopen 设备简单起见,只使用一个 SDO 服务器,如果要使用多个 SDO 服务器,同时只允许一个服务器进行写操作,其余的服务器可以进行读操作。
-
SDO 传输原则上分为3步进行:
- 发起传输
- 读或写数据
- 结束传输
-
发起传输时,SDO 客户端通知 SDO 服务器要访问的对象字典(索引,子索引)中的哪一个条目,以及访问的类型(写或读)。在发起传输阶段,SDO 服务器会检查将要访问的对象是否存在以及是否允许访问。在读或写数据阶段,待传输的数据会分成几个 7字节大小的段,然后通过 CAN 报文来传输。
4.2.3 同步
- 在通过网络进行通信的应用中,发送和接收之间必须相互协调同步。为此,CANopen 引入了同步对象这个概念来解决这个问题。
- 同步对象是指不含数据字节或只含有一个数据字节的 CAN 报文。数据字节中包含一个从1开始递增计数的同步计数器。
- 同步计数器的计数溢出值可以通过参数(索引 1019h)来设置,如果溢出值为0,则发送不含同步计数器的同步报文。
-
同步对象的 CAN 标识符为 80h(默认128)。该值保存在对象字典中 Sync-COB-ID(索引 1005h)的对象中,且可配置。此外,用户还可以配置『循环周期』(通信时间)和『同步窗口长度』对同步机制进行参数设置。
-
同步 PDO 必须在同步对象发送完毕之后的同步时间窗口范围内发送,而对于超出同步时间窗口之后才发送的 PDO,在 CANopen 规范中没有明确规定。因此,同步 PDO 的发送方必须保证同步对象在发送同步 PDO 之前发送,而且也要在同步时间窗口范围内。若在同步时间窗口范围内无法确定要发送多少个同步 PDO 消息,那么就很难决定是否要发送同步 PDO。
4.3 对象字典
1