Qt编写Modbus从机程序
上一个网文我们使用MODSCAN32软件和串口助手调试了Modbus协议,我们之前还分享过使用Qt编写自己的串口助手,今天我们在上次分享的串口助手的源码基础上,使用Qt编写一个Modbus从机程序,让其与MODSCAN32软件实现数据交互。
实现目标
熟悉Modbus协议0x03和0x06功能码
熟悉QTableView控件的使用
Qt编写的Modbus从设备与ModScan32软件进行数据交互
结果展示
改变QTableView控件中某一个单元格的值
MODSCAN32软件实时获得QTableView控件中的值
MODSCAN32软件中修改某一个寄存器的值,QTableView控件随之改变
素材获取
上面视频中获取源码的获取方式,欢迎关注小哈哥的视频号,更多精彩敬请期待。
读保持寄存器功能码0x03
当主机发送0x03功能码时,表明主机想要获取从机某些寄存器里的内容。
举例: 请求读寄存器108~110:
由上图我们可知,寄存器108的内容为02 2B,即十进制的555,寄存器109~110的内容分别为十六进制的00 00 和 00 64,或十进制的0和100。
写单个寄存器功能码0x06
0x06功能码是主机用来向从机的某个寄存器写数据,一次只能操作一个寄存器。
使用功能码0x06写单个保持寄存器。
举例: 请求将十六进制00 03写入寄存器2。
写多个保持寄存器功能码0x10
将十六进制 00 0A 和 01 02 写入从寄存器 2 开始的两个寄存器的实例:
注意:上面截图的实例中,未包含地址位和校验码。
0x03和0x06功能码调试
主从机寄存器地址设置不一致
上面主从机地址设置不一致的返回:
MODSIM32收到的数据包:01 03 00 00 00 06 C5 C8
MODSIM32返回的数据包:01 83 02 C0 F1
主从机寄存器地址一致
MODSIM32收到的数据包:01 03 00 00 00 06 C5 C8
MODSIM32返回的数据包:01 03 0C 01 00 00 00 00 00 00 00 00 00 00 00 6E B3
主机修改值
使用Modbus功能码0x06:写单路寄存器,实现对从机单个寄存器值的修改。
修改地址2的寄存器值为0x00FF
MODSCAN32发送的数据包:01 06 00 01 00 FF 98 4A
MODSIM32返回的应答包:01 06 00 01 00 FF 98 4A
主机发送的报文格式:
主机发送 | 字节数 | 发送的信息 |
---|---|---|
从机地址 | 1 | 01 |
功能码 | 1 | 06 |
起始地址 | 2 | 0x0001 |
写入数据 | 2 | 0x00FF |
CRC码 | 2 | 0x984A |
从机响应返回的报文格式,与主机发送的报文格式及数据内容完全相同。
修改地址6的寄存器值为0xFF00
从机修改值
修改地址4的寄存器值为0x0008
由上我们可以看出来,从机修改完值无需上传数据包(因为Modbus是主从模式,从机不能主动上传数据),等待下次主机查询寄存器状态的时候,上报即可。
注意:上面演示使用的ModSim32软件作为从机,MODSCAN32软件作为主机。
基于Qt的Modbus从机程序
有了上面的演示,我们知道了主机发送不同功能码的时候,我们应该返回给主机什么样的数据内容,下面我们在之前我们分享的《 使用Qt打造属于自己的串口调试助手 》的基础上,完成0x03和0x06功能码的应答,最终程序的界面显示如下。
因为Modbus协议是主从模式,从机不会主动发数据包至主机,从机只要解析接收到的数据包,然后根据协议规定返回对应的内容即可。
所以我们的Qt程序,主要工作就是解析收到的串口数据,因此,在串口接收函数中,解析收到的数据包具体需要做如下工作:
将接收到的前6个字节数据进行CRC计算;
CRC计算的结果跟接收到的第7、第8字节比较,如果一致,证明数据包没有问题;
如果CRC正确,那么根据接收到的第2字节进行判断,当第2字节为0x03时,为Modbus读寄存器的操作;当第2字节为0x06时,为Modbus写单寄存器的操作;
如果功能码为0x03,则获取TableView第2列内的所有数据,作为返回数据包的寄存器值,然后将地址位、功能码、数据长度、寄存器值这些进行CRC校验,然后组成一个数据包发送至主机;
如果功能码为0x06,则将收到数据包的数据位组成一个WORD类型的整形数,根据寄存器地址,将其赋值到TableView中对应的单元格中。
Qt实现的Modbus从机程序大家可以参考本文提供的源码。
总结
经过我们这两次modbus协议的分享,大家可以试试其他功能码的发送与应答,自己随意玩起吧。
参考阅读
干货 | Modbus协议调试分享
485型风速和风向变送器数据包解析
CRC校验码简介及CRC16的计算方法
使用Qt打造属于自己的串口调试助手
欢迎关注
小伙伴们可加微信[chengxuyuanxiaoha]进技术交流群,与更多同道中人一起成长。
声明:文中软件仅供学习使用,请支持正版。
Qt编写Modbus从机程序相关推荐
- 基于单片机的modbus从机程序
一 .开发思路 我这里开发的平台是新唐M031,它是Cortex-M0的内核.32位单片机.因为要和上位机进行RS485通讯,所以选用了Modbus-RTU来作为通讯协议.我这是用串口接收中断+定时器 ...
- 利用QT编写一个简单爬虫程序
从高中到大学,一直在固定小说网中下载小说,小说网停机过好几次但最后又起死回生.最近萌发一个想法,把小说网里的小说都爬下来.. 既然要爬网站肯定要对网站结构十分了解,幸好小说网没有弄什么登陆防爬措施,结 ...
- Qt编写的复杂象棋程序 chessbroad.cpp 错误比较多
#include "chessbroad.h"#include <qtextcodec.h>ChessBroad::ChessBroad(QWidget *parent ...
- Qt编写的局域网聊天程序
这个程序足足用了一个月的时间,也怪小生内功不强,但此番修炼着实受益良多.整体程序不建议大家观摩,主要是太乱了.在这里我会将其中的几个重要部分剥离出来和大家分享. 该程序界面灵感来源于网络,小生不才,又 ...
- Qt编写自定义控件49-飞机仪表盘
一.前言 飞行仪表是测定和表示飞机数据的工具,飞机中必不可少的一部分,飞行员根据飞行仪表表示的数据才能正确地做出判断.一般飞机仪表包括高度表+空速表+垂直速率表+姿态仪+航向指示表+转弯协调表. 这次 ...
- 【嵌入式开发】监测系统——用QT编写下位机
[嵌入式开发]监测系统--用QT编写嵌入式下位机界面 一.登陆界面 二.自定义弹出式小键盘 2.1设计思路 2.2具体实现 三.通讯协议 四.检测界面 五.历史信息显示 六.总结 本文为嵌入式课程的课 ...
- 从零开始编写一个上位机(串口助手)QT Creator + Python
提示:本博客作为学习笔记,有错误的地方希望指正,此文可能会比较长,作为学习笔记的积累,希望对来着有帮助. 绪论:笔者这里使用的是QTCreator和Python来实现一个简单的串口上位机的开发的简 ...
- Qt编写OpenMP程序--循环测试
第一篇:https://blog.csdn.net/hats8888/article/details/46378281 最近一个客户需要处理大量股票数据,并跑到数据库里,原来的程序导入数据到数据库需要 ...
- 【转】Qt编写串口通信程序全程图文讲解
Qt编写串口通信程序全程图文讲解 本文章原创于www.yafeilinux.com 转载请注明出处. (说明:我们的编程环境是windows xp下,在Qt Creator中进行,如果在Linux下或 ...
- windows下如何使用QT编写dll程序 .
Windows 下如何使用 QT 编写 dll 程序 因为 QT 必须有调用 QApplication 的 exec 方法,这样才能产生消息循环, QT 的程序才可以运行.所以说如果我们使用了 QT ...
最新文章
- 2017年伊始,你需要尝试的25个Android第三方库
- Linux下Oracle 10.2.0.1升级到10.2.0.4总结
- Line 923: Char 9: runtime error: reference binding to null pointer of type ‘int‘ (stl_vector.h)
- JDK 6中新增的Java Console类功能概览
- 老男孩mysql参数配置_MySQL启动相关参数解析
- php的缓存机制,PHP缓存机制
- python写数据库校验_Python:生成验证码并插入到数据库!
- lambda表达式java_Java Lambda表达式
- 库存转换是什么意思_安全库存的设置:库存计划的看家本领
- 大学生自己做网站如何赚钱
- matlab绘制图形中,常用函数调用(num2str,disp,gcf,hold on,plot,axis,subplot,line,stairs,grid,set,gca)
- c语言十全十美游戏规则,十全十美游戏
- 【CareerCup】 Linked Lists—Q2.5
- tf.logging
- 网上测试眼镜的软件,测脸型配眼镜app
- C语言/打印日历,用户输入年分和月份两个变量,系统计算该月份的1号是星期几,并计算该月有多少天。最后打印出该日历。已知:1900年1月1日是星期一
- 一种客户端即时通信数据的加密和解密方法
- SP,Substance painter
- 如何写出网站策划方案
- 滴答清单 TickTick for Mac(待办事项清单)