Я использую следующий код, чтобы попытаться отправить данные в качестве раба ModbusTCP:Использование Pymodbus TCP Client implementaion
import socket
import logging
from pymodbus.constants import Defaults
from pymodbus.factory import ClientDecoder
from pymodbus.exceptions import NotImplementedException, ParameterException
from pymodbus.exceptions import ConnectionException
from pymodbus.transaction import ModbusSocketFramer, ModbusBinaryFramer
from pymodbus.client.common import ModbusClientMixin
#------------------------------------------------------------------#
#Logging
#------------------------------------------------------------------#
_logger = logging.getLogger(__name__)
##------------------------------------------------------------------##
##The Synchronous Clients
##------------------------------------------------------------------##
class BaseModbusClient(ModbusClientMixin):
def __init__(self, framer, **kwargs):
self.framer = framer
if isinstance(self.framer, ModbusSocketFramer):
self.transaction = DictTrasactionManager(self, **kwargs)
else: self.transcation = FitoTransactionManager(self, **kwargs)
def connect(self):
raise NotImplementedException("Method not implemented by derived class")
def close(self):
pass
def _send(self, request):
raise NotImplementedException("Method not implemented by derived class")
def _recv(self, size):
raise NotImplementedException("Method not implemented by derived class")
def excecute(self, request=None):
if not self.connect():
raise ConnectionException("Failed to connect[%s]" % (self.__str__()))
return self.transaction.execute(request)
def __enter__(self):
if not self.connect():
raise ConnectionException("Failed to connect [%s]" % (self.__str__()))
raise self
def __exit__(self, klass, value, traceback):
self.close()
def __str__(self):
return "Null Transport"
class ModbusTcpClient(BaseModbusClient):
def __init__(self, host='192.168.3.2', port=Defaults.Port, framer=ModbusSocketFramer, **kwargs):
self.host = host
self.port = port
self.source_address = kwargs.get('source_address', ('', 0))
BaseModbusClient.__init__(self,framer(ClientDecoder()), **kwargs)
def connect(self):
if self.socket: return True
try:
address = (self.host, self.port)
self.socket = socket.create_connection((self.host, self.port), timeout=Defaults.Timeout, source_address=self.source_address)
except socket.error, msg:
_logger.error('Connection to (%s, %s) failed: %s' % (self.host, self.port, msg))
self.close()
def close(self):
if self.socket:
self.socket.close()
self.socket = None
def _send(self, request):
if not self.socket:
raise ConnectionException(self.__str__())
if request:
return self.socket.send(request)
return 0
def _recv(self, size):
if not self.socket:
raise ConnectionException(self.__str__())
return self.socket.recv(size)
def __str__(self):
return "%s:%s" % (self.host, self.port)
Теперь им готовы начать и использовать все эти функции. С чего начать? Должен ли я просто вызвать функции, которые мне нужны? Моей волей является подключение к ведущему устройству в качестве ведомого и изменение регистра.
Спасибо за ответы.
Вы должны прочитать руководство по устройству, с которым вы пытаетесь установить соединение, и узнать, какие номера регистров вы хотите изменить. В приложениях, которые я создал с помощью pymodbus, единственными функциями, которые я использовал часто, являются метод write_register и 'read_register' класса' minimalmodbus.Instrument'. –
Привет, Оливер, спасибо за ответ. Я знаю идентификатор устройства и регистры, которые я хочу изменить. Я просто не могу понять, что должно быть первым и как. сначала открыть соединение с сервером и прочитать? какие функции я должен использовать? – user3091216
Когда я пишу небольшой скрипт, пытающийся подключиться, я продолжаю получать «от pymodbus.constants import Defauls - ImportError: No module с именем константы». не могу понять это, я не использую этот модуль, и даже если я его импортирую, я получаю такую же ошибку. – user3091216