У меня проблема, которая может показаться очень простой для людей, привыкших работать с последовательными интерфейсами, но для меня это впервые.
Мы хотим автоматизировать нашу температурно-зависимую станцию датчиков с помощью контроллера температуры (серии 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) с установленными, надеюсь, правильными драйверами (см. это скриншот). Кроме того, настройки устройства были согласованы между контроллером и главным компьютером на следующие значения (настройки порта в устройстве менеджер):
- Baudrate = 9600;
- Bitsize = 8;
- Четность = Нет;
- Стоповые биты = 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? Почему так сложно найти быстрые онлайн-ресурсы?
Большое спасибо, любая помощь приветствуется!
read_holding_registers
имеет 3 параметра;read_holding_registers(address, count, unit)
, а для параметраunit
по умолчанию установлено значение0x00
? Возможно, вы вместо этого читаете с устройства с "адресом"0x00
? - person Bosz   schedule 20.09.2019