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

Тема: Библиотеки CODESYS верхнего уровня абстракции

  1. #1

    По умолчанию Библиотеки CODESYS верхнего уровня абстракции

    Коллеги!

    Я разработал и, как мне кажется, успешно применил некий набор библиотек CODESYS, позволяющий кардинально упростить процесс разработки программ ПЛК и интерфейса пользователя (для панельных ПЛК типа СПК210).
    Началось всё с того, что система "алармов" CODESYS меня выбесила.

    Не знаю, как у вас, а у меня ТЗ к ПО придумываю я сам, согласовываю сам с собой, реализую и тестирую тоже сам. Но должен при этом угодить желаниям заказчика, которые до момента приемки чаще всего остаются тайными. Т.е. ситуация, когда в последний момент заказчик требует что-то изменить - более чем норма. И вот тут даже простое "переименование" сообщения аларма приводит к тому, что надо в десятке мест внести ручные изменения, и не факт, что из-за этого не "поплывет" что-то еще (например, внезапно может вылезти ограничение WSTRING в 80 символов по умолчанию). Началось с этого, а дальше пошло-поехало...

    И что же вышло в итоге? Вот краткое перечисление:

    1. Универсальные "переменные" - блоки, которые в себе содержат и собственное наименование (например, "Температура"), и единицу измерения (например, "°С"), и коэффициенты преобразования для согласования с модулем ввода-вывода, и настройки системы "алармов" и еще много другого.
    2. Альтернативаня система алармов - без задействования средств CODESYS, полностью "прозрачно" для программиста. Т.е. если вы для переменной (см. п.1) задали верхний порог аварии AH - то это всё, что вам надо сделать для генерации аварийного сообщения, установки аварийного состояния переменной и т.п. - вплоть до активации системы автоматического отключения всего, что было включено. Кроме того, моя система алармов пишет журнал тревог сразу в CSV-формате на SD-карту, т.е. никаких танцев с бубном для "разбора полетов" не нужно (попробуйте стандартный журнал CODESYS каким-то способом скопировать на ПК и загрузить в Эксель - если у вас это получается просто, я вам очень завидую!)
    3. Универсальные элементы визуализации, поддерживающие переменные из п.1. Т.е. для индикации на экране значения переменной, которая хранит температуру печи (например), вам надо вставить на экран фрейм "индикатора" и передать в него указатель на эту переменную - всё! С этого момента этот "индикатор" будет показывать значение температуры вместе с единицей измерения, с требуемым вам количеством знаков после запятой, и при этом цвет индикатора будет отражать состояние переменной, например, если переменная пересекла верхний аварийный порог, фон индикатора станет красным.
    4. Система переменных позволяет практически отказаться от использования RETAIN-переменных, где хранятся настройки аппаратуры. Меня достала ситуация, что при кажом обновлении программы в ПЛК все накопленные значения (речь о настройке ПИД, например) теряются. И я сделал сохранение параметров моих "переменных" в файлах на SD-карте. В итоге что бы ни делалось с программой, состояние переменных всегда бует тем, что достигнуто на предыдущем этапе.
    5. Теперь управление настройками аппаратуры (для примера тот же ПИд-регулятор) делается на ОДНОМ экране визуализации при помощи ОДНОЙ таблицы, в которой АВТОМАТИЧЕСКИ собираются все "параметры" нужные вам. Чем это удобно? Вот вы все сделали, подготовили, начали пусконаладку... Из-за плеча выглядывает заказчик и говорит: а вот это значение мне бы хотелось сделать с ограничением. Т.е. надо, чтобы я мог ввести значение ограничения. Что пришлось бы делать вам "по классике"? объявить где-то переменную, написать код в PLC_PRG, изменить визуализацию окна настроек (добавить поле значения и поле с текстом), задать всякие параметры ввода значения (минимум-максимум, название диалога ввода и т.п.). И дай бог, чтобы этот параметр никак не был связан с алармами - иначе пришлось бы еще рукоблудить в этой системе... А что с моим вариантом? PLC_PRG - да, тоже меняем. Переменную - да, тоже объявляем. НО на этом ВСЁ, точка! Эта переменная САМА добавится в таблицу параметров, чего там вы настраивали, и автоматически будет задействована в системе алармов, если надо!!! (только позаботьтесь о "правильном" именовании этой переменной).
    6. К модулям ввода-вывода переменные так же "подключаются" элементарно - никаких танцев с бубном с превращением пары WORD в REAL и т.п., никаких манипуляций с формированием сигнала "записи" в регистр модбас! Все делается автоматически, только подвяжите соответствующие свойства переменной к каналу модуля ввода-вывода, и все!


    Много слов написал... Теперь немного примеров.

    Вот так объявляется (как вариант) "моя" переменная:
    Код:
    HEATER3_T: AV.HMI_IO_REAL	:= (
                    wsOwner := ADR(HEATER3_Name), // это имя "владельца" параметра
                    wsName := "Температура", // это название параметра
                    wsUnit := "°С", // единица измерения параметра
                    AH := 950.0, // верхний аварийный порог (аларм)
                    WH := 850, // верхний предупреджительный порог (варнинг)
                    AL := -1, // нижний аварийный порог
    		Lock := LVP.IOPROP OR LVP.MINMAX // а это запрещает пользователю изменение допустимого минимума и максимума значения и свойств ввода-вывода
    		);
    Если мы хотим проверить значение этой переменной, то пишем что-то типа IF HEATER3_T.Value > 100 THEN ...., т.е. используем свойство Value переменой. Если мы хотим вывести значение переменной в виде текста, мы используем свойство Text (оно уже с единицей измерения). Если нам надо 2 знака после запятой, мы делаем HEATER3_T.PREC := 2, и с этого момента будем видеть 2 знака после запятой. Если нам надо вывести "название" - свойство Caption. B так далее.

    Благодаря принятому подходу вы имеете доступ в рантайме (!!!) ко всем переменным со всеми их свойствами. Т.е. можете в рантайме менять любые параметры (свойства), и, если хотите, оставить эту возможность пользователю (можно ограничить). Вот, например, такой окно может открываться по клику на "индикаторе":
    chrome_z3a4B2n8eP.png
    На скриншоте показана только часть свойств переменной. По заголовку диалога видно, что переменная имеет свойство Caption "Датчик давление ДД-1: Давление", при этом оно состоит из wsOwner "Датчик давления ДД-1" и собственно названия параметра wsName "Давление".

    В частности, используя блок "фильтра" переменных, можно поместить в таблицу переменные, содержащие в своем названии (теге), имени (wsName), заголовке (wsCaption) определенную последовательность символов (можно использовать логику И-ИЛИ-НЕ для наборов "масок"), и потом кликом на строке менять свойства и/или значения - именно так теперь можно делать настройки. Например, у вас 3 блока регулятора REG1, REG2 и REG3. Вы устанавливаете фильтр на тег "REG1", и в таблице параметров появляется список всех ПАРАМЕТРОВ регулятора 1 (разумеется, параметры при этом должны быть заданы в виде REG1_PARAM1, REG1_PARAM2 и т.д.). Если вы хотите получить значение PARAM2 сразу всех регуляторов, сколько бы их ни было, вы задаете фильтр "PARAM2". Блок фильтра выдает массив, так что можно перебором этого массива изменить все значения "в один клик". Так, например, реализован блок автоматического выключения всех устройств - все "BOOL"-переменные, содержашие в теге "_ON", будут установлены в FALSE, будь их хоть 1, хоть 101 (и вам не надо забоиться о том, чтобы ничего не поломалось, если вы вдруг удалите пяток подобных переменных или добавите десяток).

    Вот, например, может быть такая таблица параметров:
    chrome_VEz9WOzeab.png
    "Не достоверный" означает, что модуль ввода-вывода, к которому подвязана переменная, вернул ошибку.

    Если эта моя писанина интересна - готов выложить библиотеки (точнее, предоставить ссылку на скачивание). Они пока что постоянно "развиваются", что-то изменяется, т.е. процесс еще не завершен. Возможно, кто-то захочет подключиться к процессу, и сделать мир лучше вместе

    Если не интересно - ну что ж, пусть этот пост на форуме будет единственным, и с годами канет в Лету...
    Последний раз редактировалось Забодай тебя комар; 03.12.2025 в 12:07.

  2. #2

    По умолчанию

    Я свои себе делал тоже под свои задачи. У меня они ещё и к статусу Modbus привязаны и фильтруют ошибки.
    Как ты работаешь со строками? У меня работа со строками сильно нагружает процессор ПЛК, и я склеиваю их через указатели и библиотеку StringUtils
    Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живёте. © Steve McConnell
    Мой рабочий блог со статьями про щиты и автоматику ОВЕН - Cs-Cs.Net | Почта: Info@Cs-Cs.Net | Канал в ТГ @CsCsNetLab

  3. #3

    По умолчанию

    Ссылку однозначно сделайте и пару примеров простых, показать возможности биб-к, тоже не мешало бы.
    Последний раз редактировалось kondor3000; 03.12.2025 в 13:29.

  4. #4

    По умолчанию

    Цитата Сообщение от Cs-Cs Посмотреть сообщение
    Я свои себе делал тоже под свои задачи. У меня они ещё и к статусу Modbus привязаны и фильтруют ошибки.
    Как ты работаешь со строками? У меня работа со строками сильно нагружает процессор ПЛК, и я склеиваю их через указатели и библиотеку StringUtils
    Со строками я поступаю точно так же. Побочный эффект в виде увеличения нагрузки - а куда деваться?! Тут надо выбирать: или свою нагрузку экономить, или нагрузку ПЛК. Мне почему-то себя жальче, чем бездушную железку...

  5. #5

    По умолчанию

    Цитата Сообщение от kondor3000 Посмотреть сообщение
    Ссылку однозначно сделайте и пару примеров простых, показать возможности биб-к, тоже не мешало бы.
    Чуток разгребусь с рабочими задачами и сделаю демку.

  6. #6

    По умолчанию

    Цитата Сообщение от Забодай тебя комар Посмотреть сообщение
    Со строками я поступаю точно так же. Побочный эффект в виде увеличения нагрузки - а куда деваться?! Тут надо выбирать: или свою нагрузку экономить, или нагрузку ПЛК. Мне почему-то себя жальче, чем бездушную железку...
    Я в свои FBшки встроил таймеры BLINK и по ним обновляю выходные строковые переменные раз в 1-2 секунды. Нагрузку на проц снижает аж на 10..20%!
    "Сделай и себе" (с)
    Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живёте. © Steve McConnell
    Мой рабочий блог со статьями про щиты и автоматику ОВЕН - Cs-Cs.Net | Почта: Info@Cs-Cs.Net | Канал в ТГ @CsCsNetLab

  7. #7

    По умолчанию

    У меня несколько иное решение: текстовые значения получаются методом Get свойств, соответственно, вычисляются только в моменты, когда они реально запрашиваются, а запрашиваются они в 2 случаях: при отрисовке визуализации (период 100 или даже 200 мс), и при генерации "сообщений тревог" (еще реже). Таким образом затраты на побочные вычисления строк уменьшены до минимума без особых ухищрений.

    Реально цикл MainTask длится около 2 мс для проекта с примерно сотней "моих" переменных (каждая переменная имеет что-то около 16 текстовых элементов). Т.е. нагрузки вообще не видно.
    Последний раз редактировалось Забодай тебя комар; Вчера в 08:54.

  8. #8

    По умолчанию

    Набросал небольшой проект, прилагаю вместе с комплектом библиотек.
    Проект демонстрирует систему контроля значений с выводом сообщений.
    Проект на основе СПК210, в режиме эмуляции выдаёт ошибку записи - это нормально, т.к. эмулятор файловые операции не поддерживает. Если есть под рукой СПК210, там ошибки не должно быть (но изучите документацию библиотек на предмет рабочих путей для файлов).

    Для оптимизации пользователю для просмотра доступны только последние 32 сообщения, но в файл (в демке не используется) пишутся все. Главное - чтобы между событиями, которые вызывают запись сообщений, были паузы в несколько секунд, иначе будут потери сообщений. Это связано с тем, что используется кэш на 32 сообщения, которые перезаписываюстя при переполнении, а сброс кэша в файл происходит в "тишине".
    Вложения Вложения
    • Тип файла: zip DEMO.ZIP (965.6 Кб, Просмотров: 6)
    Последний раз редактировалось Забодай тебя комар; Вчера в 16:36.

Похожие темы

  1. библиотеки Codesys
    от Радик в разделе ПЛК1хх
    Ответов: 13
    Последнее сообщение: 24.08.2018, 18:16
  2. Библиотеки CoDeSys
    от Romjke76 в разделе Трёп (Курилка)
    Ответов: 11
    Последнее сообщение: 30.09.2016, 08:43
  3. Свои библиотеки CoDeSys .lib
    от Gus в разделе ПЛК1хх
    Ответов: 4
    Последнее сообщение: 02.03.2009, 18:18
  4. Сеть ModBus верхнего и нижнего уровня
    от dani1978 в разделе ПЛК1хх
    Ответов: 1
    Последнее сообщение: 09.02.2009, 07:10
  5. Новые библиотеки для CodeSys
    от Юрий_1900 в разделе ПЛК1хх
    Ответов: 5
    Последнее сообщение: 20.01.2009, 15:48

Ваши права

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