python pymodbus庫使用教程(以Modbus RTU為例)

文檔:

https://pymodbus.readthedocs.io/en/latest/

源碼:

https://github.com/riptideio/pymodbus/

文章目錄

  • Python PyModbus庫使用教程:以Modbus RTU為例
    • 介紹
    • 安裝PyModbus
    • 配置串行連接
      • 導入必要的模塊
      • 創建Modbus客戶端實例
    • 建立連接
      • 連接到Modbus設備
    • 讀取數據
      • 讀取寄存器
    • 寫入數據
      • 寫入單個寄存器
      • 寫入多個寄存器
    • 處理異常
    • 斷開連接
    • 高級主題
      • 異步客戶端(使用Twisted或Asyncio框架)
      • 自定義消息
      • 日志記錄
    • 實例
      • 1. 使用RS485 modbus協議讀取溫度濕度傳感器數據

Python PyModbus庫使用教程:以Modbus RTU為例

介紹

Modbus是一種工業領域廣泛使用的通信協議,而PyModbus是一個在Python中實現Modbus通信的庫。它支持多種Modbus模式,包括RTU(通過串行線路),ASCII和TCP/IP。本教程將重點介紹如何使用PyModbus庫進行Modbus RTU通信。

安裝PyModbus

在開始編寫代碼之前,需要確保已經安裝了PyModbus庫。可以使用pip命令輕松地安裝:

pip install pymodbus

配置串行連接

導入必要的模塊

首先,需要從pymodbus庫中導入必要的模塊:

from pymodbus.client.sync import ModbusSerialClient as ModbusClient

不知道是不是改版了,我用上面導入報錯,用下面的可以:

from pymodbus.client import ModbusSerialClient as ModbusClient

創建Modbus客戶端實例

接下來,創建一個ModbusClient實例,用于建立與Modbus設備的RTU通信:

client = ModbusClient(method='rtu', port='/dev/ttyUSB0', baudrate=9600)

在這里,method參數設置為'rtu'以指定通信協議,port參數根據實際連接的串行端口進行設置(例如Linux系統中可能是'/dev/ttyUSB0',Windows中可能是'COM3'),baudrate參數設置傳輸速率,這些參數應與設備文檔或配置相匹配。

建立連接

連接到Modbus設備

在配置好客戶端實例后,嘗試連接到Modbus設備:

if client.connect():print("Modbus RTU Client Connected")
else:print("Failed to connect to Modbus RTU Client")

讀取數據

讀取寄存器

Modbus協議定義了幾種類型的寄存器,最常見的是保持寄存器和輸入寄存器。以下示例展示了如何讀取保持寄存器:

response = client.read_holding_registers(address=1, count=10, unit=1)
if not response.isError():print("Register Values: ", response.registers)
else:print("Failed to read registers")

在這個例子中,read_holding_registers方法用于讀取地址為1的起始位置、數量為10的連續寄存器。unit參數表示從哪個單元(即設備ID)讀取數據。

注意:pymodbus某個版本已將unit字段改為slave。使用時即使寫錯也不會報錯,注意查看你的pymodbus文檔。

寫入數據

寫入單個寄存器

要向設備的單個寄存器寫入數據,可以使用以下代碼:

write_response = client.write_register(address=1, value=25, unit=1)
if not write_response.isError():print("Written successfully")
else:print("Failed to write register")

這里使用了write_register方法,它接受地址、要寫入的值以及目標設備的單元ID。

寫入多個寄存器

如果要寫入多個寄存器,可以使用write_registers方法:

values = [20, 40, 60, 80, 100]
write_response = client.write_registers(address=1, values=values, unit=1)
if not write_response.isError():print("Multiple registers written successfully")
else:print("Failed to write multiple registers")

這里values列表包含了要寫入寄存器的值序列。

處理異常

處理Modbus通信過程中可能出現的異常非常重要,可以使用try-except語句捕獲這些異常:

from pymodbus.exceptions import ModbusExceptiontry:# 嘗試執行Modbus操作response = client.read_holding_registers(address=1, count=10, unit=1)
except ModbusException as ex:print("An error occurred:", str(ex))

斷開連接

在完成所有Modbus通信后,應該關閉與設備的連接:

client.close()
print("Modbus RTU Client Connection Closed")

調用close()方法將關閉串行端口,并釋放相關資源。

高級主題

異步客戶端(使用Twisted或Asyncio框架)

除了同步客戶端,PyModbus還提供了異步客戶端選項,可以使用Twisted或Asyncio框架。異步客戶端允許程序在等待響應時執行其他任務,對于需要同時處理多個Modbus請求的應用非常有用。

自定義消息

有時候,標準的Modbus函數不足以滿足特定的需求。PyModbus允許創建自定義消息和事務處理器,使得可以擴展協議以適應特殊用例。

日志記錄

調試和監控Modbus通信過程中,日志記錄功能至關重要。PyModbus提供了詳細的日志記錄機制,可以幫助分析問題所在。

實例

1. 使用RS485 modbus協議讀取溫度濕度傳感器數據

# 請先安裝 pymodbus 和 pyserial
# pip install pymodbus
# pip install pyserial# from pymodbus.client.sync import ModbusSerialClient as ModbusClient   # 報錯,說找不到 sync
from pymodbus.client import ModbusSerialClient as ModbusClient
from pymodbus.exceptions import ModbusException, ConnectionException
import logging# 配置日志記錄
logging.basicConfig()
log = logging.getLogger()
log.setLevel(logging.DEBUG)# 初始化Modbus串行客戶端
# client = ModbusClient(method='rtu', port='/dev/ttyUSB0', baudrate=9600, timeout=3)    # [Errno 2] could not open port /dev/ttyUSB0: [Errno 2] No such file or directory: '/dev/ttyUSB0'
# client = ModbusClient(method='rtu', port='/dev/ttyTHS1', baudrate=9600, timeout=3)
# ttyTHS4 ttyS0 ttyS1 ttyS2 ttyS4
# client = ModbusClient(method='rtu', port='/dev/ttyTHS1', baudrate=9600, timeout=3)
# client = ModbusClient(method='rtu', port='/dev/ttyTHS0', baudrate=9600, timeout=3, stopbits=1, bytesize=8, parity='N')
client = ModbusClient(port='/dev/ttyTHS0', baudrate=9600, timeout=3,stopbits=1, bytesize=8, parity='N')    # 看文檔,method='rtu'貌似沒用def read_temperature_and_humidity(client):try:# 讀取寄存器地址0和1上的4個字節(兩個寄存器)# result = client.read_input_registers(address=0, count=3, unit=1)  # 這個錯了,這是讀取輸入寄存器的)0x04# result = client.read_holding_registers(address=0, count=3, unit=1)  # 這個才是讀取輸入寄存器的0x03  # unit參數錯了,當前pymodbus版本沒有這個參數,搞烏龍了,要不是用filelocator搜索函數用法,還真不知道- -result = client.read_holding_registers(address=0, count=2, slave=1)  # 讀取輸入寄存器的0x03 # 讀兩個寄存器就ok,賣家說第三個寄存器是預留的,不用讀if result.isError():# 處理錯誤print("讀取錯誤:", result)return None, None# 將讀取到的結果轉換為溫度和濕度registers = result.registerstemperature_reg = registers[0]humidity_reg = registers[1]# 檢查是否有探頭錯誤if temperature_reg == 0x8000 or humidity_reg == 0x8000:print("探頭錯誤")return None, None# 計算實際的溫度和濕度值temperature = temperature_reg * 0.1humidity = humidity_reg * 0.1# 格式化溫度和濕度值,保留一位小數temperature = round(temperature, 1)humidity = round(humidity, 1)return temperature, humidityexcept ModbusException as e:print("Modbus異常:", e)return None, Noneexcept Exception as e:# 捕獲除ModbusException之外的所有異常print(f"An error occurred: {e}")return None, Nonedef main():try:if client.connect():  # 嘗試連接到Modbus服務器/設備temperature, humidity = read_temperature_and_humidity(client)if temperature is not None and humidity is not None:print(f"溫度: {temperature}°C, 濕度: {humidity}%RH")client.close()  # 關閉連接else:print("無法連接到Modbus設備")except ConnectionException as e:print("連接異常:", e)if __name__ == "__main__":main()

運行結果:

在這里插入圖片描述

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

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

相關文章

UEC++ day8

傷害系統 給敵人創建血條 首先添加一個UI界面用來顯示敵人血條設置背景圖像為黑色半透明 填充顏色 給敵人類添加兩種狀態表示血量與最大血量,添加一個UWidegtComponet組件與UProgressBar組件 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category "Enemy …

TikTok歷史探秘:短視頻中的時間之旅

在數字時代的浪潮中,TikTok嶄露頭角,成為社交媒體領域的一顆耀眼新星。這款短視頻應用以其獨特的創意、時尚和娛樂性質,吸引了全球數以億計的用戶。 然而,TikTok并非一夜之間的奇跡,它背后蘊藏著豐富而有趣的歷史故事…

[ChatGPT]ChatGPT免費,不用翻墻!?——你需要的裝備

系列文章目錄 【AIGC】服務于人類|一種新的人工智能技術-CSDN博客 文章目錄 目錄 系列文章目錄 文章目錄 前言 一、天意云網站 ?編輯 二、使用步驟 可以看到有云服務器、Rstudio以及我們的ChatGPT,我這次主要分享ChatGPT,其他的有機會我再給…

常用服務注冊中心與發現(Eurake、zookeeper、Nacos)筆記(一)基礎概念

基礎概念 注冊中心 在服務治理框架中,通常都會構建一個注冊中心,每個服務單元向注冊中心登記自己提供的服務,將主機與端口號、版本號、通信協議等一些附加信息告知注冊中心,注冊中心按照服務名分類組織服務清單,服務…

電力感知邊緣計算網關產品設計方案-軟件架構(業務流程)

軟件架構(業務流程) 基于前端系統提供的硬件通信平臺,后端系統以控制執行單元為核心,協同控制通信管理、驅動適配、存儲單元等職能單元完成與前端系統的通信數據交互業務,在經歷以下業務流程后,完成設備自適應通信業務功能。 1.外部設備通信前端系統 前端系統連接新的…

OpenAI

OpenAI,在美國成立的人工智能研究公司,核心宗旨在于“實現安全的通用人工智能(AGI)”,使其有益于人類。 OpenAI于2015年由一群科技領袖,包括山姆阿爾特曼(Sam Altman)、彼得泰爾(Peter Thiel&a…

設計師不能忽視的幾個寶藏圖標設計工具

在這個快速變化的時代,設計師對創新和實用工具的需求越來越大。這就要求我們及時跟上潮流,不斷探索和嘗試最新、最有價值的圖標設計工具。只有這樣,我們才能在競爭激烈的設計市場中脫穎而出。以下是我們精心挑選的2024年值得一試的圖標設計工…

C語言實現求n以內最大的k個素數c

以下是C語言實現求n以內最大的k個素數的代碼&#xff1a; #include <stdio.h> #include <stdlib.h> #include <stdbool.h> #include <math.h>bool is_prime(int num) { // 判斷素數int i;if(num < 2) {return false;}for(i 2; i < sqrt(num); …

服務器安全如何保障

主機安全是指保護計算機主機&#xff08;也稱為服務器、終端或主機設備&#xff09;免受潛在的安全威脅和攻擊的一系列措施和實踐。主機安全旨在防止未經授權的訪問、數據泄露、惡意軟件感染和其他安全漏洞的利用&#xff0c;主機一旦被黑客入侵&#xff0c;企業會面臨很多安全…

相比其他關系型數據庫,AntDB JDBC驅動特性有哪些不同之處

摘要&#xff1a;使用Java語言進行各類應用程序的快速開發成為目前比較主要且流行的開發方式。JDBC是 Java 語言中用來連接和操作關系型數據庫的 API&#xff0c;在業務程序與關系型數據庫通信時&#xff0c;必然會使用JDBC驅動。 本文將通過國產關系型數據庫AntDB中的JDBC為大…

【Effective C++】 (六) 繼承與面向對象設計

【六】繼承與面向對象設計 條款32 &#xff1a; 確保public繼承是"is a"的關系 Item 32: Make sure public inheritance models “is-a”. C面向對象程序設計中&#xff0c;最重要的規則便是&#xff1a;public繼承應當是"is-a"的關系。當Derived public繼…

3.1.2 Linux時間子系統 hrtimer示例使用

文章目錄 結構體定義接口初始化啟動修改取消示例示例1示例2示例3結構體定義 struct hrtimer {struct timerqueue_node node;ktime_t _softexpires;enum hrtimer_restart

生成目錄結構圖 tree命令

tree /f >info.txt tree命令可用于生成漂亮的目錄結構圖&#xff0c;在此之前&#xff0c;我一直以為是手打的…… .| index.html|\---static---css| bar.css| map.css| \---js

jQuery創建、插入、刪除對象

jQuery庫中的一些操作元素的方法 創建元素&#xff1a; $(htmlString)&#xff1a;這個構造器可以用來創建元素&#xff0c;其中htmlString是一個包含HTML標記的字符串。例如&#xff0c;$(<p>Hello, World!</p>)會創建一個<p>元素對象&#xff1b;$("&…

【uniapp】部分圖標點擊事件無反應

比如&#xff1a;點擊這個圖標在h5都正常&#xff0c;在小程序上無反應 css&#xff1a;也設置z-index&#xff0c;padding 頁面上也試過click.native.stop.prevent"changePassword()" 時而可以時而不行&#xff0c; 最后發現是手機里輸入鍵盤的原因&#xff0c;輸…

大型養殖場需要哪些污水處理設備

大型養殖場是一個涉及環境保護和可持續發展的關鍵行業&#xff0c;對于處理養殖場產生的污水有著明確的要求和標準。為了確保污水得到有效處理和處理效果達到國家排放標準&#xff0c;大型養殖場需要配備一系列污水處理設備。以下是幾種常見的污水處理設備&#xff1a; 1. 水解…

Python入門指南之基本概率和語法基礎

文章目錄 一、基本概念二、控制流三、函數四、模塊五、數據結構六、面向對象的編程七、輸入輸出八、異常九、Python標準庫關于Python技術儲備一、Python所有方向的學習路線二、Python基礎學習視頻三、精品Python學習書籍四、Python工具包項目源碼合集①Python工具包②Python實戰…

快速排序演示和代碼介紹

快速排序的核心是(以升序為例)&#xff1a;在待排序的數據中指定一個數做為基準數&#xff0c;把所有小于基準數的數據放到基準數的左邊&#xff0c;所有大于基準數的數據放在右邊&#xff0c;這樣的話基準數的位置就確定了&#xff0c;然后在兩邊的數據中重復上述操作

2023亞太地區數學建模B題思路分析+模型+代碼+論文

目錄 2023亞太地區數學建模A題思路&#xff1a;開賽后第一時間更新&#xff0c;獲取見文末名片 2023亞太地區數學建模B題思路&#xff1a;開賽后第一時間更新&#xff0c;獲取見文末名片 2023亞太地區數學建模C題思路&#xff1a;開賽后第一時間更新&#xff0c;獲取見文末名…

使用 Pinia 的五個技巧

在這篇文章中&#xff0c;想與大家分享使用 Pinia 的五大技巧。 以下是簡要總結&#xff1a; 不要創建無用的 getter在 Option Stores 中使用組合式函數&#xff08;composables&#xff09;對于復雜的組合式函數&#xff0c;使用 Setup Stores使用 Setup Stores 注入全局變量…