Я обращался из макроса.
RS485 с двумя устройствами на шине будет работать с панелью в режиме master. В этом режиме проблемы нет. Опросил датчики поочереди.
Режим Modbus ASCII Master и позволяет вам реализовать свой протокол. Я и работаю по своему протоколу, отличному от modbus.
Не вижу тут проблемы. Опросили, в функцию Receive передали нужное вам количество байт и таймаут ожидания. Получили, перешли к опросу второго датчика.
В общем, пока такой максимум удалось выжать с помощью забавного способа.
У панели есть строб («пульсирующий бит») по адресу PSB3. 50 мс — вкл., 50 мс — выкл.
Два макроса для двух независимых каналов включаются — 1-й по переднему фронту, 2-й по заднему.
Функция Receive(xxx,DataReceive,1,0,0) с нулевыми таймаутами.
Одновременный прием данных работает с одним «но»: байты должны следовать с интервалом не менее 50 мс.
Пробовал разные пульсирующие биты (50, 150 и 500 мс) с разными таймаутами для Receive().
Это максимум, который мне удалось выжать%)
UPD: проблема вроде как решена. Еще потестирую.
Абзац выше — и есть решение. Только надо принимать не по 1 байту, а по 28 (именно такого размера моя посылка).
Таймауты нулевые, т. к. чтение происходит из внутренних буферов без ожидания.
Не лишним будет добавить, что при старте панели один раз открываем порты (Enter) и больше их не закрываем (Leave).
В случае, если пакеты приходят реже, чем раз в секунду, можно использовать пульсирующий бит PSB4 с периодом 1 сек. (500 мс — вкл., 500 мс — выкл.).
EFrol, еще раз благодарю за подсказку.
UPD2: дополнение по работе функции Receive().
«Таймауты нулевые, т. к. чтение происходит из внутренних буферов без ожидания».
Это не так работает. При нулевом таймауте функция уходит в бесконечное ожидание, пока буфер на заполнится до требуемого значения.
Важное дополнение для понимание ее работы.
В моем случае она ждет пакет, но при этом второй скрипт продолжает работать с приемом по второму каналу.
Третий скрипт отсчитывает таймаут и ставит флаг «Нет связи».
Панель вполне себе умеет в многозадачность, но только в рамках разных макросов.
Отдельного внимания заслуживает вопрос передачи этого всего по Ethernet (пункт моего ТЗ). Тоже есть подводные камни, как оказалось.
Если нет связи с Slave-устройством, то функция передачи данных Write() завешивает выполнение скрипта, внося неопределенные задержки.
Требуется реализовывать арбитраж вызова ф-ии передачи по флагу, используя признак PSB54 (Ошибка связи с TCP Slave), чтобы при отсутствии связи не тормозилось выполнение макроса.
Но это для другой темы![]()





Ответить с цитированием