Скорее всего вы опрашиваете панелью несуществующие регистры
Вид для печати
Скорее всего вы опрашиваете панелью несуществующие регистры
У меня "замерзала" панель СП307 из-за избыточно большого таймаута обмена - если пакет терялся или портился от помех, то панель выжидала весь таймаут для принятия решения отправить новый запрос.
Кроме того, панель СП307 не опрашивает по одному регистру, а сразу по несколько штук - может быть есть какие-то проблемы с некоторыми регистрами - отсутствуют или их адреса в панели неправильно заданы (в ПЛК при распределении адресов производится выравнивание и могут образоваться пропуски регистров).
Друзья, спасибо за ответы и желание помочь, но..
"Замерзает" не панель ! Панель работает без нареканий.
ПЛК замедленно выполняет свой алгоритм.
Реакция на датчики замедленная. Сработал концевик, а клапан выключился только через полсекунды.
Пришли по RS485 показания датчика, а реакция на них - через полсекунды. Ну и т.п.
Предполагаю, что ресурсы тратятся на обработку запросов от панели.
Нашел в настройках панели Параметр "Время ожидания – время ожидания входящих пакетов TCP/IP; "
Возможно это как раз пауза между опросами слейва. В работе проверить пока нет возможности.
P.S. А может кто знает, у ПЛК110 есть возможность программно остановить-включить опрос устройства по RS485 ?
На ПР-ках есть, а в ПЛК не нашел.
Вопрос в ветке "Панели оператора (HMI)" и в теме "Панели оператора СП3xx. Вопросы и ответы"...
Сейчас у меня нет CDS2.3 и проверить не могу, но в документации есть смысл поискать - не исключаю, имеется возможность останова опроса для некоторых устройств на шине.
Если уже все способы оптимизации исчерпаны (чтение 32 переменных BOOL не по одной, а сразу одним DWORD, чтение аналоговых входов не по одному, а все сразу в STRING), то нужно переходить на библиотеку опроса по Modbus и самостоятельно опрашивать модули.
Спасибо, FPavel
Каюсь, вопрос не в тему ветки, не хотел плодить ветки.
Чтение 16 BOOL как WORD уже исчерпано, а вот аналоговые как STRING - пока нет, надо попробовать.
Спасибо.
ПЛК мастер задержек не создаёт, вся проблема только в опросе не группой, решается опросом через String. https://owen.ru/forum/showthread.php...l=1#post244022
Вот пря пример. Мой. С кодом https://cs-cs.net/codesys-23-uskoren...ppovye-zaprosy
Не слушайте эту хрень про 40 регистров - 120 через STRING без проблем.
Нужно только после пару неиспользуемых мастер-запросов прописать. Чиста для резерва места. Баг КДС, но вполне подконтрольный, т.е. ставший фичей
Плк без проблем обслужит ок. 1000 (тыща) модбас-запросов в сек по TCP. Причем хоть по 125 регистров каждый. Панель и не сможет столько создать, да и только 120 регистров. На фоне этого по каждому com (485 2шт + 232) еще по 100...150 запросов в сек - как 2 пальца. Через либы правда, но и через конфигурацию - не менее половины от этого.Цитата:
Предполагаю, что ресурсы тратятся на обработку запросов от панели.
Какие ресурсы? О чем вы? Работа с ПЛК с компортом - это лежание на пляже, периодически отвлекаясь на проходящего мимо пивоносца.
Есть проблемы - выкладывайте проекты. Раз какие-то тормоза - чего-то наворотили. Экстрасенсов тута нету.
Всем спасибо за участие.
Опрос через string у меня отпал, аналоговый модуль, как оказалось, не поддерживает чтение группы регистров.
Но это выходит за рамки конкретно этой темы форума.
Согласен, что компорт сильно ПЛК не грузит, посему и заподозрил панель, список регистров для нее в моем проекте имеет около 200 позиций.
Параметр "Время ожидания – время ожидания входящих пакетов TCP/IP" действительно задает паузу в обмене панели с ПЛК,
но ненулевое значение имеет побочный эффект - почему-то после перепрошивки ПЛК, панель виснет, и лечится только передергиванием питания панели.
Если ПЛК не перепрошивать - просто замедляется реакция на действия с панелью.
На настоящий момент проблема тормозов частично решена, переводом опроса одного аналогового датчика из Modbus в 4-20мА.
Предположительно, он тормозил с модбас-ответами и завешивал RS485.
Настроил экспорт статуса связи для ModbusTCP Slave-устройства c выводом регистров на экран.
Наблюдаю быстрое увеличение регистра "число переданных пакетов".
Все остальные регистры равны 0 и не меняются.
Все запрашиваемые данные корректно отображаются на экране.
Элементы ввода данных данные принимают и передают на устройство без задержек. Не придерёшься.
Всё работает отлично!
Но окно "communicating.." раз в 2 секунды на секунду всё таки выводится.
Даже когда на экране оставляю всего один элемент ввода.
Не нужные галки в настройках проекта могут вызвать такой эффект
Вложение 88436 Вложение 88437
Кроме того в окне "communicating.." выводится номер порта и номер проблемного слейва
Вложение 88438
Спасибо. Эти окна стерильны, включая окно 60001. Т.е. проблема возникает и тут же, видимо, исчезает.
Дело в том, что панель ещё является Modbus-сервером для 3-х устройств. При их отключении проблема не возникает.
Предполагаю, что необходимость отвечать на запросы других мешает собственной работе.
Попробую оптимизировать таймингами.
Коллеги, подскажите, как одним махом обнулить 5000 PFW регистров ?
В PFW сохраняется протокол работы, нужен механизм его очистки.
Ну и попутно, есть способ для таблицы данных организовать прокрутку ?
Спасибо.
А что стандартные кнопки для прокрутки не подходят?
Вложение 88453
Зачем обнулять регистры не понятно. Обычно если в таблице используется циклический буфер,
то достаточно адреса головы и хвоста буфера установить в начальное положение и таблица "очищается"
Спасибо за ответ,
стандартные кнопки возможно подходят, только я о них не знал :)
Спасибо, попробую.
По регистрам.
Может я вообще не правильно организовал весь механизм, тогда поправьте.
По окончанию одного цикла работы, в область PFW, со смещением согласно текущему индексу,
копируется блок данных - название рецепта и фактические результаты работы. После чего индекс инкрементируется.
К этой же области PFW привязана таблица данных на 100 записей, видимых-20, для отображения результатов. Впоследствии планирую ее экспорт в CSV.
По отдельной кнопке предполагаю очистку этой области.
Не совсем понимаю, где достаточно установить адреса головы и хвоста, чтобы таблица на экране очистилась и в CSV не записались старые значения.
upd: может стандартная кнопка с действием "удалить содержимое" поможет ? Или она на одну запись работает ?
Проверить пока нет возможности.
Механизм использования циклического буфера заложен в таких инструментах как Архивирование в панели, График реального времени, Исторический график, Историческая таблица, Тренды. Все они предполагают периодическое сохранение выборки данных в области внутренней памяти панели - называемом хранилищем. В хранилище записи образуют циклический буфер. Первые 4 регистра хранилища отводятся под указатели адреса (DWORD) начала(головы) и конца(хвоста) циклического буфера, остальная область отводится под данные архива. Запись очередной выборки происходит по адресу головы буфера. Адрес головы и хвоста автоматически увеличиваются после каждой записи на количество записанных регистров. По этому адрес головы указывает на самые новые данные, а адрес хвоста - на самые последние данные. После того как адрес головы достигнет конца хранилища, он сбрасывается в начало хранилища и новые записи будут затирать самые старые.
Таким образом ни какая память панели никогда не очищается, а просто новая информация перезаписывает старую.
Для правильного отображения данных циклического буфера (по порядку поступления) и предназначена соответствующая галка в настройках таблицы
- Использовать циклический буфер
Вложение 88454
ЗЫ.
Вы скорей всего не используете в своей таблице эту настройку, по этому для Вас только физическая очистка 5000 регистров.
Могу и очистку организовать
Держите пример с очисткой 5000 регистров PWF256..PFW5255
по фронту PSB1000
Скрытый текст:
Петр, спасибо за развернутый ответ.
Да, я не использую стандартные средства архивирования, так как там нет возможности
сохранять текстовые данные ( название рецепта) и сохранять по событию (только по времени),
поэтому организовал функциональную область, которая по изменению флага копирует нужные данные в нужную область с учетом текущего индекса.
Поэтому похоже да, только фактическая очистка.
Но работа с PFW специфическая, даже в макросах только через копирование области через Read/Write.
Пока видится - в макросе сделать константу с обнуленной записью и в цикле делать Write по всем записям.
Эмулятор, к сожалению, макросы не поддерживает, а панели в руках нет, поэтому пока попробовать не могу.
Возможно есть какой-то другой способ ?
UPD. Пока писал - вы ответили. Спасибо!
Начало и конец области очистки можно изменить так
Вложение 88458
Присмотрелись бы к элементу Архивирование на USB
1. Сохранять можно и по событию, а не только по времени
Вложение 88459
2. В выборке (блоке данных) могут присутствовать текстовые данные, если названия у Вас в регистрах находятся
Вложение 88460 Вложение 88461 Вложение 88462
Можно индекс завести для выбора нужной области
Вложение 88464
3. Сохранение на флешку можно сделать по команде
Вложение 88465
Ну и таблицу данных с ЦИКЛИЧЕСКИМ БУФЕРОМ можно привязать к адресу хранилища
Вложение 88466
ЗЫ
Автоматический экспорт нужно запретить (PSB1=0 перманентный 0)
Вложение 88467
Зачем в макросе через Read/Write, разве так нельзя?
Вложение 88468
Сразу записать 0 в 5000 регистров PFW,начиная с PFW256
Код:Writes(HMI_LOCAL_MCH, 0, TYPE_PFW, 256, 5000, NULL);
Да, после ваших пояснений, выглядит как будто приемлемо.
Я правильно понимаю, что архивируемые величины не обязаны лежать в непрерывной области регистров, один за другим?
И флешка не обязана всегда быть подключена, а только на момент записи ?
Было бы неплохо и метку времени тогда сохранять.
Спасибо, вечером попробую.
1. Если копировать ваши данные в регистры указанные в настройка выборки, то да - архивируемые величины не обязаны лежать в непрерывной области регистров, один за другим
2. Флешку можно подключать только перед записью, Статус экспорта, в том числе наличие флешки, можно вывести в динамический текст
Вложение 88476 Вложение 88477
3. Метка времени будет добавляться если включить галку
Вложение 88475
Петр, спасибо огромное еще раз.
Архивирование на USB отлично легло под задачу. Переделал на нем, даже удивился насколько просто получилось.
Проверял пока в симуляторе. Импульс на архивирование имитирую нажатием кнопки.
Единственная непонятная вещь, - на первый импульс архивирование не происходит, на второй и последующие - все четко.
Надеюсь, это гримасы симулятора и на железе все будет нормально.
У меня архивирование в эмуляторе работает адекватно.
Сделал простейший проект. Архивирую два регистра для простоты имитации изменяющихся значений - PSW34. PSW35 это текущие секунды и минуты + штамп времени. Архивирование - по фронту бита PSB256. Экспорт на USB - по фронту бита PSB500.
При эмуляции файл экспорта будет на диске С:, если Вы не знали.
Обязательная галка "Очистить регистры после экспорта" !!!! иначе в файле могут присутствовать повторяющиеся строки.
Физически никакой очистки регистров не происходить, а просто адреса головы и хвоста кольцевого буфера сбрасываются в начальные значения.
Скрытый текст:
Все так и делал. Все работает, кроме того, что только второе нажатие кнопки "В архив" приводит к записи и далее все корректно.
Возможно дело в том, что бит "в архив" я задал не в PSB, а как бит в сетевой переменной, которая в реале должна из ПЛК приходить.
Надеюсь, что просто симулятор на этом лажает.
Завтра проверю на натуре, думаю разберусь.
Спасибо за очередной видеомануал, думаю многим будет полезен.
Документация, к сожалению, скудна и часто допускает неоднозначное прочтение.
День добрый.
На натуре все заработало, только с одной странностью.
Рецепт отрабатывается, ПЛК зажигает лампу "Готовность" и инкрементирует номер цикла.
Архивирование настроено по фронту бита, отвечающего за лампу.
Бит упакован в сетевую переменную, которую опрашивает панель (мастер).
В архив пишется номер цикла, название рецепта и результаты работы.
Так вот изредка, без закономерности , в таблице появляются строки с одинаковыми номером цикла, названием и "левыми" данными.
Такое впечатление, что панель видит несколько фронтов управляющего бита в течении цикла.
Программу ПЛК прошерстил, бит лампы устанавливается в единственном месте, сразу после инкремента номера цикла.
Куда еще посмотреть можно?
Если вместо записи в архив по фронту бита
Вложение 88522
Сделать так - через бит разрешения записи
Вложение 88523
то будет похожий результат - первая запись по фронту бита и если бит не успеть сбросить, то еще будет "левая" запись по времени
Доброе утро. В Codesys я могу сделать окно-диалог с настройками объекта (насоса/датчика/хоть-чего), и открыть любой из n-ного количества объектов, используя одно окно-диалог. В СП300 что-то подобное можно реализовать - открытие окна с динамически передаваемыми в него данными? Или нужно будет под каждый объект создавать своё окно?
Почитайте про динамическую адресацию:
Вложение 88771
Не могу разобраться: пытаюсь функциональной кнопке задать действие "включить бит". Не работает. Если задать действие "присвоить значение" (записать всё число целиком) с тем же адресом - работает. Что может быть не так?
Вложение 88775Вложение 88776
UPD: чтение бита работает, главное.
ЗЫ
Так и есть
Вложение 88778
--------------------------------------
Вложение 88779
ДаЦитата:
а если использовать RTU - всё будет норм?