В общем, спустя два месяца, через 5 рукопожатий меня перенаправили с проблемой к человеку, который разрабатывал этот контроллер, в том числе часть ModBus. Он уже не работает у этого производителя, но охотно отвечает на вопросы и готов помочь. Я бы выложил сюда его ответ, но это голосовое сообщение на 13 минут, поэтому пересказываю услышанное:
Контроллер ТЕРМ-2000 в части ModBus полностью соответствует требованиям и стандартам ModBus, что они тестировали на эмуляторах. Как одни из идей, что может сбивать с толку Wirenboard, это то, что ТЕРМ-2000 посылает байты в одной посылке с разными интервалами. То есть, к примеру, он может послать второй байт через 50 мкс после первого, третий через 100 мкс после второго, а четвёртый через 80 мкс после третьего (интервалы даны условные, для понимания). И нужно попробовать поставить побольше таймаут именно между байтами в одной посылке.
Какой таймаут за это отвечает? Я пробовал играться с guard_interval, проблема из первого поста проявляется на guard_interval 50000us. Если поставить его 4010us на скорости 9600, то ошибки появляются периодически на каждом из регистров в рандомном порядке. Если поставить 50000us, то все регистры читаются без ошибок, а в какой-то момент по всем одновременно ошибки, и затем опять без ошибок.