modbus_tcp 协议

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><04><20><55><00><00><00><00><00><00><00><00><00><02><00><00><00><00><00><00><00><00><00><00><00><00><00><00><00><00><00><00><00><00>

读代码确认为以下意义:
请求:
[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
    --> slaveID
<04>    --> 命令
<20>     --> 数据长度,byte为单位
<55>.... 32byte 数据, 16个word.

概念:
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

 

你可能感兴趣的:(开源软件)