開啟modbus tcp模擬調試

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;
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/915281.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/915281.shtml
英文地址,請注明出處:http://en.pswp.cn/news/915281.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

昇思+香橙派 AI 開發實踐:DeepSeek 全流程指南(基于 openEuler)

一、 環境準備 1. 鏡像燒錄 鏡像燒錄可以在任何操作系統內執?&#xff0c;這?以在Windows系統為例&#xff0c;使用balenaEtcher?具&#xff0c;快速燒錄鏡像到Micro SD卡中。 本章節所需的軟/硬件如下&#xff1a; 軟件相關&#xff1a;balenaEtcher制卡?具、openEul…

AI生成郵件發送腳本(帶附件/HTML排版)與定時爬取網站→郵件通知(價格監控原型)

想象一下&#xff1a;每天早晨咖啡還沒喝完&#xff0c;你的郵箱就自動收到了心儀商品的最新價格&#xff1b;重要報告準時帶著專業排版的附件發送到客戶手中——這一切不需要你手動操作。本文將用不到100行代碼帶你實現這兩個自動化神器&#xff01; 一、為什么我們需要自動化…

【vLLM 學習】Encoder Decoder Multimodal

vLLM 是一款專為大語言模型推理加速而設計的框架&#xff0c;實現了 KV 緩存內存幾乎零浪費&#xff0c;解決了內存管理瓶頸問題。 更多 vLLM 中文文檔及教程可訪問 →https://vllm.hyper.ai/ *在線運行 vLLM 入門教程&#xff1a;零基礎分步指南 源碼 examples/offline_inf…

【MySQL筆記】視圖

目錄一、什么是視圖&#xff1f;二、使用視圖的優勢三、視圖的創建與使用四、不能更新視圖的場景五、刪除視圖六、總結一、什么是視圖&#xff1f; 視圖&#xff08;View&#xff09;是一種虛擬表&#xff0c;不存儲實際數據&#xff0c;而是通過執行預定義的查詢動態生成數據…

【RK3576】【Android14】分區劃分

獲取更多相關的【RK3576】【Android14】驅動開發&#xff0c;可收藏系列博文&#xff0c;持續更新中&#xff1a; 【RK3576】Android 14 驅動開發實戰指南

Datawhale 25年7月組隊學習coze-ai-assistant Task1學習筆記:動手實踐第一個AI Agent—英倫生活口語陪練精靈

Chap1 了解AI工作流 1.1什么是工作流 工作流 就像是一條流水線&#xff0c;把復雜的任務拆分成多個簡單的步驟&#xff0c;每一步都有明確的目標和流程。1.2智能體和工作流的區別 智能體&#xff08;AI Agent&#xff09; **是什么 &#xff1a;**智能體是一個自動化的“助手”…

Webpack插件開發深度指南:從原理到實戰

Webpack插件是前端工程化的核心引擎&#xff0c;本文將帶你深入插件開發全流程&#xff0c;實現一個功能完整的資源清單插件&#xff0c;并揭示Tapable事件系統的核心原理。 一、Webpack插件機制解析 1.1 插件架構核心&#xff1a;Tapable事件系統 Webpack基于Tapable構建了…

2、Redis持久化詳解

Redis持久化詳解 文章目錄 Redis持久化詳解 前言 RDB和AOF的區別 RDB和AOF的優缺點 Redis 持久化配置 1、RDB持久化配置 2、AOF持久化配置(嘗試修復會刪除aof文件內容) 3、AOF 重寫功能 新增知識點: 新增知識點: 前言 Redis是一種高級 key-value 型的NoSQL數據庫。它跟mem…

curl 命令詳解

curl 命令的 -d/–data 和 --data-urlencode 的區別 curl 命令的 -d/–data 和 --data-urlencode 都用于發送 HTTP POST 請求的數據&#xff0c;但關鍵區別在于 是否自動對數據進行 URL 編碼。以下是詳細對比&#xff1a; curl 命令的 -d/--data 和 --data-urlencode 都用于發送…

ubuntu下好用的錄屏工具

以下是 vokoscreen 的安裝教程&#xff0c;適用于 Linux 系統。vokoscreen 是一款簡單易用的屏幕錄制工具&#xff0c;支持錄制屏幕、攝像頭和音頻。 安裝 vokoscreen vokoscreen 提供了多種安裝方式&#xff0c;包括通過包管理器、Deb 包或 AppImage 文件。 方法 1&#xf…

筆試大題20分值(用兩個棧實現隊列)

目錄前言一、原題二、解題思路三、代碼實現&#xff08;c/c&#xff09;C語言代碼C代碼實現結語前言 目前博主在處于秋招求職的關鍵時期&#xff0c;在暑假這段時間會頻繁更新博客&#xff0c;想在暑假期間把一些常考的面試和筆試題過一下&#xff0c;利用這兩個月沉淀一下技術…

【知識掃盲】tokenizer.json中的vocab和merges是什么?

在自然語言處理里&#xff0c;tokenizer.json 文件一般是由 Hugging Face 的 Tokenizers 庫生成的&#xff0c;它是分詞器配置的核心文件。這里面的 vocab 和 merges 是子詞分詞算法&#xff08;像 BPE 這種&#xff09;的重要構成要素。下面為你詳細解釋它們的作用和工作原理&…

【安卓筆記】RxJava的Hook機制,整體攔截器

0. 環境&#xff1a; 電腦&#xff1a;Windows10 Android Studio: 2024.3.2 編程語言: Java Gradle version&#xff1a;8.11.1 Compile Sdk Version&#xff1a;35 Java 版本&#xff1a;Java11 1. 使用場景 整個項目都是用了RxJava&#xff0c;需要對 整個/部分 項目…

NX二次開發常用函數——從一個坐標系到另一個坐標系的轉換(UF_MTX4_csys_to_csys )相同體坐標轉化

再做項目時相信大家都會用到坐標轉化,例如,我之前寫的案例分享中的博客都用到過,之前總是找借口進行if else判斷,雖然可以實現,但是比起坐標變換無論代碼復雜程度還是運行速度都比較差,之前參加過曹大師的教學訓練營,但是明顯感覺到大佬寫代碼的邏輯性以及模塊化能力都比…

數據庫防止數組字符串序列化

請求接到數組["aa","bb"]后,后端需要轉換成字符串Java 8 使用 String.join()String[] arr {"aa", "bb"}; String str String.join(",", arr); // "aa,bb"如果采用其他轉換,在字段存入數據庫后會["\"a…

若依框架文件上傳返回路徑端口錯誤 - Nginx代理環境下serverConfig.getUrl()獲取端口異常

目錄一 、問題描述二、問題現象三、問題根本原因3.1 代碼分析3.2 問題核心四、解決方案五、總結一 、問題描述 在使用若依框架進行項目開發時&#xff0c;遇到了一個令人困擾的問題&#xff1a;文件上傳功能在本地開發環境運行正常&#xff0c;但部署到服務器后&#xff0c;上…

使用PyInstaller打包 Python 工程

引言:大模型是個好工具,盡管好多內容都是拼湊的,但是整理學到的就是自己的。因工作需要隱藏python源代碼,方法有PyInstaller 、Cpython等多種方法,PyInstaller更為常用,PyInstaller打包 Python 工程步驟整理如下: 一、確保系統環境準備就緒 安裝 Python 和 pip 確認版本…

Python 程序設計講義(1):PyCharm 安裝教程

Python 程序設計講義&#xff08;1&#xff09;&#xff1a;PyCharm 安裝教程 一、安裝 Python 解釋器 1、下載 Python 安裝文件 點擊如下鏈接進入 Python 官網&#xff1a; https://www.python.org/ 在彈出的頁面中單擊【Downloads】&#xff0c;然后單擊下面的【Download Pyt…

uniapp云打包安卓

1、基礎云打包 2、修改logo3、怎么實現下拉菜單4、修改啟動頁啟動頁默認這樣 5、URL Scheme頁面跳轉

Python----NLP自然語言處理(英文分詞器--NLTK)

一、NLTK_介紹NLTK&#xff08;Natural Language Toolkit&#xff0c;自然語言處理工具包&#xff09;&#xff0c;一個主要用于清洗和處理英文文本的Python工具包。它有很多的功能&#xff0c;我們主要使用的是它的分詞功能&#xff0c;之前講過中文分詞是比較復雜的&#xff…