# modbus_rt:纯C实现的跨平台modbus协议通信库
该项目的演示视频,详见:
B站:https://www.bilibili.com/video/BV1cc411m72m/
### 一、介绍
modbus_rt是一款完全基于C语言实现的可以运行在windows, linux, macos, RTOS上的modbus通信库。主要目的是针对控制系统和工业物联网的方向使用。modbus_rt可以同时支持slave模式和master模式,基于类似socket句柄的实现思想,可以很方便的支持多例模式。它不仅仅是modbus协议的解析和实现,而是尽可能的在应用层做好实现和封装,做到开箱即用,而不需要做过多的应用层移植。
modbus_rt支持几乎市面上常用的所有的modbus协议的实现,包括**modbus RTU**,**modbus ASCII**,**modbus TCP**,**modbus TCP over UDP**,**modbus RTU over TCP/UDP**, **modbus ASCII over TCP/UDP**,且都可以运行在**Slave模式**和**Master模式**。另外modbus_rt提供了modbus通信中的大小端转换函数接口(市面上**4种大小端模式**均支持),实现不同平台下的modbus寄存到各种数据的转换接口函数功能(包括bytes, string, int, long, float, double等)。
modbus_rt还额外提供了基于pikapython的接口实现,并整合进pikapython的官方的包管理器。可以采用python脚本实现modbus通信功能。可以无缝兼容到pikapython的环境当中(后续可能考虑提供基于micro python和Cpython的接口实现,本人对micro python和Cpython的底层封装不是很熟悉,看情况,不一定有时间,感兴趣的可以自己移植)。
另外由于modbus_rt采用纯C编写,后续会考虑支持编译封装为动态链接库,供其他编程语言调用(主要考虑给C#调用,目前主要的控制上位机平台基于QT或者C#居多),目前暂时没有封装dll,所以仅提供基于QT的demo。
##### 1、 modbus_rt的主要特性如下:
1. 可以无缝运行在市面上绝大部分平台,包括:windows,Linux,嵌入式RTOS系统当中(计划会维护rt-thread和FreeRTOS系统)。
2. 采用线程实现应用层接口,可以快速实现多个modbus 实例应用。支持几乎所有的modbus协议,且均支持Slave模式和Master模式。
3. 同时支持市面上4种不同模式的大小端数据转化接口,实现不同平台下的modbus寄存到各种数据的转换接口函数功能(包括bytes, string, int, long, float, double等)。
4. 基于面向对象的思维方式,采用句柄模式,非常方便实现modbus的多例模式。理论上只要性能,内存和空间足够,可以创建无数个modbus实例。
5. **modbus master在tcp模式下支持断线重连功能(包括tcp master和rtu/ascii master over tcp)**。在modbus的网络通信中,由于slave是服务端,master为客户端,可能由于网络或者服务端的原因(有些服务端为了保证性能是会自动做短链接处理。就是每进行一次modbus通信之后,会主动断开与客户端的连接,以减小性能开销)。这种情况下,会出现master每次通信需要判断服务端有没有断开,如果断开则需要重新建立连接。modbus_rt内部支持断线重连机制,即使由于网络或者服务端原因断开了连接,下次通信不需要重新建立连接。直接调用功能函数即可,应用框架会自动进行重连(内部有功能调用时重连和定时重连两方面处理,定时重连可以通过宏定义打开或者关闭——针对具有自动断开机制的服务端系统,可以考虑关闭定时重连,否则服务端断开之后系统会间隔的尝试与服务器进行重连。针对其他应用,开启定时重连的目的时为了防止由于网络或者超时原因导致的断开,系统会自动进行重连)。
6. **基于UDP通信接口之上modbus模式下,提供了网络设备查找和发现功能**。即:modbus slave端(一般可以称为设备端,以下简称设备端)与modbus master端(一般PC客户端或者应用端,以下简称客户端)为同一个路由器或者交换机下面的不同设备时。即使设备端与客户端的IP地址不在同一个网段下(设备端IP地址未知),可以由客户端通过往255.255.255.255的广播地址广播modbus命令,设备端收到广播信息后会对广播设备的ip地址进行检测,如果与设备不在同一个网段,会默认往255.255.255.255广播应答信息。这个时候,客户端就可以获取到modbus_rt设备端的ip地址。这样就可以实现设备地址的发现。另外基于此基础上可以扩展实现修改设备的IP地址的功能(详细可以参考rt-thread平台演示)。
7. **mdobus_rt在slave模式下,增加了set_pre_ans_callback和set_done_callback两个回调函数调用接口**。方便快速实现modbus协议与其他协议的转换。比如modbus RTU,ASCII,TCP之间的相互转化, modbus转mqtt,modbus转sql, modbus转OPC Client, modbus转profibus,modbus转canOpen等协议(第三方协议需要自己实现)。可以快速实现类似DTU的应用,以适应各种工业物联网的应用需求(详细可以参考modbus dtu案例演示)。
8. **modbus_rt提供脚本的应用层接口API,目前实现基于pikapython**(主要是考虑到pikapython本身采用python3语法,且支持windows,linux,RTOS,甚至无系统的跨平台支持),并且支持脚本解析运行模式和字节码运行模式,且提供了REPL的交互式运行模块。所以可以无缝集成到系统当中,也可以采用类似终端的方式,基于REPL的命令行模式来验证功能。
9. **(2024-01-31增加)支持自动modbus功能码实现文件下载和上传功能**:可以方便的用modbus_rt实现固件升级和其他文件(比如pikapython的字节码)下载上传功能。并且可以选择使用mbedTLS对固件和文件进行加密,实现加密的文件下载和上传。
##### 2、 modbus_rt的几点补充说明:
1. modbus_rt的协议解析部分基于开源的agile_modbus协议栈修改而来。针对slave_util部分做了重写,主要是支持动态绑定slave寄存器,甚至可以运行中增加slave寄存器。
2. 在基于windows,linux(理论上也可以运行在macos系统)上的串口通信部分采用了开源的libserialport串口通信库,采用加载动态链接库的形式调用,RTOS部分串口通信代码为自己编写。
3. modbus_rt的网络通信部分,采用BSD Socket接口,所以理论上只要可以支持BSD Socket的平台都可以使用,需要注意的是:为了实现多个socket的阻塞问题,采用了IO多路复用接口(select机制),所以需要系统支持select接口。windows和linux本身就都支持,RTOS系统需要确保系统已经移植了BSD socket并且支持select。
4. modbus_rt的应用实现层采用多线程,在windows,linux,macos等操作系统上采用了pthread多线程。linux和macos默认支持pthread,windows需要自己加载和安装pthread库。
5. 本项目参考和借鉴使用了包括但不仅限于以下开源的项目:agile_modbus, libserialport, PikaPython, PikaPython-OpenHardware, RT-Thread, FreeRTOS等等(如还有没有标注的项目,请注明)。采用和借鉴了的开源项目地址详见最后感谢栏,欢迎大家点赞相互交流学习。感谢以上的开源项目作者。
### 二、重大的更新记录
##### 1、2024-03-01更新内容
1. 修复了modbus_rt在slave模式下,如果绑定寄存器乱序绑定modbus slave寄存器的时候会导致链表数据丢失。(之前测试都是按照从小到大,或者从大到小,没有测试全面,如果地址顺序是乱的,则会出错,最新版本已经修复)——感谢网友“皓月”发现bug。
2. 增加了modbus_rt在freeRTOS系统的支持,并提供了在ESP32和air780e硬件平台的demo示例。
3. 增加了cmsis_rtos2的RTOS兼容层的platform
阿齐Archie
- 粉丝: 3w+
- 资源: 2474
最新资源
- Comsol 锂枝晶生长3个模型打包单枝晶,多枝晶,随机形核模型打包处理 给初学者玩家学习使用
- Formality各版本User Guide
- java项目,毕业设计-休闲娱乐代理售票系统
- Vue devtools 5.3.3开发者工具
- 轮式移动机器人轨迹跟踪的MATHLAB程序,运用运动学和动力学模型的双闭环控制,借鉴自抗扰控制技术结合了非线性ESO,跟踪效果良好,控制和抗扰效果较优,可分享控制结构图 这段程序主要是一个小车的动力
- 基于Transformer的最大MoE模型,拥有3890亿总参数和520亿激活参数
- 数据分析-31-疫情数据分析(包含代码和数据)
- Litermal 说明书
- 伺服控制器开发设计方案成熟量产伺服控制器方案 Is620伺服驱动电机,提供DSP程序和原理图,代码完整,学习工业代码的范例,采用ES232,RS485及CAN通讯接口处提供刚性表设置,惯性识别及振
- LIN一致性测试规范 SAE-J2602协议
- (23149420)STM32F407驱动LCD12864代码 LCD12864带中文字库
- (25463858)sxs-.net3.5.zip
- java项目,毕业设计-原创歌曲分享平台
- 使用 Python + pygame 实现植物大战僵尸游戏(源码)
- 基于 Super Text Mesh 的超链接文本
- (6921610)PIC16F877单片机
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈