Сервер Modbus с umodbus - PullRequest
       15

Сервер Modbus с umodbus

0 голосов
/ 17 января 2019

Я создаю сервер Modbus, используя модуль python umodbus. Два клиента подключаются к серверу. Один читает регистры, а другой записывает одни и те же регистры каждые 5 секунд. Теперь проблема в том, что оба клиента не могут читать и писать одновременно. '' '

Позже я понял, что мне нужно закрывать соединение после каждого чтения и записи от обоих клиентов. Но все же иногда один из клиентов не может подключиться, и флаг подключения показывает False.

Как я могу справиться с этой ситуацией на стороне сервера, чтобы он работал стабильно, и 1-й клиент может записать регистр, а другие могут легко прочитать регистр?

from socketserver import TCPServer
from collections import defaultdict

from umodbus import conf
from umodbus.server.tcp import RequestHandler, get_server
from umodbus.utils import log_to_stream

log_to_stream(level=logging.DEBUG)
data_store =defaultdict(int)

conf.SIGNED_VALUES = True

TCPServer.allow_reuse_address = True
app = get_server(TCPServer, ('0.0.0.0', 502), RequestHandler)

data_store[10]=0
data_store[11]=0
data_store[20]=0
data_store[21]=0

@app.route(slave_ids=[1], function_codes=[3,4], addresses=list(range(10,15)))
def read_data_store_power(slave_id, function_code, address):
   """" Return value of address. """
   print("Read Power: "+str(address))
   return data_store[address]

@app.route(slave_ids=[1], function_codes=[6, 16], addresses=list(range(10, 15)))
def write_data_store_power(slave_id, function_code, address, value):
   """" Set value for address. """
   print("Write Power: "+str(address)+" Value: "+str(value))
   data_store[address] = value


@app.route(slave_ids=[1], function_codes=[3,4], addresses=list(range(20,25)))
def read_data_store_energy(slave_id, function_code, address):
   """" Return value of address. """
   print("Read Request for Energy no:"+str(address))
   return data_store[address]

@app.route(slave_ids=[1], function_codes=[6, 16], addresses=list(range(20, 25)))
def write_data_store_power_energy(slave_id, function_code, address, value):
   """" Set value for address. """
   print("Write Request for: "+str(address)+" and Value: "+str(value))
   data_store[address] = value


if __name__ == '__main__':
   try:
       app.serve_forever()
   finally:
       app.shutdown()
       app.server_close()````







...