最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python中pymodbus模塊詳細(xì)講解

 更新時間:2026年02月25日 11:09:11   作者:我是一只小青蛙888  
pymodbus是一個基于Python的開源庫,用于實現(xiàn)Modbus通信協(xié)議,Modbus是一種廣泛應(yīng)用于工業(yè)自動化領(lǐng)域的串行通信協(xié)議,支持主從架構(gòu),這篇文章主要介紹了Python中pymodbus模塊的相關(guān)資料,需要的朋友可以參考下

好的,我們來詳細(xì)講解一下 Python 的 pymodbus 模塊。

概述

pymodbus 是一個用純 Python 實現(xiàn)的 Modbus 協(xié)議棧。Modbus 是一種廣泛應(yīng)用于工業(yè)自動化領(lǐng)域的串行通信協(xié)議,常用于連接 PLC(可編程邏輯控制器)、傳感器、儀表等設(shè)備。pymodbus 支持 Modbus TCP(基于 TCP/IP)和 Modbus RTU/ASCII(基于串行線路,如 RS-232/RS-485)兩種主要傳輸方式。

核心功能與概念

  1. 協(xié)議類型:

    • Modbus TCP: 使用 TCP/IP 協(xié)議進(jìn)行通信,端口號通常為 502。
    • Modbus RTU: 使用串行通信(RS-232/485),數(shù)據(jù)以二進(jìn)制形式傳輸。
    • Modbus ASCII: 使用串行通信,數(shù)據(jù)以 ASCII 字符形式傳輸(較少見)。
  2. 角色:

    • Client (主站/Master): 發(fā)起請求的設(shè)備。通常由上位機(jī)(如運行 Python 程序的 PC)充當(dāng)。
    • Server (從站/Slave): 響應(yīng)請求的設(shè)備。通常是 PLC、傳感器等現(xiàn)場設(shè)備。pymodbus 也可以用來模擬從站設(shè)備。
  3. 數(shù)據(jù)模型 (寄存器類型):

    • 線圈 (Coils): 1 位,可讀寫。通常表示開關(guān)量輸出狀態(tài)(如繼電器開/關(guān))。
    • 離散輸入 (Discrete Inputs): 1 位,只讀。通常表示開關(guān)量輸入狀態(tài)(如按鈕按下/松開)。
    • 保持寄存器 (Holding Registers): 16 位,可讀寫。通常存儲設(shè)備參數(shù)、設(shè)定值等。
    • 輸入寄存器 (Input Registers): 16 位,只讀。通常存儲設(shè)備采集的實時數(shù)據(jù)(如溫度、壓力)。
  4. 常用功能碼:

    • 01 (0x01): 讀取線圈狀態(tài)。
    • 02 (0x02): 讀取離散輸入狀態(tài)。
    • 03 (0x03): 讀取保持寄存器。
    • 04 (0x04): 讀取輸入寄存器。
    • 05 (0x05): 寫單個線圈。
    • 06 (0x06): 寫單個保持寄存器。
    • 15 (0x0F): 寫多個線圈。
    • 16 (0x10): 寫多個保持寄存器。

安裝

pip install pymodbus

使用示例

作為客戶端 (Client) - 讀取數(shù)據(jù)

Modbus TCP 示例 (同步)

from pymodbus.client import ModbusTcpClient

# 連接到 Modbus TCP 服務(wù)器 (假設(shè)地址為 192.168.1.100, 端口 502)
client = ModbusTcpClient('192.168.1.100', port=502)
connection = client.connect()  # 建立連接

if connection:
    try:
        # 讀取從站地址為 1 的設(shè)備上的保持寄存器 (功能碼 03)
        # 起始地址 = 0, 讀取數(shù)量 = 5 個寄存器
        response = client.read_holding_registers(address=0, count=5, slave=1)

        if not response.isError():
            # 獲取寄存器值列表 (每個寄存器是 16 位無符號整數(shù))
            registers = response.registers
            print(f"讀取到的寄存器值: {registers}")
        else:
            print(f"讀取錯誤: {response}")
    finally:
        client.close()  # 關(guān)閉連接
else:
    print("無法連接到 Modbus 服務(wù)器")

Modbus RTU 示例 (同步)

from pymodbus.client import ModbusSerialClient

# 連接到串口設(shè)備 (例如 COM3, 波特率 9600, 8N1)
# method='rtu' 表示使用 RTU 模式
client = ModbusSerialClient(
    port='COM3',
    baudrate=9600,
    bytesize=8,
    parity='N',
    stopbits=1,
    method='rtu'
)
connection = client.connect()

if connection:
    try:
        # 讀取從站地址為 1 的設(shè)備上的輸入寄存器 (功能碼 04)
        # 起始地址 = 100, 讀取數(shù)量 = 3 個寄存器
        response = client.read_input_registers(address=100, count=3, slave=1)

        if not response.isError():
            registers = response.registers
            print(f"讀取到的輸入寄存器值: {registers}")
        else:
            print(f"讀取錯誤: {response}")
    finally:
        client.close()

作為服務(wù)器 (Server) - 提供數(shù)據(jù)

Modbus TCP 服務(wù)器示例

from pymodbus.server import StartTcpServer
from pymodbus.datastore import ModbusSequentialDataBlock
from pymodbus.datastore import ModbusSlaveContext, ModbusServerContext

# 定義數(shù)據(jù)存儲
# 初始化各個數(shù)據(jù)區(qū)域 (起始地址, 初始值列表)
coils = ModbusSequentialDataBlock(0, [False] * 100)  # 100 個線圈,初始為 False
discrete_inputs = ModbusSequentialDataBlock(0, [True] * 100)  # 100 個離散輸入,初始為 True
holding_registers = ModbusSequentialDataBlock(0, [0] * 100)  # 100 個保持寄存器,初始為 0
input_registers = ModbusSequentialDataBlock(0, [0] * 100)  # 100 個輸入寄存器,初始為 0

# 創(chuàng)建從站上下文 (Slave Context),關(guān)聯(lián)數(shù)據(jù)塊
slave_context = ModbusSlaveContext(
    di=discrete_inputs,  # 離散輸入
    co=coils,            # 線圈
    hr=holding_registers, # 保持寄存器
    ir=input_registers,   # 輸入寄存器
)

# 創(chuàng)建服務(wù)器上下文 (Server Context),可以包含多個從站 (這里只定義了一個從站,地址為 1)
context = ModbusServerContext(slaves={1: slave_context}, single=False)

# 啟動 TCP 服務(wù)器,監(jiān)聽所有接口 (0.0.0.0) 的 502 端口
StartTcpServer(context=context, address=("0.0.0.0", 502))

高級特性

  • 異步客戶端: 使用 AsyncModbusTcpClientAsyncModbusSerialClient,配合 asyncio 庫進(jìn)行異步編程,提高并發(fā)性能。
  • 數(shù)據(jù)解析: 寄存器通常存儲 16 位數(shù)據(jù)。對于 32 位浮點數(shù)、64 位整數(shù)等,需要將多個寄存器組合起來并按特定字節(jié)序解析。pymodbus 提供了 payload 模塊中的工具(如 BinaryPayloadBuilder, BinaryPayloadDecoder)來幫助處理這些復(fù)雜數(shù)據(jù)類型。
  • 自定義數(shù)據(jù)存儲: 可以繼承 ModbusSparseDataBlock 或?qū)崿F(xiàn)自己的存儲類,用于更靈活地管理數(shù)據(jù)。
  • 回調(diào): 服務(wù)器端可以設(shè)置回調(diào)函數(shù),在數(shù)據(jù)被讀取或?qū)懭霑r執(zhí)行自定義邏輯。

注意事項

  1. 地址偏移: Modbus 協(xié)議中的寄存器地址通常從 0 開始。但有些設(shè)備手冊或軟件習(xí)慣使用從 1 開始的地址(如 40001 代表保持寄存器地址 0)。使用 pymodbus 時,傳入的 address 參數(shù)通常是基于 0 的索引。務(wù)必查閱設(shè)備文檔確認(rèn)地址映射規(guī)則。
  2. 字節(jié)序 (Endianness): 處理多寄存器數(shù)據(jù)(如浮點數(shù))時,必須了解設(shè)備使用的字節(jié)序(大端序 Big-Endian / 小端序 Little-Endian)和字序(高低字順序)。
  3. 超時: 在創(chuàng)建客戶端時設(shè)置合理的 timeout 參數(shù),避免網(wǎng)絡(luò)或設(shè)備響應(yīng)慢導(dǎo)致程序長時間阻塞。
  4. 錯誤處理: 始終檢查 response.isError() 并處理可能的異常(如超時、連接失敗、Modbus 異常響應(yīng))。
  5. 資源釋放: 使用 try...finally 確保連接 (client.close()) 或服務(wù)器 (StopTcpServer() / StopSerialServer()) 被正確關(guān)閉。

總結(jié)

pymodbus 是一個功能強(qiáng)大且靈活的 Python Modbus 庫,適用于開發(fā)需要與工業(yè)設(shè)備通信的應(yīng)用程序。通過理解 Modbus 協(xié)議基礎(chǔ)、數(shù)據(jù)模型和 pymodbus 提供的接口,開發(fā)者可以高效地實現(xiàn)主站(數(shù)據(jù)采集、控制)或從站(模擬設(shè)備、數(shù)據(jù)提供)功能。務(wù)必參考官方文檔和示例代碼以獲取更詳細(xì)的信息:https://pymodbus.readthedocs.io/。

到此這篇關(guān)于Python中pymodbus模塊詳細(xì)講解的文章就介紹到這了,更多相關(guān)Python pymodbus模塊內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • python 計算概率密度、累計分布、逆函數(shù)的例子

    python 計算概率密度、累計分布、逆函數(shù)的例子

    這篇文章主要介紹了python 計算概率密度、累計分布、逆函數(shù)的例子,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-02-02
  • 6種方法輕松實現(xiàn)將Python腳本打包成EXE應(yīng)用

    6種方法輕松實現(xiàn)將Python腳本打包成EXE應(yīng)用

    將?Python?代碼打包成獨立的可執(zhí)行文件是一個非常常見的需求,用戶無需任何額外環(huán)境配置,就能像運行普通軟件一樣直接啟動您的?Python?應(yīng)用,下面小編就和大家介紹六種主流且有效的?Python?打包工具吧
    2025-12-12
  • Python批量修改xml的坐標(biāo)值全部轉(zhuǎn)為整數(shù)的實例代碼

    Python批量修改xml的坐標(biāo)值全部轉(zhuǎn)為整數(shù)的實例代碼

    這篇文章主要介紹了Python批量修改xml的坐標(biāo)值全部轉(zhuǎn)為整數(shù)的實例代碼,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-11-11
  • Python+Tkinter實現(xiàn)Windows?Hosts文件編輯管理工具

    Python+Tkinter實現(xiàn)Windows?Hosts文件編輯管理工具

    在日常開發(fā)和網(wǎng)絡(luò)調(diào)試或科學(xué)上網(wǎng)場景中,Hosts文件修改是每個開發(fā)者都繞不開的"必修課",本文將完整解析一個基于Python?Tkinter開發(fā)的Windows?Hosts管理工具,希望對大家有一定的幫助
    2025-05-05
  • pycharm 創(chuàng)建py文件總是為txt格式的問題及解決

    pycharm 創(chuàng)建py文件總是為txt格式的問題及解決

    這篇文章主要介紹了pycharm 創(chuàng)建py文件總是為txt格式的問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • Python中Tkinter組件Button的具體使用

    Python中Tkinter組件Button的具體使用

    Button=組件用于實現(xiàn)各種各樣的按鈕,本文主要介紹了Python中Tkinter組件Button的具體使用,具有一定的參考價值,感興趣的可以了解一下
    2022-01-01
  • Python confluent kafka客戶端配置kerberos認(rèn)證流程詳解

    Python confluent kafka客戶端配置kerberos認(rèn)證流程詳解

    這篇文章主要介紹了Python confluent kafka客戶端配置kerberos認(rèn)證流程詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-10-10
  • 教你用Python讀取CSV文件的5種方式

    教你用Python讀取CSV文件的5種方式

    一個股票的數(shù)據(jù)集,其實就是常見的表格數(shù)據(jù),有自己的頭部和身體,這篇文章主要介紹了用Python讀取CSV文件的5種方式,通過五招給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2021-11-11
  • pandas DataFrame 刪除重復(fù)的行的實現(xiàn)方法

    pandas DataFrame 刪除重復(fù)的行的實現(xiàn)方法

    這篇文章主要介紹了pandas DataFrame 刪除重復(fù)的行的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-01-01
  • 基于Python搭建人臉識別考勤系統(tǒng)

    基于Python搭建人臉識別考勤系統(tǒng)

    人臉識別目前正被用于讓世界更安全、更智能、更方便。在本文中,你將學(xué)習(xí)如何使用 Python 構(gòu)建人臉識別系統(tǒng)。人臉識別比人臉檢測更進(jìn)一步。感興趣的可以學(xué)習(xí)一下
    2021-12-12

最新評論

黎平县| 雷波县| 民县| 墨玉县| 高邑县| 集安市| 高邑县| 义马市| 尤溪县| 济源市| 奈曼旗| 达拉特旗| 邵阳县| 沽源县| 贵定县| 白水县| 乳山市| 新竹市| 凤台县| 新丰县| 玉门市| 兰西县| 荔波县| 十堰市| 乐昌市| 宿迁市| 和田市| 福清市| 房山区| 治县。| 张家界市| 海淀区| 家居| 崇文区| 泰顺县| 那曲县| 尉氏县| 文昌市| 城固县| 邵武市| 辰溪县|