libmodbus
功能: a fast and portable Modbus library
庫下載地址
https://libmodbus.org
使用指南
1)包含頭文件
#include <modbus.h>
2) 編譯
cc `pkg-config --cflags --libs libmodbus` files
示例:
#include <stdio.h>
#include <modbus.h>
int main(void) {
modbus_t *mb;
uint16_t tab_reg[32];
mb = modbus_new_tcp("127.0.0.1", 1502);
modbus_connect(mb);
/* Read 5 registers from the address 0 */
modbus_read_registers(mb, 0, 5, tab_reg);
modbus_close(mb);
modbus_free(mb);
}
描述:
libmodbus是一個遵循Modbus協議的庫,可以使一個設備用來發送接收數據。可以支持多種網絡通信:串口通信RTU或者網口通信TCP/IPv6等。
相關概念
Contexts
The modbus_t context is an opaque structure containing all necessary information to establish a connection with other Modbus devices according to the selected variant.
常用的contexts有如下幾種:
1)RTU Context:
A Modbus RTU message must be transmitted continuously without inter-character hesitations .The Modbus RTU framing calls a slave, a device/service
which handle Modbus requests, and a master, a client which send requests. The communication is always initiated by the master.
2)TCP(IPv4) Context:
The TCP backend implements a Modbus variant used for communications over TCP/IPv4 networks. It does not require a checksum calculation as lower layer takes care of the same.
3)TCP PI (IPv4 and IPv6) Context:
The TCP PI (Protocol Independent) backend implements a Modbus variant used for communications over TCP IPv4 and IPv6 networks. It does not require a checksum calculation as lower layer takes care of the same.Contrary to the TCP IPv4 only backend, the TCP PI backend offers hostname resolution but it consumes about
1Kb of additional memory.
常用API
1)釋放context
modbus_free();
2)設置slave ID
modbus_set_slave();
3)啟動調試模式
modbus_set_debut();
4)超時設置
modbus_get_byte_timeout();
modbus_set_byte_timeout();
modbus_get_response_timeout();
modbus_set_response_timeout();
modbus_get_indication_timeout();
modbus_set_indication_timeout();
5)錯誤恢復模式
modbus_set_error_recovery();
6)設置/獲取內部socket
modbus_set_socket();
modbus_get_socket();
7)頭部信息
modbus_get_header_length();
8)數據操作宏
MODBUS_GET_HIGH_BYTE(data) // 獲取數據的高字節
MODBUS_GET_LOW_BYTE(data) // 獲取數據的低字節
MODBUS_GET_INT64_FROM_INT16(tab_int16, index) // builds an int64 from the four first int16 starting at tab_int16[index]
MODBUS_GET_INT32_FROM_INT16(tab_int16, index) // builds an int32 from the two first int16 starting at tab_int16[index]
MODBUS_GET_INT16_FROM_INT8(tab_int8, index) // builds an int16 from the two first int8 starting at tab_int8[index]
MODBUS_SET_INT16_TO_INT8(tab_int8, index, value) // set an int16 value into the two first bytes starting at tab_int8[index]
MODBUS_SET_INT32_TO_INT16(tab_int16, index, value) // set an int32 value into the two first int16 starting at tab_int16[index]
MODBUS_SET_INT64_TO_INT16(tab_int16, index, value) // set an int64 value into the four first int16 starting at tab_int16[index]
9)處理bits和bytes
modbus_set_bits_from_byte();
modbus_set_bits_from_bytes();
modbus_get_byte_from_bits();
10)設置或獲取浮點數
modbus_get_float_abcd();
modbus_set_float_abcd();
modbus_get_float_badc();
modbus_set_float_badc();
modbus_get_float_cdab();
modbus_set_float_cdab();
modbus_get_float_dcba();
modbus_set_float_dcba();
11) Connection連接
建立連接
mobus_connect();
關閉連接
modbu_close();
刷新
modbus_flush();
12) Client客戶端
The Modbus protocol defines different data types and functions to read and write them from/to remote devices. The following functions are used by the clients to send Modbus requests:
讀數據
modbus_read_bits();
modbus_read_input_bits();
modbus_read_registers();
modbus_read_input_registers();
modbus_report_slave_id();
寫數據
modbus_write_bit();
modbus_write_registers();
modbus_write_bits();
modbus_write_registers();
讀寫數據
modbus_write_and_read_registers();
Raw請求
modbus_send_raw_request();
modbus_receive_confirmation();
響應異常
modbus_reply_exception();
13)Sever
The server is waiting for request from clients and must answer when it is concerned by the request.
accept/listen
modbus_tcp_listen();
modbus_tcp_accept();
modbus_tcp_pi_listen();
modbus_tcp_pi_accept();
接收
modbus_receive();
發送響應
modbus_reply();
modbus_reply_exception();
14)錯誤處理
modbus_strerror();
15)RTU context
創建一個RTU context
modbus_new_rtu();
設置串口模式
modbus_rtu_get_serial_mode();
modbus_rtu_set_serial_mode();
modbus_rtu_get_rts();
modbus_rtu_set_rts();
modbus_rtu_set_custom_rts();
modbus_rtu_get_rts_delay();
modbus_rtu_set_rts_delay();
16) TCP(IPv4) Context
創建
modbus_new_tcp();
17) TCP PI(IPv4 and IPv6)
創建
modbus_new_tcp_pi();