1.串口调试工具——Modbus Poll
2.干货 | 动手写写Modbus-RTU协议
3.「干货」迪文串口屏ModBus开发流程
4.免费串口调试助手 开源 C#
5.Qt编写Modbus从机程序
6.51单片机C语言怎么写Modbus通信程序?
串口调试工具——Modbus Poll
Modbus Poll,串口串口作为一款专为测试和调试 Modbus 从设备设计的源码主机仿真器,支持 ModbusRTU、调试ASCII、工具TCP/IP 协议,串口串口为开发者提供了便捷的源码暗黑文字游戏源码下载测试环境。其多文档接口特性允许同时监控多个从设备或数据域,调试简化了调试流程。工具软件界面直观,串口串口用户仅需设定从设备ID、源码功能、调试地址、工具大小和轮询间隔,串口串口即可通过任意窗口读写寄存器和线圈。源码提供浮点、调试双精度、长整型等多种数据格式显示方式,支持字节序列交换,极大提高了编程和测试的灵活性。
安装使用 Modbus Poll 非常简便,只需双击桌面快捷方式启动软件。注册流程后,用户将直接进入主窗口,其中显示的参数包括向主站发送数据帧次数、通讯错误次数、模拟的Modbus子设备的设备地址、使用的Modbus功能码及扫描周期等信息。主窗口下方的错误状态显示,如“No Connection”表示未连接状态,直观提示用户当前连接状态。
软件参数设置功能强大,允许用户根据需求调整从站地址、功能码、起始地址、寄存器连续个数及读取数据周期等参数。设置完成点击OK按钮后,模拟窗口将显示定义的寄存器列表。用户可选择数据显示方式,如Signed方式(进制无符号二进制),以满足不同数值显示需求。地址格式可选PLC地址或Protocol Addresses,delphi 源码之家一般情况下使用默认的PLC地址即可。
串口连接功能允许用户通过选择相应的串口或TCP/IP模式进行连接,设置包括端口、模式、读取超时时间、最小间隔时间等参数。连接成功后,主窗口将显示读取寄存器的相关信息。用户可直接在主窗口寄存器地址上双击修改寄存器值,范围为-至。此外,软件还提供了“Communication Traffic”按钮,用于查看发送命令和接收数据的实时情况。
为了更好地理解和使用 Modbus Poll,我们建议用户先安装vspd虚拟串口工具并添加COM2和COM3端口。随后,打开modbuspoll和modbus slave软件并按“F8”配置主从端的相关参数。连接时,选择与虚拟端口对应的端口进行连接,确保正确配置。连接后,主窗口将显示TX、Err、ID、F、SR等参数,显示发送命令次数、错误次数、从机ID、功能码及轮询间隔。使用工具栏的“Communication Traffic”按钮可监控实时通讯数据。
对于需要进一步了解和使用 Modbus Poll 的用户,可访问提供下载的链接。通过下载和安装,用户将获得一款高效、灵活的 Modbus 从设备测试工具,为开发和调试过程提供强大支持。
干货 | 动手写写Modbus-RTU协议
今天,我们来实现 Modbus-RTU 协议,重点放在设备端的源码输出 音质实现。在了解 Modbus 协议时,我们曾绘制过一个 OSI 模型图,这是一个分层设计图,类似于建房子时建筑师绘制的设计图。不过,让我们回到正题。
编码前,遵循协议设计三层结构:物理层与控制芯片使用 UART 与一个 GPIO 进行交互。接下来,让我们详细探讨字节编码、链路层与应用层。
字节编码方面,链路层的主要职责是接收服务,芯片与物理层之间通信接口是 UART,因此需要处理串口接收。modbus 报文结构定义为无特殊帧头、帧尾,如何判定接收到一个完整的帧?modbus 标准规定帧间隔至少须 3.5 个字节时间,字节间隔不得大于 1.5 字节时间。因此,只要 3.5 字节时间内没有新收到数据,即可能接收到一帧。为确保数据完整,我们需加上 CRC 校验,这样便能判定数据帧的接收。
接下来,我们设计一个收发状态机,以实现 3.5 字节时间的判定。T3.5 和 T1.5 字节时间的计算基于字节长度和波特率,这里以波特率 为例,进行计算。若使用其他单片机,实现方式相似,只需相应调整。
应用层中,数据关联是关键。回顾 modbus 协议,标准将用户应用数据规划为四张表。我们以最常见的 0x、0x 命令为例,1000的源码仅需使用后两种表。这两条命令以 位地址进行索引,与用户应用数据关联。我们设计一个数据表来实现这一关联。
接下来,我们将数据表绘制成一张图来分析。首先设计一个索引枚举 E_IDXS,与 appDataTable 里的条目一一对应,appDataTable 类似字典,用于快速存取应用数据的下标。利用 T_APP_DATA_TABLE 结构体,通过 void 指针实现任意类型数据与长度的抽象。这里甚至可以放入自定义数据类型。实现方式是设计一个 modbus 寄存器表结构体,其中包含地址、索引和数据类型三个数据成员。这样,modbus 寄存器表与应用数据便实现了关联。
有了数据字典映射管理,根据寄存器表进行索引,实现内存读写操作。为此,我们需要实现两个读写接口,供 modbus 应用层访问:GetDataFromReg 函数负责从寄存器表中通过查字典获取对应的应用数据内存地址,并将数据复制到 pBuf 所指向的缓冲区。StoreDataToReg 函数则负责接收报文,查询寄存器表中的数据索引和数据类型,实现数据搬运。
在应用层,需要注意 modbus 报文中字节序的规则,如地址 对应 进制的 0x4E,报文中先传 0x4E,后传 0x。
链路层中,帧校验本需实现,但由于 单片机资源有限,接收采用逐字节中断方式,因此将其移至应用层处理。主要思路是判断 layer2 是否接收报文,然后校验该报文是隐藏转发 源码否正确,若正确则进行校验,并转入相应的命令处理。
在数据校验部分,除了 CRC- 校验外,还需检查当前请求是否为设备支持的命令,并验证是否针对该设备。本文未涉及广播报文。CRC- 校验算法遵循标准给出的算法。
总结,本文提供了一个整体思路,用于实现 modbus-RTU 协议。代码可能不甚严谨,有兴趣的朋友可以尝试实现其他命令或广播处理,本文可作为参考。
「干货」迪文串口屏ModBus开发流程
本文将深入探讨迪文串口屏的ModBus开发流程,从协议栈获取到实际应用。
首先,从迪文官方论坛获取ModBus协议栈的OS程序,以UART5-/波特率的示例程序为例。下载并解压后,关键文件包括DWINOS-xx.bin和_xx.bin,前者存入SD卡的DWIN_SET目录,屏幕断电插卡再上电,屏幕会自动更新SD卡内容。_xx.bin文件内有测试指令,可使用J-Flash等工具查看,迪文论坛提供了图形化编辑工具,便于理解指令含义。
在配置ModBus指令时,注意功能码的变量地址要求,如码控制单个线圈需在0X-0XF范围内,遵循手册规定。要读取从机数据,如地址为1,数据在输入寄存器,浮点型,配置时需指定启用标记、从机ID、功能码、寄存器地址等信息。然而,配置工具存在bug,生成的指令格式不正确,需要手动修改bin文件。
完成指令配置后,通过串口工具下载到串口5,与ModBus Slave模拟器交互。设置模拟器寄存器后,屏幕上的指定变量会显示模拟器的数据,这是验证指令正确性的关键步骤。
免费串口调试助手 开源 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)
Qt编写Modbus从机程序
在之前的文章中,我们已经熟悉了如何使用MODSCAN软件和串口助手处理Modbus协议。今天,我们将利用之前分享的Qt串口助手源码,开发一个Modbus从机程序,使其能够与MODSCAN进行数据交互。我们的目标是实现功能码0x读取保持寄存器和0x写入单个寄存器的功能。
当主机发送0x功能码时,程序需要读取并回应从机特定寄存器的内容。例如,如果请求读取寄存器-,其内容分别为 2B(十进制)和 , (十进制0和)。
功能码0x用于向从机写入单个寄存器。比如,我们可以将十六进制 写入寄存器2。在0x功能码下,可以写入多个寄存器,如 0A和 到从寄存器2开始的两个位置。
在调试中,如果主从机的寄存器地址设置不一致,可能会出现错误的数据包,如MODSIM接收到的数据包 C5 C8与 C0 F1。当地址设置一致时,响应的包将正确反映寄存器内容。
Qt编写的Modbus从机程序需要解析接收到的串口数据,根据功能码进行响应。比如,当主机修改地址2的寄存器值为0xFF时,程序会接收并返回确认报文。注意,Modbus从机通常不主动发送数据,而是等待主机查询。
通过这个例子,我们已经展示了基于Qt的Modbus从机程序的基本运作。更多功能码的处理和自定义串口交互,大家可以在之前的文章基础上进行深入学习。欢迎关注嵌入式从0到1,持续分享嵌入式知识。
单片机C语言怎么写Modbus通信程序?
刚好我在弄crc校验。给你一段代码。我也是冲网上抄过来的。验证过了。
unsigned short crc;
static uchar code auchCRCHi[] = {
0x, 0xC1, 0x, 0x, 0x, 0xC0, 0x, 0x, 0x, 0xC0,
0x, 0x, 0x, 0xC1, 0x, 0x, 0x, 0xC0, 0x, 0x,
0x, 0xC1, 0x, 0x, 0x, 0xC1, 0x, 0x, 0x, 0xC0,
0x, 0x, 0x, 0xC0, 0x, 0x, 0x, 0xC1, 0x, 0x,
0x, 0xC1, 0x, 0x, 0x, 0xC0, 0x, 0x, 0x, 0xC1,
0x, 0x, 0x, 0xC0, 0x, 0x, 0x, 0xC0, 0x, 0x,
0x, 0xC1, 0x, 0x, 0x, 0xC0, 0x, 0x, 0x, 0xC1,
0x, 0x, 0x, 0xC1, 0x, 0x, 0x, 0xC0, 0x, 0x,
0x, 0xC1, 0x, 0x, 0x, 0xC0, 0x, 0x, 0x, 0xC0,
0x, 0x, 0x, 0xC1, 0x, 0x, 0x, 0xC1, 0x, 0x,
0x, 0xC0, 0x, 0x, 0x, 0xC0, 0x, 0x, 0x, 0xC1,
0x, 0x, 0x, 0xC0, 0x, 0x, 0x, 0xC1, 0x, 0x,
0x, 0xC1, 0x, 0x, 0x, 0xC0, 0x, 0x, 0x, 0xC0,
0x, 0x, 0x, 0xC1, 0x, 0x, 0x, 0xC1, 0x, 0x,
0x, 0xC0, 0x, 0x, 0x, 0xC1, 0x, 0x, 0x, 0xC0,
0x, 0x, 0x, 0xC0, 0x, 0x, 0x, 0xC1, 0x, 0x,
0x, 0xC1, 0x, 0x, 0x, 0xC0, 0x, 0x, 0x, 0xC0,
0x, 0x, 0x, 0xC1, 0x, 0x, 0x, 0xC0, 0x, 0x,
0x, 0xC1, 0x, 0x, 0x, 0xC1, 0x, 0x, 0x, 0xC0,
0x, 0x, 0x, 0xC1, 0x, 0x, 0x, 0xC0, 0x, 0x,
0x, 0xC0, 0x, 0x, 0x, 0xC1, 0x, 0x, 0x, 0xC0,
0x, 0x, 0x, 0xC1, 0x, 0x, 0x, 0xC1, 0x, 0x,
0x, 0xC0, 0x, 0x, 0x, 0xC0, 0x, 0x, 0x, 0xC1,
0x, 0x, 0x, 0xC1, 0x, 0x, 0x, 0xC0, 0x, 0x,
0x, 0xC1, 0x, 0x, 0x, 0xC0, 0x, 0x, 0x, 0xC0,
0x, 0x, 0x, 0xC1, 0x, 0x
};
// CRC 低位字节值表
static uchar code auchCRCLo[] = {
0x, 0xC0, 0xC1, 0x, 0xC3, 0x, 0x, 0xC2, 0xC6, 0x,
0x, 0xC7, 0x, 0xC5, 0xC4, 0x, 0xCC, 0x0C, 0x0D, 0xCD,
0x0F, 0xCF, 0xCE, 0x0E, 0x0A, 0xCA, 0xCB, 0x0B, 0xC9, 0x,
0x, 0xC8, 0xD8, 0x, 0x, 0xD9, 0x1B, 0xDB, 0xDA, 0x1A,
0x1E, 0xDE, 0xDF, 0x1F, 0xDD, 0x1D, 0x1C, 0xDC, 0x, 0xD4,
0xD5, 0x, 0xD7, 0x, 0x, 0xD6, 0xD2, 0x, 0x, 0xD3,
0x, 0xD1, 0xD0, 0x, 0xF0, 0x, 0x, 0xF1, 0x, 0xF3,
0xF2, 0x, 0x, 0xF6, 0xF7, 0x, 0xF5, 0x, 0x, 0xF4,
0x3C, 0xFC, 0xFD, 0x3D, 0xFF, 0x3F, 0x3E, 0xFE, 0xFA, 0x3A,
0x3B, 0xFB, 0x, 0xF9, 0xF8, 0x, 0x, 0xE8, 0xE9, 0x,
0xEB, 0x2B, 0x2A, 0xEA, 0xEE, 0x2E, 0x2F, 0xEF, 0x2D, 0xED,
0xEC, 0x2C, 0xE4, 0x, 0x, 0xE5, 0x, 0xE7, 0xE6, 0x,
0x, 0xE2, 0xE3, 0x, 0xE1, 0x, 0x, 0xE0, 0xA0, 0x,
0x, 0xA1, 0x, 0xA3, 0xA2, 0x, 0x, 0xA6, 0xA7, 0x,
0xA5, 0x, 0x, 0xA4, 0x6C, 0xAC, 0xAD, 0x6D, 0xAF, 0x6F,
0x6E, 0xAE, 0xAA, 0x6A, 0x6B, 0xAB, 0x, 0xA9, 0xA8, 0x,
0x, 0xB8, 0xB9, 0x, 0xBB, 0x7B, 0x7A, 0xBA, 0xBE, 0x7E,
0x7F, 0xBF, 0x7D, 0xBD, 0xBC, 0x7C, 0xB4, 0x, 0x, 0xB5,
0x, 0xB7, 0xB6, 0x, 0x, 0xB2, 0xB3, 0x, 0xB1, 0x,
0x, 0xB0, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x,
0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x9C, 0x5C,
0x5D, 0x9D, 0x5F, 0x9F, 0x9E, 0x5E, 0x5A, 0x9A, 0x9B, 0x5B,
0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x4B, 0x8B,
0x8A, 0x4A, 0x4E, 0x8E, 0x8F, 0x4F, 0x8D, 0x4D, 0x4C, 0x8C,
0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x,
0x, 0x, 0x, 0x, 0x, 0x
};
//CRC校验的函数
unsigned short CRC(unsigned char *puchMsg, unsigned short usDataLen)
{
unsigned char uchCRCHi = 0xFF ; /* 高CRC字节初始化 */
unsigned char uchCRCLo = 0xFF ; /* 低CRC 字节初始化 */
unsigned uIndex ; /* CRC循环中的索引 */
while (usDataLen--) /* 传输消息缓冲区 */
{
uIndex = uchCRCHi ^ *puchMsg++ ; /* 计算CRC */
uchCRCHi = uchCRCLo ^ auchCRCHi[uIndex] ;
uchCRCLo = auchCRCLo[uIndex] ;
}
return (uchCRCHi << 8 | uchCRCLo) ;
}
调用方式:dd=CRC(tmp,x);
串口调试工具——Modbus Slave使用
一、Modbus Slave使用指南 Modbus Slave是一款模拟器,适用于构建个从设备/地址域的场景。该工具支持OLE自动化功能,与Excel报表集成,用于模拟Modbus从站设备,接收主站指令,回送数据包,帮助Modbus通讯设备开发者进行协议测试和调试。 1、安装与注册 安装过程简单,双击运行ModbusSlave快捷方式即可。破解方法:在"Connection->Connect"中打开注册窗口,复制ModbusPoll序列号,粘贴至注册栏后点击"OK"完成破解。安装和破解流程与ModbusPoll类似。 2、主窗口 启动后,主窗口显示"未连接"状态。如需测试"输出保持寄存器",可直接跳至步骤3进行连接。 3、参数设置 点击"Setup->Slave Definition.. F2"进入设置界面。设置内容包括: Slave:从站地址,对应主界面ID值,默认1。 Function:寄存器功能码选择,四种选项对应特定功能。 Address:寄存器起始地址,默认从1开始。 Length:寄存器连续数量,默认个。 设置后,模拟窗口显示定义的寄存器列表,包含ID、功能码。点击寄存器可修改值或状态。 4、显示设置 默认以Signed方式显示进制无符号二进制数,范围-至。通过"Display"菜单选择其他显示方式。默认使用PLC地址,若需调整起始地址为0,选择"Protocol Addresses(Base 0)"。一般使用默认设置即可。 5、连接 点击"Connection->Connect.. F3"启动连接。配置界面包括端口、模式、流控制等参数,默认设置为串口1、波特率、数据位8、校验位无、停止位1。确认设置后点击"OK"完成连接。 6、寄存器值改变 双击主窗口寄存器地址,弹出修改对话框。输入值后确认,范围为-至。勾选"Auto increment"后,值每秒增加1。 7、查看通信数据帧 点击"Display->Communication…",打开监视窗口,查看收发数据帧。窗口显示序号、接收和发送数据帧。 8、断开连接 点击"Disconnect F4"断开连接。连接状态变为"未连接"。 通过上述步骤,用户可以高效地进行Modbus通讯协议的模拟和测试。