Показано с 1 по 5 из 5

Тема: ПЛК-100 как Мастер Модбаса

  1. #1
    Пользователь Аватар для drvlas
    Регистрация
    30.09.2010
    Адрес
    Киев
    Сообщений
    700

    По умолчанию ПЛК-100 как Мастер Модбаса

    При работе ПЛК-100 в качестве Мастера наблюдаю устойчивое нежелание принимать от слейва нормальные данные с одного запроса.

    Есть "Универсальное устройство Модбаса (Мастер)". У него есть канал команды, в который можно записать СТАРТ (FF) и СТОП (FE). Именно по командам я и хочу работать (т.е. не поллингом).
    В данном устройстве есть несколько регистров. Их я выбрал обычными Register input module, чтение командой Модбаса 03.

    Почему-то, пока не поставлю этот процесс на зацикливание, данных не вижу.
    Вытянуть несколько регистров с Модбаса получается только многочисленными запросами.

    Думаю, что я мог напутать с управлением опросом. Читаю описание Конфигуратора ПЛК.

    п.3.2.1, начало описания "Универсального устройства Модбаса (Мастер)". Сказано, что при наличии канала СТАРТ-СТОП нужно работать с командами СТАРТ (FF) и СТОП (FE). Причем, подача команды СТАРТ запускает данное устройство, и потом повторная подача команды СТАРТ приводит к "внеочередному запросу одной очередной переменной устройства Modbus"

    Может ли кто-то объяснить, что такое "внеочередной запрос очередной переменной"?

    Следует ли из этого, что после подачи первой команды СТАРТ опроса вообще еще не будет? Что после первого СТАРТа мне теперь нужно все время пихать ПЛК командами СТАРТ в... спину, выпрашивая у него по одной "внеочередной" переменной? Что вообще групповое чтение наскольких регистров невозможно...

    Или после первого СТАРТа опрос уже идет и все переменные данного "Универсального устройства Модбаса" принимаются в область ввода-вывода? Но я не вижу их с одного обращения, хотя опрашиваю слово LastError, которое из предварительно загруженного туда слова FAFA становится нулем, стало быть, индицирует об успешном обращении у слейву.

    Если все очень запутано, спрошу иначе: Кто-то читал с помощью стандартного Конфигуратора несколько переменных из одного "Универсального устройства Модбаса"? Как?

    Спасибо!

  2. #2
    Пользователь Аватар для Nazar
    Регистрация
    31.07.2009
    Адрес
    г.Красноярск
    Сообщений
    26

    По умолчанию

    На мой взгляд лучше работать по Modbus на прямую. Опрашиваешь сколько и когда хочешь...Качество связи на порядок лучше. Особенно это актуально когда много сетевых устройств.

  3. #3
    Пользователь Аватар для drvlas
    Регистрация
    30.09.2010
    Адрес
    Киев
    Сообщений
    700

    По умолчанию

    Цитата Сообщение от Валенок Посмотреть сообщение
    Я тоже ему про это говорил
    Если помнишь, я только сказал, что хочу попробовать штатные средства. Чтобы было с чем сравнивать.

    Докладываю. Из работающих вариантов только один кажется мне "правильным". В кавычках, потому что все равно запросов много больше, чем я бы сделал без конфигуратора.

    Так вот, "правильный" вариант состоит в том, что я на каждое из созданых "универсальных устройств" создаю целый цикл запросов - по количеству регистров. Это означает, что ПЛК вяжется со слейвом только по одному регистру за раз. Это просто ужасно. Не могу поверить. Хочу надеяться, что я не вкурил тему до конца...
    Если коллеги не покажут, как они заставили ПЛК выдавать запрос на несколько регистров одной командой, то придется признать, что штатный конфигуратор суть весьма примитивная вещь.

    Я не очень вышел за рамки дозволенного на этом форуме? Кажется, не грубил. И вообще, жду опровержения своим предположениям...

    А пока начну готовиться к прямой связи со слейвом

  4. #4
    Пользователь Аватар для drvlas
    Регистрация
    30.09.2010
    Адрес
    Киев
    Сообщений
    700

    По умолчанию

    Цитата Сообщение от Валенок Посмотреть сообщение
    Это пока ознакомление с возможностями конфигуратора.
    А вот когда столкнетесь с его работой ...
    Ну, потолкался. Пришлось нацепить сниффера и до боли вглядываться в рядочки цифирек. Но что делать, если ребята, которые знают ноты, упорно игнорируют прямые вопросы.
    Так вот, по моим наблюдениям основная проблема работы ПЛК-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!
    Последний раз редактировалось drvlas; 09.03.2011 в 23:47.

  5. #5

    По умолчанию

    В Порт Debug воткнут не тот кабель, который ждет CoDeSys.
    Вставьте нужный кабель, перезагрузите контроллер, или в проекте отключите обращение к порту 232 Debug

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •