ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

ModSim32与ModScan32主从联调:从站先开、地址偏移与报文验证

ModSim32与ModScan32主从联调:从站先开、地址偏移与报文验证 简介这份文档面向工业自动化、HMI组态开发及Modbus协议调试的初学者与工程技术人员系统讲解ModSim32与ModScan32两款常用调试工具的定位与用法。ModSim32用于模拟从设备可在HMI组态开发中改变寄存器状态以验证画面变量配置ModScan32用于模拟主设备向智能仪表等从机发送指令并读取寄存器返回数据。文档还说明了两者在同一台电脑上配合模拟数据收发的方法并特别提示ModSim32可对所有功能代码地址写操作而ModScan32仅支持0和4功能代码地址写入1和3功能代码地址为只读帮助读者避开调试中的常见误区。资源包共1个doc文件约14KB内容精炼、便于随查随用。目前已有1667人学习下载适合需要快速上手Modbus RTU与TCP/IP调试、掌握主从设备模拟与寄存器读写规则的读者参考。1. ModSim32 与 ModScan32一对主从搭档到底谁先开手里只有一根 USB 转 485 线、一台还没接 PLC 的工控机却要先把 Modbus 链路跑通——这种场景下ModSim32 和 ModScan32 就是最省事的一对组合。ModSim32 扮演从站Slave在 PC 上虚拟出一堆线圈和寄存器ModScan32 扮演主站Master按 Modbus RTU 或 Modbus TCP 去读写这些虚拟点位。一个造数据一个读数据不用真实设备就能把报文、校验、地址偏移这些容易翻车的地方先摸清楚。它适合刚接触 Modbus 协议的调试人员、要验证上位机轮询逻辑的工程师以及手头暂时没有硬件、又想先把 modbus 报文 和寄存器映射搞明白的人。下面按「先建从站、再连主站、最后排错」的顺序讲透。2. 先把从站立起来ModSim32 的寄存器映射与连接参数2.1 为什么先开从站而不是先开主站Modbus 是请求—应答模型主站发什么、从站答什么主动权在主站但从站必须先在线主站才有对象可问。很多人习惯先打开 ModScan32 点 Connect结果一直超时回头才发现 ModSim32 根本没启动。血泪经验是调试顺序永远是「从站先监听主站后发起」。ModSim32 启动后会在本机打开一个串口或 TCP 端口等待主站请求如果它没起来主站的任何请求都石沉大海。ModSim32 的核心是「设备 ID 功能码 起始地址 数量」四要素。它默认把数据分成四类线圈Coil可读写功能码 01/05/15、离散输入Discrete Input只读02、保持寄存器Holding Register可读写03/06/16、输入寄存器Input Register只读04。这四类地址空间在协议里是独立的0x0000 在线圈和保持寄存器里是两个完全不同的位置新手最容易在这里翻车。2.2 建立从站连接串口与 TCP 两种模式先看串口Modbus RTU模式。打开 ModSim32菜单 Connection → Connect选择 Serial Port参数要和主站严格一致参数常用值说明PortCOM3以设备管理器实际枚举为准Baud Rate9600 / 19200 / 115200两端必须相同Data Bits8Modbus RTU 固定 8 位ParityNone / Even两端必须相同None 最常见Stop Bits1多数设备为 1ModeRTU与 ASCII 不能混用TCP 模式则选 Connection → Connect → TCP/IP监听端口默认 502。注意 ModSim32 在 TCP 模式下是作为 Server 存在的ModScan32 作为 Client 去连它别把角色搞反。2.3 配置寄存器区地址、数量与初值连接建立后在 ModSim32 主界面设置从站地址Slave ID常用 1、功能码区域和起始地址。比如要模拟 10 个保持寄存器从 40001 开始Slave ID: 1 Function: 03 (Holding Register) Address: 0000 (对应协议地址 0x0000即 40001) Length: 10这里有个关键点ModSim32 界面上显示的地址可能是 1 基40001而协议报文里是 0 基0x0000。两者差 1配置时以工具显示为准抓包时以报文为准。设置完成后双击某个寄存器单元格就能改初值主站读到的就是这些值。提示ModSim32 的寄存器值默认是十进制显示排查报文时切到 Hex 视图更直观能直接和抓到的字节对上。3. 主站发起轮询ModScan32 的地址偏移与报文验证3.1 ModScan32 的连接与轮询配置ModScan32 是主站负责发请求。打开后先 Connection → Connect参数与 ModSim32 完全对应。连接成功后在主界面设置Device ID填 ModSim32 里的 Slave ID比如 1Function选 03读保持寄存器或 01读线圈Address起始地址注意这里是 0 基还是 1 基Length一次读多少个寄存器Scan Rate轮询间隔单位毫秒点 Start Poll 后ModScan32 会周期性发请求界面上实时刷新读回的值。如果值在跳变说明链路通了如果一直显示超时或异常码就要往下查。3.2 地址偏移最容易踩的 1 与 0 之争Modbus 协议文档里保持寄存器常写成 4000149999这是 1 基的「逻辑地址」而报文里的起始地址是 0 基的「协议地址」。40001 对应协议地址 0x000040002 对应 0x0001。ModScan32 的 Address 框如果填 1它可能发的是 0x0001读到的就是 40002。很多人发现「读到的值总是差一个寄存器」根源就在这里。判断方法在 ModScan32 里把 Address 改成 0看读回的第一个值是不是 ModSim32 里 40001 的值。如果是说明这个工具用的是 0 基如果改成 1 才对说明是 1 基。不同版本行为可能不同以实测为准别死记。3.3 用报文窗口验证功能码与校验ModScan32 一般带一个报文监视窗口有的版本叫 Message Display 或 Traffic。打开后能看到实际发出的请求和收到的应答例如请求: 01 03 00 00 00 0A C5 CD 应答: 01 03 14 00 01 00 02 ... (后面是数据和 CRC)逐字段拆01 是从站地址03 是功能码00 00 是起始地址00 0A 是读 10 个寄存器C5 CD 是 CRC16 校验。应答里 14 是字节数10 个寄存器 × 2 字节 20 0x14。如果 CRC 不对从站会直接丢弃主站表现为超时。用 modbus校验码在线计算 工具核对一下 CRC能快速判断是配置问题还是线路问题。注意RTU 模式下帧与帧之间要有 3.5 个字符时间的静默间隔ModScan32 的 Scan Rate 设得太小比如 10ms可能导致帧粘连从站解析失败。一般设 100ms 以上更稳。4. 避坑与排查ModSim32/ModScan32 联调常见问题4.1 一直超时连不上现象ModScan32 点 Connect 后状态栏一直 Timeout读不到任何数据。 原因最常见的是从站没启动、串口号选错、波特率/校验位不一致或者 TCP 模式下 IP/端口填错。 解决先确认 ModSim32 已经 Connect 且处于监听状态在设备管理器核对 COM 口把两端波特率、数据位、校验、停止位逐项对齐TCP 模式确认 ModScan32 填的是 ModSim32 所在机器的 IP 和 502 端口。4.2 读到的值差一个寄存器现象ModScan32 读回的值总是 ModSim32 里下一个寄存器的值。 原因地址基准不一致主站按 1 基发从站按 0 基解析或反过来。 解决把 ModScan32 的 Address 减 1 或加 1 试一次观察是否对齐同时看报文窗口里的起始地址字段确认实际发出的是 0x0000 还是 0x0001。4.3 功能码异常码 02 或 03现象应答里功能码变成 0x83后面跟异常码 02非法数据地址或 03非法数据值。 原因请求的地址范围超出了 ModSim32 里配置的寄存器区或者数量超限。 解决检查 ModSim32 里该功能码区域配置的起始地址和长度确保主站请求的地址落在范围内单次读取数量不要超过 125 个寄存器功能码 03 的上限。4.4 数据跳变或乱码现象读回的值偶尔跳变或明显不是写入的初值。 原因串口线接触不良、共地没做好、波特率偏高导致误码或 Scan Rate 太小造成帧冲突。 解决换屏蔽双绞线并确保两端共地把波特率降到 9600 试把 Scan Rate 调到 200ms 以上用报文窗口看是否有 CRC 错误帧。4.5 TCP 模式连不上但串口正常现象串口模式一切正常切到 TCP 就超时。 原因ModSim32 在 TCP 下是 ServerModScan32 是 Client角色填反或防火墙拦了 502 端口。 解决确认 ModSim32 选的是 TCP Server 并已监听ModScan32 填目标 IP 和端口去连临时关闭防火墙或放行 502 端口测试。5. 进阶技巧用脚本批量造数据与自动化验证5.1 为什么还要脚本ModSim32 手动改寄存器值适合小规模验证但要做压力测试、模拟传感器连续变化、或者验证上位机的批量轮询逻辑时手点太慢。常见做法是用 Python 的 pymodbus 起一个从站或用 pymodbus 客户端去读写 ModSim32把「造数据」和「验数据」自动化。5.2 用 pymodbus 客户端读写 ModSim32下面这段代码连到 ModSim32 的 TCP 从站读 10 个保持寄存器并打印from pymodbus.client import ModbusTcpClient # ModSim32 作为 TCP ServerIP 和端口按实际填 client ModbusTcpClient(127.0.0.1, port502) client.connect() # slave1 对应 ModSim32 里的 Slave ID # address0 对应协议地址 0x0000即 40001 rr client.read_holding_registers(address0, count10, slave1) if not rr.isError(): print(读回寄存器:, rr.registers) else: print(异常:, rr) client.close()逻辑说明address0是协议地址不是 40001 这种逻辑地址pymodbus 用的是 0 基。count10一次读 10 个别超过 125。slave1必须和 ModSim32 的 Slave ID 一致否则从站不响应。如果返回异常先看rr里的异常码再对照第 4 章的排查表。5.3 用脚本批量写值模拟传感器要模拟温度从 20 缓慢升到 30可以循环写保持寄存器import time from pymodbus.client import ModbusTcpClient client ModbusTcpClient(127.0.0.1, port502) client.connect() for temp in range(20, 31): # 写单个保持寄存器address0 即 40001 client.write_register(address0, valuetemp, slave1) print(写入温度:, temp) time.sleep(1) client.close()逻辑说明write_register对应功能码 06写单个寄存器。valuetemp是十进制值ModSim32 界面会同步刷新。time.sleep(1)控制变化节奏模拟真实传感器。如果要一次写多个用write_registers对应功能码 16。5.4 验证方法抓包 报文比对自动化跑起来后怎么确认数据真的对两个手段一是 ModScan32 的报文窗口看请求和应答的字节是否和脚本预期一致二是用 modbus校验码在线计算 工具核对 CRC。如果脚本读回的值和 ModSim32 界面显示的一致且报文窗口里功能码、地址、数量都对得上这条链路就算验证通过了。我自己的习惯是每次换新设备或新上位机先用 ModSim32 ModScan32 把地址偏移和功能码确认一遍再上真实 PLC。这一步多花十分钟能省掉现场半天排查。希望帮到你。本文还有配套的精品资源点击获取
返回列表