modbus 服务器客户端关系不一致

问题描述 投票:0回答:1

我正在VM(Ubuntu)中模拟Modbus服务器客户端连接。服务器正在运行并在寄存器上写入随机值。客户端应该从寄存器中读取随机写入的值,然后在不同的寄存器上写入不同的值,然后读取它们。客户端不会从寄存器中读取(由服务器)最初写入的值。但是,当我更改寄存器以将值写入第一个寄存器(服务器写入值的位置),然后在客户端代码的连续运行中读取寄存器时,客户端正确读取它(在寄存器上)写入的值。但服务器仍然没有在同一寄存器上一致地写入和更新值。

服务器代码是:

import random
from pyModbusTCP.server import ModbusServer, DataBank
from time import sleep

#instance of ModbusServer
server = ModbusServer("127.0.0.1", 12344, no_block=True)

#instance of DataBank
data_bank = DataBank()
server.data_bank = data_bank

    try:
        print("Start Server...")
        server.start()
        print("Server is online")
        state = 0
    while True:
        data_bank.set_holding_registers(0, [random.randint(1, 100)])  # Set holding register values
        if state != data_bank.get_holding_registers(0, 1)[0]:  # Get holding register values
            state = data_bank.get_holding_registers(0, 1)[0]
            print("Value of Register 1 has changed to " + str(state))
            sleep(1)
except Exception as e:
    print(f"An error occurred: {e}")
    print("Shutdown server...")
    server.stop()
    print("Server is stopped")

服务器输出为:

Start Server...
Server is online
Value of Register 1 has changed to 88
Value of Register 1 has changed to 83
Value of Register 1 has changed to 51
Value of Register 1 has changed to 61
Value of Register 1 has changed to 45
^CTraceback (most recent call last):
  File "/home/neptun/Desktop/modbusyt/server.py", line 22, in <module>
    sleep(1)
KeyboardInterrupt

客户端代码是:

import pyModbusTCP
from pyModbusTCP.client import ModbusClient

client = ModbusClient(host='127.0.0.1', port=12344, auto_open=True, debug=False)

try:
    regs = client.read_holding_registers(0, 1)
    if regs:
        print(regs)
    else:
        print("Read error")
except pyModbusTCP.ModbusIOException as e:
    print(f"Error reading registers: {e}")

try:
    client.write_multiple_registers(0, [1, 2, 3])
    regs = client.read_holding_registers(0, 5)
    if regs:
        print(regs)
    else:
        print("Read error")
except pyModbusTCP.ModbusIOException as e:
   print(f"Error writing registers: {e}")

客户端输出是:

# first run:
[0]
[1, 2, 3, 0, 0]
# Consecutive runs:
[1]
[1, 2, 3, 0, 0]
python modbus modbus-tcp pymodbus pymodbustcp
1个回答
0
投票

你不能只用

server.data_bank = data_bank
设置 data_bank (它在构造函数中用于创建
data_hdl
等);相反,在创建服务器时传递它:

#instance of DataBank
data_bank = DataBank()

#instance of ModbusServer
server = ModbusServer("127.0.0.1", 12344, no_block=True, data_bank=data_bank)

这样我们得到以下输出:

./client.py
[70]
[1, 2, 3, 0, 0]

./client.py
[31]
[1, 2, 3, 0, 0]

./client.py
[64]
[1, 2, 3, 0, 0]

下面的完整服务器(您的问题中有一些缩进问题)

import random
from pyModbusTCP.server import ModbusServer, DataBank
from time import sleep

# instance of DataBank
data_bank = DataBank()

# instance of ModbusServer
server = ModbusServer("127.0.0.1", 12344, no_block=True, data_bank=data_bank)

try:
    print("Start Server...")
    server.start()
    print("Server is online")
    state = 0
    while True:
        data_bank.set_holding_registers(0, [random.randint(1, 100)])  # Set holding register values
        if state != data_bank.get_holding_registers(0, 1)[0]:  # Get holding register values
            state = data_bank.get_holding_registers(0, 1)[0]
            print("Value of Register 1 has changed to " + str(state))
            sleep(1)
except Exception as e:
    print(f"An error occurred: {e}")

print("Shutdown server...")
server.stop()
print("Server is stopped")
© www.soinside.com 2019 - 2024. All rights reserved.