工控領域協議之Modbus

Modbus 是一種通信協議,用于工業自動化領域中的設備之間的通信。它是一種串行通信協議,廣泛應用于連接不同設備、傳感器和執行器的工業控制系統。 Modbus 在工業控制系統、自動化設備、能源管理系統等領域得到廣泛應用。

Modbus 協議的基本特點:

通信方式: Modbus 支持串行通信和以太網通信。串行通信通常使用 RS-232、RS-485 或 RS-422 等標準。

協議類型: Modbus 協議有不同的變體,包括 Modbus RTU(二進制形式)和 Modbus ASCII(ASCII 文本形式)。此外,基于以太網的 Modbus TCP/IP 也是一種常見的變體。

數據幀: Modbus 通信使用數據幀(Frame)進行信息傳遞。幀包括地址、功能碼、數據和錯誤檢測字段。

功能碼: Modbus 定義了一系列功能碼,用于執行不同的操作。例如,讀取保持寄存器、寫入單個寄存器等。

寄存器: 數據在 Modbus 中以寄存器的形式存儲。有輸入寄存器、保持寄存器等不同類型。

主從結構: Modbus 通信通常涉及到主從結構。主設備(Master)發起通信請求,而從設備(Slave)響應請求。

在這里插入圖片描述

數據幀

Modbus 通信使用數據幀(Frame)進行信息傳遞。幀包括地址、功能碼、數據和錯誤檢測字段。
在這里插入圖片描述

網絡架構

每種類型的設備(PLC, HMI,控制面板,驅動程序,運動控制,I/O設備…)都可以使用MODBUS協議發起遠程操作。

同樣的通信可以在串行線上完成,也可以在以太網TCP/IP網絡上完成。網關允許使用MODBUS協議在幾種類型的總線或網絡之間進行通信
在這里插入圖片描述
MODBUS協議定義了三個PDUs.
? MODBUS Request PDU, mb_req_pdu
? MODBUS Response PDU, mb_rsp_pdu
? MODBUS Exception Response PDU, mb_excep_rsp_pdu

Modbus主從通信

Modbus 通信通常涉及到一個主設備(Master)和一個或多個從設備(Slave)。以下是建立 Modbus 通信連接的一般步驟:

主設備(Master)的操作:

確定通信參數: 主設備需要確定與從設備通信時所需的參數,包括通信端口、波特率、奇偶校驗等。

選擇通信方式: 主設備可以選擇串行通信(RS-232、RS-485、RS-422等)或以太網通信(Modbus TCP/IP)。

創建 Modbus 請求幀: 主設備通過構建包含適當功能碼和數據的 Modbus 請求幀來發起通信請求。功能碼指示所需的操作,例如讀取寄存器、寫入寄存器等。

發送請求幀: 主設備通過選定的通信方式將請求幀發送到從設備。

等待響應: 主設備等待從設備的響應。響應幀包含所請求的數據或操作的結果。

解析響應: 主設備解析從設備發送的響應幀,提取所需的信息。

從設備(Slave)的操作:

接收請求幀: 從設備通過選定的通信方式接收主設備發送的請求幀。

解析請求: 從設備解析主設備發送的請求幀,確定所需執行的操作和相關參數。

執行操作: 從設備執行主設備請求的操作,例如讀取寄存器、寫入寄存器等。

創建響應幀: 從設備根據執行結果創建包含響應數據的 Modbus 響應幀。

發送響應幀: 從設備通過選定的通信方式將響應幀發送回主設備。

在通信過程中,主從設備都應該能夠處理可能的錯誤情況。這可能包括超時、通信中斷、校驗錯誤等。

modbus協議的主從通信

在 Linux 下使用 C/C++ 實現 Modbus 主從通信涉及到底層的串口或網絡通信編程,以及構建 Modbus 請求和響應幀的操作。以下是一個簡單的示例,使用串口通信(RS-485)實現 Modbus 主從通信,主設備讀取從設備的保持寄存器的例子.

安裝 Modbus 庫

sudo apt-get install libmodbus-dev

Modbus 從設備代碼

從設備代碼示例(modbus_slave.cpp)

#include <modbus/modbus.h>int main() {modbus_t *ctx;uint16_t holding_registers[2] = {0x1234, 0xABCD};// Create a new context with Modbus RTU over RS-485ctx = modbus_new_rtu("/dev/ttyUSB0", 9600, 'N', 8, 1);if (ctx == NULL) {fprintf(stderr, "Unable to create Modbus context\n");return -1;}// Set the Modbus device IDmodbus_set_slave(ctx, 1);// Start the Modbus server (listen for requests)modbus_mapping_t *mb_mapping = modbus_mapping_new(0, 0, 2, 0);modbus_mapping_set_base_address(mb_mapping, 0, 0);modbus_mapping_set_pointer(ctx, mb_mapping);while (1) {// Handle Modbus requestsmodbus_receive(ctx, mb_mapping);modbus_reply(ctx, mb_mapping, 0x01);  // 0x01 is the Modbus function code for reading holding registers}// Clean upmodbus_mapping_free(mb_mapping);modbus_close(ctx);modbus_free(ctx);return 0;
}

Modbus 主設備代碼

主設備代碼示例(modbus_master.cpp)

#include <modbus/modbus.h>int main() {modbus_t *ctx;uint16_t holding_registers[2];// Create a new context with Modbus RTU over RS-485ctx = modbus_new_rtu("/dev/ttyUSB0", 9600, 'N', 8, 1);if (ctx == NULL) {fprintf(stderr, "Unable to create Modbus context\n");return -1;}// Set the Modbus device IDmodbus_set_slave(ctx, 1);// Connect to the Modbus serverif (modbus_connect(ctx) == -1) {fprintf(stderr, "Modbus connection failed: %s\n", modbus_strerror(errno));modbus_free(ctx);return -1;}// Read holding registers from the Modbus serverint num_registers = modbus_read_registers(ctx, 0, 2, holding_registers);if (num_registers == -1) {fprintf(stderr, "Modbus read failed: %s\n", modbus_strerror(errno));} else {printf("Holding Register 0: 0x%04X\n", holding_registers[0]);printf("Holding Register 1: 0x%04X\n", holding_registers[1]);}// Disconnect and clean upmodbus_close(ctx);modbus_free(ctx);return 0;
}

編譯和運行

# 編譯從設備代碼
g++ modbus_slave.cpp -o modbus_slave -lmodbus# 編譯主設備代碼
g++ modbus_master.cpp -o modbus_master -lmodbus# 運行從設備
./modbus_slave# 在另一個終端運行主設備
./modbus_master

實際中需要根據具體設備的 Modbus 協議文檔和通信方式進行適當的配置和編碼。同時,對于網絡通信,可以使用 Modbus TCP/IP,而不是串口通信。

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

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

相關文章

大件垃圾識別 mAP↑28%:陌訊多模態融合算法實戰解析

一、行業痛點&#xff1a;大件垃圾識別的現實困境在城市環衛智能化轉型過程中&#xff0c;大件垃圾&#xff08;如廢舊家具、電器等&#xff09;的自動化識別與分揀成為關鍵環節。據住建部《城市環境衛生發展報告》顯示&#xff0c;傳統人工分揀模式下大件垃圾識別準確率不足 6…

vk框架或者普通函數封裝的一些函數可以拿取使用【會持續更新】

1.身份證校驗【通用】/*** function isIDCard* description 判斷是否為有效的身份證號碼。* param {string} idCard - 待驗證的身份證號碼。* returns {boolean} 返回驗證結果。*/ pubFun.isIDCard function (idCard) {// 身份證號碼為15位或者18位&#xff0c;15位時全為數字…

如何給Word和WPS文檔添加密碼或取消密碼

要保護Word和WPS文檔&#xff0c;可以為它們加密&#xff0c;加密有兩類&#xff1a;打開密碼和修改密碼。密碼設置有兩個入口&#xff0c;一個是在另存為&#xff0c;一個是在文件菜單。Word和WPS文字的路徑略有不同&#xff0c;微軟Office和WPS的其他套件也是如此操作。一、W…

uni-app項目gitignore文件示例

uni-app 忽略以下文件和目錄 DS_Store 忽略 UniApp 編譯生成的小程序相關目錄 unpackage/ uni_modules/ 忽略編輯器自動生成的文件 idea/ vscode/ 忽略日志文件 logs/ 忽略臨時文件 temp/ 忽略構建工具自動生成的文件 build/ 忽略 npm 安裝的包文件 package-lock.json yarn.loc…

LeetCode 135:分糖果

LeetCode 135&#xff1a;分糖果問題本質與核心挑戰 給定孩子的評分數組&#xff0c;需滿足 “每個孩子至少1顆糖果&#xff0c;相鄰評分高的孩子糖果更多”&#xff0c;求最少糖果總數。核心挑戰&#xff1a; 相鄰約束是雙向的&#xff08;左→右和右→左都需滿足&#xff09;…

【QT】安裝與配置

個人主頁&#xff1a;Guiat 歸屬專欄&#xff1a;QT 文章目錄1. QT簡介與準備工作1.1 什么是QT1.2 QT的版本選擇1.3 系統要求檢查2. QT安裝方式詳解2.1 官方在線安裝器2.2 離線安裝包2.3 包管理器安裝3. Windows平臺安裝配置3.1 Windows安裝步驟3.2 環境變量配置3.3 Visual Stu…

Java從入門到精通 - 算法、正則、異常

算法、正則、異常 此筆記參考黑馬教程&#xff0c;僅學習使用&#xff0c;如有侵權&#xff0c;聯系必刪 文章目錄算法、正則、異常1. 常見算法1.1 簡單認識算法1.1.1 什么是算法&#xff1f;1.1.2 為什么要學習算法&#xff1f;1.2 排序算法1.2.1 冒泡排序1.2.1.1 實現冒泡排…

題單【排序】

P1271 【深基9.例1】選舉學生會 P1271 【深基9.例1】選舉學生會 - 洛谷 【方法一】快速排序 使用sort()&#xff0c;注意數組的范圍&#xff01;&#xff01;&#xff01; #include<bits/stdc.h> using namespace std;int a[2000000],n,m;int main() {cin>>n>&g…

【機器學習】(算法優化二)提升算法之:AdaBoost與隨機梯度

文章目錄一、 AdaBoost&#xff1a;自適應提升算法1、AdaBoost數學原理詳解1.1、 目標函數1.2、 樣本權重更新的邏輯1.3、 模型權重計算的含義1.4、 AdaBoost的核心思想2、為什么AdaBoost如此有效&#xff1f;二、 隨機梯度提升算法&#xff1a;梯度優化下更精細的優化1、隨機梯…

力扣 hot100 Day65

75. 顏色分類 給定一個包含紅色、白色和藍色、共 n 個元素的數組 nums &#xff0c;原地 對它們進行排序&#xff0c;使得相同顏色的元素相鄰&#xff0c;并按照紅色、白色、藍色順序排列。 我們使用整數 0、 1 和 2 分別表示紅色、白色和藍色。 必須在不使用庫內置的 sort 函…

12.Linux 磁盤管理

Linux : 磁盤管理 一、磁盤設備命名規則磁盤類型設備命名模式示例特點SATA/SCSI/SAS/dev/sdXsda&#xff08;第一塊硬盤&#xff09; sda1&#xff08;第一塊硬盤第一分區&#xff09;機械硬盤/通用接口NVMe/dev/nvmeXnYpZnvme0n1&#xff08;第一通道第一塊盤&#xff09; …

《Linux服務與安全管理》| DHCP服務器安裝和配置

《Linux服務與安全管理》| DHCP服務器安裝和配置 目錄 《Linux服務與安全管理》| DHCP服務器安裝和配置 一、點擊“編輯虛擬機設置”&#xff0c;配置三臺虛擬機為“僅主機”模式。 二、server01開機&#xff0c;root用戶登錄&#xff0c;輸入nmtui&#xff0c;進入圖形界面…

賽博威攜手Dify,助力AI在企業的場景化落地

人工智能正以前所未有的速度重塑商業世界。我們經歷了從理論探索到大語言模型&#xff08;LLM&#xff09;的爆發式增長&#xff0c;如今&#xff0c;一個以“AI Agent&#xff08;智能體&#xff09;”為核心的新階段已然來臨。AI Agent代表了人工智能應用的未來形態。它不再被…

嵌入式硬件中三極管推挽電路控制與實現

我們昨天講到了這個電路。 如果 A 電是 PWM 波,那么請問 B 點是不是 PWM 波呢?那么,當 PWM 為高時, B 點的電流是從哪里流過來的?

數據結構——查找(三、樹形查找)

一、二叉排序樹&#xff08;BST&#xff09;1、二叉排序樹的定義構造一棵二叉排序樹的目的并不是排序&#xff0c;而是提高查找、插入和刪除關鍵字的速度二叉排序樹&#xff08;也稱二叉搜索樹&#xff09;或者是一顆空樹&#xff0c;或者是具有以下性質的二叉樹1、若左子樹非空…

八股——Kafka相關

文章目錄1、 消息隊列的作用什么&#xff1f;思&#xff1a;消息隊列是什么?消息隊列的定義消息隊列的工作原理消息隊列的作用消息隊列的常見類型消息隊列的簡單例子2、Kafka 集群的架構是什么樣子的&#xff1f;3、Kafka 消費者組和生產者組是什么&#xff1f;定義與核心作用…

墨者學院SQL手工注入漏洞測試(MySQL數據庫)題目,純手工注入教程

打開練習手工注入的靶場,發現此時為一個登錄頁面,我們先試著登錄看看注入點在不在登錄頁面 使用用戶:or 1=1# 密碼:admin123;嘗試登錄,發現顯示錯誤后直接彈回原頁面,無sql報錯相關語句,這里不存在sql注入點 一:判斷注入點以及猜測是否有注入 此時點擊這里的動態頁面…

[硬件電路-140]:模擬電路 - 信號處理電路 - 鎖定放大器概述、工作原理、常見芯片、管腳定義

一、鎖定放大器概述鎖定放大器&#xff08;Lock-in Amplifier&#xff09;是一種基于相干檢測技術的高靈敏度測量儀器&#xff0c;通過將待測信號與參考信號進行同步處理&#xff0c;從強噪聲中提取微弱信號并精確測量其振幅與相位。其核心優勢包括&#xff1a;信噪比提升&…

下載 | Windows Server 2025官方原版ISO映像!(7月更新、標準版、數據中心版、26100.4652)

? 資源A066_Windows_Server_2025系統映像&#x1f536; Windows Server 2025官方原版ISO映像&#xff0c;7月更新版已放出。提供來自微軟官方每月更新的ISO原版映像&#xff0c;內部包含了標準版和數據中心版&#xff0c;可選擇無GUI界面版或桌面體驗版&#xff0c;滿足不同部…

Go 語言模糊測試 (Fuzz Testing) 深度解析與實踐

學習一個知識&#xff0c;要先了解它的來源 1. 模糊測試的誕生&#xff1a;Barton Miller 的故事 “Fuzz”一詞起源于1988年&#xff0c;由威斯康星大學麥迪遜分校的Barton Miller教授及其研究生團隊在一個高級操作系統課程項目中提出 。這個概念的誕生頗具戲劇性。Miller教授在…