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,unrar 源码一般情况下使用默认的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 协议,重点放在设备端的daseygenius源码实现。在了解 Modbus 协议时,我们曾绘制过一个 OSI 模型图,这是一个分层设计图,类似于建房子时建筑师绘制的设计图。不过,让我们回到正题。
编码前,遵循协议设计三层结构:物理层与控制芯片使用 UART 与一个 GPIO 进行交互。接下来,让我们详细探讨字节编码、链路层与应用层。
字节编码方面,链路层的主要职责是接收服务,芯片与物理层之间通信接口是 UART,因此需要处理串口接收。modbus 报文结构定义为无特殊帧头、帧尾,如何判定接收到一个完整的帧?modbus 标准规定帧间隔至少须 3.5 个字节时间,字节间隔不得大于 1.5 字节时间。因此,只要 3.5 字节时间内没有新收到数据,即可能接收到一帧。为确保数据完整,我们需加上 CRC 校验,这样便能判定数据帧的接收。
接下来,我们设计一个收发状态机,以实现 3.5 字节时间的判定。T3.5 和 T1.5 字节时间的计算基于字节长度和波特率,这里以波特率 为例,进行计算。若使用其他单片机,实现方式相似,只需相应调整。
应用层中,数据关联是关键。回顾 modbus 协议,标准将用户应用数据规划为四张表。我们以最常见的 0x、0x 命令为例,openkm 源码仅需使用后两种表。这两条命令以 位地址进行索引,与用户应用数据关联。我们设计一个数据表来实现这一关联。
接下来,我们将数据表绘制成一张图来分析。首先设计一个索引枚举 E_IDXS,与 appDataTable 里的条目一一对应,appDataTable 类似字典,用于快速存取应用数据的下标。利用 T_APP_DATA_TABLE 结构体,通过 void 指针实现任意类型数据与长度的抽象。这里甚至可以放入自定义数据类型。实现方式是设计一个 modbus 寄存器表结构体,其中包含地址、索引和数据类型三个数据成员。这样,modbus 寄存器表与应用数据便实现了关联。
有了数据字典映射管理,根据寄存器表进行索引,实现内存读写操作。为此,我们需要实现两个读写接口,供 modbus 应用层访问:GetDataFromReg 函数负责从寄存器表中通过查字典获取对应的应用数据内存地址,并将数据复制到 pBuf 所指向的缓冲区。StoreDataToReg 函数则负责接收报文,查询寄存器表中的数据索引和数据类型,实现数据搬运。
在应用层,需要注意 modbus 报文中字节序的规则,如地址 对应 进制的 0x4E,报文中先传 0x4E,后传 0x。
链路层中,帧校验本需实现,但由于 单片机资源有限,接收采用逐字节中断方式,因此将其移至应用层处理。主要思路是判断 layer2 是否接收报文,然后校验该报文是jfinalshop 源码否正确,若正确则进行校验,并转入相应的命令处理。
在数据校验部分,除了 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通讯协议的模拟和测试。