开源我的嵌入式开发项目:CAN总线工具与Modbus网关的实现解析
开源我的嵌入式开发项目:CAN总线工具与Modbus网关的实现解析
项目硬件示意图
最近在整理自己的一些嵌入式开发项目,觉得这个CAN总线工具结合Modbus网关的项目还挺有代表性的,干脆把源码开源出来,顺便聊聊开发过程中的一些坑和经验。项目本身是基于ECANFD-E01_V2工程的,但做了一些适配调整,因为最终设备只支持2路CAN,而且不支持CAN-FD,所以上位机界面和功能都得重新调整。另外,设备还新增了Modbus网关功能,这也让开发过程多了不少挑战。
调整后的上位机界面
项目背景与需求
最初的项目模板是支持3路CAN以及CAN-FD的,但硬件上我们的设备只支持2路CAN,并且不兼容CAN-FD。这意味着上位机界面得大改,至少得把多余的CAN口相关配置屏蔽掉,同时还要保证Modbus网关功能能正常跑起来。毕竟Modbus在工业现场用得挺多,加上这个功能能让设备的应用场景更广一些。
上位机开发的难点
界面调整
首先得把原本3路CAN的界面改成2路CAN的,而且要彻底去掉CAN-FD相关的配置项。这个过程听起来简单,但仔细一想,界面调整不仅仅是删减东西,还得确保剩余的CAN口配置逻辑不受影响。比如,波特率、采样点、过滤规则这些设置,都得重新梳理一遍,确保用户操作起来不会觉得别扭。
协议规范
CAN和Modbus是两种完全不同的协议,要在一个上位机里同时支持,得好好设计一下数据交互流程。CAN那边还是用标准的ISO 11898-1协议,而Modbus这边则选择了RTU模式,因为工业环境里用RTU的比较多。为了方便调试,我在上位机里加了一个简单的协议解析器,能实时显示CAN帧和Modbus报文的内容,这样排查问题会方便很多。
下位机适配
上位机的调整离不开下位机的配合。因为原工程是支持CAN-FD的,所以下位机的固件里肯定有不少CAN-FD相关的代码。这部分得先注释掉或者干脆删掉,不然会占用不必要的资源。另外,Modbus网关功能需要在下位机里实现一个简单的协议转换模块,把CAN帧转换成Modbus报文,或者反过来。这个模块的效率直接影响了设备的实时性,所以得好好优化一下。
开发过程中的踩坑记录
1. CAN-FD残留代码引发的bug
一开始没把下位机里的CAN-FD代码清理干净,导致设备在初始化的时候总是报错。后来仔细排查才发现,原工程里有一个默认开启CAN-FD的寄存器配置,而我们的硬件根本不支持这个功能。改掉之后问题就解决了。
2. Modbus地址冲突
Modbus网关的地址映射一开始没设计好,导致CAN帧的ID和Modbus的地址发生了冲突。后来重新规划了地址空间,把CAN帧的高位作为Modbus的设备地址,低位作为寄存器地址,这才解决了问题。
3. 上位机通信效率
刚开始的时候,上位机轮询Modbus设备的频率太高,导致CAN通信出现了丢帧。后来把轮询间隔改成了动态调整,根据当前的CAN负载情况自动调节Modbus的轮询速度,这样就平衡了两边的通信效率。
项目总结与展望
这个项目虽然不大,但涉及的东西还挺杂的,从CAN总线到Modbus协议,再到上位机开发,每一块都得仔细处理。开源这个项目也是希望能帮到一些做嵌入式开发的朋友,尤其是那些刚接触CAN或Modbus的初学者。后续打算继续优化Modbus网关的转换效率,看看能不能把CAN-FD的支持也加上,这样可能会吸引更多对工业物联网感兴趣的人。
如果你对这个项目感兴趣,可以自己去试一下,遇到问题可以互相交流。毕竟开源的意义就在于共同进步嘛。
评论已关闭