Чтение и запись данных из контроллера температуры с использованием RS485 и Modbus (Python или LabView)

У меня проблема, которая может показаться очень простой для людей, привыкших работать с последовательными интерфейсами, но для меня это впервые.

Мы хотим автоматизировать нашу температурно-зависимую станцию ​​датчиков с помощью контроллера температуры (серии CB100 / CB400 / CB500 / CB700 / CB900 от RKC Instruments: https://www.rkcinst.co.jp/english/download-center/?dc_cat=15#). Контроллер подключен к главному устройству Dell OptiPlex5060 в корпусе Tower (https://www.dell.com/en-us/work/shop/desktops-all-in-one-pcs/optiplex-5060-small-form-factor/spd/optiplex-5060-desktop/cto01o5060sffus) под управлением Windows 10 Pro (версия 1903, сборка 18362.267) через адаптер RS485 - USB.

Устройство отображается в диспетчере устройств (порт COM3) с установленными, надеюсь, правильными драйверами (см. это скриншот). Кроме того, настройки устройства были согласованы между контроллером и главным компьютером на следующие значения (настройки порта в устройстве менеджер):

  1. Baudrate = 9600;
  2. Bitsize = 8;
  3. Четность = Нет;
  4. Стоповые биты = 1

Я думаю, что я правильно подключил устройство, используя библиотеку pymodbus со следующим кодом:

Подключение к устройству RS485 - pymodbus

#Import useful modules
from pymodbus.client.sync import ModbusSerialClient as ModbusClient
#For the first test, I manually read the configuration from the 
#the controller display and hard-code the values in the script.

d_port='COM3'                    #Device address

commspeed={}                #Communication speed
commspeed_table={
    '0':2400,
    '1':4800,
    '2':9600,
    '3':19200,
        }
commspeed['flag']='2'
commspeed['value']=commspeed_table[commspeed['flag']]

bitconf={}                  #Bit configuration
bitconf_table={
    '0':(8,'N',1),
    '1':(8,'N',2),
    '2':(7,'E',1),
    '3':(7,'E',2),
    '4':(7,'O',1),
    '5':(7,'O',2),
        }
bitconf['flag']='0'
bitconf['size'],bitconf['parity'],bitconf['stopbit']=\
bitconf_table[bitconf['flag']]

intime={}
intime['flag']='5'
intime['value']=round(int(intime['flag'])*1.666,0)

def main():
    modbus=ModbusClient(method='ascii',port='COM3',\
                        baudrate=commspeed['value'],stopbits=bitconf['stopbit'],\
                        bytesize=bitconf['size'],parity=bitconf['parity'],\
                        timeout=1)
    modbus.connect()

if __name__ == "__main__":
    main()

Однако, когда я пытаюсь прочитать его с помощью этого кода (адрес устройства - 001Hex):

r = modbus.read_holding_registers(0x0001,1)
print(r)

Я получаю такую ​​ошибку:

Ошибка Modbus: [Вход / Выход] Ошибка Modbus: [Недействительное сообщение] Получено неполное сообщение, ожидается не менее 5 байт (получено 1).

Может ли кто-нибудь помочь с предположением, в чем ошибка? Каков минимальный рабочий код для работы Modbus? Почему так сложно найти быстрые онлайн-ресурсы?

Большое спасибо, любая помощь приветствуется!


person Sir Fumi    schedule 19.09.2019    source источник
comment
read_holding_registers имеет 3 параметра; read_holding_registers(address, count, unit), а для параметра unit по умолчанию установлено значение 0x00? Возможно, вы вместо этого читаете с устройства с "адресом" 0x00?   -  person Bosz    schedule 20.09.2019
comment
Привет @Bosz, спасибо, что нашли время ответить. Я получаю ту же ошибку даже при добавлении unit = 1 в качестве аргумента функции.   -  person Sir Fumi    schedule 23.09.2019
comment
В документации на контроллер только RTU (вместо ASCII) упоминается как режим передачи сигнала.   -  person Bosz    schedule 23.09.2019
comment
@Bosz Где ты это нашел? Я использовал ASCII, как упоминалось здесь (rkcinst.co.jp/english/downlaods / 8935 / imcb03e5, стр. 7 PDF-файла, в разделе "Код связи")   -  person Sir Fumi    schedule 24.09.2019
comment
Руководство по эксплуатации связи MODBUS: турбо-контроль .com / wtbc1 / store / F3 /   -  person Bosz    schedule 24.09.2019
comment
@Bosz Большое спасибо за помощь, но, вероятно, это была проблема с оборудованием, так как мы не могли получить НИКАКОГО ответа от ведомого устройства.   -  person Sir Fumi    schedule 01.10.2019


Ответы (1)


В таких случаях может быть полезно разделить проблему. Попробуйте внешний тестер программного обеспечения, например https://www.schneider-electric.us/en/faqs/FA180037/. Когда ваше ведомое устройство ответит правильно, у вас будет надежный справочник по отладке кода.

person Guust-DSP    schedule 26.09.2019
comment
Большое спасибо за помощь, но, вероятно, это была проблема с оборудованием, так как мы не могли получить НИКАКОГО ответа от ведомого устройства. - person Sir Fumi; 01.10.2019