python pymodbus模塊的具體使用
一、詳解
pymodbus是一個(gè)基于Python的開源庫,用于實(shí)現(xiàn)Modbus通信協(xié)議。Modbus是一種廣泛應(yīng)用于工業(yè)自動(dòng)化領(lǐng)域的串行通信協(xié)議,支持主從架構(gòu)(客戶端-服務(wù)器模型)。pymodbus庫提供了完整的Modbus客戶端(主站)和服務(wù)器(從站)功能,支持多種傳輸方式,包括Modbus RTU(串行通信)和Modbus TCP(以太網(wǎng)通信)。
1、 基礎(chǔ)概念
Modbus協(xié)議定義了一套標(biāo)準(zhǔn)的數(shù)據(jù)模型和通信規(guī)則:
- 數(shù)據(jù)模型:使用寄存器存儲(chǔ)數(shù)據(jù),分為:
- 線圈(Coils):1位讀寫寄存器,用于布爾值(如開關(guān)狀態(tài))。
- 離散輸入(Discrete Inputs):1位只讀寄存器。
- 保持寄存器(Holding Registers):16位讀寫寄存器,用于整數(shù)值(如傳感器讀數(shù))。
- 輸入寄存器(Input Registers):16位只讀寄存器。
- 地址范圍:每個(gè)寄存器類型有獨(dú)立地址空間,范圍從0到65535(即 0 ≤ address ≤ 65535 0 \leq \text{address} \leq 65535 0≤address≤65535)。
- 功能碼:Modbus操作使用功能碼(Function Code),例如:
- 讀線圈:功能碼1。
- 寫單個(gè)寄存器:功能碼6。
- 完整列表可參考Modbus標(biāo)準(zhǔn)文檔。
pymodmos庫實(shí)現(xiàn)了這些概念,支持Python 3.6及以上版本,并兼容多種操作系統(tǒng)(Windows、Linux、macOS)。
2、核心功能
pymodbus提供模塊化設(shè)計(jì),主要組件包括:
- 客戶端(Client):作為主站發(fā)起請(qǐng)求,支持同步和異步模式。
- 支持Modbus TCP和RTU傳輸。
- 提供讀寫API,如
read_coils、write_register。
- 服務(wù)器(Server):作為從站響應(yīng)請(qǐng)求,可模擬設(shè)備行為。
- 支持?jǐn)?shù)據(jù)存儲(chǔ)上下文(如
ModbusServerContext)。 - 內(nèi)置線程或異步事件處理。
- 支持?jǐn)?shù)據(jù)存儲(chǔ)上下文(如
- 協(xié)議處理:
- 自動(dòng)處理Modbus PDU(協(xié)議數(shù)據(jù)單元)格式。
- 支持異常響應(yīng)(如非法地址時(shí)返回錯(cuò)誤碼)。
- 擴(kuò)展性:允許自定義數(shù)據(jù)處理器和傳輸層(如通過串口或Socket)。
關(guān)鍵優(yōu)勢:
- 輕量級(jí):純Python實(shí)現(xiàn),無需外部依賴。
- 靈活:支持同步(
pymodbus.client)和異步(pymodbus.async)編程。 - 兼容性:遵循Modbus標(biāo)準(zhǔn),可與PLC、HMI等工業(yè)設(shè)備互操作。
3、安裝與設(shè)置
安裝pymodbus簡單,通過pip命令即可:
pip install pymodbus
安裝后,導(dǎo)入所需模塊:
from pymodbus.client import ModbusTcpClient # TCP客戶端 from pymodbus.server import StartTcpServer # TCP服務(wù)器 from pymodbus.datastore import ModbusSlaveContext, ModbusServerContext # 數(shù)據(jù)存儲(chǔ)
環(huán)境要求:
- Python 3.6+。
- 對(duì)于Modbus RTU,需物理串口或虛擬串口工具(如pyserial)。
- 測試工具推薦:使用Modbus模擬軟件(如Modbus Poll)驗(yàn)證通信。
4、使用示例
以下示例展示常見場景,代碼基于同步模式(異步模式類似,使用asyncio)。
示例1: Modbus TCP客戶端(讀取保持寄存器)
作為客戶端,連接到服務(wù)器并讀取數(shù)據(jù)。
from pymodbus.client import ModbusTcpClient
# 連接到服務(wù)器(假設(shè)IP: 127.0.0.1, 端口: 502)
client = ModbusTcpClient('127.0.0.1', port=502)
client.connect()
# 讀取保持寄存器(地址0,數(shù)量2個(gè)寄存器)
result = client.read_holding_registers(address=0, count=2, unit=1) # unit為從站ID
if not result.isError():
print("讀取成功:", result.registers) # 輸出寄存器值列表,如[100, 200]
else:
print("錯(cuò)誤:", result)
client.close() # 關(guān)閉連接
示例2: Modbus TCP服務(wù)器(模擬從站)
創(chuàng)建服務(wù)器并存儲(chǔ)數(shù)據(jù)。
from pymodbus.server import StartTcpServer
from pymodbus.datastore import ModbusSlaveContext, ModbusServerContext
from pymodbus.datastore import ModbusSequentialDataBlock
# 初始化數(shù)據(jù)存儲(chǔ):設(shè)置保持寄存器(地址0-9,初始值0)
store = ModbusSlaveContext(
hr=ModbusSequentialDataBlock(0, [0]*10) # hr表示保持寄存器
)
context = ModbusServerContext(slaves=store, single=True) # single模式為單從站
# 啟動(dòng)服務(wù)器(端口502)
StartTcpServer(context=context, address=("0.0.0.0", 502))
示例3: Modbus RTU通信(使用串口)
適用于串行設(shè)備。
from pymodbus.client import ModbusSerialClient # 配置串口(端口COM1, 波特率9600) client = ModbusSerialClient(method='rtu', port='COM1', baudrate=9600) client.connect() # 寫單個(gè)線圈(地址0,值True) client.write_coil(address=0, value=True, unit=1) client.close()
5、 高級(jí)特性
pymodbus支持更復(fù)雜場景:
- 異步模式:使用
AsyncModbusTcpClient結(jié)合asyncio,提高并發(fā)性能。import asyncio from pymodbus.client import AsyncModbusTcpClient async def main(): client = AsyncModbusTcpClient('127.0.0.1', port=502) await client.connect() result = await client.read_holding_registers(0, 2) print(result.registers) await client.close() asyncio.run(main()) - 自定義數(shù)據(jù)處理器:重寫
ModbusRequestHandler處理特定邏輯。 - 安全擴(kuò)展:支持TLS加密(Modbus TCP)或自定義認(rèn)證。
- 診斷工具:內(nèi)置日志記錄(
import logging),便于調(diào)試通信問題。
性能優(yōu)化建議:
- 使用連接池管理客戶端實(shí)例。
- 批量讀寫減少請(qǐng)求次數(shù)(如
read_holding_registers中count參數(shù))。 - 在資源受限設(shè)備上,啟用精簡模式(禁用不必要功能)。
6、注意事項(xiàng)
- 錯(cuò)誤處理:pymodbus可能拋出異常(如
ModbusIOException),需捕獲處理:try: result = client.read_coils(0, 1) except Exception as e: print("通信錯(cuò)誤:", e) - 協(xié)議限制:
- Modbus RTU要求嚴(yán)格時(shí)序(如3.5字符間隔)。
- 地址溢出:確保地址在有效范圍(如超出65535會(huì)報(bào)錯(cuò))。
- 常見問題:
- 連接超時(shí):檢查網(wǎng)絡(luò)或串口配置。
- 數(shù)據(jù)不一致:驗(yàn)證字節(jié)序(pymodbus默認(rèn)大端序)。
- 性能瓶頸:在高頻通信中,優(yōu)先使用異步模式。
- 資源:
- 官方文檔:pymodbus GitHub
- 社區(qū)支持:通過GitHub Issues獲取幫助。
二、代碼示例
1、modbusTCP client
from time import sleep
from pymodbus.client import ModbusTcpClient
client = ModbusTcpClient('127.0.0.1')
client.connect()
while True:
res = client.read_holding_registers(slave=1,address=0,count=10)
print(res.registers)
sleep(0.5)

2、modbusRTU client
from time import sleep
from pymodbus.client import ModbusSerialClient
client = ModbusSerialClient(method='rtu', port='COM1', baudrate=9600, timeout=1)
connection = client.connect()
while True:
res = client.read_holding_registers(slave=1,address=0,count=10)
print(res.registers)
sleep(0.5)

到此這篇關(guān)于python pymodbus模塊的具體使用的文章就介紹到這了,更多相關(guān)python pymodbus使用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python基于paramunittest模塊實(shí)現(xiàn)excl參數(shù)化
這篇文章主要介紹了Python基于paramunittest模塊實(shí)現(xiàn)excl參數(shù)化,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-04-04
python基礎(chǔ)教程之實(shí)現(xiàn)石頭剪刀布游戲示例
使用PYTHON設(shè)計(jì)一個(gè)"石頭,剪子,布"游戲,有時(shí)又叫"Rochambeau",下面是實(shí)現(xiàn)方法,需要的朋友可以參考下2014-02-02
Python參數(shù)傳遞機(jī)制傳值和傳引用原理詳解
這篇文章主要介紹了Python參數(shù)傳遞機(jī)制傳值和傳引用原理詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-05-05
通過python掃描二維碼/條形碼并打印數(shù)據(jù)
這篇文章主要介紹了通過python掃描二維碼/條形碼并打印數(shù)據(jù),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11

