1、新建modbus tcp服務器
?功能差異??客戶端功能?:
生成并發送Modbus請求報文(如功能碼03讀取寄存器)。??
解析服務器響應數據,實現遠程監控或控制。??
?服務器端功能?:
監聽默認端口(如502),等待客戶端連接。??
解析請求報文并執行操作,封裝結果返回客戶端。??
modbustcp庫文件
https://github.com/stephane/libmodbus/releases
2、下載庫文件
# 從源碼編譯安裝 libmodbus
wget https://libmodbus.org/releases/libmodbus-3.1.11.tar.gz
tar -xzf libmodbus-3.1.6.tar.gz
cd libmodbus-3.1.6
./autogen.sh
./configure
make
sudo make install
# 更新動態鏈接庫
sudo ldconfig
1. 安裝依賴
首先,確保你的系統上安裝了編譯 libmodbus 所需的依賴。對于大多數 Linux 發行版,你需要安裝 gcc(或類似的 C 編譯器)、make 和 automake 等基本工具。
以 Ubuntu/Debian 系統為例,你可以使用以下命令安裝這些依賴:
sudo apt-get update
sudo apt-get install build-essential autoconf automake libtool
2. 解壓文件
下載 libmodbus-3.1.7.tar.gz 文件,并使用以下命令解壓:
tar -zxvf libmodbus-3.1.7.tar.gz
cd libmodbus-3.1.7
3. 生成配置腳本
進入解壓后的目錄,運行以下命令來生成配置腳本:
./autogen.sh
4. 配置和編譯
運行 configure 腳本并編譯 libmodbus:
./configure
make
5. 安裝
完成編譯后,使用以下命令安裝 libmodbus:
sudo make install
6. 驗證安裝
安裝完成后,你可以通過檢查庫文件和頭文件的位置來驗證安裝是否成功。例如:
ls /usr/local/lib/libmodbus* ?# 檢查庫文件
ls /usr/local/include/modbus* # 檢查頭文件
7. 可選:設置環境變量(如果需要)
如果你希望在命令行中直接使用 libmodbus 的頭文件和庫,可能需要設置環境變量。例如,你可以在你的 shell 配置文件中(如 .bashrc 或 .bash_profile)添加以下行:
export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH
export C_INCLUDE_PATH=/usr/local/include:$C_INCLUDE_PATH
export CPLUS_INCLUDE_PATH=/usr/local/include:$CPLUS_INCLUDE_PATH
然后,運行 source ~/.bashrc 來應用更改。
按照這些步驟,你應該能夠成功安裝 libmodbus-3.1.7。如果在安裝過程中遇到任何問題,請檢查錯誤信息并根據需要進行調整。
g++ hello.cpp -o hello -I /usr/local/include -L /usr/local/lib -lmodbus
測試成功
3. 編寫 Modbus TCP 程序
(1) 示例代碼(客戶端)
cpp
復制
下載
#include <modbus/modbus.h>
#include <stdio.h>
#include <errno.h>
int main() {
? ? modbus_t *ctx;
? ? uint16_t tab_reg[10] = {0};
? ? ctx = modbus_new_tcp("127.0.0.1", 502); ?// 目標服務器 IP 和端口
? ? if (ctx == NULL) {
? ? ? ? fprintf(stderr, "Failed to create Modbus context: %s\n", modbus_strerror(errno));
? ? ? ? return -1;
? ? }
? ? if (modbus_connect(ctx) == -1) {
? ? ? ? fprintf(stderr, "Connection failed: %s\n", modbus_strerror(errno));
? ? ? ? modbus_free(ctx);
? ? ? ? return -1;
? ? }
? ? // 讀取寄存器(地址 0,數量 5)
? ? int rc = modbus_read_registers(ctx, 0, 5, tab_reg);
? ? if (rc == -1) {
? ? ? ? fprintf(stderr, "Read failed: %s\n", modbus_strerror(errno));
? ? } else {
? ? ? ? printf("Read data:\n");
? ? ? ? for (int i = 0; i < 5; i++) {
? ? ? ? ? ? printf("Register %d: %d\n", i, tab_reg[i]);
? ? ? ? }
? ? }
? ? modbus_close(ctx);
? ? modbus_free(ctx);
? ? return 0;
}
(2) 編譯
由于 libmodbus 安裝在 /usr/local/lib,需手動鏈接庫路徑:
bash
復制
下載
g++ modbus_client.cpp -o modbus_client -I /usr/local/include -L /usr/local/lib -lmodbus
(3) 運行
bash
復制
下載
export LD_LIBRARY_PATH=/usr/local/lib ?# 臨時添加動態庫路徑
./modbus_client
永久生效:
bash
復制
下載
echo "/usr/local/lib" | sudo tee /etc/ld.so.conf.d/libmodbus.conf
sudo ldconfig
4. 調試配置
在 VS Code 中創建 launch.json:
json
復制
下載
{
? ? "version": "0.2.0",
? ? "configurations": [
? ? ? ? {
? ? ? ? ? ? "name": "Debug Modbus Client",
? ? ? ? ? ? "type": "cppdbg",
? ? ? ? ? ? "request": "launch",
? ? ? ? ? ? "program": "${workspaceFolder}/modbus_client",
? ? ? ? ? ? "args": [],
? ? ? ? ? ? "environment": [{"name": "LD_LIBRARY_PATH", "value": "/usr/local/lib"}],
? ? ? ? ? ? "cwd": "${workspaceFolder}",
? ? ? ? ? ? "MIMode": "gdb"
? ? ? ? }
? ? ]
}
讀寄存器的值
#include <modbus/modbus.h>
#include <stdio.h>
#include <errno.h>int main() {modbus_t *ctx;uint16_t tab_reg[10] = {0};ctx = modbus_new_tcp("192.168.1.193", 502); // 目標服務器 IP 和端口if (ctx == NULL) {fprintf(stderr, "Failed to create Modbus context: %s\n", modbus_strerror(errno));return -1;}if (modbus_connect(ctx) == -1) {fprintf(stderr, "Connection failed: %s\n", modbus_strerror(errno));modbus_free(ctx);return -1;}// 讀取寄存器(地址 0,數量 5)int rc = modbus_read_registers(ctx, 0, 5, tab_reg);if (rc == -1) {fprintf(stderr, "Read failed: %s\n", modbus_strerror(errno));} else {printf("Read data:\n");for (int i = 0; i < 5; i++) {printf("Register %d: %d\n", i, tab_reg[i]);}}modbus_close(ctx);modbus_free(ctx);return 0;
}
寫寄存器的值
#include <modbus/modbus.h>
#include <stdio.h>
#include <errno.h>int main() {modbus_t *ctx;int rc;uint16_t write_value = 88; // 要寫入的值int write_addr = 100; // 寄存器地址// 1. 創建 Modbus TCP 上下文ctx = modbus_new_tcp("192.168.1.193", 502); // 目標服務器IP和端口if (ctx == NULL) {fprintf(stderr, "Failed to create Modbus context: %s\n", modbus_strerror(errno));return -1;}// 2. 設置超時(可選)modbus_set_response_timeout(ctx, 1, 0); // 1秒超時// 3. 連接服務器if (modbus_connect(ctx) == -1) {fprintf(stderr, "Connection failed: %s\n", modbus_strerror(errno));modbus_free(ctx);return -1;}// 4. 寫入單個寄存器(功能碼 0x06)rc = modbus_write_register(ctx, write_addr, write_value);if (rc == -1) {fprintf(stderr, "Write failed: %s\n", modbus_strerror(errno));} else {printf("Successfully wrote value %d to register %d\n", write_value, write_addr);}// 5. 關閉連接modbus_close(ctx);modbus_free(ctx);return 0;
}