上一个网文我们使用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 0000 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从机程序相关推荐

  1. 基于单片机的modbus从机程序

    一 .开发思路 我这里开发的平台是新唐M031,它是Cortex-M0的内核.32位单片机.因为要和上位机进行RS485通讯,所以选用了Modbus-RTU来作为通讯协议.我这是用串口接收中断+定时器 ...

  2. 利用QT编写一个简单爬虫程序

    从高中到大学,一直在固定小说网中下载小说,小说网停机过好几次但最后又起死回生.最近萌发一个想法,把小说网里的小说都爬下来.. 既然要爬网站肯定要对网站结构十分了解,幸好小说网没有弄什么登陆防爬措施,结 ...

  3. Qt编写的复杂象棋程序 chessbroad.cpp 错误比较多

    #include "chessbroad.h"#include <qtextcodec.h>ChessBroad::ChessBroad(QWidget *parent ...

  4. Qt编写的局域网聊天程序

    这个程序足足用了一个月的时间,也怪小生内功不强,但此番修炼着实受益良多.整体程序不建议大家观摩,主要是太乱了.在这里我会将其中的几个重要部分剥离出来和大家分享. 该程序界面灵感来源于网络,小生不才,又 ...

  5. Qt编写自定义控件49-飞机仪表盘

    一.前言 飞行仪表是测定和表示飞机数据的工具,飞机中必不可少的一部分,飞行员根据飞行仪表表示的数据才能正确地做出判断.一般飞机仪表包括高度表+空速表+垂直速率表+姿态仪+航向指示表+转弯协调表. 这次 ...

  6. 【嵌入式开发】监测系统——用QT编写下位机

    [嵌入式开发]监测系统--用QT编写嵌入式下位机界面 一.登陆界面 二.自定义弹出式小键盘 2.1设计思路 2.2具体实现 三.通讯协议 四.检测界面 五.历史信息显示 六.总结 本文为嵌入式课程的课 ...

  7. 从零开始编写一个上位机(串口助手)QT Creator + Python

    提示:本博客作为学习笔记,有错误的地方希望指正,此文可能会比较长,作为学习笔记的积累,希望对来着有帮助.   绪论:笔者这里使用的是QTCreator和Python来实现一个简单的串口上位机的开发的简 ...

  8. Qt编写OpenMP程序--循环测试

    第一篇:https://blog.csdn.net/hats8888/article/details/46378281 最近一个客户需要处理大量股票数据,并跑到数据库里,原来的程序导入数据到数据库需要 ...

  9. 【转】Qt编写串口通信程序全程图文讲解

    Qt编写串口通信程序全程图文讲解 本文章原创于www.yafeilinux.com 转载请注明出处. (说明:我们的编程环境是windows xp下,在Qt Creator中进行,如果在Linux下或 ...

  10. windows下如何使用QT编写dll程序 .

    Windows 下如何使用 QT 编写 dll 程序 因为 QT 必须有调用 QApplication 的 exec 方法,这样才能产生消息循环, QT 的程序才可以运行.所以说如果我们使用了 QT ...

最新文章

  1. 2017年伊始,你需要尝试的25个Android第三方库
  2. Linux下Oracle 10.2.0.1升级到10.2.0.4总结
  3. Line 923: Char 9: runtime error: reference binding to null pointer of type ‘int‘ (stl_vector.h)
  4. JDK 6中新增的Java Console类功能概览
  5. 老男孩mysql参数配置_MySQL启动相关参数解析
  6. php的缓存机制,PHP缓存机制
  7. python写数据库校验_Python:生成验证码并插入到数据库!
  8. lambda表达式java_Java Lambda表达式
  9. 库存转换是什么意思_安全库存的设置:库存计划的看家本领
  10. 大学生自己做网站如何赚钱
  11. matlab绘制图形中,常用函数调用(num2str,disp,gcf,hold on,plot,axis,subplot,line,stairs,grid,set,gca)
  12. c语言十全十美游戏规则,十全十美游戏
  13. 【CareerCup】 Linked Lists—Q2.5
  14. tf.logging
  15. 网上测试眼镜的软件,测脸型配眼镜app
  16. C语言/打印日历,用户输入年分和月份两个变量,系统计算该月份的1号是星期几,并计算该月有多少天。最后打印出该日历。已知:1900年1月1日是星期一
  17. 一种客户端即时通信数据的加密和解密方法
  18. SP,Substance painter
  19. 如何写出网站策划方案
  20. 滴答清单 TickTick for Mac(待办事项清单)

热门文章

  1. 关于EditPlus3 取消备份后再重新打开 备份设置还原到默认状态的问题
  2. WPF开发实例——仿QQ登录界面
  3. 网络安全菜鸟学习之杂项篇——WIFI安全(一)
  4. 给大家推荐12款好用的3D编辑器
  5. Oracle 之 AIO (异步io)
  6. 【图卷积网络】Graph Convolutional Network
  7. COMSOL光纤建模、光子带隙分析等
  8. oa服务器日常维护,OA系统怎么维护?
  9. Uniapp 移动端调用摄像头扫描二维码或者条形码
  10. 单片机矩阵键盘扫描程序c语言,51单片机矩阵键盘扫描程序详解