準備工作
-
安裝 libmodbus 庫
-
Linux (Debian/Ubuntu):
sudo apt-get install libmodbus-dev
-
Windows: 下載預編譯庫 libmodbus for Windows,并配置開發環境。
-
示例
1.Modbus RTU (串行通信)
#include <stdio.h> #include <modbus/modbus.h> ? int main() {modbus_t *ctx;int rc;uint16_t tab_reg[1]; // 存儲讀取的寄存器值 ?// 創建RTU上下文ctx = modbus_new_rtu("/dev/ttyUSB0", 9600, 'N', 8, 1);if (ctx == NULL) {fprintf(stderr, "無法創建RTU上下文\n");return -1;} ?// 設置從機地址modbus_set_slave(ctx, 1); ?// 設置超時時間(毫秒)modbus_set_response_timeout(ctx, 1, 0); ?// 連接設備if (modbus_connect(ctx) == -1) {fprintf(stderr, "連接失敗: %s\n", modbus_strerror(errno));modbus_free(ctx);return -1;} ?// 讀取保持寄存器(地址0,讀取1個寄存器)rc = modbus_read_registers(ctx, 0, 1, tab_reg);if (rc == -1) {fprintf(stderr, "讀取失敗: %s\n", modbus_strerror(errno));} else {printf("寄存器值: %d\n", tab_reg[0]);} ?// 寫入單個寄存器(地址0,值0xFF)rc = modbus_write_register(ctx, 0, 0xFF);if (rc == -1) {fprintf(stderr, "寫入失敗: %s\n", modbus_strerror(errno));} ?// 關閉連接modbus_close(ctx);modbus_free(ctx);return 0; }
2. Modbus TCP (以太網通信)
#include <stdio.h> #include <modbus/modbus.h> ? int main() {modbus_t *ctx;int rc;uint16_t tab_reg[2]; // 存儲讀取的寄存器值 ?// 創建TCP上下文ctx = modbus_new_tcp("192.168.1.100", 502);if (ctx == NULL) {fprintf(stderr, "無法創建TCP上下文\n");return -1;} ?// 設置從機地址(部分TCP設備需要)modbus_set_slave(ctx, 1); ?// 連接服務器if (modbus_connect(ctx) == -1) {fprintf(stderr, "連接失敗: %s\n", modbus_strerror(errno));modbus_free(ctx);return -1;} ?// 讀取輸入寄存器(地址0,讀取2個寄存器)rc = modbus_read_input_registers(ctx, 0, 2, tab_reg);if (rc == -1) {fprintf(stderr, "讀取失敗: %s\n", modbus_strerror(errno));} else {printf("寄存器值: [%d, %d]\n", tab_reg[0], tab_reg[1]);} ?// 寫入多個寄存器(地址10,寫入值255和128)uint16_t write_data[2] = {255, 128};rc = modbus_write_registers(ctx, 10, 2, write_data);if (rc == -1) {fprintf(stderr, "寫入失敗: %s\n", modbus_strerror(errno));} ?// 關閉連接modbus_close(ctx);modbus_free(ctx);return 0; }
編譯與運行
-
Linux 編譯命令
gcc modbus_rtu_example.c -o rtu_demo -lmodbus gcc modbus_tcp_example.c -o tcp_demo -lmodbus
-
運行前確保串口權限:
sudo chmod 666 /dev/ttyUSB0
-
-
Windows 編譯 在 Visual Studio 中配置
libmodbus
的庫路徑和鏈接選項。
關鍵函數說明
功能 | 函數 |
---|---|
創建RTU上下文 | modbus_new_rtu() |
創建TCP上下文 | modbus_new_tcp() |
設置從機地址 | modbus_set_slave() |
讀取保持寄存器 | modbus_read_registers() |
寫入單個寄存器 | modbus_write_register() |
寫入多個寄存器 | modbus_write_registers() |
關閉連接 | modbus_close() / modbus_free() |
注意事項
-
地址對齊 Modbus 寄存器地址分為四類:
-
線圈 (0x0000-0xFFFF):
modbus_read_bits()
/modbus_write_bit()
-
離散輸入 (0x0000-0xFFFF):
modbus_read_input_bits()
-
輸入寄存器 (0x0000-0xFFFF):
modbus_read_input_registers()
-
保持寄存器 (0x0000-0xFFFF):
modbus_read_registers()
-
-
錯誤處理 檢查所有函數的返回值,使用
modbus_strerror(errno)
獲取錯誤信息。 -
調試工具 推薦先用 QModMaster 或 Modbus Poll 驗證設備通信參數。