2015-01-11 2 views
0

Я использую следующий код, чтобы попытаться отправить данные в качестве раба 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) 

Теперь им готовы начать и использовать все эти функции. С чего начать? Должен ли я просто вызвать функции, которые мне нужны? Моей волей является подключение к ведущему устройству в качестве ведомого и изменение регистра.

Спасибо за ответы.

+0

Вы должны прочитать руководство по устройству, с которым вы пытаетесь установить соединение, и узнать, какие номера регистров вы хотите изменить. В приложениях, которые я создал с помощью pymodbus, единственными функциями, которые я использовал часто, являются метод write_register и 'read_register' класса' minimalmodbus.Instrument'. –

+0

Привет, Оливер, спасибо за ответ. Я знаю идентификатор устройства и регистры, которые я хочу изменить. Я просто не могу понять, что должно быть первым и как. сначала открыть соединение с сервером и прочитать? какие функции я должен использовать? – user3091216

+0

Когда я пишу небольшой скрипт, пытающийся подключиться, я продолжаю получать «от pymodbus.constants import Defauls - ImportError: No module с именем константы». не могу понять это, я не использую этот модуль, и даже если я его импортирую, я получаю такую ​​же ошибку. – user3091216

ответ

1

Это должно вас начать.

from pymodbus.client.sync import ModbusTcpClient 

#modbus connection 
client = ModbusTcpClient('192.168.1.100') 
connection = client.connect() 

#read register 
request = client.read_holding_registers(xxxx,3) #covert to float 
result = request.registers 

#write to register 
client.write_registers(xxxx, [xxxx,xxxx,xxxx]) 
+0

Эй, Дэвид, спасибо за ответ. Мое соединение работает, но у меня проблема с функцией read_holding_registers. Модем-адрес моего устройства - 201, должен ли я вставить этот адрес в функцию read_holding_registers или мне нужно вставить адрес регистра, который я хочу прочитать? потому что в этом маленьком скрипте я не использую этот адрес «201» где угодно. Есть идеи?? – user3091216

+0

Вставьте адрес регистра, который вы хотите прочитать. Например, мой AI1 - это регистр 40000. Поэтому я бы написал request = client.read_holding_registers (40000,3) result = request.registers. Чтобы проверить правильность работы ПЛК, загрузите программу OmniMBT. Это бесплатная загрузка. Дайте мне знать, если это не имеет смысла, и я могу объяснить по-другому. –