MODBUS协议学习总结

MODBUS协议学习总结 MODBUS协议Modbus 协议主要分为串口Serial​ 和网络TCP/IP​ 两种物理传输方式。这两种方式在电气接口、报文格式和应用场景上有显著区别。上文提供的拓扑图中 传感器与数据汇总控制 Modbus RTU (串口) 、主控设备与数据汇总控制 Modbus RTU (串口) 、网络后台与数据汇总控制 Modbus TCP (网络) 。A. Modbus RTU (串口) 报文示例01 03 00 00 00 08 44 0C解析01从站地址 (Slave ID)03功能码。00 00起始地址。00 08寄存器数量。44 0CCRC 校验码串口特有B. Modbus TCP (网络) 报文示例42 00 00 00 06 01 03 01 3F 00 20解析42 00事务标识符Transaction ID用于配对请求和响应00 00协议标识符固定为000 06长度后面还有6个字节01单元标识符这里通常填充从站 ID因为 TCP 用 IP 寻址这个字节是为了兼容串口设备03 01 3F 00 20真正的 Modbus 数据功能码地址数量具体连接操作在 Modbus Poll / Slave 软件中的配置区别场景一连接串口设备如 USB 转 4851.打开软件点击 Connection - Connect2.选择 Serial Port3.设置参数Port选择正确的 COM 口如 COM3可打开设备管理器查看具体的端口号Baud Rate9600必须与设备一致ParityNone无校验Data Bits8Stop Bits14.点击 OK场景二连接网络设备如超容柜网关、PLC 网口1.打开软件点击 Connection - Connect2.选择 TCP/IP3.设置参数Mode选择 Client大多数情况软件作为客户端去连接设备IP Address填写设备的 IP如 192.168.1.100Port502默认4.点击 OK常见问题与排查MODBUS模拟软件在Modbus开发与调试中模拟软件是必不可少的工具。它们通常分为两类主站模拟器模拟主机/客户端如PLC、上位机和从站模拟器模拟从机/服务器如传感器、变流器。Modbus PollModbus Poll主站/客户端用于主动发送请求读取从站数据。目前软件支持01、02、03、04、05、06、15、16功能码异常报文检测原始报文查看数据记录等功能是调试Modbus协议栈的好帮手。串口配置1. 在配置窗口中配置好端口号、波特率、数据位、校验位、停止位一般是9600波特率9600 Baud8个数据位8 Data bits无校验位None Parity1个停止位1 Stop Bit。2. 根据通信的从机设备选择使用RTU模式或ASCII模式工业应用的话一般使用RTU模式很少使用ASCII模式3. 再设置下超时时间和帧间隔时间实际就是每个窗口之间的发送间隔超时时间可以按默认1s就行Modbus国标规定是200ms到1s。帧间隔时间按默认20ms设置即可。4. 设置完点OK即可完成设置进行连接。TCP配置1. 设置好IP及端口号Modbus/TCP的默认端口号为502。2. 设置完点OK即可完成设置进行连接。“读/写定义”Read/Write Definition​ 配置界面Slave ID可以配置从机地址Function可以配置功能码Address可以配置读/写的寄存器/线圈起始地址Quantity可以配置读/写的寄存器/线圈个数Scan Rate可以配置帧的扫描周期Disable有两个勾选项Read/Write Disabled可以选择是否禁止读写Disable on error可以选择是否一出错就停止读写。Rows可以选择该窗口一列可以显示多少行数字是对应的行数最后一个选项Fit to Quantity是可以根据前面设置的Quantity数量自动匹配行数。Hide Alias Columns可以选择是否隐藏Alias列。PLC Addresses(Base 1)可以选择通信的基地址是从0开始还是从1开始。Address in Cell可以选择是否在每个单元格中显示地址。Enron/Daniel Mode增加了浮点的数据类型扩展读写一个寄存器是4个字节主要用于跟支持该模式的设备通信用的。设置完成点OK或Apply应用即可。窗口操作发送写指令双击数据的位置可快速调出编辑写指令的窗口默认按当前窗口配置的寄存器类型所使用的单个写功能码输入需要修改的数值点击发送即可完成一次寄存器/线圈的写入。Close dialog on Response ok可选择发送后如果正常响应则关闭此窗口。Use Function可选择使用什么功能码发送保持寄存器类型的只提供06和16功能码选择线圈类型的只提供05和15功能码选择。修改寄存器描述双击数据前的空白区域Alias列可对其进行修改根据实际寄存器/线圈的数据含义可以此进行备注方便调试时查看。数据类型修改点击需要修改的数据可以批量选择右键单击选择Format根据使用的场景选择不同的数据类型。modbus poll模拟主站工具使用教程参考链接https://blog.csdn.net/u012749085/article/details/125270869Modbus SlaveModbus Slave从站/服务器用于模拟下位机设备。点击菜单栏Connection-Connect...或者按快捷键F3弹出连接配置窗口在连接选项那里选择Serial Port表示当前是用串口通信如果使用的是Modbus/TCP则选择“TCP/IP”Error Simulation故障模拟Skip response跳过响应目前实测是主机每发10帧Slave这边会有一帧不回Insert CRC/LRC error插入CRC/LRC错误目前实测是主机每发10帧Slave这边会有一帧返回错误CRC/LRC校验Response delay延迟回复时间可以设置接收到数据后延时回复的时间Return exception 06. Busy返回设备繁忙状态即故障码06窗口操作双击数据的位置可修改当前地址的寄存器/线圈数值。Auto increment可选择是否每次通信后自动增加数值。可以作为一个心跳包来使用查看收发报文选择Display-Communication...可打开查看收发报文的窗口。通过这个窗口可以查看当前的原始收发报文有助于异常的分析。也可以点Log把当前报文保存下来。modbus slave模拟从站工具使用教程参考链接【工具使用】Modbus Slave软件使用详解-CSDN博客工程实例上文提供的拓扑图中 传感器与数据汇总控制 Modbus RTU (串口) 、主控设备与数据汇总控制 Modbus RTU (串口) 、网络后台与数据汇总控制 Modbus TCP (网络) 。准备两根.USB转485线PC电脑一台安装modbus模拟主机软件和modbus模拟从机软件、网线一根1. 第一根USB转485线正确连接数据汇总控制485端口的A1、B1其中A1B1接的主控设备上行波特率9600 无校验使用 modbus poll模拟主站工具代替主控设备与数据汇总控制通讯2. 第二根USB转485线正确连接数据汇总控制485端口的A2、B2其中A2B2接的传感器下行波特率4800 无校验使用 modbus slave模拟从站工具代替传感器与数据汇总控制通讯3. 网线连接数据汇总控制和PC电脑IP必须位于同一网段IP200.200.200.190 使用 modbus poll模拟主站工具代替网络后台与数据汇总控制通讯传感器协议表格中“UPS本机输出有功功率H”和“L”对应的数据格式为32位有符号整数占两个寄存器缩放因子为0.1 kW。要设定目标值为200 kW需要进行相应的换算并分高低位写入。以下是详细的计算过程和软件操作步骤1. 数据计算与分析目标物理值200 kW寄存器缩放比例0.1 kW 即寄存器内数值乘以0.1等于实际功率寄存器目标数值200÷0.12000数据格式拆分由于数值 2000 在十六进制中为0x000007D0这是一个32位数据。需要将其拆分为高16位和低16位高16位 (High Word)0x0000对应十进制 0低16位 (Low Word)0x07D0对应十进制 20002. 操作过程基于 Modbus Poll 界面要完成写操作需要将界面顶部的Function功能码​ 从读取模式切换为写入模式。提供以下两种常用方法方法一使用“单次读写”按钮最快捷推荐这是最直接的测试写入方式无需修改主界面的下拉菜单。准备数据在软件主界面的数值显示区域通常在下方表格找到地址1003​ 和1004​ 对应的单元格。输入数值在地址1003​ 的格子里输入高字0在地址1004​ 的格子里输入低字2000执行写入鼠标右键点击地址 1003 所在的行选择Write Single Register写单个寄存器将 1003 地址的值写为 0。鼠标右键点击地址 1004 所在的行选择Write Single Register将 1004 地址的值写为 2000。方法二修改 Function 下拉菜单连续写入模式如果您希望像之前配置读取一样设定好参数让软件自动轮询写入可以修改顶部配置更改功能码点击界面上方的Function​ 下拉框将03 Read Holding Registers修改为06 Write Single Register。设置地址将Address​ 修改为1003必须从高位寄存器开始写。输入数值在Quantity​ 下方的数值框或直接在主界面双击输入0然后点击Write/Write Once​ 按钮。写入低位将Address​ 改为1004数值框输入2000再次点击写入按钮。3. 验证结果写入完成后建议将界面顶部的 Function 改回03 Read Holding Registers并设置 Address 为 1003Quantity 为 2点击 Apply。观察软件读取出的数值如果显示为2000或根据显示格式可能显示为 200.0则说明 200 kW 的设定已成功生效。以下是对该Modbus TCP报文的逐层详细解析结合您之前提供的超容柜协议规则一、报文整体结构Modbus TCPModbus TCP报文由MBAP头7字节和PDU协议数据单元组成。Tx主站→从站请求​ 和Rx从站→主站响应​ 的事务标识符42 00一致说明是同一组通信。二、Tx请求报文解析主站发往从站Tx:000196-01 42 00 00 00 06 01 03 01 3F 00 20字段十六进制值十进制值含义说明事务标识符​42 0066主站生成的唯一标识用于匹配请求与响应此处为第66次请求。协议标识符​00 000固定为0表示Modbus协议。长度​00 066MBAP头后后续数据的总字节数即01 03 01 3F 00 20共6字节。单元标识符​011从站设备地址对应超容柜的ID1。功能码​033读保持寄存器Holding Registers。起始地址​01 3F319从寄存器地址319十进制开始读取协议中可能对应“簇1内侧总压”等参数。寄存器数量​00 2032连续读取32个保持寄存器每个寄存器2字节共64字节数据。三、Rx响应报文解析从站返回主站Rx:000197-01 42 00 00 00 43 01 03 40 06 77 06 6A 00 00 00 00 00 00 00 00 00 00 00 00 06 7B 06 68 00 00 00 00 00 00 00 00 00 00 00 00 06 7F 06 6A 00 00 00 00 00 00 00 00 00 00 00 00 06 C8 06 6A 00 00 00 00 00 00 00 00 00 00 00 00字段十六进制值十进制值含义说明事务标识符​42 0066与Tx一致确认是同一请求的响应。协议标识符​00 000固定为0。长度​00 4367后续数据总字节数01 03 40 64字节数据 67字节。单元标识符​011从站地址与Tx一致。功能码​033成功响应读保持寄存器请求若出错会返回83错误码。字节计数​4064后续数据的总字节数32个寄存器 × 2字节/寄存器 64字节。寄存器数据​详见下文—32个寄存器的具体数值每个寄存器2字节按地址顺序排列。四、寄存器数据解析结合超容柜协议起始地址为319十进制共32个寄存器按2字节/寄存器解析对应物理量协议规定电压×0.1V电流×0.1A寄存器地址十进制十六进制值十进制值物理量换算协议规则含义推测需以协议文档为准31906 7716551655×0.1165.5 V1#簇内侧总压32006 6A16421642×0.1164.2 V1#簇外侧总压32100 0000×0.10 V1#簇外侧负总压未启用/正常32200 0000×0.10 A1#簇总电流无电流323–32600 000—备用/未使用寄存器32706 7B16591659×0.1165.9 V2#簇内侧总压32806 6816401640×0.1164.0 V2#簇外侧总压329–33200 000—备用/未使用寄存器33306 7F16631663×0.1166.3 V3#簇内侧总压33406 6A16421642×0.1164.2 V3#簇外侧总压335–33800 000—备用/未使用寄存器33906 C817361736×0.1173.6 V4#簇内侧总压34006 6A16421642×0.1164.2 V4#簇外侧总压341–35000 000—备用/未使用寄存器五、关键结论通信正常事务标识符匹配功能码03无错误从站返回了32个寄存器的有效数据。设备状态各簇电压均在164V–174V区间符合超容柜正常工作电压范围所有簇电流均为0A当前无充放电动作备用寄存器未使用值为0。协议一致性数据与您之前提到的“电压×0.1V”规则完全吻合验证了协议的准确性。