我正在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]
你不能只用
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")