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

python如何用pymodbus庫進行modbus tcp通信

 更新時間:2024年06月29日 09:44:13   作者:brandon_l  
這篇文章主要介紹了python如何用pymodbus庫進行modbus tcp通信問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教

使用pymodbus庫進行modbus tcp通信

使用python解決工業(yè)通信問題是一個非常好的選擇,python具有豐富的生態(tài),可以輕松解決工業(yè)通信的各種問題。

本篇主要介紹使用pymodbus庫進行modbus tcp仿真,實現(xiàn)pc端讀取plc或工業(yè)設備modbus變量。

安裝pymodbus:

pip install -U pymodbus

創(chuàng)建modbus tcp server

這里我們先創(chuàng)建一個虛擬的modbus設備,如果你手里有一個plc或者工業(yè)設備,可以直接跳過本節(jié)。

  • modbus_server.py
'''
 * @Author: liuzhao 
 * @Last Modified time: 2022-10-05 09:56:13 
'''

from pymodbus.server.sync import (
    StartTcpServer,
)
from pymodbus.datastore import (
    ModbusSequentialDataBlock,
    ModbusServerContext,
    ModbusSlaveContext,
)
from pymodbus.version import version

datablock = ModbusSequentialDataBlock.create()
context = ModbusSlaveContext(
    di=datablock,
    co=datablock,
    hr=datablock,
    ir=datablock,
    )
single = True

# Build data storage
store = ModbusServerContext(slaves=context, single=single)


if __name__ == '__main__':

	address = ("0.0.0.0", 503)
	StartTcpServer(
	    context=store,  # Data storage
	    address=address,  # listen address
	  	allow_reuse_address=True,  # allow the reuse of an address
	)

直接運行該腳本,就可以在本機的503端口創(chuàng)建一臺modbus設備了,具體實現(xiàn)暫不深追,我們學習的重點是客戶端對modbus變量的讀寫。

讀寫modbus變量

modbus變量類型以及地址

Object typeAccessSizeAddress
CoilRead-write1 bit00001 – 09999
Discrete inputRead-only1 bit10001 – 19999
Input registerRead-only16 bits30001 – 39999
Holding registerRead-write16 bits40001 – 49999

coil是線圈,Discrete input是數(shù)字量輸入,Input register是模擬量輸入,Holding register是保持寄存器。一般地址范圍是0-65535

讀取常規(guī)變量

讀寫線圈 | 讀取輸入變量 | 讀寫保持寄存器

from pymodbus.client.sync import ModbusTcpClient
from pymodbus.bit_read_message import ReadCoilsResponse
from pymodbus.register_read_message import ReadInputRegistersResponse
from pymodbus.exceptions import ConnectionException      # 連接失敗,用于異常處理

host = '127.0.0.1'
port = 503
client = ModbusTcpClient(host,port)


# 寫入線圈
client.write_coil(1, True)
client.write_coil(2, False)
client.write_coil(3, True)

# 讀取線圈    注意對于離散量的讀取,第二個參數(shù)cout是有坑的,必須為8的倍數(shù)個
result:ReadCoilsResponse = client.read_coils(address=1,cout=8)     # 從地址1開始讀,讀取8個線圈,一次讀8的倍數(shù)個線圈,不設置為8的倍數(shù)可能會出現(xiàn)問題
print(result.isError())

# 不建議使用
print(result.getBit(7))            # 這里的參數(shù)address不是plc里的地址,而是python列表的address,

print('read_coils ')

# 建議使用
print(result.bits)        # 打印讀取結果,一共8位
# 讀取其中的位
print(                   
    result.bits[0],
    result.bits[1],
    result.bits[2]
    )         # 相當于result.getBit(0)


# 讀取數(shù)字輸入
result = client.read_discrete_inputs(address=10001,count=8)    # 從10001開始讀,讀取8位
print(result.bits)


# 讀取模擬輸入寄存器
input_register_result:ReadInputRegistersResponse = client.read_input_registers(1,count=8)
# print(f'is_error:{input_register_result.isError()}')
print('read_input_registers ')
print(input_register_result.registers)   
print(input_register_result.getRegister(0))   


# 讀寫保持寄存器
client.write_register(address=40001,value=100)
result:ReadInputRegistersResponse = client.read_holding_registers(address=40001,count=1)
print('read_holding_registers ')
print(result.registers)

?!£P閉連接
client.close()

讀取復雜變量

字符串、浮點數(shù)、負數(shù)等

這里需要注意modbus設備的存儲結構是低位低字節(jié)還是低位高字節(jié),也就是設備內存的字節(jié)、字的排列順序。

根據(jù)不同的設備,對照下表調整正確的組合方式。

Word OrderByte orderWord1Word2
BigBig0x12340x5678
BigLittle0x34120x7856
LittleBig0x56780x1234
LittleLittle0x78560x3412
# 復雜數(shù)據(jù)類型

from collections import OrderedDict
import logging

from pymodbus.client.sync import ModbusTcpClient as ModbusClient

from pymodbus.constants import Endian
from pymodbus.payload import BinaryPayloadBuilder, BinaryPayloadDecoder



ORDER_DICT = {"<": "LITTLE", ">": "BIG"}


def run_binary_payload_client(host:str,port:int):
  
    for word_endian, byte_endian in (
        (Endian.Big, Endian.Big),
        (Endian.Big, Endian.Little),
        (Endian.Little, Endian.Big),
        (Endian.Little, Endian.Little),
    ):
        print("-" * 60)
        print(f"Word Order: {ORDER_DICT[word_endian]}")
        print(f"Byte Order: {ORDER_DICT[byte_endian]}")
        print()
    
        builder = BinaryPayloadBuilder(
            wordorder=word_endian,
            byteorder=byte_endian,
        )
		
		# 寫入的變量
        my_string = "abcd-efgh123345765432"
        builder.add_string(my_string)
        builder.add_bits([0, 1, 0, 1, 1, 0, 1, 0])
        builder.add_8bit_int(-0x12)
        builder.add_8bit_uint(0x12)
        builder.add_16bit_int(-0x5678)
        builder.add_16bit_uint(0x1234)
        builder.add_32bit_int(-0x1234)
        builder.add_32bit_uint(0x12345678)
        builder.add_16bit_float(12.34)
        builder.add_16bit_float(-12.34)
        builder.add_32bit_float(22.34)
        builder.add_32bit_float(-22.34)
        builder.add_64bit_int(-0xDEADBEEF)
        builder.add_64bit_uint(0x12345678DEADBEEF)
        builder.add_64bit_uint(0x12345678DEADBEEF)
        builder.add_64bit_float(123.45)
        builder.add_64bit_float(-123.45)
        registers = builder.to_registers()
        print("Writing Registers:")
        print(registers)
        print("\n")
        payload = builder.build()
        address = 40001          # 從40001開始寫入
        # We can write registers
        client.write_registers(address, registers, unit=1)    # 寫入
     	
     	# 讀取復雜變量
        print("Reading Registers:")
        address = 40001

        count = len(payload)
        print(f"payload_len {count}")
        result = client.read_holding_registers(address, count, slave=1)
        print(result.registers)
        print("\n")
        decoder = BinaryPayloadDecoder.fromRegisters(
            result.registers, byteorder=byte_endian, wordorder=word_endian
        )
        # Make sure word/byte order is consistent between BinaryPayloadBuilder and BinaryPayloadDecoder
        assert (
            decoder._byteorder == builder._byteorder  # pylint: disable=protected-access
        )  # nosec
        assert (
            decoder._wordorder == builder._wordorder  # pylint: disable=protected-access
        )  # nosec

        decoded = OrderedDict(
            [
                ("string", decoder.decode_string(len(my_string))),
                ("bits", decoder.decode_bits()),
                ("8int", decoder.decode_8bit_int()),
                ("8uint", decoder.decode_8bit_uint()),
                ("16int", decoder.decode_16bit_int()),
                ("16uint", decoder.decode_16bit_uint()),
                ("32int", decoder.decode_32bit_int()),
                ("32uint", decoder.decode_32bit_uint()),
                ("16float", decoder.decode_16bit_float()),
                ("16float2", decoder.decode_16bit_float()),
                ("32float", decoder.decode_32bit_float()),
                ("32float2", decoder.decode_32bit_float()),
                ("64int", decoder.decode_64bit_int()),
                ("64uint", decoder.decode_64bit_uint()),
                ("ignore", decoder.skip_bytes(8)),
                ("64float", decoder.decode_64bit_float()),
                ("64float2", decoder.decode_64bit_float()),
            ]
        )
        print("Decoded Data")
        for name, value in iter(decoded.items()):
            print(
                "%s\t" % name,  # pylint: disable=consider-using-f-string
                hex(value) if isinstance(value, int) else value,
            )
        print("\n")

	# 關閉連接
    client.close()


if __name__ == "__main__":
    run_binary_payload_client("127.0.0.1", 503)    

總結

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • pytest配置文件pytest.ini的配置、原理與實際應用詳解

    pytest配置文件pytest.ini的配置、原理與實際應用詳解

    在Python的測試生態(tài)中,pytest無疑是最受歡迎的測試框架之一,在pytest的眾多配置文件中,pytest.ini無疑是最為重要和常用的一個,本文將深入探討pytest.ini的配置、工作原理以及實際應用場景,幫助讀者更好地理解和使用這一強大的工具,需要的朋友可以參考下
    2025-03-03
  • django 按時間范圍查詢數(shù)據(jù)庫實例代碼

    django 按時間范圍查詢數(shù)據(jù)庫實例代碼

    這篇文章主要介紹了django 按時間范圍查詢數(shù)據(jù)庫實例代碼,分享了相關代碼示例,小編覺得還是挺不錯的,具有一定借鑒價值,需要的朋友可以參考下
    2018-02-02
  • 三種Matplotlib中動態(tài)更新繪圖的方法總結

    三種Matplotlib中動態(tài)更新繪圖的方法總結

    這篇文章主要為大家詳細介紹了如何隨著數(shù)據(jù)的變化動態(tài)更新Matplotlib(Python的數(shù)據(jù)可視化庫)圖,文中介紹了常用的三種方法,希望對大家有所幫助
    2024-04-04
  • python實現(xiàn)的自動發(fā)送消息功能詳解

    python實現(xiàn)的自動發(fā)送消息功能詳解

    這篇文章主要介紹了python實現(xiàn)的自動發(fā)送消息功能,涉及Python基于requests、itchat庫的數(shù)據(jù)請求與信息處理相關操作技巧,需要的朋友可以參考下
    2019-08-08
  • Python簡單日志處理類分享

    Python簡單日志處理類分享

    這篇文章主要介紹了Python簡單日志處理類分享,本文直接給出實現(xiàn)代碼,需要的朋友可以參考下
    2015-02-02
  • 總結歸納python os庫常用方法

    總結歸納python os庫常用方法

    這篇文章主要為大家介紹了python os庫常用方法的總結歸納,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-03-03
  • python 判斷字符串是否為空的多種方法

    python 判斷字符串是否為空的多種方法

    這篇文章主要介紹了python 如何判斷字符是否為空,通過本文的介紹,我們學習了三種判斷字符串是否為空的方法,并給出了相應的代碼示例,需要的朋友可以參考下
    2024-06-06
  • python使用beautifulsoup從愛奇藝網(wǎng)抓取視頻播放

    python使用beautifulsoup從愛奇藝網(wǎng)抓取視頻播放

    這篇文章主要介紹了python使用beautifulsoup從愛奇藝網(wǎng)抓取視頻并播放示例,大家參考使用吧
    2014-01-01
  • Selenium環(huán)境變量配置(火狐瀏覽器)及驗證實現(xiàn)

    Selenium環(huán)境變量配置(火狐瀏覽器)及驗證實現(xiàn)

    這篇文章主要介紹了Selenium環(huán)境變量配置(火狐瀏覽器)及驗證實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-12-12
  • 解決pytorch rnn 變長輸入序列的問題

    解決pytorch rnn 變長輸入序列的問題

    這篇文章主要介紹了解決pytorch rnn 變長輸入序列的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-05-05

最新評論

增城市| 许昌市| 杭锦旗| 上犹县| 泰兴市| 华安县| 霍林郭勒市| 临汾市| 涡阳县| 元谋县| 阳新县| 桦川县| 保康县| 府谷县| 图们市| 滨州市| 吉木乃县| 即墨市| 紫阳县| 团风县| 库尔勒市| 霍山县| 辰溪县| 景洪市| 巴马| 徐州市| 石林| 吉林市| 乐清市| 新乡市| 临夏县| 甘德县| 方山县| 杭锦后旗| 南安市| 安康市| 新建县| 内江市| 哈尔滨市| 洱源县| 赞皇县|