本文以综科智控品牌的IO控制器为例,直接以实际例子讲解modbus协议 目录 一、MODBUS协议简介4 1.什么是MODBUS协议4 2.MODBUS协议格式5 2.1MODBUS-RTU报文模型(用于串口通讯)5 2.2MODBUS-TCP报文模型(用于网络TCP/IP通信)5 3.MODBUS的功能码及寄存器介绍5 3.1功能码5 3.2寄存器分类说明6 3.3寄存器地址说明6 二、MODBUS-RTU协议详解7 1.X输入口开关量状态读取 (读取:DI寄存器,命令号:0x02)7 2.X输入口脉冲计数读取 (读取:AI寄存器,命令号:0x04)9 3.X输入口脉冲计数清空 (写入:DO寄存器,命令号:0x0F)12 4.Y输出口ON/OFF写入 (写入:DO寄存器,命令号:0x0F)14 5.Y输出口ON/OFF读取 (读取:DO寄存器,命令号:0x01)16 6.AI模拟量采集读取(读取:AI寄存器,命令号:0x04)18 7.AO模拟量输出写入(写入:AO寄存器,命令号:0x10)20 8.AO模拟量输出读取(读取:AO寄存器,命令号:0x03)22 三、MODBUS-TCP协议详解24 1.X输入口开关量状态读取 (读取:DI寄存器,命令号:0x02)24 2.X输入口脉冲计数读取 (读取:AI寄存器,命令号:0x04)27 3.X输入口脉冲计数清空 (写入:DO寄存器,命令号:0x0F)30 4.Y输出口ON/OFF写入 (写入:DO寄存器,命令号:0x0F)33 5.Y输出口ON/OFF读取 (读取:DO寄存器,命令号:0x01)36 6.AI模拟量采集读取(读取:AI寄存器,命令号:0x04)39 7.AO模拟量输出写入(写入:AO寄存器,命令号:0x10)42 8.AO模拟量输出读取(读取:AO寄存器,命令号:0x03)45 MODBUS协议简介什么是MODBUS协议Modbus协议是一种已广泛应用于当今工业控制领域的通用通讯协议,按其格式可分为MODBUS-RTU,MODBUS-ASCII,MODBUS-TCP,其中前两者适用于串行通信控制网络中,例如RS485,RS232等,而MODBUS-TCP主要应用于基于以太网TCP/IP通信的控制网络中。 通过此协议,控制器相互之间、或控制器经由网络(如以太网)可以和其它设备之间进行通信。Modbus协议使用的是主从通讯技术,即由主设备主动查询和操作从设备。一般将主控设备方所使用的协议称为Modbus Master,从设备方使用的协议称为Modbus Slave。典型的主设备包括工控机和工业控制器等;典型的从设备如PLC可编程控制器等。Modbus通讯物理接口可以选用串口(包括RS232和RS485),也可以选择以太网口。其通信遵循以下的过程: ● 主设备向从设备发送请求 ● 从设备分析并处理主设备的请求,然后向主设备发送结果 ● 如果出现任何差错,从设备将返回一个异常功能码 Modbus协议具有以下几个特点: (1)标准、开放,用户可以免费、放心地使用Modbus协议,不需要交纳许可证费,也不会侵犯知识产权。 (2)Modbus可以支持多种电气接口,如RS-232、RS-485等,还可以在各种介质上传送,如双绞线、光纤、无线等。 (3)Modbus的帧格式简单、紧凑,通俗易懂。用户使用容易,厂商开发简单。 MODBUS-RTU报文模型(用于串口通讯)
MODBUS-TCP报文模型(用于网络TCP/IP通信)
注意: Modbus-RTU一般用于串口RS232/RS485/RS422通讯 Modbus-TCP一般用于网口、WIFI的TCP/UDP通讯 MODBUS的功能码及寄存器介绍功能码下表列出 MODBUS支持的部分功能代码:以十进制表示
寄存器分类说明
寄存器地址说明
寄存器信息地址指的是存放于控制器中的地址,这些控制器可以是 PLC,也可以使触 摸屏,或是文本显示器。例如 4x0001、3x0002等,这些地址一般使用十进制描述。
寄存器寻址地址指的是通信时使用的寄存器地址,例如信息地址 40001对应寻址地址 0x0000,40002对应寻址地址 0x0001,寄存器寻址地址一般使用 16进制描述。再如,信息寄存器 40003对应寻址地址 0002,信息寄存器 30003对应寻址地址 0002,虽然两个信息寄存器通信时使用相同的地址,但是需要使用不同的命令才可以访问,所以访问时不存在冲突。 MODBUS-RTU协议详解X输入口开关量状态读取 (读取:DI寄存器,命令号:0x02)
读模块的X输入口输入信号的 ON/OFF状态。
请求: 发送数据(HEX): 01 02 00 00 00 01 B9 CA 解释: 01:子站地址 02:指令号,02读DI 00 00:从哪一路开始读,0x0000=X1开始读 00 01:要读多少路,十六进制0x0001=十进制1,读取1路 B9 CA:CRC校验 响应: //X1 输入ON(1)时的回复 01 02 01 01 60 48 解释: 01:子站地址 02:指令号,02读DI 01:后面跟的数据字节数 01:换成二进制就是 0000 0001 =X8-X7-X6-X5-X4-X3-X2-X1输入口的当前状态0=OFF,1=ON 60 48:CRC校验 //X1 输入OFF(0)时的回复 01 02 01 00 A1 88 解释: 01:子站地址 02:指令号,02读DI 01:后面跟的数据字节数 00:换成二进制就是 0000 0000 =X8-X7-X6-X5-X4-X3-X2-X1输入口的当前状态0=OFF,1=ON A1 88:CRC校验
请求: 发送数据(HEX): 01 02 00 00 00 08 79CC 解释: 01:子站地址 02:指令号,02读DI 00 00:从哪一路开始读,0x0000=X1开始读 00 08:要读多少路十六进制0x0008=十进制8,读取8路 79CC:CRC校验 响应: //X1,X8输入ON(1)时,其他都输入OFF(0)时的回复 01 02 01 81 61 E8 解释: 01:子站地址 02:指令号,02读DI 01:后面跟的数据字节数 81:换成二进制就是1000 0001 =X8-X7-X6-X5-X4-X3-X2-X1输入口的当前状态0=OFF,1=ON 61 E8:CRC校验
请求: 发送数据(HEX): 01 02 00 00 00 18 78 00 解释: 01:子站地址 02:指令号,02读DI 00 00:从哪一路开始读,0x0000=X1开始读 00 18:要读多少路十六进制0x0018=十进制24,读取24路 78 00:CRC校验 响应: //X1,X2,X9,X24 输入ON(1)时,其他都输入OFF(0)时的回复 01 02 03 03 01 80 88 7E 解释: 01:子站地址 02:指令号,02读DI 03:后面跟的数据字节数 03:换成二进制就是 0000 0011 =X8-X7-X6-X5-X4-X3-X2-X1输入口的当前状态0=OFF,1=ON 01:换成二进制就是 0000 0001 =X16-X15-X14-X13-X12-X11-X10-X9输入口的当前状态0=OFF,1=ON 80:换成二进制就是 1000 0000 =X24-X23-X22-X21-X20-X19-X18-X17输入口的当前状态0=OFF,1=ON 88 7E:CRC校验 X输入口脉冲计数读取 (读取:AI寄存器,命令号:0x04)
读模块的X输入口的脉冲计数值。
请求: 发送数据(HEX): 01 04 00 18 00 02 F1 CC 解释: 01:子站地址 04:指令号,04读AI 00 18:从哪一路开始读,0x0018对应的是X1脉冲计数寄存器起始地址 00 02:要读多少个寄存器,因为一路X脉冲计数占用2个寄存器地址,所以这里寄存器数量要填2,十六进制0x0002=十进制2 F1 CC:CRC校验 响应: 接收数据(HEX): 01 04 04 00 00 27 10 E1 B8 解释: 01:子站地址 04:指令号,04读AI 04:后面跟的数据字节数,0x04=十进制4,后面数据区有4字节数据 00002710:换成十进制就是 0x00002710 =10000,即读取到X1输入口当前脉冲计数值为10000 E1 B8:CRC校验
请求: 发送数据(HEX): 01 04 00 18 00 08 71 CB 解释: 01:子站地址 04:指令号,04读AI 00 18:从哪一路开始读,0x0018对应的是X1脉冲计数寄存器起始地址 00 08:要读多少个寄存器,因为一路X脉冲计数占用2个寄存器地址,这里读4路,所以这里寄存器数量要填8,十六进制0x0008=十进制8 71 CB :CRC校验 响应: 接收数据(HEX): 01 04 10 00 00 27 10 00 00 27 10 00 00 27 10 00 00 27 10 EC C3 解释: 01:子站地址 04:指令号,04读AI 10:后面跟的数据字节数,0x10=十进制16,后面数据区有16字节数据 00002710:换成十进制就是 0x00002710 =10000,即读取到X1输入口当前脉冲计数值为10000 00002710:换成十进制就是 0x00002710 =10000,即读取到X2输入口当前脉冲计数值为10000 00002710:换成十进制就是 0x00002710 =10000,即读取到X3输入口当前脉冲计数值为10000 00002710:换成十进制就是 0x00002710 =10000,即读取到X4输入口当前脉冲计数值为10000 EC C3:CRC校验
请求: 发送数据(HEX): 01 04 00 18 00 10 71 C1 解释: 01:子站地址 04:指令号,04读AI 00 18:从哪一路开始读,0x0018对应的是X1脉冲计数寄存器起始地址 00 10:要读多少个寄存器,因为一路X脉冲计数占用2个寄存器地址,这里读8路,所以这里寄存器数量要填十六进制0x0010=十进制16 71 C1 :CRC校验 响应: 接收数据(HEX): 01 04 20 00 00 27 10 00 00 27 10 00 00 27 10 00 00 27 10 00 00 27 10 00 00 27 10 00 00 27 10 00 00 27 10 36 38 解释: 01:子站地址 04:指令号,04读AI 20:后面跟的数据字节数,0x20=十进制32,后面数据区有32字节数据 00002710:换成十进制就是 0x00002710 =10000,即读取到X1输入口当前脉冲计数值为10000 00002710:换成十进制就是 0x00002710 =10000,即读取到X2输入口当前脉冲计数值为10000 00002710:换成十进制就是 0x00002710 =10000,即读取到X3输入口当前脉冲计数值为10000 00002710:换成十进制就是 0x00002710 =10000,即读取到X4输入口当前脉冲计数值为10000 00002710:换成十进制就是 0x00002710 =10000,即读取到X5输入口当前脉冲计数值为10000 00002710:换成十进制就是 0x00002710 =10000,即读取到X6输入口当前脉冲计数值为10000 00002710:换成十进制就是 0x00002710 =10000,即读取到X7输入口当前脉冲计数值为10000 00002710:换成十进制就是 0x00002710 =10000,即读取到X8输入口当前脉冲计数值为10000 36 38:CRC校验
请求: 发送数据(HEX): 01 04 00 18 00 18 70 07 解释: 01:子站地址 04:指令号,04读AI 00 18:从哪一路开始读,0x0018对应的是X1脉冲计数寄存器起始地址 00 18:要读多少个寄存器,因为一路X脉冲计数占用2个寄存器地址,这里读12路,所以这里寄存器数量要填十六进制0x0018=十进制24 70 07 :CRC校验 响应: 接收数据(HEX): 01 04 30 00 00 27 10 00 00 27 10 00 00 27 10 00 00 27 10 00 00 27 10 00 00 27 10 00 00 27 10 00 00 27 10 00 00 27 10 00 00 27 10 00 00 27 10 00 00 27 10 C1 D9 解释: 01:子站地址 04:指令号,04读AI 30:后面跟的数据字节数,0x30=十进制48,后面数据区有48字节数据 00002710:换成十进制就是 0x00002710 =10000,即读取到X1输入口当前脉冲计数值为10000 00002710:换成十进制就是 0x00002710 =10000,即读取到X2输入口当前脉冲计数值为10000 00002710:换成十进制就是 0x00002710 =10000,即读取到X3输入口当前脉冲计数值为10000 00002710:换成十进制就是 0x00002710 =10000,即读取到X4输入口当前脉冲计数值为10000 00002710:换成十进制就是 0x00002710 =10000,即读取到X5输入口当前脉冲计数值为10000 00002710:换成十进制就是 0x00002710 =10000,即读取到X6输入口当前脉冲计数值为10000 00002710:换成十进制就是 0x00002710 =10000,即读取到X7输入口当前脉冲计数值为10000 00002710:换成十进制就是 0x00002710 =10000,即读取到X8输入口当前脉冲计数值为10000 00002710:换成十进制就是 0x00002710 =10000,即读取到X9输入口当前脉冲计数值为10000 00002710:换成十进制就是 0x00002710 =10000,即读到X10输入口当前脉冲计数值为10000 00002710:换成十进制就是 0x00002710 =10000,即读到X11输入口当前脉冲计数值为10000 00002710:换成十进制就是 0x00002710 =10000,即读到X12输入口当前脉冲计数值为10000 C1 D9:CRC校验 X输入口脉冲计数清空 (写入:DO寄存器,命令号:0x0F)
清空模块的X输入口的脉冲计数值。
请求: 发送数据(HEX): 01 0f 00 40 00 01 01 01 ee 98 解释: 01:子站地址 0f:指令号,0x0f=十进制15,写多路DO 00 40:从哪一路开始清空,0x00 40是X1计数清空DO寄存器起始地址 00 01:要清空多少路计数,十六进制0x0001=十进制1路 01:后面要写入的数据字节数,0x01=十进制1,写入1字节数据 01:写入的数据,写1清空 ee 98:CRC校验 响应: //模块回复 01 0F 00 40 00 01 95 df 解释: 01:子站地址 0f:指令号,0x0f=十进制15,写多路DO 00 40:从哪一路开始清空,0x00 40是X1计数清空DO寄存器起始地址 00 01:要清空多少路计数,十六进制0x0001=十进制1路 95 df:CRC校验
请求: 发送数据(HEX): 01 0f 00 40 00 0C 02 ff 0f ea 84 解释: 01:子站地址 0f:指令号,0x0f=十进制15,写多路DO 00 40:从哪一路开始清空,0x00 40是X1计数清空DO寄存器起始地址 00 0C:要清空多少路计数,十六进制0x000C=十进制12路 02:后面要写入的数据字节数,0x02=十进制2,写入2字节数据 ff:十六进制0xff=二进制1111 1111=X8计数清空-X7计数清空-X6计数清空-X5计数清空-X4计数清空-X3计数清空-X2计数清空-X1计数清空,对应的bit位写1清空,写0保持不变 0f: 十六进制0x0f=二进制0000 1111=X16计数清空-X15计数清空-X14计数清空-X13计数清空-X12计数清空-X11计数清空-X10计数清空-X9计数清空,对应的bit位写1清空,写0保持不变 ea 84:CRC校验 响应: //模块回复 01 0F 00 40 00 0C 54 1A 解释: 01:子站地址 0f:指令号,0x0f=十进制15,写多路DO 00 40:从哪一路开始清空,0x00 40是X1计数清空DO寄存器起始地址 00 0C:要清空多少路计数,十六进制0x000C=十进制12路 54 1A:CRC校验
请求: 发送数据(HEX): 01 0f 00 40 00 18 03 85 08 80 16 39 解释: 01:子站地址 0f:指令号,0x0f=十进制15,写多路DO 00 40:从哪一路开始清空,0x00 40是X1计数清空DO寄存器起始地址 00 18:要清空多少路计数,十六进制0x0018=十进制24路 03:后面要写入的数据字节数,0x03=十进制3,写入3字节数据 85:十六进制0x85=二进制1000 1001=X8计数清空-X7计数清空-X6计数清空-X5计数清空-X4计数清空-X3计数清空-X2计数清空-X1计数清空,对应的bit位写1清空,写0保持不变 08: 十六进制0x08=二进制0000 1000=X16计数清空-X15计数清空-X14计数清空-X13计数清空-X12计数清空-X11计数清空-X10计数清空-X9计数清空,对应的bit位写1清空,写0保持不变 80: 十六进制0x80=二进制1000 0000=X24计数清空-X23计数清空-X22计数清空-X21计数清空-X20计数清空-X19计数清空-X18计数清空-X17计数清空,对应的bit位写1清空,写0保持不变 16 39:CRC校验 响应: //模块回复 01 0F 00 40 00 18 54 15 解释: 01:子站地址 0f:指令号,0x0f=十进制15,写多路DO 00 40:从哪一路开始清空,0x00 40是X1计数清空DO寄存器起始地址 00 18:操作了多少路计数,十六进制0x0018=十进制24路 54 15:CRC校验 Y输出口ON/OFF写入 (写入:DO寄存器,命令号:0x0F)
用于控制模块Y输出点的开关状态。
请求: 发送数据(HEX): 01 0f 00 00 00 01 01 01 ef 57 解释: 01:子站地址 0f:指令号,0x0f=十进制15,写多路DO 00 00:从哪一路开始写,00 00=Y1开始写 00 01:要写多少路,十六进制0x0001=十进制1,写1路 01:后面要写入的数据字节数,0x01=十进制1,写入1字节数据 01:写入的数据,0x01换算成二进制00000001 = Y8-Y7-Y6-Y5-Y4-Y3-Y2-Y1输出状态,ON=0,OFF=1 ef 57:CRC校验 响应: //模块回复 01 0F 00 00 00 01 94 0B 解释: 01:子站地址 0f:指令号,0x0f=十进制15,写多路DO 00 00:从哪一路开始写,00 00=Y1开始写 00 01:写了多少路,十六进制0x0001=十进制1,写1路 94 0B:CRC校验
//将Y1,Y2,Y8输出ON,其他路输出OFF 请求: 发送数据(HEX): 01 0f 00 00 00 08 01 83 bf 34 解释: 01:子站地址 0f:指令号,0x0f=十进制15,写多路DO 00 00:从哪一路开始写,00 00=Y1开始写 00 08:要写多少路,十六进制0x0008=十进制8,写8路 01:后面要写入的数据字节数,0x01=十进制1,写入1字节数据 83:写入的数据,0x83换算成二进制10000011 = Y8-Y7-Y6-Y5-Y4-Y3-Y2-Y1输出状态,ON=0,OFF=1 bf 34:CRC校验 响应: //模块回复 01 0F 00 00 00 08 54 0D 解释: 01:子站地址 0f:指令号,0x0f=十进制15,写多路DO 00 00:从哪一路开始写,00 00=Y1开始写 00 08:写了多少路,十六进制0x0008=十进制8,写8路 54 0D:CRC校验
//将Y1,Y2,Y9,Y24输出ON,其他路输出OFF 请求: 发送数据(HEX): 01 0f 00 00 00 18 03 03 01 80 b0 44 解释: 01:子站地址 0f:指令号,0x0f=十进制15,写多路DO 00 00:从哪一路开始写,00 00=Y1开始写 00 18:要写多少路,十六进制0x0018=十进制24,写24路 03:后面要写入的数据字节数,0x01=十进制1,写入1字节数据 03:写入的数据,0x03换算成二进制00000011 = Y8-Y7-Y6-Y5-Y4-Y3-Y2-Y1输出状态,ON=0,OFF=1 01:写入的数据,0x01换算成二进制00000001 = Y16-Y15-Y14-Y13-Y12-Y11-Y10-Y9输出状态,ON=0,OFF=1 80:写入的数据,0x80换算成二进制10000000 = Y24-Y23-Y22-Y21-Y20-Y19-Y18-Y17输出状态,ON=0,OFF=1 b0 44:CRC校验 响应: //模块回复 01 0F 00 00 00 18 55 C1 解释: 01:子站地址 0f:指令号,0x0f=十进制15,写多路DO 00 00:从哪一路开始写,00 00=Y1开始写 00 18:写了多少路,十六进制0x0018=十进制24,写24路 55 C1:CRC校验 Y输出口ON/OFF读取 (读取:DO寄存器,命令号:0x01)
用于读取当前Y输出口的开关状态。
请求: 发送数据(HEX): 01 01 00 00 00 01 FD CA 解释: 01:子站地址 01:指令号,01读取多路DO 00 00:从哪一路开始读,00 00=Y1开始读 00 01:要读多少路,十六进制0x0001=十进制1,读取1路 FD CA:CRC校验 响应: //Y1 输出ON(1)时的回复 01 01 01 01 90 48 解释: 01:子站地址 01:指令号,01读取多路DO 01:后面数据区字节数 01:数据,换算成二进制0x01=0000 0001,对应Y8-Y7-Y6-Y5-Y4-Y3-Y2-Y1的状态 90 48 :CRC校验 //Y1 输出OFF(0)的时回复 01 01 01 00 51 88 解释: 01:子站地址 01:指令号,01读取多路DO 01:后面数据区字节数 00:数据,换算成二进制0x00=0000 0000,对应Y8-Y7-Y6-Y5-Y4-Y3-Y2-Y1的状态 51 88 :CRC校验
请求: 发送数据(HEX): 01 01 00 00 00 08 3D CC 解释: 01:子站地址 01:指令号,01读取多路DO 00 00:从哪一路开始读,00 00=Y1开始读 00 08:要读多少路,十六进制0x0008=十进制8,读取8路 3D CC:CRC校验 响应: //Y1,Y2,Y8输出ON(1),其他输出OFF(0)时的回复 01 01 01 83 10 29 解释: 01:子站地址 01:指令号,01读取多路DO 01:后面数据区字节数,0x01=十进制1,后面数据区有1字节数据 83:数据区,换算成二进制0x83=1000 0011,对应Y8-Y7-Y6-Y5-Y4-Y3-Y2-Y1的状态 10 29 :CRC校验
请求: 发送数据(HEX): 01 01 00 00 00 18 3C 00 解释: 01:子站地址 01:指令号,01读取多路DO 00 00:从哪一路开始读,00 00=Y1开始读 00 18:要读多少路,十六进制0x0018=十进制24,读取24路 3C00:CRC校验 响应: //Y1,Y2,Y9,Y24输出ON(1),其他输出OFF(0)时的回复 01 01 03 03 01 80 CC 7E 解释: 01:子站地址 01:指令号,01读取多路DO 03:后面数据区字节数,0x03=十进制3,后面数据区有3字节数据 03:数据,换算成二进制0x03=0000 0011,对应Y8-Y7-Y6-Y5-Y4-Y3-Y2-Y1的状态 01:数据,换算成二进制0x01=0000 0001,对应Y16-Y15-Y14-Y13-Y12-Y11-Y10-Y9的状态 80:数据,换算成二进制0x80=1000 0000,对应Y24-Y23-Y22-Y21-Y20-Y19-Y18-Y17的状态 CC 7E :CRC校验 AI模拟量采集读取(读取:AI寄存器,命令号:0x04)
读模块中的输入型数据,例如AD模拟采集到的电压值,电流值,压力值等。
请求: 发送数据(HEX): 01 04 00 00 00 02 71CB 解释: 01:子站地址 04:指令号,04读AI 00 00:从哪一路开始读,0x0000=AIO1开始读 00 02:要多少个寄存器,因为一个AI通道占用2个寄存器地址,所以这里读1路模拟量的话,寄存器数量要填2,十六进制0x0002=十进制2 71CB:CRC校验 响应: 接收数据(HEX): 01 04 04 00 00 BF 11 4B B8 解释: 01:子站地址 04:指令号,04读AI 04:后面跟的数据字节数,0x04=十进制4,后面数据区有4字节数据 0000BF11:换成十进制就是 0x0000BF11 =48913,即读取到AI1模拟量输入口当前值为48913 4B B8:CRC校验
请求: 发送数据(HEX): 01 04 00 00 00 08 F1 CC 解释: 01:子站地址 04:指令号,04读AI 00 00:从哪一路开始读,0x0000=AIO1开始读 00 08:要多少个寄存器,因为一个AI通道占用2个寄存器地址,所以这里读4路模拟量的话,寄存器数量要填8,十六进制0x0008=十进制8 F1 CC:CRC校验 响应: 接收数据(HEX): 01 04 10 00 00 BF 11 00 00 BF 11 00 00 BF 11 00 00 BF 11 76 C5 解释: 01:子站地址 04:指令号,04读AI 10:后面跟的数据字节数,0x10=十进制16,后面数据区有16字节数据 00 00 BF 11:数据区,换成十进制就是 0x0000BF11 =48913,即读取到AI1模拟量输入口当前值为48913 00 00 BF 11:数据区,换成十进制就是 0x0000BF11 =48913,即读取到AI2模拟量输入口当前值为48913 00 00 BF 11:数据区,换成十进制就是 0x0000BF11 =48913,即读取到AI3模拟量输入口当前值为48913 00 00 BF 11:数据区,换成十进制就是 0x0000BF11 =48913,即读取到AI4模拟量输入口当前值为48913 76 C5:CRC校验
请求: 发送数据(HEX): 01 04 00 00 00 10 F1 C6 解释: 01:子站地址 04:指令号,04读AI 00 00:从哪一路开始读,0x0000=AIO1开始读 00 10:要多少个寄存器,因为一个AI通道占用2个寄存器地址,所以这里读8路模拟量的话,寄存器数量要填16,换算成十六进制就是0x0010 F1 C6:CRC校验 响应: 接收数据(HEX): 01 04 20 00 00 BF 11 00 00 BF 11 00 00 BF 11 00 00 BF 11 00 00 BF 11 00 00 BF 11 00 00 BF 11 00 00 BF 11 C0 F7 解释: 01:子站地址 04:指令号,04读AI 20:后面跟的数据字节数,0x20=十进制32,后面数据区有32字节数据 00 00 BF 11:数据区,换成十进制就是 0x0000BF11 =48913,即读取到AI1模拟量输入口当前值为48913 00 00 BF 11:数据区,换成十进制就是 0x0000BF11 =48913,即读取到AI2模拟量输入口当前值为48913 00 00 BF 11:数据区,换成十进制就是 0x0000BF11 =48913,即读取到AI3模拟量输入口当前值为48913 00 00 BF 11:数据区,换成十进制就是 0x0000BF11 =48913,即读取到AI4模拟量输入口当前值为48913 00 00 BF 11:数据区,换成十进制就是 0x0000BF11 =48913,即读取到AI5模拟量输入口当前值为48913 00 00 BF 11:数据区,换成十进制就是 0x0000BF11 =48913,即读取到AI6模拟量输入口当前值为48913 00 00 BF 11:数据区,换成十进制就是 0x0000BF11 =48913,即读取到AI7模拟量输入口当前值为48913 00 00 BF 11:数据区,换成十进制就是 0x0000BF11 =48913,即读取到AI8模拟量输入口当前值为48913 C0 F7:CRC校验 AO模拟量输出写入(写入:AO寄存器,命令号:0x10)
用于设定DA模拟量输出值。
请求: 发送数据(HEX): 01 10 00 00 00 01 02 10 D2 2B CD 解释: 01:子站地址 10:指令号,0x10=十进制16,写AO 00 00:从哪一路开始写,0x0000=AIO1开始写 00 01:要写多少路,十六进制0x0001=十进制1,写1路 02:后面要写入的数据字节数,0x02=十进制2,写2个字节 10 D2:要写入的AO输出值,0x10D2=十进制4306,即写入AO1输出口模拟量输出值为4306 2B CD:CRC校验 响应: 接收数据(HEX): 01 10 00 00 00 01 01 C9 解释: 01:子站地址 10:指令号,0x10=十进制16,写AO 00 00:从哪一路开始写,0x0000=AIO1开始写 00 01:写了多少路,十六进制0x0001=十进制1,写1路 01 C9:CRC校验
请求: 发送数据(HEX): 01 10 00 00 00 04 08 10 D2 10 D2 10 D2 10 D2 D6 9D 解释: 01:子站地址 10:指令号,0x10=十进制16,写AO 00 00:从哪一路开始写,0x0000=AIO1开始写 00 04:要写多少路,十六进制0x0004=十进制4,写4路 08:后面要写入的数据字节数,0x08=十进制8,写8个字节 10D2:要写入的AO输出值,0x10D2=十进制4306,即写入AO1输出口模拟量输出值为4306 10D2:要写入的AO输出值,0x10D2=十进制4306,即写入AO2输出口模拟量输出值为4306 10D2:要写入的AO输出值,0x10D2=十进制4306,即写入AO3输出口模拟量输出值为4306 10D2:要写入的AO输出值,0x10D2=十进制4306,即写入AO4输出口模拟量输出值为4306 D6 9D:CRC校验 响应: 接收数据(HEX): 01 10 00 00 00 04 C1 CA 解释: 01:子站地址 10:指令号,0x10=十进制16,写AO 00 00:从哪一路开始写,0x0000=AIO1开始写 00 04:写了多少路,十六进制0x0004=十进制4,写4路 C1 CA:CRC校验
请求: 发送数据(HEX): 01 10 00 00 00 08 10 10 D2 10 D2 10 D2 10 D2 10 D2 10 D2 10 D2 10 D2 E8 0C 解释: 01:子站地址 10:指令号,0x10=十进制16,写AO 00 00:从哪一路开始写,0x0000=AIO1开始写 00 08:要写多少路,十六进制0x0008=十进制8,写8路 10:后面要写入的数据字节数,0x10=十进制16,16个字节 10D2:要写入的AO输出值,0x10D2=十进制4306,即写入AO1输出口模拟量输出值为4306 10D2:要写入的AO输出值,0x10D2=十进制4306,即写入AO2输出口模拟量输出值为4306 10D2:要写入的AO输出值,0x10D2=十进制4306,即写入AO3输出口模拟量输出值为4306 10D2:要写入的AO输出值,0x10D2=十进制4306,即写入AO4输出口模拟量输出值为4306 10D2:要写入的AO输出值,0x10D2=十进制4306,即写入AO5输出口模拟量输出值为4306 10D2:要写入的AO输出值,0x10D2=十进制4306,即写入AO6输出口模拟量输出值为4306 10D2:要写入的AO输出值,0x10D2=十进制4306,即写入AO7输出口模拟量输出值为4306 10D2:要写入的AO输出值,0x10D2=十进制4306,即写入AO8输出口模拟量输出值为4306 E8 0C:CRC校验 响应: 接收数据(HEX): 01 10 00 00 00 08 C1 CF 解释: 01:子站地址 10:指令号,0x10=十进制16,写AO 00 00:从哪一路开始写,0x0000=AIO1开始写 00 08:写了多少路,十六进制0x0008=十进制8,写8路 C1 CF:CRC校验 AO模拟量输出读取(读取:AO寄存器,命令号:0x03)
用于读取当前DA模拟量输出值。
请求: 发送数据(HEX): 01 03 00 00 00 01 84 0A 解释: 01:子站地址 03:指令号,03读AO 00 00:从哪一路开始读,0x0000=AIO1开始读 00 01:要读多少路,十六进制0x0001=十进制1,读取1路 84 0A:CRC校验 响应: 接收数据(HEX): 01 03 02 10 D2 35 D9 解释: 01:子站地址 03:指令号,03读AO 02:后面跟的数据字节数 10 D2:换成十进制就是0x10D2 =十进制4306,即读取到AO1输出模拟量当前输出值为4306 35 D9:CRC校验
请求: 发送数据(HEX): 01 03 00 00 00 04 44 09 解释: 01:子站地址 03:指令号,03读AO 00 00:从哪一路开始读,0x0000=AIO1开始读 00 04:要读多少路,十六进制0x0004=十进制4,读取4路 44 09:CRC校验 响应: 接收数据(HEX): 01 03 08 10 D2 10 D2 10 D2 10 D2 F5 30 解释: 01:子站地址 03:指令号,03读AO 08:后面跟的数据字节数 10 D2:换成十进制就是 0x10D2 =十进制4306,即读取到AO1输出模拟量当前输出值为4306 10 D2:换成十进制就是 0x10D2 =十进制4306,即读取到AO2输出模拟量当前输出值为4306 10 D2:换成十进制就是 0x10D2 =十进制4306,即读取到AO3输出模拟量当前输出值为4306 10 D2:换成十进制就是 0x10D2 =十进制4306,即读取到AO4输出模拟量当前输出值为4306 F5 30:CRC校验
请求: 发送数据(HEX): 01 03 00 00 00 08 44 0C 解释: 01:子站地址 03:指令号,03读AO 00 00:从哪一路开始读,0x0000=AIO1开始读 00 08:要读多少路,十六进制0x0008=十进制8,读取8路 44 0C:CRC校验 响应: 接收数据(HEX): 01 03 10 10 D2 10 D2 10 D2 10 D2 10 D2 10 D2 10 D2 10 D2 15 98 解释: 01:子站地址 03:指令号,03读AO 10:后面跟的数据字节数,十六进制0x10=十进制16 10 D2:换成十进制就是 0x10D2 =十进制4306,即读取到AO1输出模拟量当前输出值为4306 10 D2:换成十进制就是 0x10D2 =十进制4306,即读取到AO2输出模拟量当前输出值为4306 10 D2:换成十进制就是 0x10D2 =十进制4306,即读取到AO3输出模拟量当前输出值为4306 10 D2:换成十进制就是 0x10D2 =十进制4306,即读取到AO4输出模拟量当前输出值为4306 10 D2:换成十进制就是 0x10D2 =十进制4306,即读取到AO5输出模拟量当前输出值为4306 10 D2:换成十进制就是 0x10D2 =十进制4306,即读取到AO6输出模拟量当前输出值为4306 10 D2:换成十进制就是 0x10D2 =十进制4306,即读取到AO7输出模拟量当前输出值为4306 10 D2:换成十进制就是 0x10D2 =十进制4306,即读取到AO8输出模拟量当前输出值为4306 15 98:CRC校验 MODBUS-TCP协议详解X输入口开关量状态读取 (读取:DI寄存器,命令号:0x02)
读模块X输入点的ON/OFF状态等。
请求: 发送数据(HEX): 00 00 00 00 00 06 01 02 00 00 00 01 解释: 00 00:TID 传输标识符(用于上位机传输报文序列号),也可为0 00 00:PID 协议标识符,默认0 00 06:后面要发送的字节数 01:子站地址 02:指令号,02读DI 00 00:从哪一路开始读,0x0000=X1开始读 00 01:要读多少路,十六进制0x0001=十进制1,读取1路 响应: //X1 输入ON(1)时的回复 00 00 00 00 00 04 01 02 01 01 解释: 00 00:TID 传输标识符(用于模块回送报文序列号),也可为0 00 00:PID 协议标识符,默认0 00 04:后面要发送的字节数 01:子站地址 02:指令号,02读DI 01:后面跟的数据字节数 01:换成二进制就是 0000 0001 =X8-X7-X6-X5-X4-X3-X2-X1输入口的当前状态0=OFF,1=ON //X1 输入OFF(0)时的回复 00 00 00 00 00 04 01 02 01 00 解释: 00 00:TID 传输标识符(用于模块回送报文序列号),也可为0 00 00:PID 协议标识符,默认0 00 04:后面要发送的字节数 01:子站地址 02:指令号,02读DI 01:后面跟的数据字节数 00:换成二进制就是 0000 0000 =X8-X7-X6-X5-X4-X3-X2-X1输入口的当前状态0=OFF,1=ON
请求: 发送数据(HEX): 00 00 00 00 00 06 01 02 00 00 00 08 解释: 00 00:TID 传输标识符(用于上位机传输报文序列号),也可为0 00 00:PID 协议标识符,默认0 00 06:后面要发送的字节数 01:子站地址 02:指令号,02读DI 00 00:从哪一路开始读,0x0000=X1开始读 00 08:要读多少路十六进制0x0008=十进制8,读取8路 响应: //X1,X8输入ON(1)时,其他都输入OFF(0)时的回复 00 00 00 00 00 04 01 02 01 81 解释: 00 00:TID 传输标识符(用于模块回送报文序列号),也可为0 00 00:PID 协议标识符,默认0 00 04:后面要发送的字节数 01:子站地址 02:指令号,02读DI 01:后面跟的数据字节数 81:换成二进制就是1000 0001 =X8-X7-X6-X5-X4-X3-X2-X1输入口的当前状态0=OFF,1=ON
请求: 发送数据(HEX):00 00 00 00 00 06 01 02 00 00 00 18 解释: 00 00:TID 传输标识符(用于上位机传输报文序列号),也可为0 00 00:PID 协议标识符,默认0 00 06:后面要发送的字节数 01:子站地址 02:指令号,02读DI 00 00:从哪一路开始读,0x0000=X1开始读 00 18:要读多少路十六进制0x0018=十进制24,读取24路 响应: //X1,X2,X9,X24 输入ON(1)时,其他都输入OFF(0)时的回复 00 00 00 00 00 06 01 02 03 03 01 80 解释: 00 00:TID 传输标识符(用于模块回送报文序列号),也可为0 00 00:PID 协议标识符,默认0 00 06:后面要发送的字节数 01:子站地址 02:指令号,02读DI 03:后面跟的数据字节数 03:换成二进制就是 0000 0011 =X8-X7-X6-X5-X4-X3-X2-X1输入口的当前状态0=OFF,1=ON 01:换成二进制就是 0000 0001 =X16-X15-X14-X13-X12-X11-X10-X9输入口的当前状态0=OFF,1=ON 80:换成二进制就是 1000 0000 =X24-X23-X22-X21-X20-X19-X18-X17输入口的当前状态0=OFF,1=ON X输入口脉冲计数读取 (读取:AI寄存器,命令号:0x04)
读模块的X输入口的脉冲计数值。
请求: 发送数据(HEX): 00 00 00 00 00 06 01 04 00 18 00 02 解释: 00 00:TID 传输标识符(用于上位机传输报文序列号),也可为0 00 00:PID 协议标识符,默认0 00 06:后面要发送的字节数 01:子站地址 04:指令号,04读AI 00 18:从哪一路开始读,0x0018对应的是X1脉冲计数寄存器起始地址 00 02:要读多少个寄存器,因为一路X脉冲计数占用2个寄存器地址,所以这里寄存器数量要填2,十六进制0x0002=十进制2 响应: 接收数据(HEX): 00 00 00 00 00 07 01 04 04 00 00 27 10 解释: 00 00:TID 传输标识符(用于上位机传输报文序列号),也可为0 00 00:PID 协议标识符,默认0 00 07:后面要发送的字节数 01:子站地址 04:指令号,04读AI 04:后面跟的数据字节数,0x04=十进制4,后面数据区有4字节数据 00002710:换成十进制就是 0x00002710 =10000,即读取到X1输入口当前脉冲计数值为10000
请求: 发送数据(HEX): 00 00 00 00 00 06 01 04 00 18 00 08 解释: 00 00:TID 传输标识符(用于上位机传输报文序列号),也可为0 00 00:PID 协议标识符,默认0 00 06:后面要发送的字节数 01:子站地址 04:指令号,04读AI 00 18:从哪一路开始读,0x0018对应的是X1脉冲计数寄存器起始地址 00 08:要读多少个寄存器,因为一路X脉冲计数占用2个寄存器地址,这里读4路,所以这里寄存器数量要填8,十六进制0x0008=十进制8 响应: 接收数据(HEX): 00 00 00 00 00 13 01 04 10 00 00 27 10 00 00 27 10 00 00 27 10 00 00 27 10 解释: 00 00:TID 传输标识符(用于上位机传输报文序列号),也可为0 00 00:PID 协议标识符,默认0 00 13:后面要发送的字节数,0x13=十进制19 01:子站地址 04:指令号,04读AI 10:后面跟的数据字节数,0x10=十进制16,后面数据区有16字节数据 00002710:换成十进制就是 0x00002710 =10000,即读取到X1输入口当前脉冲计数值为10000 00002710:换成十进制就是 0x00002710 =10000,即读取到X2输入口当前脉冲计数值为10000 00002710:换成十进制就是 0x00002710 =10000,即读取到X3输入口当前脉冲计数值为10000 00002710:换成十进制就是 0x00002710 =10000,即读取到X4输入口当前脉冲计数值为10000
请求: 发送数据(HEX): 00 00 00 00 00 06 01 04 00 18 00 10 解释: 00 00:TID 传输标识符(用于上位机传输报文序列号),也可为0 00 00:PID 协议标识符,默认0 00 06:后面要发送的字节数 01:子站地址 04:指令号,04读AI 00 18:从哪一路开始读,0x0018对应的是X1脉冲计数寄存器起始地址 00 10:要读多少个寄存器,因为一路X脉冲计数占用2个寄存器地址,这里读8路,所以这里寄存器数量要填十六进制0x0010=十进制16 响应: 接收数据(HEX): 00 00 00 00 00 23 01 04 20 00 00 27 10 00 00 27 10 00 00 27 10 00 00 27 10 00 00 27 10 00 00 27 10 00 00 27 10 00 00 27 10 解释: 00 00:TID 传输标识符(用于上位机传输报文序列号),也可为0 00 00:PID 协议标识符,默认0 00 23:后面要发送的字节数,0x23=十进制35 01:子站地址 04:指令号,04读AI 20:后面跟的数据字节数,0x20=十进制32,后面数据区有32字节数据 00002710:换成十进制就是 0x00002710 =10000,即读取到X1输入口当前脉冲计数值为10000 00002710:换成十进制就是 0x00002710 =10000,即读取到X2输入口当前脉冲计数值为10000 00002710:换成十进制就是 0x00002710 =10000,即读取到X3输入口当前脉冲计数值为10000 00002710:换成十进制就是 0x00002710 =10000,即读取到X4输入口当前脉冲计数值为10000 00002710:换成十进制就是 0x00002710 =10000,即读取到X5输入口当前脉冲计数值为10000 00002710:换成十进制就是 0x00002710 =10000,即读取到X6输入口当前脉冲计数值为10000 00002710:换成十进制就是 0x00002710 =10000,即读取到X7输入口当前脉冲计数值为10000 00002710:换成十进制就是 0x00002710 =10000,即读取到X8输入口当前脉冲计数值为10000
请求: 发送数据(HEX): 00 00 00 00 00 06 01 04 00 18 00 18 解释: 00 00:TID 传输标识符(用于上位机传输报文序列号),也可为0 00 00:PID 协议标识符,默认0 00 06:后面要发送的字节数 01:子站地址 04:指令号,04读AI 00 18:从哪一路开始读,0x0018对应的是X1脉冲计数寄存器起始地址 00 18:要读多少个寄存器,因为一路X脉冲计数占用2个寄存器地址,这里读12路,所以这里寄存器数量要填十六进制0x0018=十进制24 响应: 接收数据(HEX): 00 00 00 00 00 33 01 04 30 00 00 27 10 00 00 27 10 00 00 27 10 00 00 27 10 00 00 27 10 00 00 27 10 00 00 27 10 00 00 27 10 00 00 27 10 00 00 27 10 00 00 27 10 00 00 27 10 解释: 00 00:TID 传输标识符(用于上位机传输报文序列号),也可为0 00 00:PID 协议标识符,默认0 00 33:后面要发送的字节数 01:子站地址 04:指令号,04读AI 30:后面跟的数据字节数,0x30=十进制48,后面数据区有48字节数据 00002710:换成十进制就是 0x00002710 =10000,即读取到X1输入口当前脉冲计数值为10000 00002710:换成十进制就是 0x00002710 =10000,即读取到X2输入口当前脉冲计数值为10000 00002710:换成十进制就是 0x00002710 =10000,即读取到X3输入口当前脉冲计数值为10000 00002710:换成十进制就是 0x00002710 =10000,即读取到X4输入口当前脉冲计数值为10000 00002710:换成十进制就是 0x00002710 =10000,即读取到X5输入口当前脉冲计数值为10000 00002710:换成十进制就是 0x00002710 =10000,即读取到X6输入口当前脉冲计数值为10000 00002710:换成十进制就是 0x00002710 =10000,即读取到X7输入口当前脉冲计数值为10000 00002710:换成十进制就是 0x00002710 =10000,即读取到X8输入口当前脉冲计数值为10000 00002710:换成十进制就是 0x00002710 =10000,即读取到X9输入口当前脉冲计数值为10000 00002710:换成十进制就是 0x00002710 =10000,即读到X10输入口当前脉冲计数值为10000 00002710:换成十进制就是 0x00002710 =10000,即读到X11输入口当前脉冲计数值为10000 00002710:换成十进制就是 0x00002710 =10000,即读到X12输入口当前脉冲计数值为10000 X输入口脉冲计数清空 (写入:DO寄存器,命令号:0x0F)
清空模块的X输入口的脉冲计数值。
请求: 发送数据(HEX): 00 00 00 00 00 08 01 0f 00 40 00 01 01 01 解释: 00 00:TID 传输标识符(用于上位机传输报文序列号),也可为0 00 00:PID 协议标识符,默认0 00 08:后面要发送的字节数 01:子站地址 0f:指令号,0x0f=十进制15,写多路DO 00 40:从哪一路开始清空,0x00 40是X1计数清空DO寄存器起始地址 00 01:要清空多少路计数,十六进制0x0001=十进制1路 01:后面要写入的数据字节数,0x01=十进制1,写入1字节数据 01:写入的数据,写1清空 响应: //模块回复 00 00 00 00 00 06 01 0F 00 40 00 01 解释: 00 00:TID 传输标识符(用于上位机传输报文序列号),也可为0 00 00:PID 协议标识符,默认0 00 06:后面要发送的字节数 01:子站地址 0f:指令号,0x0f=十进制15,写多路DO 00 40:从哪一路开始清空,0x00 40是X1计数清空DO寄存器起始地址 00 01:要清空多少路计数,十六进制0x0001=十进制1路
请求: 发送数据(HEX): 00 00 00 00 00 09 01 0f 00 40 00 0C 02 ff 0f 解释: 00 00:TID 传输标识符(用于上位机传输报文序列号),也可为0 00 00:PID 协议标识符,默认0 00 09:后面要发送的字节数 01:子站地址 0f:指令号,0x0f=十进制15,写多路DO 00 40:从哪一路开始清空,0x00 40是X1计数清空DO寄存器起始地址 00 0C:要清空多少路计数,十六进制0x000C=十进制12路 02:后面要写入的数据字节数,0x02=十进制2,写入2字节数据 ff:十六进制0xff=二进制1111 1111=X8计数清空-X7计数清空-X6计数清空-X5计数清空-X4计数清空-X3计数清空-X2计数清空-X1计数清空,对应的bit位写1清空,写0保持不变 0f: 十六进制0x0f=二进制0000 1111=X16计数清空-X15计数清空-X14计数清空-X13计数清空-X12计数清空-X11计数清空-X10计数清空-X9计数清空,对应的bit位写1清空,写0保持不变 响应: //模块回复 00 00 00 00 00 06 01 0F 00 40 00 0C 解释: 00 00:TID 传输标识符(用于上位机传输报文序列号),也可为0 00 00:PID 协议标识符,默认0 00 06:后面要发送的字节数 01:子站地址 0f:指令号,0x0f=十进制15,写多路DO 00 40:从哪一路开始清空,0x00 40是X1计数清空DO寄存器起始地址 00 0C:要清空多少路计数,十六进制0x000C=十进制12路
请求: 发送数据(HEX): 00 00 00 00 00 0A 01 0f 00 40 00 18 03 85 08 80 解释: 00 00:TID 传输标识符(用于上位机传输报文序列号),也可为0 00 00:PID 协议标识符,默认0 00 0A:后面要发送的字节数,0x0A=十进制10 01:子站地址 0f:指令号,0x0f=十进制15,写多路DO 00 40:从哪一路开始清空,0x00 40是X1计数清空DO寄存器起始地址 00 18:要清空多少路计数,十六进制0x0018=十进制24路 03:后面要写入的数据字节数,0x03=十进制3,写入3字节数据 85:十六进制0x85=二进制1000 1001=X8计数清空-X7计数清空-X6计数清空-X5计数清空-X4计数清空-X3计数清空-X2计数清空-X1计数清空,对应的bit位写1清空,写0保持不变 08: 十六进制0x08=二进制0000 1000=X16计数清空-X15计数清空-X14计数清空-X13计数清空-X12计数清空-X11计数清空-X10计数清空-X9计数清空,对应的bit位写1清空,写0保持不变 80: 十六进制0x80=二进制1000 0000=X24计数清空-X23计数清空-X22计数清空-X21计数清空-X20计数清空-X19计数清空-X18计数清空-X17计数清空,对应的bit位写1清空,写0保持不变 响应: //模块回复 00 00 00 00 00 06 01 0F 00 40 00 18 解释: 00 00:TID 传输标识符(用于上位机传输报文序列号),也可为0 00 00:PID 协议标识符,默认0 00 06:后面要发送的字节数 01:子站地址 0f:指令号,0x0f=十进制15,写多路DO 00 40:从哪一路开始清空,0x00 40是X1计数清空DO寄存器起始地址 00 18:操作了多少路计数,十六进制0x0018=十进制24路 Y输出口ON/OFF写入 (写入:DO寄存器,命令号:0x0F)
用于控制模块Y输出点的开关状态。
请求: 发送数据(HEX): 00 00 00 00 00 08 01 0f 00 00 00 01 01 01 解释: 00 00:TID 传输标识符(用于上位机传输报文序列号),也可为0 00 00:PID 协议标识符,默认0 00 08:后面要发送的字节数 01:子站地址 0f:指令号,0x0f=十进制15,写多路DO 00 00:从哪一路开始写,00 00=Y1开始写 00 01:要写多少路,十六进制0x0001=十进制1,写1路 01:后面要写入的数据字节数,0x01=十进制1,写入1字节数据 01:写入的数据,0x01换算成二进制00000001 = Y8-Y7-Y6-Y5-Y4-Y3-Y2-Y1输出状态,ON=0,OFF=1 响应: //模块回复 00 00 00 00 00 06 01 0F 00 00 00 01 解释: 00 00:TID 传输标识符(用于模块回送报文序列号),也可为0 00 00:PID 协议标识符,默认0 00 06:后面要发送的字节数 01:子站地址 0f:指令号,0x0f=十进制15,写多路DO 00 00:从哪一路开始写,00 00=Y1开始写 00 01:写了多少路,十六进制0x0001=十进制1,写1路
//将Y1,Y2,Y8输出ON,其他路输出OFF 请求: 发送数据(HEX): 00 00 00 00 00 08 01 0f 00 00 00 08 01 83 解释: 00 00:TID 传输标识符(用于上位机传输报文序列号),也可为0 00 00:PID 协议标识符,默认0 00 08:后面要发送的字节数 01:子站地址 0f:指令号,0x0f=十进制15,写多路DO 00 00:从哪一路开始写,00 00=Y1开始写 00 08:要写多少路,十六进制0x0008=十进制8,写8路 01:后面要写入的数据字节数,0x01=十进制1,写入1字节数据 83:写入的数据,0x83换算成二进制10000011 = Y8-Y7-Y6-Y5-Y4-Y3-Y2-Y1输出状态,ON=0,OFF=1 响应: //模块回复 00 00 00 00 00 06 01 0F 00 00 00 08 解释: 00 00:TID 传输标识符(用于模块回送报文序列号),也可为0 00 00:PID 协议标识符,默认0 00 06:后面要发送的字节数 01:子站地址 0f:指令号,0x0f=十进制15,写多路DO 00 00:从哪一路开始写,00 00=Y1开始写 00 08:写了多少路,十六进制0x0008=十进制8,写8路
//将Y1,Y2,Y9,Y24输出ON,其他路输出OFF 请求: 发送数据(HEX): 00 00 00 00 00 0a 01 0f 00 00 00 18 03 03 01 80 解释: 00 00:TID 传输标识符(用于上位机传输报文序列号),也可为0 00 00:PID 协议标识符,默认0 00 0a:后面要发送的字节数,0x0a=十进制10 01:子站地址 0f:指令号,0x0f=十进制15,写多路DO 00 00:从哪一路开始写,00 00=Y1开始写 00 18:要写多少路,十六进制0x0018=十进制24,写24路 03:后面要写入的数据字节数,0x01=十进制1,写入1字节数据 03:写入的数据,0x03换算成二进制00000011 = Y8-Y7-Y6-Y5-Y4-Y3-Y2-Y1输出状态,ON=0,OFF=1 01:写入的数据,0x01换算成二进制00000001 = Y16-Y15-Y14-Y13-Y12-Y11-Y10-Y9输出状态,ON=0,OFF=1 80:写入的数据,0x80换算成二进制10000000 = Y24-Y23-Y22-Y21-Y20-Y19-Y18-Y17输出状态,ON=0,OFF=1 响应: //模块回复 00 00 00 00 00 06 01 0F 00 00 00 18 解释: 00 00:TID 传输标识符(用于模块回送报文序列号),也可为0 00 00:PID 协议标识符,默认0 00 06:后面要发送的字节数 01:子站地址 0f:指令号,0x0f=十进制15,写多路DO 00 00:从哪一路开始写,00 00=Y1开始写 00 18:写了多少路,十六进制0x0018=十进制24,写24路 Y输出口ON/OFF读取 (读取:DO寄存器,命令号:0x01)
用于读取模块Y输出点的开关状态。
请求: 发送数据(HEX): 00 00 00 00 00 06 01 01 00 00 00 01 解释: 00 00:TID 传输标识符(用于上位机传输报文序列号),也可为0 00 00:PID 协议标识符,默认0 00 06:后面要发送的字节数 01:子站地址 01:指令号,01读取多路DO 00 00:从哪一路开始读,00 00=Y1开始读 00 01:要读多少路,十六进制0x0001=十进制1,读取1路 响应: //Y1 输出ON(1)时的回复 00 00 00 00 00 04 01 01 01 01 解释: 00 00:TID 传输标识符(用于模块回送报文序列号),也可为0 00 00:PID 协议标识符,默认0 00 04:后面要发送的字节数 01:子站地址 01:指令号,01读取多路DO 01:后面数据区字节数 01:数据,换算成二进制0x01=0000 0001,对应Y8-Y7-Y6-Y5-Y4-Y3-Y2-Y1的状态 //Y1 输出OFF(0)的时回复 00 00 00 00 00 04 01 01 01 00 解释: 00 00:TID 传输标识符(用于模块回送报文序列号),也可为0 00 00:PID 协议标识符,默认0 00 04:后面要发送的字节数 01:子站地址 01:指令号,01读取多路DO 01:后面数据区字节数 00:数据,换算成二进制0x00=0000 0000,对应Y8-Y7-Y6-Y5-Y4-Y3-Y2-Y1的状态
请求: 发送数据(HEX): 00 00 00 00 00 06 01 01 00 00 00 08 解释: 00 00:TID 传输标识符(用于上位机传输报文序列号),也可为0 00 00:PID 协议标识符,默认0 00 06:后面要发送的字节数 01:子站地址 01:指令号,01读取多路DO 00 00:从哪一路开始读,00 00=Y1开始读 00 08:要读多少路,十六进制0x0008=十进制8,读取8路 响应: //Y1,Y2,Y8输出ON(1),其他输出OFF(0)时的回复 00 00 00 00 00 04 01 01 01 83 解释: 00 00:TID 传输标识符(用于模块回送报文序列号),也可为0 00 00:PID 协议标识符,默认0 00 04:后面要发送的字节数 01:子站地址 01:指令号,01读取多路DO 01:后面数据区字节数,0x01=十进制1,后面数据区有1字节数据 83:数据区,换算成二进制0x83=1000 0011,对应Y8-Y7-Y6-Y5-Y4-Y3-Y2-Y1的状态
请求: 发送数据(HEX): 00 00 00 00 00 06 01 01 00 00 00 18 解释: 00 00:TID 传输标识符(用于上位机传输报文序列号),也可为0 00 00:PID 协议标识符,默认0 00 06:后面要发送的字节数 01:子站地址 01:指令号,01读取多路DO 00 00:从哪一路开始读,00 00=Y1开始读 00 18:要读多少路,十六进制0x0018=十进制24,读取24路 响应: //Y1,Y2,Y9,Y24输出ON(1),其他输出OFF(0)时的回复 00 00 00 00 00 06 01 01 03 03 01 80 解释: 00 00:TID 传输标识符(用于模块回送报文序列号),也可为0 00 00:PID 协议标识符,默认0 00 06:后面要发送的字节数 01:子站地址 01:指令号,01读取多路DO 03:后面数据区字节数,0x03=十进制3,后面数据区有3字节数据 03:数据,换算成二进制0x03=0000 0011,对应Y8-Y7-Y6-Y5-Y4-Y3-Y2-Y1的状态 01:数据,换算成二进制0x01=0000 0001,对应Y16-Y15-Y14-Y13-Y12-Y11-Y10-Y9的状态 80:数据,换算成二进制0x80=1000 0000,对应Y24-Y23-Y22-Y21-Y20-Y19-Y18-Y17的状态 AI模拟量采集读取(读取:AI寄存器,命令号:0x04)
读模块中的输入型数据,例如AD模拟采集到的电压值,电流值,压力值等。
请求: 发送数据(HEX): 00 00 00 00 00 06 01 04 00 00 00 02 解释: 00 00:TID 传输标识符(用于上位机传输报文序列号),也可为0 00 00:PID 协议标识符,默认0 00 06:后面要发送的字节数 01:子站地址 04:指令号,04读AI 00 00:从哪一路开始读,0x0000=AIO1开始读 00 02:要多少个寄存器,因为一个AI通道占用2个寄存器地址,所以这里读1路模拟量的话,寄存器数量要填2,十六进制0x0002=十进制2 响应: 接收数据(HEX): 00 00 00 00 00 07 01 04 04 00 00 BF 11 解释: 00 00:TID 传输标识符(用于模块回送报文序列号),也可为0 00 00:PID 协议标识符,默认0 00 07:后面要发送的字节数 01:子站地址 04:指令号,04读AI 04:后面跟的数据字节数,0x04=十进制4,后面数据区有4字节数据 0000BF11:换成十进制就是 0x0000BF11 =48913,即读取到AI1模拟量输入口当前值为48913
请求: 发送数据(HEX): 00 00 00 00 00 06 01 04 00 00 00 08 解释: 00 00:TID 传输标识符(用于上位机传输报文序列号),也可为0 00 00:PID 协议标识符,默认0 00 06:后面要发送的字节数 01:子站地址 04:指令号,04读AI 00 00:从哪一路开始读,0x0000=AIO1开始读 00 08:要多少个寄存器,因为一个AI通道占用2个寄存器地址,所以这里读4路模拟量的话,寄存器数量要填8,十六进制0x0008=十进制8 响应: 接收数据(HEX): 00 00 00 00 00 13 01 04 10 00 00 BF 11 00 00 BF 11 00 00 BF 11 00 00 BF 11 解释: 00 00:TID 传输标识符(用于模块回送报文序列号),也可为0 00 00:PID 协议标识符,默认0 00 13:后面要发送的字节数,0x13=十进制19 01:子站地址 04:指令号,04读AI 10:后面跟的数据字节数,0x10=十进制16,后面数据区有16字节数据 0000BF11:数据区,换成十进制就是 0x0000BF11 =48913,即读取到AI1模拟量输入口当前值为48913 0000BF11:数据区,换成十进制就是 0x0000BF11 =48913,即读取到AI2模拟量输入口当前值为48913 0000BF11:数据区,换成十进制就是 0x0000BF11 =48913,即读取到AI3模拟量输入口当前值为48913 0000BF11:数据区,换成十进制就是 0x0000BF11 =48913,即读取到AI4模拟量输入口当前值为48913
请求: 发送数据(HEX): 00 00 00 00 00 06 01 04 00 00 00 10 解释: 00 00:TID 传输标识符(用于上位机传输报文序列号),也可为0 00 00:PID 协议标识符,默认0 00 06:后面要发送的字节数 01:子站地址 04:指令号,04读AI 00 00:从哪一路开始读,0x0000=AIO1开始读 00 10:要多少个寄存器,因为一个AI通道占用2个寄存器地址,所以这里读8路模拟量的话,寄存器数量要填16,换算成十六进制就是0x0010 响应: 接收数据(HEX): 00 00 00 00 00 23 01 04 20 00 00 BF 11 00 00 BF 11 00 00 BF 11 00 00 BF 11 00 00 BF 11 00 00 BF 11 00 00 BF 11 00 00 BF 11 解释: 00 00:TID 传输标识符(用于模块回送报文序列号),也可为0 00 00:PID 协议标识符,默认0 00 23:后面要发送的字节数,0x23=十进制35 01:子站地址 04:指令号,04读AI 20:后面跟的数据字节数,0x20=十进制32,后面数据区有32字节数据 0000BF11:数据区,换成十进制就是 0x0000BF11 =48913,即读取到AI1模拟量输入口当前值为48913 0000BF11:数据区,换成十进制就是 0x0000BF11 =48913,即读取到AI2模拟量输入口当前值为48913 0000BF11:数据区,换成十进制就是 0x0000BF11 =48913,即读取到AI3模拟量输入口当前值为48913 0000BF11:数据区,换成十进制就是 0x0000BF11 =48913,即读取到AI4模拟量输入口当前值为48913 0000BF11:数据区,换成十进制就是 0x0000BF11 =48913,即读取到AI5模拟量输入口当前值为48913 0000BF11:数据区,换成十进制就是 0x0000BF11 =48913,即读取到AI6模拟量输入口当前值为48913 0000BF11:数据区,换成十进制就是 0x0000BF11 =48913,即读取到AI7模拟量输入口当前值为48913 0000BF11:数据区,换成十进制就是 0x0000BF11 =48913,即读取到AI8模拟量输入口当前值为48913 AO模拟量输出写入(写入:AO寄存器,命令号:0x10)
用于设定DA模拟量输出值。
请求: 发送数据(HEX): 00 00 00 00 00 09 01 10 00 00 00 01 02 10 D2 解释: 00 00:TID 传输标识符(用于上位机传输报文序列号),也可为0 00 00:PID 协议标识符,默认0 00 09:后面要发送的字节数 01:子站地址 10:指令号,0x10=十进制16,写AO 00 00:从哪一路开始写,0x0000=AIO1开始写 00 01:要写多少路,十六进制0x0001=十进制1,写1路 02:后面要写入的数据字节数,0x02=十进制2,写2个字节 10D2:要写入的AO输出值,0x10D2=十进制4306,即写入AO1输出口模拟量输出值为4306 响应: 接收数据(HEX): 00 00 00 00 00 06 01 10 00 00 00 01 解释: 00 00:TID 传输标识符(用于模块回送报文序列号),也可为0 00 00:PID 协议标识符,默认0 00 06:后面要发送的字节数 01:子站地址 10:指令号,0x10=十进制16,写AO 00 00:从哪一路开始写,0x0000=AIO1开始写 00 01:写了多少路,十六进制0x0001=十进制1,写1路
请求: 发送数据(HEX): 00 00 00 00 00 0f 01 10 00 00 00 04 08 10 D2 10 D2 10 D2 10 D2 解释: 00 00:TID 传输标识符(用于上位机传输报文序列号),也可为0 00 00:PID 协议标识符,默认0 00 0f:后面要发送的字节数,0x0f=十进制15 01:子站地址 10:指令号,0x10=十进制16,写AO 00 00:从哪一路开始写,0x0000=AIO1开始写 00 04:要写多少路,十六进制0x0004=十进制4,写4路 08:后面要写入的数据字节数,0x08=十进制8,写8个字节 10D2:要写入的AO输出值,0x10D2=十进制4306,即写入AO1输出口模拟量输出值为4306 10D2:要写入的AO输出值,0x10D2=十进制4306,即写入AO2输出口模拟量输出值为4306 10D2:要写入的AO输出值,0x10D2=十进制4306,即写入AO3输出口模拟量输出值为4306 10D2:要写入的AO输出值,0x10D2=十进制4306,即写入AO4输出口模拟量输出值为4306 响应: 接收数据(HEX): 00 00 00 00 00 06 01 10 00 00 00 04 解释: 00 00:TID 传输标识符(用于模块回送报文序列号),也可为0 00 00:PID 协议标识符,默认0 00 06:后面要发送的字节数 01:子站地址 10:指令号,0x10=十进制16,写AO 00 00:从哪一路开始写,0x0000=AIO1开始写 00 04:写了多少路,十六进制0x0004=十进制4,写4路
请求: 发送数据(HEX): 00 00 00 00 00 17 01 10 00 00 00 08 10 10 D2 10 D2 10 D2 10 D2 10 D2 10 D2 10 D2 10 D2 解释: 00 00:TID 传输标识符(用于上位机传输报文序列号),也可为0 00 00:PID 协议标识符,默认0 00 17:后面要发送的字节数,0x17=十进制23 01:子站地址 10:指令号,0x10=十进制16,写AO 00 00:从哪一路开始写,0x0000=AIO1开始写 00 08:要写多少路,十六进制0x0008=十进制8,写8路 10:后面要写入的数据字节数,0x10=十进制16,16个字节 10D2:要写入的AO输出值,0x10D2=十进制4306,即写入AO1输出口模拟量输出值为4306 10D2:要写入的AO输出值,0x10D2=十进制4306,即写入AO2输出口模拟量输出值为4306 10D2:要写入的AO输出值,0x10D2=十进制4306,即写入AO3输出口模拟量输出值为4306 10D2:要写入的AO输出值,0x10D2=十进制4306,即写入AO4输出口模拟量输出值为4306 10D2:要写入的AO输出值,0x10D2=十进制4306,即写入AO5输出口模拟量输出值为4306 10D2:要写入的AO输出值,0x10D2=十进制4306,即写入AO6输出口模拟量输出值为4306 10D2:要写入的AO输出值,0x10D2=十进制4306,即写入AO7输出口模拟量输出值为4306 10D2:要写入的AO输出值,0x10D2=十进制4306,即写入AO8输出口模拟量输出值为4306 响应: 接收数据(HEX): 00 00 00 00 00 06 01 10 00 00 00 08 解释: 00 00:TID 传输标识符(用于模块回送报文序列号),也可为0 00 00:PID 协议标识符,默认0 00 06:后面要发送的字节数 01:子站地址 10:指令号,0x10=十进制16,写AO 00 00:从哪一路开始写,0x0000=AIO1开始写 00 08:写了多少路,十六进制0x0008=十进制8,写8路 AO模拟量输出读取(读取:AO寄存器,命令号:0x03)
用于读取当前DA模拟量输出值。
请求: 发送数据(HEX): 00 00 00 00 00 06 01 03 00 00 00 01 解释: 00 00:TID 传输标识符(用于上位机传输报文序列号),也可为0 00 00:PID 协议标识符,默认0 00 06:后面要发送的字节数 01:子站地址 03:指令号,03读AO 00 00:从哪一路开始读,0x0000=AIO1开始读 00 01:要读多少路,十六进制0x0001=十进制1,读取1路 响应: 接收数据(HEX): 00 00 00 00 00 05 01 03 02 10 D2 解释: 00 00:TID 传输标识符(用于模块回送报文序列号),也可为0 00 00:PID 协议标识符,默认0 00 05:后面要发送的字节数 01:子站地址 03:指令号,03读AO 02:后面跟的数据字节数 10 D2:换成十进制就是 0x10D2 =十进制4306,即读取到AO1输出模拟量当前输出值为4306
请求: 发送数据(HEX): 00 00 00 00 00 06 01 03 00 00 00 04 解释: 00 00:TID 传输标识符(用于上位机传输报文序列号),也可为0 00 00:PID 协议标识符,默认0 00 06:后面要发送的字节数 01:子站地址 03:指令号,03读AO 00 00:从哪一路开始读,0x0000=AIO1开始读 00 04:要读多少路,十六进制0x0004=十进制4,读取4路 响应: 接收数据(HEX): 00 00 00 00 00 0B 01 03 08 10 D2 10 D2 10 D2 10 D2 解释: 00 00:TID 传输标识符(用于模块回送报文序列号),也可为0 00 00:PID 协议标识符,默认0 00 0B:后面要发送的字节数,0x000B=十进制11 01:子站地址 03:指令号,03读AO 08:后面跟的数据字节数 10 D2:换成十进制就是 0x10D2 =十进制4306,即读取到AO1输出模拟量当前输出值为4306 10 D2:换成十进制就是 0x10D2 =十进制4306,即读取到AO2输出模拟量当前输出值为4306 10 D2:换成十进制就是 0x10D2 =十进制4306,即读取到AO3输出模拟量当前输出值为4306 10 D2:换成十进制就是 0x10D2 =十进制4306,即读取到AO4输出模拟量当前输出值为4306
请求: 发送数据(HEX): 00 00 00 00 00 06 01 03 00 00 00 08 解释: 00 00:TID 传输标识符(用于上位机传输报文序列号),也可为0 00 00:PID 协议标识符,默认0 00 06:后面要发送的字节数 01:子站地址 03:指令号,03读AO 00 00:从哪一路开始读,0x0000=AIO1开始读 00 08:要读多少路,十六进制0x0008=十进制8,读取8路 响应: 接收数据(HEX): 00 00 00 00 00 13 01 03 10 10 D2 10 D2 10 D2 10 D2 10 D2 10 D2 10 D2 10 D2 解释: 00 00:TID 传输标识符(用于模块回送报文序列号),也可为0 00 00:PID 协议标识符,默认0 00 13:后面要发送的字节数,0x0013=十进制19 01:子站地址 03:指令号,03读AO 10:后面跟的数据字节数,十六进制0x10=十进制16 10 D2:换成十进制就是 0x10D2 =十进制4306,即读取到AO1输出模拟量当前输出值为4306 10 D2:换成十进制就是 0x10D2 =十进制4306,即读取到AO2输出模拟量当前输出值为4306 10 D2:换成十进制就是 0x10D2 =十进制4306,即读取到AO3输出模拟量当前输出值为4306 10 D2:换成十进制就是 0x10D2 =十进制4306,即读取到AO4输出模拟量当前输出值为4306 10 D2:换成十进制就是 0x10D2 =十进制4306,即读取到AO5输出模拟量当前输出值为4306 10 D2:换成十进制就是 0x10D2 =十进制4306,即读取到AO6输出模拟量当前输出值为4306 10 D2:换成十进制就是 0x10D2 =十进制4306,即读取到AO7输出模拟量当前输出值为4306 10 D2:换成十进制就是 0x10D2 =十进制4306,即读取到AO8输出模拟量当前输出值为4306 |
|