Modbus RTU與TCP通信示例

準備工作

  1. 安裝 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;
}

編譯與運行

  1. Linux 編譯命令

    gcc modbus_rtu_example.c -o rtu_demo -lmodbus
    gcc modbus_tcp_example.c -o tcp_demo -lmodbus
    • 運行前確保串口權限:

      sudo chmod 666 /dev/ttyUSB0
  2. 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()

注意事項

  1. 地址對齊 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()

  2. 錯誤處理 檢查所有函數的返回值,使用 modbus_strerror(errno) 獲取錯誤信息。

  3. 調試工具 推薦先用 QModMaster 或 Modbus Poll 驗證設備通信參數。

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

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

相關文章

maven項目添加第三方JAR包

項目開發過程中&#xff0c;不可避免的需要用到一些maven庫&#xff08;公共庫、司庫等&#xff09;中沒有的冷門jar包依賴&#xff0c;這時&#xff0c;可以將這些第三方JAR包安裝到本地maven倉庫中&#xff0c;實現項目依賴的一致性。具體步驟如下&#xff1a; 1、下載jar包 …

Sentinel實戰(三)、流控規則之流控效果及流控小結

spring cloud Alibaba-Sentinel實戰&#xff08;三&#xff09;、流控效果流控小結 一、流控規則&#xff1a;流控效果一&#xff09;、流控效果&#xff1a;預熱1、概念含義2、案例流控規則設置測試結果 二&#xff09;、流控效果&#xff1a;排隊等待1、概念含義2、案例流控規…

c++ (通用引用)和(左值引用)區別

問&#xff1a; for (auto &&ipKF : vpKFs) {} 使用 一個& 和 兩個&& 區別和聯系&#xff1f; c 在 C 中&#xff0c;auto&& 和 auto& 在范圍基于的 for 循環中有重要的區別&#xff0c;涉及到引用類型和值類別的處理。讓我們詳細解釋它們的區…

使用高德api實現天氣查詢

創建應用獲取 Key 天氣查詢-基礎 API 文檔-開發指南-Web服務 API | 高德地圖API 代碼編寫 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-wid…

XEOS 與 AutoMQ 推出聯合方案,共筑云原生 Kafka 新生態

近日&#xff0c;XSKY 星辰天合旗下企業級對象存儲產品 XEOS 與 AutoMQ 云原生消息隊列系統完成了產品兼容性適配互認證&#xff0c;致力于為客戶在私有云和混合云環境中提供云原生的 Kafka 解決方案。 在云計算和大數據時代&#xff0c;消息隊列作為分布式系統的重要組成部分…

Synology NAS 部署WPS-Office

記錄在群暉NAS上部署WPS-Office實現網頁上編輯文檔 目錄 1.思考及想法由來2.問題解決2.1 群暉NAS Docker使用2.2 部署wps-office參考1:【Docker+WPS Office】遠程辦公:Docker + WPS Office 私人云辦公室2.3 群暉NAS映射文件夾權限參考1:參考2:群暉NAS中普通用戶獲取Docker容…

Vue自定義指令最佳實踐教程

Vue 3 顯著增強了自定義指令的功能&#xff0c;使其封裝更加靈活和易用。本文將分為基礎和進階兩部分&#xff0c;介紹如何實現常用的自定義指令&#xff0c;并提供最佳的項目組織方式。 前言 本文以復制文本的自定義指令詳細介紹自定義指令的基礎知識 多個自定義指令如何進行…

用DrissionPage升級維基百科爬蟲:更簡潔高效的數據抓取方案

一、原方案痛點分析 原代碼使用urllibBeautifulSoup組合存在以下問題&#xff1a; 動態內容缺失&#xff1a;無法獲取JavaScript渲染后的頁面內容 反爬能力弱&#xff1a;基礎請求頭易被識別為爬蟲 代碼冗余&#xff1a;需要單獨處理SSL證書驗證 擴展性差&#xff1a;難以應…

23種設計模式-結構型模式-代理

文章目錄 簡介問題解決方案代碼核心設計要點 總結 簡介 代理是一種結構型設計模式&#xff0c;讓你能夠提供對象的替代品或其占位符。代理控制著對于原對象的訪問&#xff0c;并允許在把請求提交給對象前后進行一些處理。 問題 為什么要控制對于某個對象的訪問呢&#xff1f…

基于Transformer框架實現微調后Qwen/DeepSeek模型的非流式批量推理

在基于LLamaFactory微調完具備思維鏈的DeepSeek模型之后(詳見《深入探究LLamaFactory推理DeepSeek蒸餾模型時無法展示<think>思考過程的問題》),接下來就需要針對微調好的模型或者是原始模型(注意需要有一個本地的模型文件,全量微調就是saves下面的文件夾,如果是LoRA,…

基于OpenCV的指紋驗證:從原理到實戰的深度解析

指紋識別的技術革命與OpenCV的輕量級方案 在生物特征識別領域&#xff0c;指紋識別始終以獨特性和穩定性占據核心地位。隨著OpenCV等開源視覺庫的普及&#xff0c;這項看似"高大上"的技術正逐步走向民用化開發。本文將突破傳統算法框架&#xff0c;提出一套基于OpenC…

十五屆藍橋杯省賽Java B組(持續更新..)

目錄 十五屆藍橋杯省賽Java B組第一題&#xff1a;報數第二題&#xff1a;類斐波那契數第三題&#xff1a;分布式隊列第四題&#xff1a;食堂第五題&#xff1a;最優分組第六題&#xff1a;星際旅行第七題&#xff1a;LITS游戲第八題&#xff1a;拼十字 十五屆藍橋杯省賽Java B…

多模態學習(八):2022 TPAMI——U2Fusion: A Unified Unsupervised Image Fusion Network

論文鏈接&#xff1a;https://ieeexplore.ieee.org/stamp/stamp.jsp?tp&arnumber9151265 目錄 一.摘要 1.1 摘要翻譯 1.2 摘要解析 二.Introduction 2.1 Introduciton翻譯 2.2 Introduction 解析 三. related work 3.1 related work翻譯 3.2 relate work解析 四…

電腦屏幕亮度隨心控,在Windows上自由調整屏幕亮度的方法

調整電腦屏幕的亮度對于保護視力和適應不同環境光線條件非常重要。無論是在白天強光下還是夜晚昏暗環境中&#xff0c;合適的屏幕亮度都能讓您的眼睛更加舒適。本文中簡鹿辦公小編將向您介紹幾種在 Windows 系統中調整屏幕亮度的方法。 方法一&#xff1a;使用快捷鍵 大多數筆…

AF3 OpenFoldDataset類looped_samples方法解讀

AlphaFold3 data_modules 模塊的 OpenFoldDataset 類的 looped_samples 方法用于 循環采樣數據,確保數據能被不斷地提供,適用于 PyTorch 的 DataLoader 在訓練過程中迭代讀取數據。dataset_idx 指定了當前要處理的數據集(即 self.datasets[dataset_idx]) 源代碼: def loo…

lua表table和JSON字符串互轉

--print("local ssxc{\n"..string.gsub(str,":","").."\n}") Utils {} ---------------------------------------------------------------------------------- -- Lua-Table 與 string 轉換 local function value2string(value, isA…

請談談分治算法,如何應用分治算法解決大規模問題?

分治算法實戰解析與前端應用指南 分治算法本質剖析 分治算法的核心在于"分而治之"&#xff0c;其工作流程可分解為三個關鍵階段&#xff1a; 分解階段&#xff08;Divide&#xff09;&#xff1a;將復雜問題拆分為若干個相互獨立的子問題攻克階段&#xff08;Conqu…

基于BusyBox構建ISO鏡像

1. 準備 CentOS 7.9 3.10.0-957.el7.x86_64VMware Workstation 建議&#xff1a;系統內核<3.10.0 使用busybox < 1.33.2版本 2. 安裝busybox # 安裝依賴 yum install syslinux xorriso kernel-devel kernel-headers glibc-static ncurses-devel -y# 下載 wget https://…

Node.js 與 MySQL:深入理解與高效實踐

Node.js 與 MySQL:深入理解與高效實踐 引言 隨著互聯網技術的飛速發展,Node.js 作為一種高性能的服務端JavaScript運行環境,因其輕量級、單線程和事件驅動等特點,受到了廣大開發者的青睞。MySQL 作為一款開源的關系型數據庫管理系統,以其穩定性和可靠性著稱。本文將深入…

Android學習總結之handler源碼級

一、核心類關系與線程綁定&#xff08;ThreadLocal 的核心作用&#xff09; 1. Looper 與 ThreadLocal 的綁定 每個線程的 Looper 實例通過 ThreadLocal<Looper> sThreadLocal 存儲&#xff0c;確保線程隔離&#xff1a; public final class Looper {// 線程本地存儲&…