我将在 linux 中使用 CANOpen。在内核中,linux 有 socketcan,我有一些问题需要进一步实施。
1-) 对象字典是什么样子的,它是头文件还是 EDS 文件?
2-) 我需要对 pdo 和 sdo 配置使用对象字典吗?
3-) 我应该实现我的自定义 canopen 库,它只实现了一些协议,还是使用像 canfestival 这样实现几乎所有协议和对象字典的库?
1) 对象字典定义了一组对象,其中数据可以存储在 CANopen 节点上。通过提供对象索引和子索引,可以使用 SDO 协议从 CAN 总线读取和写入对象字典中的对象。它们也可以从 CANopen 节点上的本地应用程序中读取和写入。您可以说对象字典构成了从其他 CANopen 节点访问 CANopen 节点的 API。
EDS 文件包含 CANopen 节点特定模型中存在的所有对象的列表,包括数据类型、默认值、最小值和最大值以及一些属性。这有助于工具与 CANopen 节点进行通信。
2) 使用 SDO 协议通过 CAN 总线完成配置,以写入 CANopen 节点的对象字典。
3) 如果您开发商业产品,您可能希望使用商业 CANopen 堆栈来支持完整协议。(一个例子是我们维护的Kvaser CANopen 堆栈,但还有许多其他可供选择)
如果您的项目许可政策允许,您可以使用开源 CANopen 堆栈之一。我想到了 CANFestival 和 CANopenNode,但也有其他的。
但是,如果您只需要最少的功能,您也可以编写规范中的最低限度的代码。NMT 状态机、只读 SDO 加速传输、包含少量强制对象和硬编码 PDO 的对象字典甚至可能为您提供符合标准的简约节点。
以下对象在 CiA 301 中是强制性的
如果您想更进一步,您可以将网络上的所有其他节点预先配置为自动启动,然后只需发送和接收其他节点被编程识别的固定 PDO。这不符合标准,但如果您在实验室中快速使用它,它可能会起作用。
我曾经为原型做过一次,只是一个固定的 PDO 和心跳,然后切换到最终产品的商业堆栈。
我使用canfestival的canopen的经验:
1)它是一个头文件和一个源文件
2)是的,你应该为每个节点定义对象字典的sdo和pdo规范及其变量和回调,它是由canfestival中的objectdictgen自动完成的
3) 一些驱动的写法类似于 serial , tcp ,... 但是如果你有特定的协议你可以写你自己的驱动