上一节,我们了解了CANopen和CAN学习(1):嵌入式网络通用术语,本节,我们将介绍CANopen协议的主要功能,以及它如何满足嵌入式网络的要求。
文章目录
1 对象字典(Object Dictionary)
任何 CANopen 节点的核心是对象字典(Object Dictionary
,OD
),它是一个由 16
位索引和 8
位子索引组成的查找表。这允许在每个索引下最多有 256
个子条目,每个条目可以包含一个任意类型和长度的变量。
- 我们只需实现使用的条目,未使用的条目可以不用实现。
对象字典不仅提供了一种将变量与索引和子索引值关联的方法,还指定了数据类型定义表。从索引1开始的条目专门用于指定数据类型。下表显示了对象字典中定义的一些常用数据类型的前七个条目。
- 除了预定义的类型外,用户还可以根据需要扩展和添加新的数据类型
Index | Data Type |
---|---|
1 | BOOLEAN |
2 | INTEGER8 |
3 | INTEGER16 |
4 | INTEGER32 |
5 | UNSIGNED8 |
6 | UNSIGNED16 |
7 | UNSIGNED32 |
通过这种方法,CANopen 系统能够清晰地定义和存储不同类型的变量,同时允许在系统中引用这些类型。注意:
- 索引 1 到 1000h:仅用于定义数据类型,不存储变量。
- 超过 1000h 的索引:用于实际的变量存储。
- 数据类型描述:数据类型可以用特定的数字来表示,以便在某些场合使用更方便。
对象字典允许用户定义数据类型,并指定变量在网络节点中的存储位置。如下图所示,列出了每个 CANopen 节点必须实现的强制性对象字典条目:
- 设备类型和配置:这些条目提供设备类型和配置文件的信息。
- 错误监测:错误寄存器用于记录设备的错误状态。
- 标识符:标识符记录用于唯一标识设备。
- 心跳机制:节点定期发送心跳消息以报告其状态,心跳机制是监测节点活动状态的推荐方法。
对于上图来说:
- 设备类型(索引
1000h
):指示设备的类型,例如传感器、执行器等。 - 错误寄存器(索引
1001h
):记录设备的错误状态。 - 标识符记录(索引
1018h
):包含设备的唯一标识符。 - 心跳时间(索引
1017h
):配置节点发送心跳消息的时间间隔。
2 设备配置文件(Device Profile)
对象字典允许对需要通信的数据进行结构化,但仍然缺少一些内容:字典中的哪个条目用于什么?主节点无法随意猜测并尝试访问字典的某些区域以查看是否支持这些区域。CANopen提供了一个清晰的解决方案:
-
强制性条目:
-
所有 CANopen 节点必须支持一些基本的、强制性的条目。这些条目确保每个节点都能正确识别自己并报告潜在的错误状态。
-
例如:
- 身份对象:用于识别节点自身的信息(如设备类型、制造商等)。
- 错误对象:用于报告节点的错误状态。
-
-
可选条目:
- 除了强制性条目外,CANopen 规范还定义了一些可选条目。这些条目并不是每个节点都必须实现的,而是根据具体应用和设备类型来决定。
-
设备配置文件:
- 设备配置文件是针对特定类型 CANopen 模块的附加规范。
- 它们详细描述了该类型模块所支持的所有通信参数和对象字典条目。
- 这些配置文件可以用于各种设备,例如通用 I/O 模块、编码器等。
主节点或配置工具可以使用服务数据对象(SDO
,一种消息协议,稍后介绍)访问任何从节点的身份对象。
-
SDO
是一种消息协议,用于在 CANopen 网络中的节点之间交换数据。 -
当主节点或配置工具通过
SDO
访问从节点的身份对象时,从节点会回复一个SDO
,包含该模块符合的设备配置文件信息。 -
假设主节点已经知道该设备类型支持的对象字典条目,通过获取设备配置文件信息,主节点就可以知道从节点支持哪些对象字典条目,并可以直接访问这些条目。
正如 CANopen 的名字,该协议是非常open
的。假设一个制造商的设备需要报告某种特定的诊断信息,这些信息在标准设备配置文件中没有定义。制造商可以在对象字典中添加一个新的条目,用于存储和传输这些诊断信息。只要这个新的条目符合 CANopen 对象字典的结构要求,系统的其他部分就能够正确识别和处理这个条目,实现无缝集成和操作。
3 电子数据表(Electronic Data Sheets)
电子数据表(Electronic Data Sheets
,EDS
)提供了一种标准化方式来指定支持的对象字典条目。任何 CANopen 模块的制造商都会随模块一起提供这样的文件。其格式类似于Windows下的ini文件,下面的例子显示了对象字典条目 [1000h,00h] 的 EDS 定义。数据类型是7(UNSIGNED32
)。
[1000]
ParameterName=DeviceType
ObjectType=0x07
DataType=0x0007
AccessType=ro
DefaultValue=0x00030191
PDOMapping=0
EDS 文件加载:CANopen 主节点或配置工具通常运行在带有 CAN 卡的 PC 上。
-
CAN卡:将计算机的标准接口(如PCI、PCIe或USB)转换为CAN总线接口,使计算机能够直接与CAN网络通信
-
这些工具可以直接将
EDS
文件加载到其识别的设备集合中 -
一旦在网络上找到设备,主节点或配置工具会尝试找到与该设备匹配的
EDS
文件,就能知道该设备支持的所有对象字典条目
如下图所示,为设备配置文件和电子数据表之间的关系。
- 设备配置文件:定义了某种类型设备必须支持的最小对象字典条目,确保所有符合该配置文件的设备都具有基本的通信能力。
- EDS 文件:详细描述了具体设备支持的所有对象字典条目,包括基本条目和任何附加的特定制造商或模块子类型的条目。
例子:
假设有一个通用I/O模块设备配置文件,定义了所有必须支持的基本条目(如设备类型、错误状态和标识信息),即最小条目。
现在,某个特定制造商生产了一款高级通用I/O模块,除了基本条目外,还增加了一些特定功能,比如高级诊断信息和自定义配置参数。这些额外的条目会记录在该设备的EDS文件中。
因此,设备配置文件确保了基本的兼容性和功能,而EDS文件则提供了具体设备的完整条目信息,包括任何制造商特定的扩展。这使得设备既符合标准,又能实现定制化功能。
设备配置文件和EDS确保设备能够即插即用,满足**即插即用(plug-and-play
)**的要求。任何符合相同EDS文件的设备都可以互换,因为它们的对象字典和通信行为是相同的。
4 访问对象字典:SDO
现在,我们需要一个能够直接进行数据交换的通道,使主节点或配置工具能够读取和/或写入连接到网络的所有节点的对象字典条目。
CANopen 通过实现点对点通信支持这种基本的客户端/服务器通信方法,该模式允许向节点的对象字典发出读或写请求。包含对象字典请求或回答的消息被称为服务数据对象( Service Data Objects
,SDO)。
1、主动启动 SDO 通信
-
默认情况下,系统中只有一个节点有权主动启动 SDO 通信模式。
-
这个节点通常是某种主节点或管理节点。
-
配置工具或分析工具等其他节点也可以请求使用SDO通信通道。
2、SDO 通信模式
主节点驱动的请求/响应:
- 默认的 SDO 通信是一种主节点驱动的请求/响应模式。
- 主节点(或管理节点)“拥有”所有的 SDO 通信通道,系统中的每个节点都有一个可用的通道。
通信过程:
- 只有拥有通道的节点可以向目标节点(及其对象字典)发送 SDO 读或写请求。
- 被寻址的节点必须通过 SDO 响应来确认写访问或回复读请求(被称为“服务器”,因为节点将其对象字典数据“服务”到网络)。
3、分段传输功能
SDO支持“分段传输”的功能,允许任何大小的对象字典条目进行传输。如果内容无法适应单条消息,它会自动分段并通过多条消息进行分发。
SDO 允许主节点读取和写入所有连接节点的对象字典条目,提供了基本的读/写访问功能。这种功能已经足够支持一个基本的、由主节点控制的网络系统。过程数据(如传感器数据)和配置数据(如节点配置)都可以通过 SDO 进行传输和更新,确保系统的灵活性和可配置性。
然而,这种方式并不高效,因为它只实现了轮询,主节点必须处理所有的输入和输出。另外,为了将一个输入传输到一个输出,必须通过网络传输四条消息:
- 主节点向输入节点发送 SDO 读请求。
- 输入节点通过 SDO 响应和数据进行回复。
- 主节点向输出节点发送 SDO 写请求。
- 输出节点通过 SDO 响应确认。
按照定义,SDO 消息的长度总是固定为 8 字节,即使消息中只有一个数据字节或一个简单的确认信息。然而,对于纯过程数据通信,SDO 并不是最有效的方法,需要更高效的通信机制。
配置数据可以通过 SDO 访问,这满足了“即插即用”的要求。系统集成商可以选择符合设备配置文件的产品,并使用 CANopen 配置或主控软件来配置这些节点,以满足特定应用的需求。
5 提升性能:PDO
SDO通信开销太大且仅支持主节点驱动的轮询。由于 CAN 支持多主节点通信(任何节点可以随时发送消息,冲突通过消息优先级解决),需要一种更直接的通信方法,以便更高效地访问过程数据并具有更高的优先级。
5.1 PDO 映射
过程数据对象(Process Data Object
,PDO)通过将多个过程数据变量打包成一条 CAN 消息,可以灵活地选择和组合要传输的变量。但必须确保总长度不超过 8 字节。极大地提高了数据传输的效率。
先来了解一下TPDO(传输过程数据对象,Transmit Process Data Object
)和RPDO(接收过程数据对象,Receive Process Data Object
)的概念:
-
TPDO:用于发送节点传输数据,发送节点用来发布数据给网络中的其他节点
-
RPDO:用于接收节点接收数据,接收节点用来从网络中的其他节点获取数据
下面来看一个例子,理解一下如何在CANopen系统中使用PDO映射将多个过程数据变量打包到一个PDO中,以及如何在对象字典中进行这种映射:
假设一个 CANopen 输入节点支持两个 8 位的数字输入和两个 16 位的模拟输入。按照通用 I/O 模块的设备配置文件:
- 索引 6000h 的对象字典条目存储两个 8 位的数字输入
- 索引 6401h 的条目存储两个 16 位的模拟输入
PDO 映射(索引 1A00h):
- 索引 1A00h 的对象字典条目指定了 PDO 映射,指示哪些对象字典条目的哪些位用于传输 TPDO1,逐位填充 TPDO。
- 这种映射可以在位级别上完成,每个条目从 PDO 中第一个可用的空闲位开始使用,并占用所需的位数。
映射过程:
- 索引 1A00h 的第二个子条目(子索引 1)将对象 6000h 的子索引 1 的 8 位映射到 TPDO1 的第一个位。
- 下一个子条目(子索引 2)将对象 6000h 的子索引 2 的 8 位映射到 TPDO1 的下一个空闲位,依此类推。
- 在这个例子中,TPDO1 的剩余位(数据字节 7-8)保持未映射和未使用状态。
设备配置文件和电子数据表:
- 设备配置文件和电子数据表中规定了哪些 PDO 及其默认映射是特定节点预定义的。
- 这些文件确保不同设备的标准化和互操作性。
5.2 PDO 链接
PDO的默认通信方式与SDO类似:
- 在默认情况下,主节点是唯一接收TPDO的节点,且只有主节点可以向从节点发送RPDO。
预定义配置:
- CANopen网络中的设备在连接时,已经有一组预定义的PDO连接配置。这些配置决定了哪些设备发送TPDO,哪些设备接收RPDO。这简化了设备的配置和启动过程,确保设备能够即插即用。
- 每个PDO(无论是TPDO还是RPDO)都有一个唯一的CAN消息ID
COB ID(Connection Object Identifier
):一个包含CAN消息ID和一些附加配置位(如启用和禁用PDO位)的连接对象标识符。每个PDO都有唯一的COB ID。
在CANopen网络的初始化和配置阶段,系统配置人员或主节点可以修改PDO的链接设置。主节点可以配置网络中的输出模块直接监听来自输入模块的特定TPDO消息。另外,每个TPDO有唯一的COB ID,通过这种配置,节点可以明确知道需要监听哪些特定的TPDO消息帧,而忽略其他不相关的消息。
通过在初始化和配置阶段完成PDO链接设置,并在操作模式下各节点自主进行过程数据通信。进入操作模式后,传感器和执行器根据配置好的链接进行通信。主节点无需干预数据传输,可以专注于监控系统状态和处理异常情况。
5.3 PDO 触发
有哪些选项可以触发 PDO 呢?CANopen 支持总共四种触发模式:
事件驱动:
- 如果输入设备在其任意输入上检测到状态变化,它会更新对象字典和 PDO 中的数据,然后传输 PDO。这种模式允许最快的响应时间。
时间驱动:
- 可以配置 PDO 在固定的时间间隔内传输,例如每 50 毫秒。这种模式有助于使总线负载更加可预测。
个别轮询:
- 使用常规的 CAN 特性,即远程请求帧,只有当另一个节点特别请求数据时才传输 PDO。
- 注意:在新设计中不推荐使用此特性,因为不同 CAN 控制器的远程请求实现有所不同!
同步:
- 一种特殊模式,允许按许多运动控制应用所需的同步轮询进行传输。
这些触发模式在后续会详细介绍。
PDO 允许实现非常高效和灵活的通信模型。能够将多个变量放入一条消息中,并直接从一个节点发送到另一个节点(或一组节点),这是传统工业自动化网络中很少见的网络服务。
6 网络管理(NMT)
CANopen 允许网络管理主节点监视所有节点,以确保它们在其参数范围内运行。
1. 网络管理主节点的作用
- 监视所有节点:
- CANopen 允许一个网络管理主节点监视网络中的所有节点,确保它们在预设的参数范围内运行。
- 这种监视机制有助于发现并处理节点运行中的异常情况。
- 故障和报警处理:
- 当某个节点发生故障或接收到报警/紧急消息时,网络管理主节点可以启动适当的恢复或关闭程序,以保护系统的正常运行。
2. 节点监督的实现选项
- 不同的实现选项:
- CANopen 提供了多种节点监督的实现方式,最新版本推荐使用心跳消息。
- 心跳消息的推荐使用:
- 心跳消息是CANopen推荐的一种监督方式,允许节点定期发送状态信号。
- 即使没有网络管理主节点,节点也可以通过相互发送和接收心跳消息进行自我监督。
3. 心跳消息的基本思路
- 定期发出心跳消息:
- 每个节点只要存活并在其参数范围内运行,就会定期发出心跳消息。
- 这种定期信号用于表明节点的正常运行状态。
- 节点间的互相监督:
- 如果所有节点都定期发送心跳消息,每个节点都可以监视其通信伙伴的所有心跳消息。
- 这样,即使没有新的数据消息传输,节点也可以确认通信伙伴正常运行。
- 特别适用于状态变化系统:
- 在状态变化系统中,数据消息可能非常零星,长时间不会传输。
- 使用心跳协议,即使没有新的数据消息,节点也能通过心跳消息确认通信伙伴的状态。