Modbus
1. 上位机设置 modbus 主站参数
命令字: 0x7300
参数列表
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| masterStation | object | 是 | 主站参数,包含 RTU 参数和 TCP 参数 |
| startAddress | bool | 否 | 地址偏移;true 表示地址不变,false 表示地址自动-1 |
masterStation 参数
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| type | string | 是 | 主站类型;取值"TCP","RTU" |
| processNumber | int | 是 | 需要设置的工艺号;范围[1,9] |
| RTU | object | 否 | RTU 参数 |
| TCP | object | 否 | TCP 参数 |
RTU 参数
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| baudrate | int | 是 | 波特率 |
| checkBit | string | 是 | 校验位;取值"N","E","O" |
| dataBit | int | 是 | 数据位;范围[5,8] |
| port | int | 是 | 端口号 |
| slaveId | int | 是 | 从站 ID;范围[0,65535] |
| stopBit | int | 是 | 停止位;范围[0,1] |
TCP 参数
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| IP | string | 是 | IP 地址 |
| endian_type | int | 是 | Float 大小端;0表示 AB CD,1表示 CD AB,2表示 BA DC,3表示 DC BA |
| port | int | 是 | 端口号;范围[0,65535] |
请求示例
json
{
"masterStation": {
"RTU": {
"baudrate": 115200,
"checkBit": "E",
"dataBit": 5,
"port": 2,
"slaveId": 1,
"stopBit": 1
},
"TCP": {
"IP": "192.168.1.14",
"endian_type": 1,
"port": 503
},
"processNumber": 1,
"type": "TCP"
},
"startAddress": false
}2. 上位机查询 modbus 参数
命令字: 0x7301
参数列表
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| processNumber | int | 是 | 需要查询的工艺号;范围[1,9] |
请求示例
json
{
"processNumber": 1
}3. 控制器回复上位机 modbus 参数
命令字: 0x7302
参数列表
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| type | string | 是 | 主站类型;取值"TCP","RTU" |
| RTU | object | 否 | RTU 参数 |
| TCP | object | 否 | TCP 参数 |
| modbus_state | bool | 是 | Modbus 连接状态;true 表示已连接,false 表示未连接 |
| response_time_out | int | 是 | 读写响应时间;单位 ms |
| startAddress | bool | 是 | 地址偏移;true 表示地址不变,false 表示地址自动-1 |
RTU 参数
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| baudrate | int | 是 | 波特率 |
| checkBit | string | 是 | 校验位;取值"N","E","O" |
| dataBit | int | 是 | 数据位;范围[5,8] |
| port | int | 是 | 端口号 |
| slaveId | int | 是 | 从站 ID;范围[0,65535] |
| stopBit | int | 是 | 停止位;范围[0,1] |
TCP 参数
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| IP | string | 是 | IP 地址 |
| endian_type | int | 是 | Float 大小端;0表示 AB CD,1表示 CD AB,2表示 BA DC,3表示 DC BA |
| port | int | 是 | 端口号;范围[0,65535] |
响应示例
json
{
"RTU": {
"baudrate": 115200,
"checkBit": "E",
"dataBit": 5,
"port": 2,
"slaveId": 1,
"stopBit": 1
},
"TCP": {
"IP": "192.168.1.14",
"endian_type": 1,
"port": 503
},
"modbus_state": false,
"response_time_out": 100,
"startAddress": false,
"type": "TCP"
}4. 上位机查询 modbus 连接状态
命令字: 0x7303
请求示例
json
{}5. 控制器回复上位机 modbus 连接状态
命令字: 0x7304
参数列表
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| ModbusConnect | bool | 是 | modbus 连接状态;true 表示已连接,false 表示未连接 |
响应示例
json
{
"ModbusConnect": false
}6. 上位机设置 modbus 从站参数
命令字: 0x7305
参数列表
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| type | string | 是 | 通讯方式;取值"TCP","RTU" |
| RTU | object | 否 | RTU 参数 |
| TCP | object | 否 | TCP 参数 |
| master-slave | int | 是 | modbus 通讯的主从模式;0表示主站,1表示从站 |
| scancycle | int | 是 | 扫描周期;范围[8,1000]ms |
| stoprun | int | 是 | 通讯断开时操作;0表示不停机,1表示停机 |
RTU 参数
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| baudrate | int | 是 | 波特率 |
| port | int | 是 | 端口号 |
| slaveId | int | 是 | 从站 ID;范围[0,65535] |
TCP 参数
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| IP | string | 是 | IP 地址(默认值) |
| endian_type | int | 是 | Float 大小端;0表示 AB CD,1表示 CD AB,2表示 BA DC,3表示 DC BA |
| port | int | 是 | 端口号;范围[0,65535] |
请求示例
json
{
"RTU": {
"baudrate": 115200,
"port": 2,
"slaveId": 1
},
"TCP": {
"IP": "192.168.1.11",
"endian_type": 0,
"port": 502
},
"master-slave": 1,
"scancycle": 100,
"stoprun": 0,
"type": "TCP"
}7. 上位机查询 modbus 从站参数
命令字: 0x7306
请求示例
json
{}8. 控制器回复上位机 modbus 从站参数
命令字: 0x7307
参数列表
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| type | string | 是 | 通讯方式;取值"TCP","RTU" |
| RTU | object | 否 | RTU 参数 |
| TCP | object | 否 | TCP 参数 |
| enable | bool | 是 | 连接使能 |
| master-slave | int | 是 | modbus 通讯的主从模式;0表示主站,1表示从站 |
| scancycle | int | 是 | 扫描周期;范围[8,1000]ms |
| stoprun | int | 是 | 通讯断开时操作;0表示不停机,1表示停机 |
RTU 参数
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| baudrate | int | 是 | 波特率 |
| port | int | 是 | 端口号 |
| slaveId | int | 是 | 从站 ID;范围[0,65535] |
TCP 参数
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| IP | string | 是 | IP 地址(默认值) |
| endian_type | int | 是 | Float 大小端;0表示 AB CD,1表示 CD AB,2表示 BA DC,3表示 DC BA |
| port | int | 是 | 端口号;范围[0,65535] |
响应示例
json
{
"RTU": {
"baudrate": 115200,
"port": 2,
"slaveId": 1
},
"TCP": {
"IP": "192.168.1.11",
"endian_type": 0,
"port": 502
},
"enable": false,
"master-slave": 1,
"scancycle": 100,
"stoprun": 0,
"type": "TCP"
}9. 上位机设置 modbus 从站连接使能
命令字: 0x7308
参数列表
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| enable | bool | 是 | modbus 从站连接使能 |
请求示例
json
{
"enable": true
}10. 上位机设置 modbus 从站心跳检测使能
命令字: 0x7309
参数列表
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| checkheart | bool | 是 | 心跳检测使能 |
请求示例
json
{
"checkheart": true
}11. 上位机查询 modbus 从站心跳检测使能
命令字: 0x703A
请求示例
json
{}12. 控制器回复上位机 modbus 从站心跳检测使能
命令字: 0x703B
参数列表
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| checkheart | bool | 是 | 心跳检测使能 |
响应示例
json
{
"checkheart": true
}13. 上位机设置 modbus 程序
命令字: 0x703C
参数列表
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| jobname | string | 是 | 已选程序名称 |
| programid | int | 是 | 程序序号;范围[1,300] |
| robot | int | 是 | 当前机器人号 |
请求示例
json
{
"jobname": "AA",
"programid": 1,
"robot": 1
}14. 上位机查询 modbus 程序
命令字: 0x703D
参数列表
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| num | int | 是 | 查询数量;固定为10 |
| robot | int | 是 | 当前机器人号 |
| startprogramid | int | 是 | 查询序列起始程序序号;范围[1,30] |
请求示例
json
{
"num": 10,
"robot": 1,
"startprogramid": 1
}15. 控制器回复上位机 modbus 程序
命令字: 0x703E
参数列表
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| jobnamelist | array | 是 | 程序名称列表;长度为10 |
| robot | int | 是 | 当前机器人号 |
| startprogramid | int | 是 | 序列起始程序序号;范围[1,30] |
| sum | int | 是 | 可选程序总数 |
响应示例
json
{
"jobnamelist": ["AA", "", "", "", "", "", "", "", "", ""],
"robot": 1,
"startprogramid": 1,
"sum": 300
}16. 上位机 Modbus 读线圈(功能码 01H)
命令字: 0x7310
参数列表
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| processNumber | int | 是 | 工艺号,范围 [1, 9] |
| functionCode | int | 是 | 功能码,固定为 1(01H) |
| address | int | 是 | 起始地址 |
| quantity | int | 是 | 读取数量;范围 [1, 2000] |
请求示例
json
{
"processNumber": 1,
"functionCode": 1,
"address": 0,
"quantity": 10
}17. 控制器回复 Modbus 读线圈(功能码 01H)
命令字: 0x7311
参数列表
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| processNumber | int | 是 | 工艺号 |
| functionCode | int | 是 | 功能码,固定为 1(01H) |
| data | int[] | 是 | 读取到的线圈状态数组;值为 0 或 1 |
| success | bool | 是 | 读取是否成功 |
响应示例
json
{
"processNumber": 1,
"functionCode": 1,
"data": [0, 1, 1, 0, 0, 1, 0, 1, 1, 0],
"success": true
}18. 上位机 Modbus 读输入状态(功能码 02H)
命令字: 0x7312
参数列表
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| processNumber | int | 是 | 工艺号,范围 [1, 9] |
| functionCode | int | 是 | 功能码,固定为 2(02H) |
| address | int | 是 | 起始地址 |
| quantity | int | 是 | 读取数量;范围 [1, 2000] |
请求示例
json
{
"processNumber": 1,
"functionCode": 2,
"address": 100,
"quantity": 16
}19. 控制器回复 Modbus 读输入状态(功能码 02H)
命令字: 0x7313
参数列表
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| processNumber | int | 是 | 工艺号 |
| functionCode | int | 是 | 功能码,固定为 2(02H) |
| data | int[] | 是 | 读取到的输入状态数组;值为 0 或 1 |
| success | bool | 是 | 读取是否成功 |
响应示例
json
{
"processNumber": 1,
"functionCode": 2,
"data": [1, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 1, 0, 0, 1],
"success": true
}20. 上位机 Modbus 读保持寄存器(功能码 03H)
命令字: 0x7314
参数列表
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| processNumber | int | 是 | 工艺号,范围 [1, 9] |
| functionCode | int | 是 | 功能码,固定为 3(03H) |
| address | int | 是 | 起始地址 |
| quantity | int | 是 | 读取数量;范围 [1, 125] |
请求示例
json
{
"processNumber": 1,
"functionCode": 3,
"address": 200,
"quantity": 5
}21. 控制器回复 Modbus 读保持寄存器(功能码 03H)
命令字: 0x7315
参数列表
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| processNumber | int | 是 | 工艺号 |
| functionCode | int | 是 | 功能码,固定为 3(03H) |
| data | int[] | 是 | 读取到的保持寄存器值数组;范围 [0, 65535] |
| success | bool | 是 | 读取是否成功 |
响应示例
json
{
"processNumber": 1,
"functionCode": 3,
"data": [1234, 5678, 910, 1112, 1314],
"success": true
}22. 上位机 Modbus 读输入寄存器(功能码 04H)
命令字: 0x7316
参数列表
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| processNumber | int | 是 | 工艺号,范围 [1, 9] |
| functionCode | int | 是 | 功能码,固定为 4(04H) |
| address | int | 是 | 起始地址 |
| quantity | int | 是 | 读取数量;范围 [1, 125] |
请求示例
json
{
"processNumber": 1,
"functionCode": 4,
"address": 300,
"quantity": 8
}23. 控制器回复 Modbus 读输入寄存器(功能码 04H)
命令字: 0x7317
参数列表
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| processNumber | int | 是 | 工艺号 |
| functionCode | int | 是 | 功能码,固定为 4(04H) |
| data | int[] | 是 | 读取到的输入寄存器值数组;范围 [0, 65535] |
| success | bool | 是 | 读取是否成功 |
响应示例
json
{
"processNumber": 1,
"functionCode": 4,
"data": [100, 200, 300, 400, 500, 600, 700, 800],
"success": true
}24. 上位机 Modbus 写单个线圈(功能码 05H)
命令字: 0x7318
参数列表
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| processNumber | int | 是 | 工艺号,范围 [1, 9] |
| functionCode | int | 是 | 功能码,固定为 5(05H) |
| address | int | 是 | 线圈地址 |
| value | int | 是 | 写入值;0 或 1 |
请求示例
json
{
"processNumber": 1,
"functionCode": 5,
"address": 10,
"value": 1
}25. 控制器回复 Modbus 写单个线圈(功能码 05H)
命令字: 0x7319
参数列表
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| processNumber | int | 是 | 工艺号 |
| functionCode | int | 是 | 功能码,固定为 5(05H) |
| success | bool | 是 | 写入是否成功 |
响应示例
json
{
"processNumber": 1,
"functionCode": 5,
"success": true
}26. 上位机 Modbus 写单个保持寄存器(功能码 06H)
命令字: 0x731A
参数列表
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| processNumber | int | 是 | 工艺号,范围 [1, 9] |
| functionCode | int | 是 | 功能码,固定为 6(06H) |
| address | int | 是 | 寄存器地址 |
| value | int | 是 | 写入值;范围 [0, 65535] |
请求示例
json
{
"processNumber": 1,
"functionCode": 6,
"address": 200,
"value": 9999
}27. 控制器回复 Modbus 写单个保持寄存器(功能码 06H)
命令字: 0x731B
参数列表
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| processNumber | int | 是 | 工艺号 |
| functionCode | int | 是 | 功能码,固定为 6(06H) |
| success | bool | 是 | 写入是否成功 |
响应示例
json
{
"processNumber": 1,
"functionCode": 6,
"success": true
}28. 上位机 Modbus 写多个线圈(功能码 0FH)
命令字: 0x731C
参数列表
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| processNumber | int | 是 | 工艺号,范围 [1, 9] |
| functionCode | int | 是 | 功能码,固定为 15(0FH) |
| address | int | 是 | 起始地址 |
| data | int[] | 是 | 写入的线圈值数组;每个元素为 0 或 1 |
请求示例
json
{
"processNumber": 1,
"functionCode": 15,
"address": 20,
"data": [1, 0, 1, 0, 1, 1, 0, 0, 1, 0]
}29. 控制器回复 Modbus 写多个线圈(功能码 0FH)
命令字: 0x731D
参数列表
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| processNumber | int | 是 | 工艺号 |
| functionCode | int | 是 | 功能码,固定为 15(0FH) |
| success | bool | 是 | 写入是否成功 |
响应示例
json
{
"processNumber": 1,
"functionCode": 15,
"success": true
}30. 上位机 Modbus 写多个保持寄存器(功能码 10H)
命令字: 0x731E
参数列表
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| processNumber | int | 是 | 工艺号,范围 [1, 9] |
| functionCode | int | 是 | 功能码,固定为 16(10H) |
| address | int | 是 | 起始地址 |
| data | int[] | 是 | 写入的寄存器值数组;每个元素范围 [0, 65535] |
请求示例
json
{
"processNumber": 1,
"functionCode": 16,
"address": 200,
"data": [100, 200, 300, 400, 500]
}31. 控制器回复 Modbus 写多个保持寄存器(功能码 10H)
命令字: 0x731F
参数列表
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| processNumber | int | 是 | 工艺号 |
| functionCode | int | 是 | 功能码,固定为 16(10H) |
| success | bool | 是 | 写入是否成功 |
响应示例
json
{
"processNumber": 1,
"functionCode": 16,
"success": true
}Modbus 功能码汇总
| 功能码 | 名称 | 命令字(请求) | 命令字(回复) | 说明 |
|---|---|---|---|---|
| 01H | 读线圈 | 0x7310 | 0x7311 | 读取从站线圈状态(位操作,读/写) |
| 02H | 读输入状态 | 0x7312 | 0x7313 | 读取从站离散输入状态(位操作,只读) |
| 03H | 读保持寄存器 | 0x7314 | 0x7315 | 读取从站保持寄存器(16 位操作,读/写) |
| 04H | 读输入寄存器 | 0x7316 | 0x7317 | 读取从站输入寄存器(16 位操作,只读) |
| 05H | 写单个线圈 | 0x7318 | 0x7319 | 写从站单个线圈状态 |
| 06H | 写单个保持寄存器 | 0x731A | 0x731B | 写从站单个保持寄存器 |
| 0FH | 写多个线圈 | 0x731C | 0x731D | 写从站多个线圈状态 |
| 10H | 写多个保持寄存器 | 0x731E | 0x731F | 写从站多个保持寄存器 |
Modbus 通讯说明
主站操作流程
- 设置主站参数:通过
0x7300设置 Modbus 主站参数(TCP/RTU 模式、端口、从站 ID 等) - 建立连接:主站参数设置后,通讯自动建立(TCP 模式)或通过串口建立(RTU 模式)
- 查询状态:通过
0x7303查询连接状态,通过0x7304获取回复 - 读写操作:使用功能码命令(
0x7310-0x731F)进行读写操作 - 断开连接:TCP 模式下可关闭连接,RTU 模式下串口保持打开
从站操作流程
- 设置从站参数:通过
0x7305设置从站参数 - 使能连接:通过
0x7308使能从站连接 - 心跳检测:通过
0x7309设置心跳使能
地址偏移说明
startAddress为false时,写入的地址会自动减 1(适用于多数 PLC,如西门子等起始地址为 1 的设备)startAddress为true时,写入的地址保持不变(适用于起始地址为 0 的设备)
注意事项
- 每次读写操作需确保 Modbus 连接已建立,否则操作将失败
- 读取数量受 Modbus 协议限制:线圈/输入状态最多 2000 个,寄存器最多 125 个
- 写多个线圈函数会自动将数据打包为 Modbus 协议格式发送
- TCP 模式的 Float 大小端通过
endian_type参数控制