modbus_tcp 协议
github 上有代码.
甲. 先解释一条命令, 在此基础上结合代码阅读理解.
TEST WRITE/READ:
[00][01][00][00][00][06][FF][04][27][10][00][10]
Waiting for a confirmation...
<00><01><00><00><00><23>
读代码确认为以下意义:
请求:
[00][01] --> tid(transaction ID), 顺序递增
[00][00] --> modbus tcp协议固定为0,0
[00][06] --> 请求包本身的数据长度,
[FF] --> slaveID
[04] --> 命令,或者function query[header_length]
[27][10] --> 地址(0x2710), 十进制(10000) query[header_length+1]
[00][10] --> 请求的数据长度,word 为单位 query[header_length+3]
响应:
<00><01> --> 同上
<00><00> --> 同上
<00><23> --> 数据长度0x23,35个byte
<04> --> 命令
<20> --> 数据长度,byte为单位
概念:
header_length, 头部长度:为7, 后面跟的是命令
slave, 命令的前一个字节为slaveID, 在tcp中没什么用途.
function, 命令
address , 地址
请求包本身的长度.
服务器准备的数据映射.
乙. 其它的几处问题.
1. mask 是什么意思? 例子:
rc = modbus_write_register(ctx, UT_REGISTERS_ADDRESS, 0x12);
rc = modbus_mask_write_register(ctx, UT_REGISTERS_ADDRESS, 0xF2, 0x25);
ASSERT_TRUE(rc != -1, "FAILED (%x == -1)\n", rc);
rc = modbus_read_registers(ctx, UT_REGISTERS_ADDRESS, 1, tab_rp_registers);
ASSERT_TRUE(tab_rp_registers[0] == 0x17,
"FAILED (%0X != %0X)\n",
tab_rp_registers[0], 0x17);
写了内容0x12, 写了与屏蔽字0xF2,或屏蔽字0x25, 为什么得到了0x17 的结果?
data = (data & and) | (or & (~and));
(0x12 & 0xf2) | (0x25 & (~0xF2)) = 0x12 | 0x5 = 0x17
2. modbus 不允许设置slaveID 为0, 也不允许开始地址从0 开始访问,这个算是常识吧.
3. modbus 可以设置某些地址为不可读. 这需要服务器端去解析地址和长度来做出不同的响应.
下面附上客户端(master)和服务器端(slave) 常用的调用库的函数接口名称.
----------------------------------------
服务器端,主接受
----------------------------------------
modbus_tcp_listen
modbus_tcp_accept
modbus_strerror
modbus_set_slave
modbus_set_debug
modbus_set_bits_from_byte
modbus_send_raw_request
modbus_reply_exception
modbus_reply
modbus_receive
modbus_new_tcp
modbus_mapping_new_start_address
modbus_mapping_free
modbus_get_socket
modbus_get_header_length
modbus_free
modbus_connect
modbus_close
----------------------------------------
客户端,主发送请求
----------------------------------------
modbus_write_register
modbus_strerror
modbus_set_slave
modbus_set_response_timeout
modbus_set_error_recovery
modbus_set_debug
modbus_set_byte_timeout
modbus_send_raw_request
modbus_report_slave_id
modbus_receive_confirmation
modbus_read_registers
modbus_read_input_register
modbus_new_tcp
modbus_mask_write_register
modbus_get_slave
modbus_get_response_timeout
modbus_get_byte_timeout
modbus_free
modbus_flush
modbus_connect
modbus_close