Сообщение от
Валенок
Это пока ознакомление с возможностями конфигуратора.
А вот когда столкнетесь с его работой ...
Ну, потолкался. Пришлось нацепить сниффера и до боли вглядываться в рядочки цифирек. Но что делать, если ребята, которые знают ноты, упорно игнорируют прямые вопросы.
Так вот, по моим наблюдениям основная проблема работы ПЛК-100 Мастером Модбаса состоит в том, что он теряет запросы. Причем теряет как-то странно - и не совсем безсистемно, но и системы понять не могу.
Как это я увидел? Работает ПЛК-100 и мой АЦП, который я надрессировал на Модбас. Параллельно связывающей их веревочке RS485 сидит комп и снифает шину. Причем, перебрав несколько програмулек, я остановился на довольно примитивной COMPump, не заточенной под Мобдас, но шустрой и с хорошей памятью.
Область обмена между ПЛК и АЦП организована в виде нескольких групп переменных, каждая из которых целиком и полностью оккупирует "Универсальное устройство Модбас" - пора его уже сократить до УУМ (о-о-о-чень у-у-умное!).
Все УУМы, используемые в программе, я инициирую сразу по старту, подавая тот знаменитый плоходокументированный код 255. Один раз. А затем, в ходе работы, я ставлю запросы на обмен по каждому УУМу в очередь - и разбираю ее аккуратненько.
Если запрос от конкретного УУМа принят к исполнению, то тут начинаются главные танцы.
Во-первых, принимая запрос, я сразу даю код 255 в регистр управления УУМом.
Затем, при каждом програмном цикле, я ожидаю готовности результата и повторяю запрос - столько раз, сколько нужно для обмена всеми регистрами данного УУМа.
Выполняется что-то такое (я называю это фазой, по сути это отработка запроса к одному УУМу):
Код:
ADC_RO: (* Вот фаза чтения нескольких регистров из Модбаса *)
IF %QW10.1 = MODBUS_OK THEN
R_RO_C := R_RO_C - 1; (* Счетыик команд 255 *)
IF R_RO_C <>0 THEN
%QW10.1:= WEIRDCODE; (*Дурацкий код FAFA *)
byReadRO := START_CMD; (* Код 255 *)
ELSE
dwGutRO := dwGutRO + 1; (* Счетчик хороших результатов *)
...
принимаю результаты из области обмена
...
ph_tRW := ADC_BEGIN; (* В следующем цикле разбираем очередь *)
END_IF
ELSIF %QW10.1= MODBUSTMO THEN
dwErrRO := dwErrRO + 1; (* Счетчик плохих результатов *)
...
игнорирую результаты, если уж таймаута дождались...
...
ph_tRW := ADC_BEGIN; (* Все равно этот запрос бросаем *)
ELSE ; (* waiting in this phase *)
END_IF (* Конец отработки фазы ADC_RO *)
Таким образом, до обращения к результатам работы Модбаса, я пихаю ПЛК в попу столько раз, сколько нужно. Если переменных в данном УУМе 6 - так 6 раз и пихаю. Если 38 - ну и 38 не жалко.
Если возникнет таймаут - мы его зафиксируем. Других кодов ошибок доблестный овеновский программист нам не показал, Бог с ними.
Реально таймаутов нет.
Я ставлю своего сниффера в стойку, запускаю программу - и не пропускаю ни одной посылки. Все очень чинно, никаких сбоев! Вот только одна беда - у ПЛК мозги разбегаются. В протоколе видно, что запросы от каждого УУМа идут с пропусками. То есть, если я поставил на чтение 25 переменных и сделаю 25 команд 255 - я штук примерно 5 перемнных потеряю. И вовсе не из-за сбоев в линии! ПЛК просто нагло проигнорирует пинки в зад не спросит слейва 25 раз - а спросит 20.
КАНЕШНА, выход есть. Ставлю 50 запросов - и свои 25 регистров таки да обновлю. Но куда же это годится, робяты? Завтра ему 75 пинков нужно давать? В меру возрастания привычки к пинкам
Собственно, этот результат у меня был еще до праздничка всех клар цетиных. Но было сомнение - отчего же нужно увеличивать количество запросов? Теперь вижу - линия в порядке, ни одного модбас-эксепшин не видел, просто ПЛК прореживает команды 255 на УУМ.
Как написано, так и задокументировано - и обратное верно. Спрашивал туже два раза о расшифровке загадочных фраз из документации - молчок. Потому и молчок, что коряво сделано.
Почему пишу неприятные некоторым товарищам слова? А потому что спину гнул, ручки натруждал, чтобы разобраться с косяком, которого в серьезном контроллере быть не должно. А если есть - так опишите его внятно. Чтобы православные не спотыкались...
Завершаю на оптимистической ноте. Ежли вам не страшно пропускать иногда запросы или можете создать запросы с запасом - все будет чудненько. Не жалейте 255!