WB-MSW v3: Провал показаний температуры (остальные показания не пропадают)

Вот тут

сумбурно написал и непонятно.
Давайте считать и измерять.
9600 бод = 1200 байт.
Но не совсем
Возьмем изначальную таблицу отсюда:


И повторим работу с coil

Мы например пишем coil 0
*Ctrl Buzzer

time modbus_client --debug -mrtu -pnone -s2 $DEV_PORT -a$DEV_ADDR -t0x05 -r0 0
Data to write: 0x0
Opening /dev/ttyRS485-1 at 9600 bauds (N, 8, 2)
[29][05][00][00][00][00][CB][E2]
Waiting for a confirmation...
<29><05><00><00><00><00><CB><E2>
SUCCESS: written 1 elements!

real	0m0.049s
user	0m0.000s
sys	0m0.010s

49 миллисекунд. Из-за работы ОС и буферов - может и до 60-80 быть.
Сколько времени нужно на чистую передачу данных?
8 байт передали, 8 приняли.
один фрейм - это 8 байт и 3.5 байта тишины. Один байт при наших настройках - это 11 бит (стартовый+8+два стоповых). Итого запрос + ответ занимают примерно (8+3.5)211 бит = 253.
253/9600 = 0,026 - то есть 26 миллисекунд
Реально - 49
Идеально - 26

Сtrl LED green
Реально - 63
Идеально - 26

**Сtrl LED Red
Реально - 55
Идеально - 26

IC_ClearBanks (Полная очистка всех банков памяти команд)
Реально - 62
Идеально - 26

IC_FBank1Record 5301 (вообще с 5300 начинаются)
Реально - 51
Идеально - 26

IC_FBank1Play
Реально - 43
Идеально - 26

Итого:
Реально:49+63+55+62+51+43 = 323
Идеально: 6*26 = 156

И это без учета записи в остальные 79 coil IC_FBank*Play

Так, пробуем уменьшить?
У нас рядом 0xA b 0xB
Пишем их одним фреймом:

time modbus_client --debug -mrtu -pnone -s2 $DEV_PORT -a$DEV_ADDR -t0x0f -r10 0 0

Реально - 57
Идеально - 29
Выиграли 50 миллисекунд…

Так, рассмотрим чтение регистров. В принципе отправка - те же 8 байт, прием - уже 7
Значит в идеальном случае - 25 миллисекунд.
У нас период опроса был задан 500 миллисекунд.
Посчитаем, приняв за среднюю длительность обмена 60 миллисекунд:
Реально: 8 (регистров) * 60 (миллисекунд) = 480
Идеально: 25*8=200

То есть при опросе даже в “идеальных” условиях с заявленным периодом какдждые 500 миллисекунд будут набегать “лишние” ((156*5)+200)-500=480 миллисекунд.
В реальных условиях по стандарту таймаут ответа - меньше 100 миллисекунд.

Так, как улучшить-ускорить?

  • температуру, влажность, CO2 читать раз в 2 секунды. Чаще - не надо, она внутри обновляется с такой периодичностью, чтобы избежать самонагрева датчиков. Детектор движения, шум - можно и раз в 500.
  • При записи coil использовать функцию 0x0f, она работает.
    Запрос-ответ получается всего 22 байта на 40 coil
    Но лучше их писать по событию все же.
    И подскажите что у вас в регистре 245? Посмотрите если достпен больше чем один датчик - то из двух (или больше).