1.QT+ModbusTCP 基于QTcpSocket纯手搓modbustcp协议
2.免费串口调试助手 开源 C#
3.PLC数据收集的方法小结
4.Python modbus_tk 库源码分析
5.案例分享:Qt modbusTcp调试工具(读写Byte、Int、DInt、Real、DReal)(当前v1.0.0)
QT+ModbusTCP 基于QTcpSocket纯手搓modbustcp协议
一、编写缘由
1.发现问题
近期项目需将modbus RTU转换为TCP形式,支付木马源码于是对原有modbus通讯线程进行重构。起初使用Qt自带的QModbusTcpClient类,顺利重构线程并读取数据,但在发送写数据请求时,TCP连接会断开。经过多次尝试,排除从站问题,即便直接连接modbusslave也存在同样问题。
2.查找问题
为解决问题,自行编写了一个tcp server,抓取QModbusTcpClient写数据的报文,与modbuspoll上的对比,发现QT中的报文比modbuspoll上的多出一部分,推测是协议错误。
3.解决策略
既然QModbusTcpClient的协议存在问题,决定不使用它。因此,直接利用QTcpSocket手动编写一个ModbusTcp类。
二、代码编写
1.协议解析
通过对比modbuspoll上的通信日志和网络上的modbustcp协议分析文章,研究出协议的标准格式。
2.封装函数
共封装了4个函数,分别是写单个线圈、写多个线圈、写单个保持寄存器、写多个保持寄存器。具体实现如下:
四个函数中,除了写多个线圈存在问题外,瓶装燕窝溯源码其他均已验证,可正确写入。
最后,将TCP作为一个子线程,线程初始化函数如下:
三、源码下载
模块下载
四、最后的最后再吐槽一下QModbusTcpClient真的很糟糕,根本无法使用。另外,网上的QtModbusTCP资源都无法使用,只有和我一样纯手搓才能解决问题。
免费串口调试助手 开源 C#
工业控制类软件在Windows平台下,使用C#语言进行开发,既方便又快捷。在工控领域中,串口通讯是一种非常常见的需求。因此,我花费时间开发了一个通用的串口调试助手工具,并将工控调试中常用的功能集成在上面,以方便用户进行调试。源码已经在gitee上开源,界面采用wpf实现,源码地址为:
接下来,我将简单介绍一下已实现的功能。
程序功能主要分为以下四大块:
1. 串口通讯
2. TCP通讯
3. 小工具
4. 支持中英文双语切换
5. 检查版本更新
6. 曲线显示读取的值。
一、串口通讯
串口通讯详细功能:
1. 支持手动刷新串口设备列表。
2. 支持流控。
3. 接收发送编码方式同时支持ASCII和HEX方式。
4. 在ASCII模式下,可设置结束符,如回车换行等。
5. 在HEX模式下,丽江和瑞丽源码支持自动计算标准ModbusRTU的CRC。
6. 发送支持循环发送。
7. 接收区显示支持显示发送和显示接收,并可设置发送和接收的字符串颜色。
8. 接收区显示支持显示发送和接收的时间,时间格式可自定义。
9. 底部显示串口状态,总接收字节数和总发送字节数。各字节数可手动清零。
. 接收区字符串可一键清空。
. 记录发送历史,支持记录最新的条历史记录。
. 可将接收区显示的字符实时保存到本地txt文档。
. 可将读取到的值以实时曲线的形式显示出来。
二、TCP通讯
TCP通讯详细功能:
1. 支持TCP Client/TCP Server。
2. 在TCP Server模式下,可显示当前连接客户端列表。
3. TCP通讯采取异步方式通讯。
4. 支持串口通讯功能中的3-项。
5. 不支持TCP连接断开的自动侦测。
三、小工具
包含的小工具介绍:
1. 通用校验方法中包含常用的LRC、XOR、CheckSum、FCS、Modbus-CRC等校验的计算。
2. 数据转换包含整数和小数与进制HEX的转换。
3. 与base互转。
4. 数据采集中常用的模拟量与工程量转换计算。
5. ASCII码表。
6. C#颜色对照表。
7. 拾取屏幕颜色。减源码等于加该功能使用鼠标hook实现。通过hook技术可实现拦截或修改键盘鼠标等的操作,有这方面需求的可参考。
四、检查更新
1. 检查更新方式:
利用gitee作为更新检查的服务器,将版本号和下载连接写在gitee项目文件中,实现自动检查更新并提供下载连接的功能。
五、相关开源项目
1. 跨平台(Linux/Windows)串口通讯源码开源连接:
xuyuanbao/BaoYuanSerial: A GUI Serial Debug Tool for Linux/Microsoft Window (github.com)
PLC数据收集的方法小结
在工业的信息化、智能化,甚至工业4.0的大潮中,很多高级算法都是由上位机、云来实现,那么PLC数据采集是最基本的前提条件之一。
面对这种需求,新的PLC大都开始支持以太网(以前的串口局限性太大了),有的甚至在CPU上直接设置以太网接口,编程,数据传输,都可以通过这个端口来搞定,不再需要增加一个以太网接口卡。
硬件有了,要实现数据的采集,还需要软件,从软件上来说,实现方式大概有以下几种:
1、PLC编程,与外部建立以太网连接,通过收发指令进行数据交换:
为了实现这种方式,可能需要通过硬件配置来建立连接通道,然后再由用户自己编程进行收发。要想顺利完成这种通讯和调试,需要一位既懂计算机编程,爱思源码查询又懂PLC编程调试的人员,否则,经常鸡同鸭讲,困难重重。
在调试完毕后,如果想再增加一个变量,从上到下全部需要修改,那个酸爽呀!
2、PLC提供不需要编程的外部访问协议,比如,OPC-UA、MODBUS TCP等:
OPC-UA是目前比较火的开放协议,被工控界宣传得神乎其神,实际情况却是:困难重重。首先,PLC的OPC-UA协议不是随便用的,要购买授权。啊!不免费?不免费!其次,OPC-UA客户端那么容易实现吗?OPC-UA协议号称免费,但是,你如果真的从底层开始开发,如果能真的搞定了,那绝对就是通讯大佬,不需要在苦逼的工控圈混了。如果没有这个实力,就要再次掏银子去购买别人的SDK进行二次开发,貌似也不便宜。OPC-UA控制得比较严,目前还没有哪家敢用和谐版的SDK来公开做项目,做产品。
那么,就用MODBUS TCP吧!这个是免费的。不错,免费,但是也需要在PLC里进行编程、配置(那些原生支持的除外,比如施耐德PLC),并且对下兼容不一定好(我的一个项目里就遇到过,西家PLC,通过CP网卡就是无法和老的INTOUCH进行通讯,通过CPU上的网口就没有问题。由于CPU上的网口还需要做环网,后来只好更换了多网口的CPU,解决了问题,这不需要成本吗?)。现场的技术专家、西家的技术支持都不相信这个事实“MODBUS TCP就是加载在标准以太网协议之上而已,CP没有理由转不过去呀!”
3、通过通讯中间件或者中间软件进行中转
如果以上都不能搞定,就只好用通讯的中转软件了。最典型的就是OPC软件,一端访问PLC,另外一端对外提供数据。OPC软件有的是厂家提供,有的是第三方,曾经大行其道,可惜,从效率、安全性、系统兼容性上看,OPC软件逐步过时了。另外,某些厂家的OPC软件可不便宜了。
除了OPC,还有专业的中间软件,比如KEP某某,那是真专业,可同时访问的PLC和协议非常多,对外提供数据的途径也很多,OPC、OPC-UA等等。但是,一套配置下来,1万RMB能搞定吗?另外,对外的协议,依然是个问题。
国内出来一个小软件PLC-Recorder,用于专业录波(支持大部分主流PLC,自带驱动库,体积极小,可在很多场合替代PLC-Analyzer或iba软件),最近顺手增加了数据转发功能,并且用了兼容性极强的WebScoket协议和Json数据通讯格式。客户端开发非常简单,用一个web页面就能搞定用户验证、订阅、实时数据刷新等功能。如果用高级语言(比如C#、Java等)开发,能实现更加丰富的功能。官网上有转发协议文本及客户端源代码可以参考。
Python modbus_tk 库源码分析
modbus_tcp 协议是工业项目中常用的设备数据交互协议,基于 TCP/IP 协议。协议涉及两个角色:client 和 server,或更准确地称为 master 和 slave。modbus_tk 库作为 Python 中著名且强大的 modbus 协议封装模块,其源码值得深入分析,尤其是在关注并发量等方面的需求时。深入研究 modbus_tk 库的源代码和实现逻辑,对在库的基础上进行更进一步的开发尤其重要。因此,本文旨在提供对 modbus_tk 库源码的深入解析,以供参考。
实例化 TcpMaster 对象时,首先导入 TcpMaster 类,该类继承自 Master,但在实例化时并未执行任何操作。Master 的 `__init__()` 方法同样没有执行任何具体任务,这使得 TCP 链接在创建 TcpMaster 实例时并未立即建立。TCP 链接的建立在 `open()` 方法中实现,该方法由 TcpMaster 类执行。在 `open()` 方法中,自定义了超时时间,进一步保证了 TCP 连接的建立。
在 TcpMaster 类的 `execute()` 方法中,核心逻辑在于建立 TCP 协议的解包和组包。在读写线圈或寄存器等操作时,都会调用 `execute()` 方法。详细分析了 `execute()` 方法的具体实现,包括通过注释掉的组包等过程代码,以及 `TcpMaster._make_query()` 方法的实现。`_make_query()` 方法封装了请求构建过程,包括生成事务号、构建请求包和发送请求。
在请求构建完成后,`_send()` 方法负责通过 `select` 模块进行连接状态检测,确保发送数据前连接无异常。通过分析 `execute()` 方法的后续逻辑,我们能够看到一个完整的组包、发送数据及响应解析的源码流程。响应解析涉及 `TcpMaster.execute()` 方法中对 MBAP 和 PDU 的分离、解包及数据校验。
在解析响应信息时,`TcpQuery().parse_response()` 方法解包并验证 MBAP 和 PDU,确保数据一致性。通过此过程,获取了整个数据体,完成了响应信息的解析。在 `execute()` 方法的后续部分,没有执行新的 I/O 操作,进一步简化了流程。
为了保障线程安全,`threadsafe` 装饰器被添加在 `Master.execute()` 方法及 `TcpQuery._get_transaction_id()` 方法上。这一装饰器确保了跨线程间的同步,但可能引起资源竞争问题。在实际应用中,为了避免同一设备不能同时读写的情况,可以显式传递 `threadsafe=False` 关键字参数,并实现自定义锁机制。
modbus_tk 模块提供了丰富的钩子函数,如 `call_hooks`,在数据传递生命周期中自动运行,实现特定功能的扩展。常见的钩子函数包括初始化、结束、请求处理等,这些功能的实现可以根据具体需求进行定制化。
案例分享:Qt modbusTcp调试工具(读写Byte、Int、DInt、Real、DReal)(当前v1.0.0)
本文分享的是Qt modbusTcp调试工具的实例。该工具在多个工业项目中如医疗、焊接机器人、工控机床和数控等应用广泛。经过实践,将其从关键通信技术中抽离出来,形成专用工具以满足不同需求。
工具的功能需求包括:通过TCP端口进行通讯,支持设定从机IP地址、端口和超时参数,提供对bool、int、dInt、real、dReal数据类型的读写操作,并具备容错处理机制,以确保每次读写操作的成功。
使用该工具能够实现与各种行业仪器的通讯软件开发,特别是当涉及到modbus通讯时。在工具下载方面,可以通过CSDN(0积分下载)访问,网址为:download.csdn.net/downl... 或加入QQ群,群内可搜索“modbus ”以获取工具源码。
2024-12-22 15:06
2024-12-22 14:54
2024-12-22 14:41
2024-12-22 14:29
2024-12-22 14:27
2024-12-22 14:06