如何编写Canopen堆栈
How to write a CanOpen stack?
我也有类似的问题。如何编程简单的周围层。我阅读了答案,但是我必须自己编程一个可以单独编程的冠台层,但我无法获得商业化的层。因此,是否有任何编写Canopen堆栈的基本知识(或我不确定差异的一层)?我不知道从哪里开始..
如果需要以下一些信息:
我的主设备是带有QNX的小猎犬骨黑色。我认为QNX有一个通用的CAN库,但不是特定于Canopen的。我的奴隶是一个军事化的无刷电动机控制器。我正在用C 写作。我有有关系统一般要求的文档。有2个rpdos和4个TPDOS,传输是同步的,没有停止模式(因此没有心跳和节点守护),所有消息信息均已说明(大小,格式,相关节点ID等)
实际上至少有4个开源项目可以实现Canopen:
- canfestival是最古老的,可能是最成熟的解决方案。许可证:LGPLV2。
- Canopennode针对微型控制器。许可证:GPLV2。
- Liely Canopen是用于实施Canopen大师和奴隶的图书馆。许可证:Apache版本2。
- OpenCanopen是在Linux上运行的主人。许可证:ISC。注意:我是这个项目的作者。
我会发布链接,但显然我没有足够的"声誉"。
OpenCanopen还包括一些公用事业,例如用于通过TCP转发流量的守护程序,以及将Canopen Canopen流量解释为标准输出的程序。
Lely Canopen实际上具有相当不错的代码质量,如果我开始编写自己的实现时,我可能会使用它。但是,我尚未尝试使用它,所以我不能真正说出哪种实现"更好"。我只能说它们与众不同,一个或另一个可以更好地适合您的需求。
现在,我怀疑这些实现中的任何一个都会在QNX上直接起作用。他们要么必须进行调整,要么您可以将代码的各个部分复制到自己的实现中。至少这应该节省您的时间。
快速而肮脏的工作是仅实施最低限度(只是不要以冠型或索赔冠型的合规性为市场):
- 支持另一个节点将发送/期望接收的那些特定的RPDOS/TPDO。使用固定的共核(可以标识符)。忘记PDO映射和PDO配置,使用固定的设置。
- 实现NMT启动消息。
- 实现术前和操作之间的NMT状态过渡(您的节点需要从NMT Master响应这些转换)。
- 实施一些设置节点ID的方法。最简单的可能是将其用作程序常数。
如果您很幸运,这就是所需的一切。如果您不幸,将会有SDO通信,这意味着您必须实现SDO Protcol和整个对象字典。否则,以上是相当直接的,而不是那么多工作。
如果您需要对象词典,那么可能没有其他方法来获得成熟的协议堆栈。您还需要申请来自Can-In-Automation的供应商ID,但这是一次性费用(没有特许权使用费)。
我来自嵌入式办公室,也想在您的搜索中添加我的便士,即使它迟到了。首先,我想提一下,我们之所以没有将驱动程序放入Canopen-stack存储库中的原因是在多个具有多个编译器的多个目标上嵌入式软件开发的复杂性,而我的目标是尽可能提供运行的软件。只有一个库在使用过程中很难确定问题。
好消息,我设置了一个环境,以使单个维护器(ME)可管理不同的目标和编译器。因此,Canopen-stack在主机上使用LLVM开发,并为STM32F7XX微控制器提供了第一个演示。还有更多,请继续关注: - )
- 算法问题:查找从堆栈中弹出的所有序列
- 使用模板进行堆栈实现; "name followed by :: must be a class or namespace"
- Visual Studio(或任何其他工具)能否将地址解释为调用堆栈(boost上下文)的开头
- 为什么调用堆栈数组会导致内存泄漏
- gdb错误:Backtrace已停止:上一帧与此帧相同(堆栈已损坏?)
- 在 leetcode 上提交解决方案时出现堆栈缓冲区溢出错误
- 我的 int main() 中出现堆栈溢出错误
- 堆栈和队列是否像C++中的数组一样传递?
- 拥有映射的现代方法,该映射可以指向或引用已在堆栈上分配的不同类型的数据
- 为什么 STL 容器适配器堆栈中的 top 返回常量引用?
- 从堆栈分配的原始指针构造智能指针
- 在函数范围内在堆栈上分配的数组在离开函数时是否总是被释放?
- 堆栈中大小变量输入错误 (C++)
- 堆栈问题(平衡表达式问题集)
- C++ 在堆栈中包含多态属性的类对象存储
- 用于解析 win64 堆栈跟踪的命令行客户端(可以访问符号服务器)
- 在 C++ 中使用链表进行堆栈
- 变量周围的堆栈'...'已损坏
- 在 gtest 中初始化堆栈上的引用变量的隔离错误
- 如何编写Canopen堆栈