VISU#01. Как настроить воспроизведение звука в web-визуализации?
Вопрос: при возникновении аварии оператор должен услышать аварийный сигнал. Как реализовать это при использовании web-визуализации?
Ответ: см. данное видео.
COM#01. Как настроить обмен по протоколу MQTT?
Вопрос: как в CODESYS 3.5 настроить обмен по протоколу MQTT?
Ответ: можно воспользоваться библиотекой MQTT Client - она содержит реализацию клиента для протокола MQTT. Поддерживается подписка и публикация. Исходные коды библиотеки открыты.
Скачать библиотеку и посмотреть примеры ее использования можно на данной странице.
См. пример использования библиотеки.
Есть и альтернативная реализация - более функциональная, но сложная в использовании:
https://github.com/stefandreyer/CODESYS-MQTT
COM#02. Как по RS-485 опросить устройство, работающее на скорости <4800 бод?
Вопрос: как по RS-485 опросить устройство, работающее на скорости <4800 бод?
Ответ: для контроллеров, программируемых в CODESYS V3.5 SP11 Patch 5 или выше, скорости обмена 1200...4800 работают без дополнительных настроек.
В старых версиях CODESYS (3.5.5.5) нет возможности при открытии порта выбрать скорость меньше 4800.
Тем не менее, это можно сделать через Linux с помощью библиотеки CmpSysExec.
С помощью функции SysExecute необходимо однократно отправить в терминал команду типа
stty -F /dev/ttyS2 2400
где 2 - номер порта, совпадающий с маркировкой на задней крышке СПК;
2400 - скорость, на которой должен работать порт.
После этого можно открыть порт на любой скорости (с помощью соответствующего ФБ из библиотеки CAA SerialCom, SysCom или др.) - данная настройка уже не будет ни на что влиять, порт будет работать на скорости, заданной ранее.
OTHER#01. Какие сетевые порты контроллера использует среда исполнения?
Вопрос: какие сетевые порты (TCP и UDP) использует среда исполнения контроллера в процессе работы?
Ответ:
- 1217 - сервис Gateway (для подключения к контроллеру через промежуточный ПК, на котором запущен CODESYS Gateway)
- 1740-1743 - сервис обнаружения ПЛК через сканирование сети (UDP broadcast)
- 11740 - подключение к контроллеру (TCP)
- 8080 - сервер web-визуализации (HTTP)
- 8443 - сервер web-визуализации (HTTPS)
- 502 - протокол Modbus TCP
- 4840 - протокол OPC UA
Примечание: для контроллеров, программируемых в CODESYS V3.5 SP11 Patch 5 или выше, номера портов web-визуализации (для HTTP и HTTPS) могут быть изменены в конфигураторе.
PRG#01. Почему при делении происходит округление значения?
Вопрос: почему в результате выполнения следующего кода...
Код:
VAR
rVar: REAL;
iVar1: INT := 10;
iVar2: INT := 4;
END_VAR
rVar := iVar1 / iVar2;
...переменная rVar принимает значение 2, а не 2.5? Ведь она имеет тип REAL - с плавающей точкой!
Ответ: результат деления целых чисел (например, значений типа INT) является целым числом. Если в результате необходимо получить число с плавающей точкой - перед операцией деления выполните конверсию одного из аргументов к ожидаемому типу данных:
Код:
VAR
rVar: REAL;
iVar1: INT := 10;
iVar2: INT := 4;
END_VAR
rVar := INT_TO_REAL(iVar1) / iVar2;
Если в делении участвуют константы, то можно сделать так:
Код:
rVar := iVar1 / 4.0; // 4.0, а не 4
или
Код:
rVar := iVar1 / REAL#4;
COM#03. ПЛК - Modbus Slave. Можно ли изменить его адрес (slave ID) в процессе работы?
Вопрос: контроллер выполняет функцию Modbus RTU Slave. Можно ли изменить его адрес (slave ID) в процессе работы (например, с дисплея контроллера)?
Ответ: да, это возможно при использовании библиотеки OwenCommunication. Подробная информация приведена в данном видео.
IDE#01. Какие горячие клавиши используются в CODESYS 3.5?
Вопрос: какие горячие клавиши используются в CODESYS 3.5? Можно ли их переназначить?
Ответ: Список горячих клавиш приведен в данном документе. Переназначить горячие клавиши можно в меню Инструменты - Настройки - Клавиатура. Выберите нужное действие, установите курсор на поле Горячие клавиши, нажмите комбинацию клавиш (Ctrl+<...> или Ctrl+Shift+<...>), после чего нажмите Назначить.
Вложений: 2
IDE#02. Как включить отображение пиктограмм POU в редакторе CFC?
Вопрос: при создании программ на языках LD и FBD каждый оператор/POU имеет пиктограмму, характеризующее его назначение. В редакторе CFC эти пиктограммы не отображаются. Можно ли их включить?
Ответ: да, можно. Для этого на панели инструментов выберите вкладку Инструменты, в ней - пункт Опции. В опциях найдите пункт CFC-редактор, и на вкладке Вид поставьте галочку Иконки элементов.
Вложение 35474 Вложение 35475
Для POU, созданных пользователем, можно задать произвольную пиктограмму (ПКМ на POU - Свойства - Изображение).
PRG#02. Как проверить, что число имеет значение NaN?
Вопрос: как проверить, что число имеет значение NaN?
Комментарий: NaN (Not-a-Number) - это особое состояние числа с плавающей точкой, возникающее при специфических (в большинстве случаев - некорректных) математических операциях. Подробнее см. в статье на Википедии.
Ответ: например, можно воспользоваться функцией IsRealNaN из библиотеки FloatingPointUtils:
Код:
VAR
rVar: REAL;
xIsNaN: BOOL;
END_VAR
rVar := SQRT(-1.0); // генерируем NaN
xIsNaN := FPU.IsRealNaN(rVar);
или с помощью конвертации значения в строковый вид:
Код:
VAR
rVar: REAL;
sVar: STRING;
xIsNaN: BOOL;
END_VAR
rVar := SQRT(-1.0); // генерируем NaN
sVar := REAL_TO_STRING(rVar);
xIsNaN := (sVar='#NaN');
Можно также воспользоваться особым свойством NaN - оно не равно ни одному числу, в т.ч. и самому себе:
Код:
VAR
rVar: REAL;
xIsNaN: BOOL;
END_VAR
rVar := SQRT(-1.0); // генерируем NaN
xIsNaN := (rVar<>rVar);
Вложений: 1
DEBUG#01. Как переключить режим отображения переменных? (DEC/HEX)
Вопрос: как переключить режим отображения переменных? (DEC/HEX)
Ответ: меню Отладка - Режим отображения.
Эта функция меняет режим отображения для всех типов числовых переменных (кроме REAL и LREAL).
В некоторых случаях представляется удобным единовременно использовать разные режимы для различных переменных.
Для этого следует при объявлении переменных использовать директиву displaymode:
Код:
{attribute 'displaymode':='bin'}
byVar: BYTE := 2#0011_1100;
{attribute 'displaymode':='dec'}
uiVar: UINT := 123;
{attribute 'displaymode':='hex'}
wVar: WORD := 16#ABCD;
Вложение 35563
Вложений: 1
IDE#03. Как изменить версию библиотеки в проекте?
Вопрос: как изменить версию библиотеки в проекте?
Ответ: в Менеджере библиотек нажмите кнопку Плейсхолдеры. В появившимся списке однократным нажатием ЛКМ выберите нужную библиотеку (соответствующая строка выделится синим).
Нажмите ЛКМ на текущую версию библиотеки - появится окно со списком всех установленных системе версий данной библиотеки. Выберите нужную.
Вложение 35603
OTHER#02. Как синхронизировать системное время контроллера с NTP-сервером?
Вопрос: как синхронизировать системное время контроллера с NTP-сервером?
Примечание: для контроллеров, программируемых в CODESYS V3.5 SP11 Patch 5 или выше, этот функционал доступен в конфигураторе и узле OwenRTC таргет-файла.
Примечание: для контроллеров, программируемых в CODESYS V3.5 SP14 Patch 3 или выше, этот функционал доступен в web-конфигураторе.
Ответ: см. примеры для SP7 Patch 4 и SP16 Patch 3.
Вложений: 2
DEBUG#09. Как при отладке увидеть промежуточные значения переменных?
Вопрос: в режиме отладки рядом с переменной отображается значение, которое она имела на момент окончания предыдущего цикла. Как увидеть промежуточные значения переменной в пределах цикла?
Ответ: меню Отладка - команда Контроль выполнения. В результате рядом с переменной будет отображаться значение, которое оно получило в результате конкретной операции в пределах цикла (см. скриншот).
Кроме того, выполняемые ветки кода будут отображаться зеленым, а не выполняемые - белым.
Вложение 35622 Вложение 35623
Примечания: при использовании данного режима:
1. возрастает время выполнения цикла;
2. невозможно использование точек останова;
3. ввод значений переменных возможен только в поле объявления (но не напрямую в редакторе).
PRG#03. Можно ли считать тексты из компонента Список текстов в переменные программы?
Вопрос: можно ли считать тексты из компонента Список текстов в переменные программы? Можно ли отредактировать список текстов в процессе работы программы?
Ответ: да, это возможно. См. этот документ.
Вложений: 2
IDE#04. Как определить неиспользуемые в проекте переменные?
Вопрос: как определить неиспользуемые в проекте переменные?
Ответ: в меню Проект выберите пункт Установки проекта, и в появившемся окне найдите вкладку Статический анализ. Установите нужные галочки.
Вложение 35680
После этого при выполнении команды Генерация кода (меню Компиляция) на панели сообщений будет выводится соответствующая информация:
Вложение 35681
Вложений: 1
IDE#05. Как установить и добавить библиотеку?
Вопрос: как установить и добавить библиотеку?
Ответ: в целом, есть три способа способа распространения библиотек:
1.В виде архива репозитория. Архив содержит все версии системных библиотек, начиная с самых ранних релизов CODESYS V3 и заканчивая 3.5 SP4. Он необходим для работы с контроллерами Овен.
Скачать архив репозитория можно здесь. Архив представляет собой файл формата .msi, который необходимо запустить для начала установки.
2. В виде пакета (формата .package). В виде пакетов распространяются компоненты и библиотеки ОВЕН, а также, например, библиотеки OSCAT. Для установки пакета следует на вкладке Инструменты выбрать пункт Менеджер пакетов и нажать кнопку Установить.
3. В виде отдельного файла (формата .library, .compiled-library). Для установки библиотеки следует на вкладке Инструменты выбрать пункт Репозиторий библиотек в и нажать кнопку Установить.
Вложение 35752
Все установленные библиотеки по умолчанию размещаются в папке C:\ProgramData\CODESYS\Managed Libraries
Важно отметить, что версии библиотек устанавливаются независимо (в отличие от Codesys 2.3, где каждая новая версия перезаписывала предыдущую).
При этом автоматического обновления библиотеки в проекте не происходит - при необходимости следует произвести эту операцию вручную в Менеджере библиотек (см. подробности здесь).
Вложений: 3
PRG#04. Как преобразовывать данные? (2 WORD в REAL и т.п.)
Вопрос: в процессе разработки программы часто возникают задачи преобразования данных. В некоторых случаях достаточно стандартных операторов конверсии (например, REAL_TO_INT). Но иногда возникают вопросы другого рода, например - как разбить переменную DWORD на 4 отдельных байта, как преобразовать 2 переменные типа WORD в REAL и т.д. Очевидно, что можно сделать это с помощью указателей. Но есть ли более простые способы?
Ответ: такие способы есть. Рассмотрим три библиотеки:
1. Библиотека Util содержит функции, позволяющие:
- собирать переменные типов BYTE/WORD/DWORD из отдельных битов и разделять их на отдельные биты (удобно для графических языков);
- выделять/устанавливать конкретный бит переменных типа BYTE/WORD/DWORD;
- преобразовывать данные из десятичного формата в двоично-десятичный и обратно.
а также:
- функции конверсии для кода Грея;
- функции преобразования HEX-значений в ASCII-коды и обратно (пример: 16#30--->16#3330, где 16#33 - ASCII-код символа '3', а 16#30 - ASCII-код символа '0').
Вложение 35757
2. Библиотека CAA Memory содержит функции, позволяющие:
- выделять младшие и старшие байты/слова из переменных типа WORD/DWORD;
- собирать переменные типов BYTE/WORD/DWORD из отдельных битов/байт/слов и разделять их на отдельные биты/байты/слова;
- изменять порядок бит/байт/слов в переменных типа BYTE/WORD/DWORD.
Вложение 35758
Приведем также пример конвертации 2 WORD в REAL с помощью данной библиотеки:
Код:
VAR
wLow: WORD := 16#851F;
wHigh: WORD := 16#4133;
dwVar: DWORD;
rVar: REAL;
END_VAR
dwVar := MEM.PackWordsToDword(wHigh, wLow);
MEM.MemMove(ADR(dwVar), ADR(rVar), SIZEOF(rVar));
// rVar теперь имеет значение 11.22
3. Библиотека OwenCommunication содержит функции и ФБ, позволяющие:
- преобразовать REAL в 2 WORD и наоборот с возможностью изменения порядка байт;
- преобразовать DWORD в 2 WORD и наоборот с возможностью изменения порядка байт;
- преобразовать любой тип данных в любой.
Вложение 47274
Код:
VAR
wLow: WORD := 16#851F;
wHigh: WORD := 16#4133;
rVar: REAL;
END_VAR
rVar := OCL.WORD2_TO_REAL(wHigh, wLow, FALSE);
// rVar теперь имеет значение 11.22
Вложений: 1
IDE#06. Как изменить имя переменной во всех местах проекта, где она используется?
Вопрос: как изменить имя переменной во всех местах проекта, где она используется?
Ответ: найдите строку объявления переменной и поставьте курсор в любую позицию ее имени (или просто выделите имя). Нажмите ПКМ и выберите команду Рефакторинг. Укажите новое имя переменной и нажмите ОК. Имя переменной изменится во всех местах проекта, где она была использована - в коде, в визуализации, в узлах Modbus и т.д.
Вложение 35760
Вложений: 1
PRG#05. Почему при конверсии кириллицы из STRING в WSTRING получаются "крокозябры"?
Вопрос: почему при конверсии кириллицы из STRING в WSTRING (и наоборот) получаются "крокозябры"?
Ответ: напомним, что переменные типа STRING используются для представления символов кодировки из семейства ASCII (каждый символ - байт), а WSTRING - для кодировки UCS2 из семейства Unicode (каждый символ - два байта, т.е. WORD).
При конверсии STRING в WSTRING (и наоборот) происходит не интерпретация данных, а обычное перемещение байт. Проще всего пояснить это на примере, разместив строки в объединениях (UNION), чтобы иметь возможность просматривать содержимое их отдельных байтов:
Вложение 35761
Для конверсии с интерпретацией данных ('тест'--->"тест") используйте функции CP1251_TO_UNICODE и UNICODE_TO_CP1251 из библиотеки OwenStringUtils.
Примечание: не забудьте установить галочку Использовать строки Unicode в Менеджере визуализации для отображения кириллицы в WSTRING в визуализации проекта.
Вложений: 1
PRG#06. Как считать информацию об устройстве в переменные программы?
Вопрос: как считать информацию об устройстве в переменные программы?
Примечание: для контроллеров, программируемых в CODESYS V3.5 SP11 Patch 5 или выше, эта информация доступна в узле таргет-файла Info.
Ответ: см. пример (создан в 3.5 SP7 Patch4).
Вложение 35762
Вложений: 2
PRG#07. Как считать информацию о проекте в переменные программы?
Вопрос: как считать информацию о проекте (с одноименной вкладки CODESYS) в переменные программы?
Примечание: для контроллеров, программируемых в CODESYS V3.5 SP11 Patch 5 или выше, эта информация доступна в узле таргет-файла Info.
Ответ: см. пример (создан в 3.5 SP7 Patch4).
Вложение 35763
Примечание: остальная информация может быть получена с помощью автоматически создаваемых (при наличии галочки на вкладке Информация проекта) функций панели POU:
Вложение 35764
COM#04. Как организовать обмен по протоколу Modbus ASCII?
Вопрос: как организовать обмен по протоколу Modbus ASCII?
Примечание: для контроллеров, программируемых в CODESYS V3.5 SP11 Patch 5 и выше, в компоненте Modbus Master COM Port доступен выбор протокола Modbus ASCII.
Ответ: это возможно с помощью библиотеки OwenCommunication, которую можно скачать здесь.
У ФБ MB_SerialRequest (Modbus Master) есть вход xIsAsciiMode. Если он имеет значение TRUE - то блок работает по протоколу Modbus ASCII.
В ФБ MB_SerialSlave реализовано автоопределение протокола, так что блок отвечает на запросы и по протоколу Modbus RTU, и Modbus ASCII - задавать какие-то настройки для этого не требуется.
VISU#02. Где хранятся файлы стандартных ламп/кнопок, используемые в визуализации?
Вопрос: где хранятся изображения стандартных ламп и кнопок, используемые в визуализации?
Ответ: по умолчанию все стандартные изображения элементов, доступные в визуализации, хранятся в папке
C:\ProgramData\CODESYS\Visualization Styles\3S-Smart Software Solutions GmbH
Далее нужно открыть папку с названием нужного стиля и выбрать версию. Изображения хранятся в формате .svg.
Вложений: 6
VISU#03. Можно ли изменить внешний вид диалогов ввода? (Numpad, Keypad)
Вопрос: можно ли изменить внешний вид диалогов ввода? (Numpad, Keypad)
Ответ: да, это возможно. Исходники лежат в папке установки по пути ...\CODESYS\Projects\Visu\Dialogs\VisuDialogs.libr ary
Откройте файл в CODESYS (желательно предварительно сделать копию). Дальше можно либо отредактировать библиотеку и сохранить ее под новым названием (обязательно также отредактируйте информацию проекта - заголовок и плейсхолдер), либо добавить в библиотеку новый диалог, созданный на основе существующего. Помимо визуализаций, библиотека содержит программную часть - желательно не редактировать ее (или же редактировать с четким пониманием происходящего).
Сохраните библиотеку в репозиторий.
Вложение 35772 Вложение 35774 Вложение 35773
В проекте CODESYS добавьте вашу библиотеку (если вы редактировали существующую и сохранили ее под новым названием).
Вложение 35775
В настройках элемента ввода появится возможность выбрать ваш диалог:
Вложение 35776 Вложение 35777
Примечание: В некоторых случаях после добавления библиотеки с новыми диалогами в проект нет возможности выбрать новые диалоги в Менеджере визуализации. Тогда следует закрыть проект и открыть его заново.
См. также библиотеку OwenVisuDialogs с кастомизированными диалогами ввода.
PRG#08. Чем отличаются типы данных WORD и UINT?
Вопрос: чем отличаются типы данных WORD и UINT? (а также BYTE и USINT, DWORD и UDINT, LWORD и ULINT) Ведь они занимают одинаковое количество памяти и имеют совпадающий диапазон возможных значений.
Ответ: в соответствии со стандартом МЭК 61131-3 типы USINT/UINT/UDINT/ULINT относятся к группе "целые беззнаковые числа", а BYTE/WORD/DWORD/LWORD - к группе "наборы бит" (bit strings). Для целых чисел определены арифметические операции. Для наборов бит определен побитовый доступ к данным. CODESYS 3.5 позволяет производить арифметические операции и обеспечивает побитовый доступ к любому из этих типов данных - так что фактически отличия отсутствуют. Поддержка всех типов сохранена для соответствия стандарту и совместимости с другим ПО. В целом, можно порекомендовать использовать UINT (и остальные схожие типы) для представления исчислимых величин (например, количества подсчитанных импульсов, числа произведенных продуктов и т.д.), а наборы бит - для представления бинарных данных (например, битовой маски состояния входов/выходов, кода ошибки и т.д.).
COM#05. Как подключить контроллер к SCADA-системе TraceMode?
Вопрос: как подключить контроллер к SCADA-системе TraceMode?
Ответ: см. видео для СПК1хх и видео для СПК1хх [М01].
Вложений: 4
PRG#09. Некоторые особенности языка CFC
1. Команда Удалить неиспользуемые контакты позволяет удалить входы и выходы блока, к которым не привязаны переменные. Это позволяет сэкономить место на холсте.
Вложение 35834
2. Метки соединений позволяют перейти к именованным связям - это особенно удобно, если ФБ, выходы и входы которых следует соединить, разнесены друг от друга на холсте.
Вложение 35835
3. Параметры (VAR_INPUT CONSTANT) позволяют уменьшить число входов блока. Параметры представляют собой настройки, которые не изменяются в процессе работы блока.
Вложение 35836
Примечание: язык CFC удобен для наглядного представления алгоритмов, но это достоинство часто сводится на нет смешением разных уровней абстракции в пределах одного POU. На следующем рисунке (в верхней части) используются как блоки высокого уровня (PID), так и низкого (триггеры, таймеры, операторы конверсии и т.д.). Оптимальным решением является сокрытие обвязки ПИД-регулятора в отдельные POU (см. нижнюю часть рисунка).
Вложение 35837
IDE#07. Как сделать ярлык для англоязычной версии CODESYS?
Вопрос: как сделать ярлык для англоязычной версии CODESYS?
Комментарий: это может потребоваться, чтобы при каждой необходимости не переключать язык через опции проекта.
Ответ: скопируйте существующий ярлык и в его свойствах замените путь на что-то вроде этого (конкретный путь зависит от места установки CODESYS и его версии):
"D:\Soft\3S CODESYS 3.5 SP5 Patch5\CODESYS\Common\CODESYS.exe" --Profile="CODESYS V3.5 SP5 Patch 5" --Culture="En"
IDE#08. В каких форматах можно сохранить проект CODESYS?
Вопрос: в каких форматах можно сохранить проект CODESYS?
Ответ: доступно 4 формата сохранения/экспорта проекта:
1. .project (Файл - Сохранить проект) - стандартный формат сохранения проектов CODESYS;
2. .projectarchive (Файл - Архив проекта - Сохранить проект) - включает в свой состав проект и все компоненты (таргет-файлы, библиотеки и т.д.). Этот формат удобен для переноса проекта на другой ПК (на котором, например, могут отсутствовать библиотеки, использующиеся в проекте). При отправке проектов в техподдержку - пожалуйста, используйте именно этот формат. Обратите внимание, что вес архива достаточно велик и может превышать 20 Мб - в этом случае рекомендуется загрузить его на любой файловый хостинг и отправить в письме ссылку.
3. .export (Проект - Экспорт) - позволяет экспортировать проект или его фрагмент в специфичном для CODESYS xml-подобном формате. Для импорта следует выделить в проекте узел Application и использовать команду Проект - Импорт.
4. .xml (Проект - Export PLCopen XML) - позволяет экспортировать проект или его фрагмент в универсальном xml-подобном формате, разработанном организацией PLCopen. В будущем планируется включение этого формата в стандарт МЭК 61131 (как МЭК 61131-10). Таким образом, проект, сохраненный в данном формате, можно перенести в другую среду разработки с поддержкой PLCopen XML. Полная совместимость в настоящий момент не гарантируется.
VISU#04. Как из программы изменить диапазон элемента Стрелочный индикатор?
Вопрос: как из программы изменить диапазон элемента Стрелочный индикатор?
Ответ: привязка переменных к параметрам Начало шкалы и Конец шкалы поддерживается начиная с версии CODESYS V3.5 SP14 Patch 3.
VISU#05. Почему вместо элемента Индикатор добавляется Стрелочный индикатор?
Вопрос: почему в редакторе визуализации при добавлении на экран элемента Индикатор (лампа) добавляется Стрелочный индикатор?
Примечание: это проявляется в версии CODESYS V3.5 SP5 Patch 5 при использовании русскоязычного интерфейса.
Ответ: если вы наблюдает такой эффект - значит, перетаскиваете элемент из Панели элементов на экран визуализации при зажатой клавише мыши (drag-and-drop).
В данном случае для корректного добавления элемента следует произвести один клик на Панель элементов (выделив элементов) и один клик - на экран визуализации (разместив элемент).
PRG#10. Вопросы по таймерам
Вопросы:
1. Как запускать таймеры TON/TOF по импульсу на входе IN?
2. Как реализовать таймер с возможностью установки паузы?
3. Как реализовать таймер обратного отсчета?
Ответ: см. пример (создан в 3.5 SP7 Patch4). В его состав входит:
1. Демонстрация запуска таймера TON по импульсу с помощью конструкции типа
Код:
fbTon (IN := xStart OR fbTon.IN);
где xStart - переменная, по импульсу которой происходит запуск таймера. Для сброса таймера необходимо вызвать его со значением FALSE на входе IN.
2. ФБ таймеров с возможностью установки паузы (TONP, TOFP).
3. ФБ таймеров обратного отсчета (TONR, TOFR).
PRG#11. Что можно применить вместо ФБ Сhange_Real_Time_Clock из библиотеки SPK_Tools?
Вопрос: что можно использовать вместо ФБ Сhange_Real_Time_Clock из библиотеки SPK_Tools?
Примечание: для контроллеров, программируемых в CODESYS V3.5 SP11 Patch 5 или выше, работа с системным временем реализована через узел OwenRTC таргет-файла.
Ответ: действительно, библиотека SPK_Tools не рекомендуется к использованию. Основная часть ее функционала была перенесена в узлы таргет-файлов (начиная с версии 3.5.4.26).
Тем не менее, узел для работы с системным временем в настоящий момент отсутствует (но его создание запланировано). Пока что можно воспользоваться примером (создан в 3.5 SP7 Patch4).
В его состав входит ФБ REAL_TIME_CLOCK, чей функционал полностью перекрывает функционал ФБ Сhange_Real_Time_Clock.
Вложений: 2
PRG#12. Как вывести сообщение в лог CODESYS из программы?
Вопрос: как вывести сообщение в лог CODESYS из программы?
Ответ: рассмотрим самый простой способ:
Код:
VAR
xWriteToLog: BOOL;
sMessage: STRING:='Hello, world!';
END_VAR
IF xWriteToLog THEN
VisuElems.Visu_Output(sMessage, VisuElems.LogClass.LOG_INFO);
xWriteToLog:=FALSE;
END_IF
Вложение 35989
Второй аргумент функции определяет жесткость (класс) сообщения:
Вложение 35990
Обратите внимание, что в проект должна быть добавлена визуализация. Кириллический текст не поддерживается.
Вложений: 4
COM#06. Как переинициализировать компонент ModbusCom?
Вопрос: как переинициализировать компонент ModbusCom?
Примечание: это может потребоваться при зависании порта (например, из-за воздействия помехи от силового оборудования).
Ответ: В случае необходимости контролировать процесс обмена данными можно воспользоваться переменными диагностики.
Для этого в нужном месте программы введите имя компонента из дерева проекта, поставьте точку и из выпадающего списка выберите нужную переменную диагностики:
Вложение 35995
Компонент Modbus Master содержит переменную xResetComPort, по переднему фронту которой происходит переинициализация порта.
Рассмотрим несколько вариантов воздействия на эту переменную:
1. Если опрос организован исключительно через шаблоны, то можно контролировать их переменные xError (обратите внимание, что требуется добавить постфикс _Modbus к названию устройства для доступа к ним) или привязать переменные к каналам Флаг ошибки. На скриншоте ниже приведены оба варианта (в реальном проекте, конечно, разумнее использовать только один из способов).
Вложение 35993
2. Если опрос организован через стандартные компоненты Modbus Slave, то можно контролировать их переменные xError (в этом случае доступ осуществляется по названию устройства, без постфикса).
Вложение 35994
3. Если опрос организован и через шаблоны, и через стандартные компоненты Modbus Slave, то можно использовать переменную xAllSlavesOk компонента Modbus Master (обратите внимание, что в этом случае переинициализация порта будет происходить при появлении ошибки у любого устройства. В некоторых ситуациях это решение является не самым удачным - например, если из-за проблем на полевом уровне (помехи/некорректная топология сети/etc.) возникновение ошибок, не связанных с зависанием порта, неизбежно, а их частота - высока.
Вложение 35998
VISU#06. Как создать в визуализации вертикальный текст?
Вопрос: как создать в визуализации вертикальный текст?
Ответ: см. видео + пример.
Вложений: 2
IDE#09. При запуске CODESYS возникает ошибка...
Вопрос: при запуске CODESYS возникает следующая ошибка. Что нужно сделать?
Вложение 37318
Ответ: перейдите в папку C:\ProgramData\CODESYS и удалите все файлы с разрешением .opt.
Вложение 37319
После этого запустите CODESYS, создайте и сохраните новый проект. В результате .opt файлы будут автоматически пересозданы.
PRG#13. Как работать с длинными (>255 символов) строками?
Вопрос: Как работать с длинными строками?
Ответ: Функции библиотеки Standard позволяют работать только со строками, длина которых не превышает 255 символов. В случае необходимости работы с более длинными строками используйте библиотеку StringUtils.
Пример использования функции StrConcatA:
Код:
PROGRAM PLC_PRG
VAR
sLongStr1: STRING(4096) := 'длинная строка 1';
sLongStr2: STRING(4096) := 'длинная строка 2';
sVeryLongStr: STRING(8192);
xConcat: BOOL;
END_VAR
IF xConcat THEN
// склеить sLongStr1 и sLongStr2 в sVeryLongStr
STU.StrConcatA(ADR(sLongStr1), ADR(sVeryLongStr), SIZEOF(sVeryLongStr) );
STU.StrConcatA(ADR(sLongStr2), ADR(sVeryLongStr), SIZEOF(sVeryLongStr) );
xConcat := FALSE;
END_IF
OTHER#03. Как сделать резервную копию, если нет исходников проекта?
Вопрос: как сделать резервную копию проекта, если нет исходников (файла .project или .projectarchive).
Комментарий: описанные ниже способы подходят только для контроллеров, программируемых в CODESYS V3.5 SP11 Patch 5 или выше.
Ответ: есть два способа:
1. С использованием среды CODEYS - вкладка Backup&Restore в узле Device (см. видео). В этом случае в состав бэкапа войдут энергонезависимые переменные.
2. Без использования среды CODESYS - подключить к контроллеру USB или SD-накопитель, перейти в конфигуратор и на вкладке Накопители для нужного накопителя нажать кнопку Резервная копия, нажать Сохранить, установить галочку Добавить проект СODESYS в резервную копию и нажать кнопку Сохранить резервную копию. На накопителе будет создан файл backup_spk1xxm01_<метка_времени_создания_резервной _копии>.tar.gz, который содержит резервную копию настроек контроллера и проекта CODESYS, но не предоставляет доступа к исходным кодам проекта.
Также создать резервную копию можно в web-конфигураторе на вкладке Система/Резервное копирование.