一、簡介
libmodbus 是一個用於通過 Modbus 通信協議實現數據交換的 C 語言庫。Modbus 通信協議是基於主從式結構的通信協議,用於在工業自動化領域的數據交換。libmodbus 在使用時有許多優點,比如簡單易用、可移植性強、支持TCP/RTU等多種通信方式等。
二、安裝與配置
libmodbus 在不同的操作系統中的安裝過程可能會有所不同,但大致的步驟是相似的。本文將以 Ubuntu 20.04 操作系統為例介紹安裝過程。
首先需要安裝 libmodbus 庫:
sudo apt-get install libmodbus-dev
安裝完成後,即可在程序中引入此庫進行編程。需要在程序中添加以下頭文件:
#include <modbus.h>
配置的部分內容包括串口號、波特率、數據位等等,這部分內容在啟動 Modbus 設備後需要配置。
三、使用步驟
1. 初始化 modbus_t 結構體
使用 libmodbus 編程時,首先需要初始化 modbus_t 結構體,該結構體是與你要通信的 Modbus 設備相關聯的數據結構,該結構體包含了與通信相關的參數信息。你需要首先初始化這個結構體並將其指針傳遞到之後的函數中。
// 創建一個指向 modbus_t 結構體的指針
modbus_t *mb;
// 初始化 modbus_t 結構體
mb = modbus_new_rtu(dev, baudrate, parity, data_bit, stop_bit);
// 檢查初始化是否成功
if (!mb) {
fprintf(stderr, "Unable to create modbus context\n");
return -1;
}
2. 連接 Modbus 設備
使用 modbus_connect 函數來連接 Modbus 設備:
// 連接 Modbus 設備
if (modbus_connect(mb) == -1) {
fprintf(stderr, "Connection failed: %s\n", modbus_strerror(errno));
modbus_free(mb);
return -1;
}
3. 進行數據讀寫操作
libmodbus 提供多個讀/寫操作的 API,你可以使用這些函數對 Modbus 設備進行數據交換。以讀取一個 Int32 類型的寄存器為例:
int rc = modbus_read_registers(mb, reg_addr, reg_num, data);
if (rc == -1) {
fprintf(stderr, "%s\n", modbus_strerror(errno));
modbus_free(ctx);
return -1;
}
其中,modbus_read_registers 函數接收四個參數:
- modbus_t 結構體指針
- 寄存器地址
- 寄存器數量
- 存放讀取數據的緩衝區指針
4. 斷開連接並釋放資源
最後需要斷開連接並釋放所有資源,包括底層網路連接和 modbus_t 結構體:
modbus_close(mb);
modbus_free(mb);
四、示例代碼
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <unistd.h>
#include <modbus.h>
int main(int argc, char *argv[]) {
// 初始化 modbus_t 結構體
modbus_t *mb;
mb = modbus_new_rtu("/dev/ttyS0", 115200, 'N', 8, 1);
if (!mb) {
fprintf(stderr, "Failed to create the modbus context\n");
return -1;
}
// 連接 Modbus 設備
if (modbus_connect(mb) == -1) {
fprintf(stderr, "Failed to connect: %s\n", modbus_strerror(errno));
modbus_free(mb);
return -1;
}
// 讀取寄存器數據
uint16_t data[16] = {0};
int rc = modbus_read_registers(mb, 0, 16, data);
if (rc == -1) {
fprintf(stderr, "%s\n", modbus_strerror(errno));
modbus_free(ctx);
return -1;
}
for (int i = 0; i < 16; i++) {
printf("register %d: %d\n", i, data[i]);
}
// 斷開連接並釋放資源
modbus_close(mb);
modbus_free(mb);
return 0;
}
原創文章,作者:YTTGW,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/372534.html