Добрый день.
Делали некую распределённую систему на ПР200, там был модбас - мастер ПР200 и ведомые такие же.
Считать надо было с каждого по 1 регистру (стандартному, в 2 байта).

Когда мастер запросы посылал интервально, что настраивается через менюшку, всё было нормально.

А потом заказчик сказал, что хочет статистику, то есть, на сколько запросов было отвечено, а сколько - мимо, ибо применялся радиоканал и прочие неустойчивые среды передачи.

Я думал, что поставив количество попыток при отсутствии ответа =1 можно это посчитать по той переменной, которая < настройка прибора - интерфейсы - 485 мастер - устройство - статус> , но она, как только первый ответ получен, сразу становится =1 и в ноль до пропадания связи не обращается. Сколько при этом запросов в сеть улетело, посчитать тоже нельзя.

Потом попытался запросы отправлять не по временному интервалу из менюшки, а выставляя в 1 переменную "опрос", которая выбирается правее вышеуказанной. Сразу стало непонятно, когда её сбрасывать обратно. По статусу =1 это нельзя, т.к. может он ещё за счёт прошлого успешного приёма =1.
сделал её установление по таймеру, то есть, до того времени, когда ожидание ответа на запрос уже следует считать бессмысленным, а потом "опрос" приравнивается нулю, и если "статус" при этом тоже был ноль, то увеличивался счётчик запросов, на которые ответа не было, а счётчик, который считал, сколько всего ушло запросов, увеличивался при установке переменной "запрос" на 1.

Ведомых, как указано выше, было несколько, и описанным образом почему-то запросы посылались только для первого из тех, для кого была выставлена в 1 переменная "опрос". Не смотря на то, что она затем снималась, и выставлялась для следующего ведомого и так далее. При этом пока переменная "запрос" была равна 1, запросов одинаковых выходило несколько.

Поставил фронтовыделитель на выдачу запроса, переменная "запрос" теперь ставилась на один цикл контроллера, и запросы начали выходить для всех устройств, однако, не синхронно с выставлением переменной в 1, а по 1 на каждый перебор этой переменной с первого до последнего ведомого устройства. То есть, "запрос" приравнивался к 1 для первого устройства, в линию выходил пакет, потом ставился для 2, 3, 4 и тд, в линию ничего не выходило, затем сначала для 1-го, потом 2-го - и тут только выходил на линию пакет для второго устройства.

Вопрос в том, можно ли как-то иметь информацию не о наличии связи "вообще", а в конкретно нужный момент послать пакет в линию, и узнать, получен ответ в этот раз на этот пакет, или нет? Может быть, следовало использовать не те переменные "запрос" и "статус", которые за всё устройство, а такие же за конкретную считываемую величину отвечают?