Время ожидания для Python-скрипта с RS485 и minimalmodbus
В настоящее время производится считывание по шине RS485 1 (одного) киловатт-метра RS485, типа DDS238-1ZN посредством Python-скрипта, "поддерживаемого" модулем minimalmodbus. Добавление большего количества кВтч-метров означает, что (до или во время установки) ведомый адрес добавленного кВт-ч-метра должен быть смещен от начального "1". Такое переключение начинается с сканирования шины RS485, чтобы определить, где на самом деле находятся киловатт-метры.
Первым шагом является следующий простой Python-скрипт
import serial
import minimalmodbus
# Check address 00 = broadcast
instrument = minimalmodbus.Instrument('/dev/ttyAMA0',0) # port name, slave address
instrument.serial.baudrate = 9600
instrument.serial.timeout = 0.5
instrument.debug = True
print instrument
print instrument.read_register(21,0) # registernumber, number of decimals
# Check address 01 = slave 01
instrument = minimalmodbus.Instrument('/dev/ttyAMA0',1) # port name, slave address
print instrument
print instrument.read_register(21,0) # registernumber, number of decimals
# Check address 02 = slave02
instrument = minimalmodbus.Instrument('/dev/ttyAMA0',2) # port name, slave address
print instrument
print instrument.read_register(21,0) # registernumber, number of decimals
Проверка на ведомых адресах 00 и 01 дает результат (257), как и ожидалось, но (из-за отсутствия устройства) очевидно, что ответ на ведомый адрес 02 терпит неудачу с истечением времени ожидания.
Для дальнейшего описания проблемы см. http://www.domoticz.com/forum/viewtopic.php?f=31&t=13592.
Из тестовых прогонов я вижу, что истекло время ожидания. Сигнал тайм-аута может быть инициирован для перехода к следующему адресу подчиненного устройства, если бы я знал схему такого сигнала тайм-аута для сценария Python с минимальной модуляцией шины....
Ища альтернативу в Интернете, я вижу все виды "замечательных и тщательно продуманных" решений для ловушки тайм-аута, но с точки зрения моего простого сценария я ищу что-то очень простое (желательно "однострочное"), чтобы выход из тайм-аута для проверки следующего ведомого адреса 3 и т. д.
Глядя на эти решения, упомянутые выше, может ли следующая установка с полукодом быть простым / базовым решением? [для которого я искал в направлении фреда C-функции () ]
start of loop
start time-counter
read register from slave address x
N = number of characters received
if time-counter at value t, then
look if N > 0
if N == 0 then
x = x + 1
jump to start of loop
Есть подсказка для скрипта, использующего Python или MinimalModbus для выполнения полукода, совместимого с первым скриптом?
1 ответ
На этом форуме не было найдено / получено рабочее решение, но было разработано, протестировано и введено в действие прагматичное, простое средство, как описано на http://www.domoticz.com/forum/viewtopic.php?f=14&t=5808&start=20
Из-за особенностей протокола передачи данных, данное средство является специфическим для счетчика кВтч типа DDS238-1ZN, но эта идея может быть применена для других сопоставимых счетчиков кВтч с интерфейсом RS485.