同步操作将从 SenySunny/modbus_rt 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
该项目的演示视频,详见bilibi视频:
一款基于agile_modbus移植的可以运行在windows, linux, macos, RTOS(计划移植rt-thread和freeRTOS,其他系统请自行移植)的modbus库,采用纯C编写。可以同时支持slave模式和master模式,支持多例模式。支持几乎市面上常用的所有modbus协议支持。包括modbus RTU,modbus ASCII,modbus TCP,modbus TCP over UDP,modbus RTU over TCP/UDP,modbus ASCII over TCP/UDP,以覆盖更多特殊的的modbus协议。并且提供基于pikapython的python接口实现,可以无缝兼容到pikapython环境中。(后续考虑提供基于micro python和Cpython的接口实现,本人对micro python和Cpython的底层封装不是很熟悉,看情况,不一定有时间,感兴趣的可以自己移植)。 另外由于代码完全用C编写,可以很方便的封装成dll供C#等其他编程语言调用。
其主要的特性和优势如下:
这里对modbus_rt的实现做几点说明:
测试视频详见bilibili视频:
windows平台我们这里我们采用QT+MSVC来编译进行测试(理论上用Visual Studio—本身就是基于MSVC,或者MiniGW—基于GCC都可以),我们编译好的可以运行程序在example/windows目录下,源码工程可以见另外一个仓库:
我们只需要终端进入到example/windows目录下,输入.\pikapython main.py
便可以运行main.py的代码,代码运行完毕之后,可以进入到REPL交互界面,在这个界面下我们可以通过脚本对modbus_rt进行测试。
如果需要编译到自己的应用程序种,只需要把src目录的代码复制到工程当中去,安装pthread库,自己添加好头文件即可,可以参考QT+MSVC的源码工程。
Linux平台硬件理论上只要时标准的linux系统都可以使用。这里我采用了野火的鲁班猫1作为测试平台,手头刚好又这个开发板,而且目前市面上很多ROS机器人系统都采用了这块开发板,具有一定的代表性,modbus_rt时上层的应用开发API,所以实际上与硬件无关。
这里我们刷了野火提供的最新的Ubuntu桌面版本的固件。确保安装了git, cmake和gcc程序,用git下载代码。
终端进入example/linux目录,输入sh make.sh
进行编译,此时会在example/linux/build目录下生成pikapython的可执行程序(运行需要用到的库已经复制到该目录下了),用cd进入build目录,便可以运行程序了
RT-thread平台采用了我之前自己DIY的一块PLC开发板,外壳完全兼容西门子的S7-200的PLC外壳,主控我采用国产的珠海半导体的APM32E103VET6芯片(基本兼容STM32F103VET6,引脚Pin2Pin兼容,但是RAM时STM32的2倍,STM32只有64K,比较小)。外挂一篇SPI Flash,运行little FS文件系统,网络部分采用W5500网络芯片。运行rt-thread系统。详细的测试代码可以见相应的工程:
该硬件有两个RS485接口,我们代码默认靠近网卡的RS485作为终端测试使用,我们连上网线,RS485线缆(一个用于modbus通信,一个用于终端调试),上电,编译下载到硬件平台之后。我们可以通过modbus poll控制和读取IO的状态,也可以用终端运行modbus master示例,与其他设备通信。
FreeRTOS平台,我们用了PikaPython的开源硬件 PikaPython-OpenHardware,基于ESP32-S3平台,本身又配置RS485接口,另外网络部分可以用wifi进行测试。
PikaPython-OpenHardware的开源地址为:https://gitee.com/SenyLee/pikapython_openhardware
平台的测试代码仓库(基于idf V5.1开发环境):
因为我们以上4个平台的接口部分都是采用PikaPython封装的API,采用脚本进行通信,所以用那个平台无所谓,西门子PLC我们采用比较常用的S7-1214C的PLC平台,这里仅仅测试modbus TCP,我们用S7-1214C运行一个modbus TCP slave和一个modbus TCP master。modbus_rt设备端也运行一个modbus TCP slave和一个modbus TCP master。他们之间相互通信。
PLC工程详见example/PLC目录,工程采用博图V15.1创建工程
威纶通组态屏程序,我们用威纶通的MT8071IP组态屏,结合我们的RT-Thread平台硬件,进行DO控制和DI检测示例。威纶通屏幕的工程详解example/WEINVIEW,采用EBproV6.08打开下载。理论上其他的组态屏操作也基本一致,这里就不一一测试了(主要手头没有相应的组态屏)。
考虑到很多工业应用并不会使用组态屏(主要价格贵)。所以这里我们也采用国产的大彩串口屏做了一个demo示例,国产的串口屏性价比就高很多了。大彩串口屏,很多型号都支持modbus协议,价格甚至只需要几十元就可以搞定,这里我们选择了一款2.8寸的串口屏,型号:DC24320M028_1110_0T。通过电脑的modbus_rt来控制串口屏上的显示功能。
大彩串口屏的工程见example/DACAI,软件采用VisualTFT_3.0
这里做一个简单的示例,实现modbus TCP转modbus RTU。这里只提供了运行在windows上的mian.py的脚本代码。理论上这个代码也可以运行在嵌入式平台上,实现网络转串口的DTU功能。利用此代码可以很方便的实现dtu相关的功能。
这个演示种,我们两个设备,一个为windowsPC(运行modbus_master的代码),一个用Linux系统的鲁班猫作为DTU(运行modbus_dtu的代码),鲁班猫通过一个USB转RS485连接到我们的RT-Thread平台开发板上,鲁班猫设置strict为0,不对地址做检测,理论上这里我们可以用RS485总线或者多个串口连接多个串口或者RS485设备,我们只需要把设备的slave的地址设置不一样即可。这时候,我们便可以通过PC通过modbus TCP远程控制多个设备了。
通过modbus_tcp(mode), modbus_rtu(mode)或者modbus_ascii(mode)创建示例,mode:0表示modbus slave; 1表示modbus Master。该函数主要用于创建设备的数据块内容,设备块内容,初始化设备需要用到的互斥量和信号量。
通过modbus_xxx_set_net,modbus_xxx_set_serial等函数初始化相应的参数,详情见API手册
通过modbus_xxx_open开启运行设备,该函数主要用于 建立设备的通信端口,创建通信相关的线程。
如果暂时不需要使用设备,可以使用modbus_xxx_close函数关闭设备,该函数主要用于结束设备通信相关线程,关闭设备的通信接口
如果彻底不适用对应设备了,可以使用modbus_xxx_destroy销魂该设备,该函数主要用于销毁设备的互斥量和信号量相关数,销毁设备的数据信息和设备信。此时设备指针将指向空指针。
slave添加寄存器数据块函数为modbus_xxx_add_block函数。参数分别为寄存器类型(默认0, 1, 3, 4四种),寄存器其实地址,存储数据的空间地址,寄存器的长度(不是数据长度)。
获取或者修改寄存器的值用modbus_xxx_excuse函数,针对slave模式为读取或者写入自己的寄存器的值,针对master模式为读取或者写入连接slave设备的寄存器的值。
如果要实现dtu或者modbus与其他协议的转换内容,可以通过modbus_xxx_set_pre_ans_callback和modbus_xxx_set_done_callback设置两个回调函数,分别再slave设备收到master端的数据时调用,和modbus通信结束后调用,可以再回调函数种完成协议转换相关的内容(注意回调函数不能为阻塞函数,否则会导致modbus通信超时)。
modbus_xxx_set_strict用在slave模式下,把strict设置为0则通信不会对master发送的数据的设备地址做匹配检测,即任何地址都可以与该slave设备通信,主要目的在于实现dtu和协议转换相关的功能。
modbus_data_xxx相关函数用于对寄存器与各种数据进行相互转化,以满足不同场景下通信的需求,设备默认为小端模式,由于不同设备的大小端模式不相同。可以采用不同的大小端模式对数据进行转换。
小端模式(Little-endian byte swap):
寄存器0:0x0001,寄存器1:0x0002
表示的数字:0x20001(131073)
大端模式(Big-endian byte swap):
寄存器0:0x0001,寄存器1:0x0002
表示的数字:0x10002000(16,777,728)
内部大段,外部小端(Little-endian):
寄存器0:0x0001,寄存器1:0x0002
表示的数字:0x2000100(33,554,688)
内部小端,外部大端(Big-endian):
寄存器0:0x0001,寄存器1:0x0002
表示的数字:0x10002(65538)
欢迎右上角点击start给我一个支持,欢迎fork。
本项目参考或者使用了如下开源项目的内容,再此对以下项目的创作者表示感谢,由于本项目使用的libserialport项目采用LGPL V3开源协议,所以该项目默认采用LGPL V3开源协议,后续有时间会把串口部分的接口自己独立实现,再考虑更换开源协议。
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。