Разработка пользовательской программы

Приемы работы и примеры разработки пользовательских программ представлены в документе «Первые шаги с CoDeSys V2.3» на сайте owen.ru.

Программные компоненты (POU)

Пользовательская программа создается в CODESYS на любом из доступных языков программирования и может состоять из одного или нескольких программных компонентов (POU).

К программным компонентам (POU) относятся:

  • программы;

  • функции;

  • функциональные блоки.

Отдельные POU могут включать действия (подпрограммы). Каждый программный компонент состоит из раздела объявлений и кода. Для написания всего кода POU используется только один язык программирования.

CODESYS поддерживает все описанные стандартом МЭК компоненты. Для использования стандартных элементов достаточно включить в проект библиотеку standard.lib (подробнее о библиотеках см. раздел).

Программные компоненты могут вызывать другие программные компоненты, но рекурсии недопустимы.

Главная программа, выполняемая циклически, должна называться PLC_PRG. В проекте могут быть определены несколько задач с различными условиями выполнения. Работа с задачами описана в разделе «Конфигуратор задач (Task Configuration)» документа «Руководство пользователя по программированию ПЛК в CoDeSys V2.3».

Внимание
Если в окне «Конфигурация задач (Task Configuration)» определена последовательность выполнения задач (см. раздел), то проект может не содержать PLC_PRG. Нельзя удалять или переименовывать POU PLC_PRG в однозадачном проекте – если не используется «Конфигурация задач (Task Configuration)». В однозадачном проекте PLC_PRG является главной программой.

Программа

Программа – это программный компонент (POU), способный формировать произвольное число значений во время вычислений. Значения всех переменных программы сохраняются между вызовами. В отличие от функционального блока, экземпляров программы не существует. Программа является глобальной во всем проекте.

Программу нельзя вызывать из функции. Если вызвать программу, которая изменит значения своих переменных, то при следующем вызове ее переменные будут иметь те же значения, даже если она вызвана из другого POU, что является главным различием между программой и функциональным блоком, в котором изменяются только значения переменных данного экземпляра функционального блока.

Список объявлений программы (в разделе объявлений окна редактирования) начинается с ключевого слова PROGRAM и следующего за ним имени программы.

Graphic
Пример записи программы на языке IL

Функция

Функция – это программный компонент (POU), который возвращает только единственное значение (которое может состоять из нескольких элементов, если это битовое поле или структура). В текстовых языках функция вызывается как оператор и может входить в выражения.

При объявлении функции следует указать тип возвращаемого значения – после имени функции написать двоеточие и тип (см. рекомендации по наименованию в приложении документа «Руководство пользователя по программированию ПЛК в CoDeSys V2.3»). Правильно объявленная функция выглядит следующим образом:

FUNCTION Fct: INT;

Имя функции используется как выходная переменная, которой присваивается результат вычислений.

Пример
Graphic
Пример записи функции на языке IL

В функции, написанной на языке IL, используется три входных переменных (par1par3) целочисленного типа (INT, диапазон изменения от –32768 до 32767) и возвращается результат деления произведения первых двух на третью. Список объявлений функции в разделе объявлений начинается с ключевого слова FUNCTION и следующего за ним имени функции, за которым, отделенное двоеточием, указывается название типа возвращаемого значения.

В языке ST вызов функции может присутствовать в выражениях как операнд.

В языке SFC функция вызывается только из шага или перехода.

Примечание
Функция не имеет внутренней памяти, но CODESYS допускает использование в функциях глобальных переменных, что является отклонением от требований стандарта МЭК 61131-3, в соответствии с которыми выходное значение функции должно зависеть исключительно от входных параметров. Другими словами, функция с одними и теми же значениями входных параметров всегда должна возвращать одно и то же значение.

Функциональный блок

Функциональный блок – это программный компонент (POU), который принимает и возвращает произвольное число значений. В отличие от функции, функциональный блок не формирует возвращаемое значение. Список всех объявлений функционального блока в разделе объявлений начинается с ключевого слова FUNCTION_BLOCK и следующего за ним имени блока.

Функциональный блок может имеет один или несколько экземпляров (копий).

Пример
Graphic
Пример записи функционального блока на языке IL

В примере функциональный блок, написанный на языке IL, имеет две входных и две выходных переменных. Значение выходной переменной MULERG равно произведению значений двух входных переменных, значение VERGL определяется в результате сравнения значений входных переменных.

Переменные

Программные компоненты (POU) проекта обрабатывают переменные – величины, значения которых могут меняться в ходе выполнения пользовательской программы (в частных случаях переменные, обрабатываемые пользовательской программой, могут быть и константами). Переменные могут использоваться для хранения и передачи промежуточных результатов выполнения логических операций, значений состояний входов или выходов функциональных блоков программы, значений состояний входов или выходов ПЛК и др. Каждая переменная имеет идентификатор.

Типы переменных

Переменные в CODESYS могут принадлежать к нескольким типам.

Переменные могут быть:

  • локальные – используются только в рамках текущего программного компонента и задаются в разделе объявлений (см. раздел);

  • глобальные – используются в рамках всего проекта (во всех программных компонентах, входящих в его состав) и задаются в разделе объявлений, вызываемом выбором объекта «Глобальные переменные» (Global Variables) на вкладке «Ресурсы» организатора объектов.

Переменные также могут относиться к входным или выходным, а также одновременно к входным и выходным.

Если необходимо сохранять значения переменных, то их можно объявить как перманентные переменные – такие переменные сохраняют свои значения при определенных сбоях в системе. Перманентные переменные бывают сохраняемые и постоянные.

Сохраняемые переменные обозначаются во время объявления ключевым словом RETAIN. RETAIN-переменные сохраняют свои значения, даже если произошла авария питания (выключение и включение) контроллера, что равносильно команде «Сброс» (Онлайн → Сброс). Значения RETAIN-переменных сохраняются в энергонезависимой памяти контроллера.

Примечание
Переменные, объявленные в окне «Конфигурация ПЛК» в подэлементе «ModBus (slave)», являются сохраняемыми RETAIN-переменными.
Пример

Сохраняемая RETAIN-переменная

VAR RETAIN     rTemperature: REAL; (* Сохраняемая RETAIN-переменная *) END_VAR

Контроллеры с версией ПО 1.0.х поддерживают следующие режимы работы с энергонезависимой памятью:

  • запись по событию (используется по умолчанию) – RETAIN-переменные записываются автоматически по сигналу об отключении питания контроллера. Для записи используется накопленная энергия конденсаторов источника питания ПЛК;

    Внимание

    RETAIN-переменные не сохраняются в следующих случаях:

    • срабатывание сторожевого таймера (WatchDog);

    • перезагрузка контроллера по команде из пользовательской программы или ПЛК браузера («PLC-Browser»).

    В энергонезависимой памяти контроллера остаются значения, записанные ранее.

  • циклическая запись – RETAIN-переменные записываются циклично. Период устанавливается пользователем в пределах от 1 до 1000 секунд. Для надежности запись ведется поочередно в две копии RETAIN-переменных. В режиме циклической записи рекомендуется использовать цикл ПЛК не менее 10 мс, так как запись RETAIN-переменных вызывает дополнительную нагрузку на процессор контроллера.

Узнать или изменить активный режим работы с энергонезависимой памятью можно в ПЛК-Браузере («PLC-Browser») с помощью специальных команд:

  • SetupRetainMode – просмотр активного режима работы с RETAIN-переменными;

  • SetCyclicMode XXX – выбор режима циклической записи, где XXX – значение периода в секундах от 1 до 1000;

  • SetCyclicMode 0 – отключение режима циклической записи и переход к режиму записи по сигналу о пропадании питании контроллера.

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

Подробная информация и примеры проектов доступны в описании библиотеки RetainControlLib в разделе CODESYS V2 на сайте owen.ru.

Постоянные переменные обозначаются ключевым словом PERSISTENT. В отличие от сохраняемых переменных постоянные переменные сохраняют свои значения только в случае загрузки кода новой пользовательской программы, но не в случае выключения питания или сброса. Значения постоянных переменных размещаются вне энергонезависимого ОЗУ.

Подробнее о типах переменных см. Руководство пользователя по программированию ПЛК в CoDeSys V2.3.

Объявление переменных

Для использования в POU переменная должна быть объявлена. Объявление переменных производится в разделе объявлений (см. раздел). Синтаксис, используемый при объявлении переменных, соответствует стандарту МЭК 61131-3.

Раздел объявлений используется для объявления переменных POU, глобальных переменных, описания типов данных.

В разделе объявлений зарезервированные слова, типы данных и сами переменные автоматически подсвечиваются разными цветами.

Наиболее важные команды можно найти в контекстном меню, которое появляется по щелчку ПКМ или по нажатию сочетания клавиш Ctrl + F10.

Локальные переменные POU объявляются в разделе объявлений редактора программного компонента. Локальными переменными могут быть входные и выходные переменные, переменные, одновременно являющиеся входными и выходными, локальные переменные, сохраняемые переменные и константы.

Graphic
Окно раздела объявлений (верхняя часть окна редактора POU)

Методы объявления переменных

В CODESYS применяются следующие методы объявления переменных:

  • текстовый;

  • табличный;

  • автоматический.

Текстовый

Синтаксис объявления переменных текстовым методом (наименования заключены в квадратные скобки):

<Идентификатор> {AT <Адрес>}:<Тип> {:=<начальное значение>};

Имена переменных не должны содержать пробелов и специальных символов, должны объявляться только один раз и не должны совпадать с зарезервированными словами. Регистр букв в имени переменной не имеет значения (т. е. переменные Var1, VAR1  и var1 не различаются). В именах переменных важен знак подчеркивания: переменные A_BCD и AB_CD считаются разными. Идентификатор не должен содержать подряд более одного символа подчеркивания. Длина идентификатора не ограничена, все символы являются значимыми.

Все переменные и типы данных можно инициализировать с помощью оператора «=». Переменные простейших типов инициализируются константами. По умолчанию все переменные инициализируются нулем.

Пример
iVar1:INT:=12; (*Переменная типа INT, инициализируемая числом 12*)

Если требуется поместить переменную по определенному адресу, то следует объявить ее с ключевым словом AT.

Внимание
Не рекомендуется использовать прямую адресацию при помощи ключевого слова АТ. Для прямой адресации компилятор не проверяет за пользователем область памяти, на которую он ссылается при объявлении переменной. Переменным, размещаемым в области конфигурации ПЛК, следует присваивать имена непосредственно в области конфигурации. Дополнительное объявление переменных, объявленных в области конфигурации, не требуется.
Табличное

Табличный способ объявления переменных позволяет ускорить процедуру объявления переменных. Для вызова окна табличного объявления следует выбрать команду Объявления в форме таблицы контекстного меню окна раздела объявлений. На вкладках окна редактора отображаются списки переменных различных типов. В ячейках таблицы списки переменных могут быть дополнены новыми переменными. Значения атрибутов переменных могут быть введены или отредактированы также в ячейках таблицы. Кроме того, требуемые переменные могут быть не только отредактированы, но и удалены из списков.

Graphic
Окно раздела объявлений в табличном представлении
Автоматическое

Автоматическое объявление переменных позволяет автоматизировать ввод значений ряда атрибутов переменной, что позволяет ускорить и упростить процедуру ввода и одновременно избежать ошибок, возможных при ручном вводе.

Для вызова окна автоматического объявления переменных следует выбрать команду Авто объявление… в контекстном меню окна раздела объявлений.

В открывшемся окне задается имя добавляемой переменной (в поле «Имя»). В других полях окна значения задаются выбором из раскрывающегося списка или списков, отображаемых в специальных окнах.

Graphic
Окно автоматического объявления переменной

Например, требуемый тип переменной можно выбрать в окне «Ассистент ввода», которое открывается по нажатию кнопки с тремя точками, размещенной у правого края поля «Тип».

Graphic
Окно ассистента ввода типа переменной

Типы данных

Тип данных определяет род информации, методы ее обработки и хранения, количество выделяемой памяти. Программист может непосредственно использовать элементарные (базовые) типы данных или создавать собственные (пользовательские) типы на их основе.

Базовые типы данных

Логический (BOOL)

BOOL – логический тип данных, который может принимать два значения – ИСТИНА (TRUE) или ЛОЖЬ (FALSE). Логический тип данных занимает 8 бит памяти (если не задан прямой битовый адрес).

Целочисленный

BYTE, WORD, DWORD, SINT, USINT, INT, UINT, DINT и UDINT – целочисленные типы данных, которые отличаются диапазонами сохраняемых данных и требованиями к памяти. Характеристики целочисленных типов данных приведен в таблице ниже.

Характеристики целочисленных типов данных
ТипНижний пределВерхний пределРазмер памяти

BYTE

0

255

8 бит

WORD

0

65535

16 бит

DWORD

0

4294967295

32 бит

SINT

–128

127

8 бит

USINT

0

255

8 бит

INT

–32768

32767

16 бит

UINT

0

65535

16 бит

DINT

–2147483648

2147483647

32 бит

UDINT

0

4294967295

32 бит

Рациональный

REAL – данные в формате с плавающей запятой, используются для сохранения рациональных чисел. Для рационального типа требуется 32 бита памяти.

Диапазон значений рационального типа от [1.175494351e-38] до [3.402823466e+38].

Строки

Строковый тип STRING представляет строки символов. Максимальный размер строки определяет количество резервируемой памяти и указывается во время объявления переменной. Размер задается в круглых или квадратных скобках. Если размер не указан, принимается размер по умолчанию – 80 символов.

Длина строки в CODESYS не ограничена, но строковые функции способны обращаться со строками от 1 до 255 символов.

Пример
Объявление строки размером до 35 символов:str:STRING(35):='Просто строка';
Время и дата

Форматы данных времени и даты:

  • TIME – представляет длительность интервалов времени в миллисекундах. Максимальное значение для типа TIME: 49d17h2m47s295ms (4194967295 ms);

  • TIME, TIME_OF_DAY (сокр. TOD) – содержит время суток, начиная с 0 часов (с точностью до миллисекунд). Диапазон значений TOD: от 00:00:00 до 23:59:59.999;

  • DATE – содержит календарную дату, начиная с 1 января 1970 года. Диапазон значений от: 1970-00-00 до 2106-02-06;

  • DATE_AND_TIME (сокр. DT) – содержит время в секундах, начиная с 0 часов 1 января 1970 года. Диапазон значений от: 1970-00-00-00:00:00 до 2106-02-06-06:28:15.

Типы TIME, TOD, DATE и DATE_AND_TIME (сокр. DT) сохраняются физически как DWORD.

Пользовательские типы данных

Кроме стандартных типов данных в проекте можно использовать определяемые пользователем сложные типы данных: массивы, перечисления, структуры и некоторые другие (см. раздел).

Подключение дополнительных программных модулей

Дополнительные программные модули (библиотеки) подключаются в окне «Менеджер библиотек» (см. рисунок).

Окно «Менеджер библиотек» вызывается командой Окно → Менеджер библиотек или выбором пункта «Менеджер библиотек» в дереве на вкладке «Ресурсы» организатора объектов.

Graphic
Окно «Менеджер библиотек»

Для подключения библиотеки следует:

  1. Выбрать команду «Добавить библиотеку» (Add library) в контекстном меню списка подключенных библиотек (отображаемого в верхней левой области окна «Менеджер библиотек») или команду Вставка → Добавить библиотеку… в главном меню.

  2. В открывшемся окне выбора файлов выбрать файл требуемой библиотеки и нажать кнопку «Открыть». Выбранная библиотека будет подключена к проекту. Ее наименование отобразится в списке установленных библиотек (в верхней левой области окна «Менеджер библиотек»).

Для удаления подключенной библиотеки следует:

  1. Выделить требуемую библиотеку в списке подключенных (отображается в верхней левой области окна «Менеджер библиотек»).

  2. Вызвать команду «Удалить» контекстного меню списка. Выделенная библиотека будет отключена от проекта.

Для включения в проект дополнительного программного модуля (то есть модуля, который содержится в подключенной к проекту библиотеке) следует:

  1. Перейти на вкладку «POU» организатора объектов.

  2. В дереве программных компонентов объекта выбрать требуемый компонент.

  3. Вызвать команду Правка → Ассистент ввода в главном меню или команду «Ассистент ввода» в контекстном меню раздела объявлений.

  4. В открывшемся окне «Ассистент ввода» (см. рисунок), в левой части, где отображается перечень доступных типов добавляемых объектов, выделить требуемый тип (в данном случае – «Стандартные функциональные блоки»). В правой части окна отобразится перечень доступных объектов выбранного типа. Если флажок переключателя «Структурно» в нижней части окна установлен, то перечень отображается в виде иерархического структурированного списка. В противном случае перечень отображается в виде отсортированного по алфавиту линейного списка.

  5. В перечне доступных объектов (в правой части окна) выбрать требуемый объект и нажать кнопку «ОК» окна. Выбранный объект (в данном случае – стандартный функциональный блок) будет вставлен в редактируемый программный компонент проекта. Для отказа от добавления блока нажать кнопку «Отмена».

Graphic
Доступные дополнительные программные модули

Описания системных библиотек CODESYS доступны на сайте компании 3S Software и на странице CODESYS V2 на сайте owen.ru.

ПЛК110 поддерживают следующие библиотеки программных компонентов:

  • OwenLibFileAsync.lib;

  • OwenLibUSBSerial.lib;

  • OwenLibNetControl.lib;

  • OwenLibFactorySetups.lib;

  • OwenLibHidEvent.lib;

  • OwenLibPing.lib;

  • Timer.lib;

  • RetainControlLib.lib.

Рекомендуемые библиотеки:

  • Standart.lib;

  • Util.lib;

  • SysLibTime.lib;

  • SysLibCom.lib;

  • SysLibProjectInfo.lib;

  • SysLibMem.lib;

  • SysLibSockets.lib;

  • SysLibFile.lib;

  • SysLibPorts.lib;

  • NetVarUdp_LIB_V23.lib;

  • ComService.lib;

  • ModBus.lib;

  • OwenNet.lib;

  • Mercury.lib;

  • UNM.lib;

  • PID_Regulators.lib;

  • SmsOwenLib.lib;

  • OwenModbusSlave.lib;

  • Oscat_basic_333.lib;

  • Oscat_building_100.lib.

Установщик библиотек и их описания доступны на странице CODESYS V2 на сайте owen.ru. Помимо вышеперечисленных библиотек в состав установщика включены и некоторые сопутствующие библиотеки.

Модуль работы с файлами OwenLibFileAsync.lib

Модуль OwenLibFileAsync.lib поддерживает сохранение в файлы произвольных данных, чтение, удаление, копирование, переименование файлов и др. в асинхронном режиме, так как встроенное ПО контроллера в новой версии предусматривает работу с файловыми системами.

Примечание
Библиотека OwenLibFileAsync.lib рекомендуется для всех новых разработок.

Файлы можно сохранять на следующие устройства хранения:

  • внешний накопитель, подключенный к порту USB-Host (например, Flash-память, или жесткий диск);

  • внутренний Flash-накопитель;

  • внутренний виртуальный RAM диск (64 килобайт).

На носителях поддерживаются подкаталоги, а также доступны операции с файлами в директориях и просмотр содержимого директорий.

Устройство, на которое файл будет записываться, задается с помощью префикса к имени файла:

  • ffs: – для внутренней Flash-памяти;

  • ram: – для виртуального диска

  • usb: – для внешнего накопителя, подключенного к порту USB-Host.

Пример
Чтобы записать файл с именем «file1.txt» на разные носители, следует преобразовать его в «ffs:file1.txt» для записи во внутреннюю flash-память, «ram:file1.txt» – для записи на виртуальный диск и «usb:file.txt» – для записи на внешний накопитель.

На ПЛК запущен TFTP-сервер для передачи данных по протоколу TFTP (см. RFC 1350 – THE TFTP PROTOCOL (REVISION 2) http://tools.ietf.org/html/rfc1350). Следует обратить внимание, что только RAM-диск доступен для TFTP протокола, а также отсутствует функция разграничения доступа. Сервер доступен на всех интерфейсах ПЛК по соответствующим IP-адресам на порту 69. Подробный пример доступен в документе «Руководство по работе с файлами на ПЛК по протоколу TFTP», который находится на странице CODESYS V2 на сайте owen.ru.

Внимание
Не рекомендуется использовать встроенную Flash-память для записи часто переписываемых файлов, так как ее ресурс ограничен (около 50 000 циклов записи). В создаваемых пользовательских программах для контроллера рекомендуется программировать сохранение файла с предпочтением внешнего накопителя при его наличии.
Внимание
Виртуальный диск расположен в ОЗУ контроллера, поэтому все файлы, записанные под именами с префиксом «ram:», будут храниться в контроллере до первого его выключения. Для сохранения файлов следует их копировать на Flash-носители – внутренний или внешний.
Примечание
Пользовательская программа может работать одновременно максимум с пятью файлами.

Во время работы с USB-Host следует учитывать:

  • Суммарное потребление тока хабом и подключенными устройствами не должно превышать 0,5 А;

  • USB-Host имеет функцию защиты от перегрузки и короткого замыкания. Срабатывание защиты приводит к выключению питания на USB-Host с последующими периодическими попытками восстановления питания;

  • к ПЛК могут быть подключены USB MassStorage и USB HID устройства. Общее число подключенных USB MassStorage и USB HID устройств не должно превышать 1 для каждого типа. Остальные устройства игнорируются. Устройства инициализируются в порядке подключения. Если два USB MassStorage устройства уже подключены и подается питание на ПЛК, то порядок их инициализации непредсказуем;

  • стек USB-Host поддерживает опрос не менее 1 устройства класса USB HID;

  • с помощью библиотеки OwenLibHidEvent.lib можно получать сообщения от HID устройства, например мыши и/или клавиатуры;

  • в ПЛК поддерживается класс USB MassStorage с файловой системой FAT (12, 16, 32). Ограничения на размер накопителя налагаются только ограничениями файловой системы FAT.

    Примечание
    Рекомендуется использовать файловую систему FAT32.

Запись на USB MassStorage накопитель происходит без кэширования, т. е. для безопасного отключения накопителя следует:

  1. Завершить все процедуры записи (остановить запись из программы через библиотеку OwenLibFileAsync и закрыть открытые файлы, дождаться завершения всех системных загрузок файлов, остановить работу модуля(ей) архивации, остановить опрос файлов через 0x20 функцию ModBus slave).

  2. Дождаться прекращения активности на накопителе (если индикация активности присутствует) или выждать не менее 3 секунд.

  3. Отключить накопитель.

Не рекомендуется подключать USB MassStorage устройства на базе жестких дисков и SDD без дополнительного внешнего питания, т. к. это может привести к перегрузке по питанию и циклическому включению/выключению внешнего диска.

Примечание
Не гарантируется корректная работа ПЛК с USB устройствами, если последние обратно не совместимы с протоколом USB 1.1.

В контроллере реализован асинхронный механизм доступа к файлам из пользовательской программы. Асинхронный доступ гарантирует отсутствие задержек в выполнении пользовательской программы при доступе к файлам, в том числе расположенным на внешних носителях. Основной особенностью использования модуля OwenLibFileAsync.lib является выполнение функций в два этапа:

  1. Подача команду для работы с файлом.

  2. Проверка завершенности выполнения указанной команды и разрешение для подачи следующих команд для дальнейших операций с файлом.

Любая функция библиотеки OwenLibFileAsync.lib возвращает 2 значения:

  1. Состояние запроса к асинхронной библиотеке:

    • ASYNC_PAUSED -1000 (*Система по своим внутренним причинам приостановила обработку асинхронных запросов*);

    • ASYNC_QUERY_FULL -1001 (*более 5 запросов в очереди*);

    • ASYNC_BLOCK_ACCESS -1002 (*Запрос к уже обрабатываемому объекту с другой функцией*);

    • ASYNC_GENERAL_ERROR -1003 (*фатальная ошибка*);

    • ASYNC_INVALID_HANDLE_ERROR -1004 (*Запрос к неоткрытому/открытому не через асинхронную библиотеку файлу*);

    • ASYNC_WORKING 32766 (*идет работа асинхронной библиотеки*);

    • ASYNC_DONE 32767 (* работа завершена -> смотрите значение return value *).

  2. При получении ASYNC_DONE требуется посмотреть второе возвращаемое значение, уже самой функции файловой системы:

    returnvalue:POINTER TO DWORD;

    В этой переменной лежит возвращаемое функцией значение, и расшифровку значения следует смотреть в описании соответствующей функции обычной, синхронной библиотеки SysLibFile.lib.

Функции работы с файлами в асинхронном режиме:

  • OwenFileOpenAsync – используется для открытия существующего или создания нового файла. Выход hFile (DWORD) сообщает дескриптор файла. Он используется другими функциональными блоками для работы с данным файлом;

  • OwenSysFileCloseAllOpenAsync – функциональный блок закрывает все открытые файлы. Имена или дескрипторы файлов не нужно сообщать, поскольку они все уже известны системе;

  • OwenSysFileCloseAsync – используется для закрытия файла. После закрытия файл освобождается для других процессов, дескриптор более не имеет значения;

  • OwenSysFileWriteAsync – используется для записи данных в файл. Файл должен быть предварительно успешно открыт с помощью SysFileOpenAsync;

  • OwenSysFileReadAsync – используется для чтения данных из файла. Файл должен быть предварительно успешно открыт с помощью SysFileOpenAsync;

  • OwenSysFileDeleteAsync – удаление файла с заданным именем;

  • OwenSysFileGetPosAsync – возвращает позицию (смещение от начала файла в байтах) записи и чтения в файл;

  • OwenSysFileSetPosAsync – задает позицию записи и чтения в файл;

  • OwenSysFileEOFAsync – возвращает TRUE, если текущая позиция чтения/записи находится в конце файла, иначе возвращает FALSE;

  • OwenSysFileGetSizeAsync – возвращает размер файла с заданным именем;

  • OwenSysFileGetTimeAsync – возвращает время создания, последнего доступа и последнего изменения файла с заданным именем;

  • OwenSysFileCopyAsync – копирование файла с заданным именем в файл с другим именем;

  • OwenSysFileRenameAsync – переименование (перенос) файла с заданным именем.

Функция OwenSysFileOpenAsync

Функция OwenSysFileOpenAsync возвращает значение типа DWORD и используется для открытия существующего или создания нового файла. Возвращаемое значение – дескриптор файла, либо «0» в случае ошибки. Дескриптор файла используется для доступа к открытому файлу другими функциями библиотеки. В некоторых случаях сообщение об ошибке имеет вид «16#FFFFFFFF» (в десятичной системе это число 4294967295 при интерпретации как беззнакового числа или число –1 при интерпретации как числа со знаком).

Входные переменные:

  • FileName типа STRING – имя файла;

  • Mode типа STRING – режим работы с файлом, может имеет следующие значения:

    • w+ – если требуется открыть файл только для записи. Если файл существовал до начала записи, то он будет стерт и создан пустой файл с заданным именем;

    • r – если требуется открыть файл только для чтения;

    • a – аналогично w+, но если файл существовал до начала операции, данные будут дописываться в конец файла.

Пример

Открытие файла в режиме «а» и разрешение на переход к дальнейшим операциям с файлом на языке ST:

0: res:=OwenFileOpenAsync(filename,'a',ADR(handle)); IF res=ASYNC_WORKING THEN     state:=1; END_IF 1: res:=OwenFileOpenAsync(filename,'a',ADR(handle)); IF res=ASYNC_DONE THEN     IF handle<>0 THEN         state:=2;     ELSE         state:=0;     END_IF ELSIF res<0 THEN     state:=0; END_IF
Функция OwenSysFileCloseAsync

Функция OwenSysFileCloseAsync закрывает файл, открытый ранее функцией OwenSysFileOpenAsync, и возвращает значение типа BOOL, которое равно TRUE при успешном закрытии файла, иначе (например, если файл не был открыт) FALSE. Входным параметром является дескриптор закрываемого файла.

Входные переменные:

  • hFile типа DWORD – дескриптор файла, число, которое возвратила функция OwenSysFileOpenAsync.

Пример

Закрытие файла в режиме «а» и разрешение на переход к дальнейшим операциям с файлом на языке ST:

res:=OwenFileCloseAsync(handle,ADR(result)); IF res=ASYNC_WORKING THEN     state:=7; ELSE     state:=0; END_IF 7: res:=OwenFileCloseAsync(handle,ADR(result)); IF res=ASYNC_DONE THEN     IF result=0 THEN         state:=8;     ELSE         state:=8;     END_IF ELSIF res<0 THEN     state:=8; END_IF
Функция OwenSysFileWriteAsync

Функция OwenSysFileWriteAsync записывает данные в файл, открытый с помощью OwenSysFileOpenAsync, и возвращает значение типа DWORD – количество записанных байт данных.

Входные переменные:

  • File типа DWORD – дескриптор файла, число, которое возвратила функция OwenSysFileOpenAsync;

  • Buffer – адрес буфера, содержащего данные, которые необходимо записать в файл, число, которое возвратила функция ADR с аргументом – именем переменной-буфера, тип – массив, например, массив байт, или строка;

  • Size типа DWORD – размер буфера в байтах, может использоваться функция SIZEOF с аргументом (именем переменной-буфера).

Пример

Запись значения «buffout» в файл в режиме «а» на языке ST:

2: res:=OwenFileWriteAsync(handle,ADR(bufout),14,ADR(result)); IF res=ASYNC_WORKING THEN     state:=3; ELSE     state:=6; END_IF 3: res:=OwenFileWriteAsync(handle,ADR(bufout),14,ADR(result)); IF res=ASYNC_DONE THEN     IF result=14 THEN         state:=4;     ELSE         state:=6;     END_IF ELSIF res<0 THEN     state:=6; END_IF
Функция OwenSysFileReadAsync

Функция OwenSysFileReadAsync считывает данные из файла, открытого с помощью функции OwenSysFileOpenAsync, и возвращает значение типа DWORD – количество считанных байт данных.

Входные переменные:

  • File типа DWORD – дескриптор файла, число, которое возвратила функция OwenSysFileOpenAsync;

  • Buffer – адрес буфера, содержащего данные, которые необходимо записать в файл. Число, которое возвратила функция ADR с аргументом – именем переменной-буфера. Тип – массив, например, массив байт или строка;

  • Size типа DWORD – размер буфера в байтах, может использоваться функция SIZEOF с аргументом – именем переменной-буфера.

Пример функции аналогичен функции OwenSysFileWriteAsync.

Функция OwenSysFileDeleteAsync

Функция OwenSysFileDeleteAsync удаляет файл и возвращает значение типа BOOL: TRUE в случае успешного удаления или FALSE в случае ошибки.

Входная переменная FileName типа STRING – имя удаляемого файла.

Функция OwenSysFileGetPosAsync

Функция OwenSysFileGetPosAsync возвращает число типа DWORD – фактическое смещение в байтах от начала до текущей позиции в открытом файле с заданным дескриптором. Число определяет «место» в файле, откуда будет считана или куда будет записана информация, если операция чтения или записи будет произведена без дополнительного предварительного смещения позиции (см. функцию OwenSysFileSetPosAsync).

Входная переменная File типа DWORD – дескриптор открытого файла.

Функция OwenSysFileSetPosAsync

Функция OwenSysFileSetPosAsync устанавливает для открытого файла с заданным дескриптором позицию чтения (записи) с помощью заданного смещения и возвращает значение типа BOOL. Если позиция была установлена, то возвращается значение TRUE, иначе возвращается FALSE.

Входные переменные:

  • File типа DWORD – дескриптор открытого файла, в котором необходимо задать текущую позицию чтения (записи);

  • Pos типа DWORD – позиция чтения (записи), заданная смещением в байтах от начала файла.

Функция OwenSysFileEOFAsync

Функция OwenSysFileEOFAsync определяет, достигнут ли конец файла, и возвращает значение типа BOOL, равное TRUE, если текущим положением позиции чтения (записи) является конец файла, иначе FALSE.

Входная переменная File типа DWORD – дескриптор открытого файла, в котором проверяется достижение текущей позицией конца.

Функция OwenSysFileGetSizeAsync

Функция OwenSysFileGetSizeAsync возвращает размер файла в байтах в виде значения типа DWORD.

Входная переменная FileName типа STRING – имя файла.

Функция OwenSysFileGetTimeAsync

Функция OwenSysFileGetTimeAsync определяет значения даты и времени создания, последнего изменения и последнего доступа к файлу, и возвращает значение типа BOOL: TRUE в случае успешного завершения выполнения функции и FALSE в случае любой ошибки (например, доступа к файлу). Для хранения трех значений времени в одной переменной используется структура FileTime, приведенная ниже.

TYPE FILETIME     STRUCT         dtCreation:DT; (* Дата и время создания файла *)         dtLastAccess:DT; (* Дата и время последнего доступа *)         dtLastModification:DT; (* Дата и время последнего изменения файла *)     END_STRUCT END_TYPE

Входные переменные:

  • FileName типа STRING – имя файла;

  • ftFileTime типа POINTER TO FILE TIME – адрес структуры, в которую будут сохраняться считанные данные о времени создания файла, последнего доступа к нему и его последней модификации. Извлекается с помощью функции ADR.

Пример

Программа на языке ST, считывающая структуру со значениями времени создания файла:

VAR     file_time:POINTER TO FILETIME;     returnvalue:POINTER TO DWORD;     w: FILETIME; END_VAR 8:     OwenFileGetTimeAsync(filename, file_time, returnvalue);     w:=file_time; ELSE     state:=0; END_CASE
Функция OwenSysFileCopyAsync

Функция OwenSysFileCopyAsync копирует один файл в другой (файлы задаются именами) и возвращает значение типа UDINT, в котором содержится количество действительно скопированных байт.

Входные переменные:

  • FileDest типа STRING – имя копии файла (файл-приемник);

  • FileSource типа STRING – имя копируемого файла (файл-источник).

Функция OwenSysFileRenameAsync

Функция OwenSysFileRenameAsync переименовывает файл и возвращает значение типа BOOL: TRUE в случае успешного переименования или FALSE в случае ошибки. Ошибка может возникать, например, если попытаться переименовать открытый файл.

Входные переменные:

  • FileOldName типа STRING – текущее имя файла;

  • FileNewName типа STRING – новое имя файла.

Модуль контроля выхода в интернет OwenLibNetControl.lib

Модуль-библиотека OwenLibNetControl.lib предназначена для управления сетевыми устройствами в ПЛК. Библиотека позволяет включать/выключать интерфейсы (если это разрешено), получать статус интерфейса, его тип, атрибуты и адреса интерфейса (MAC, IP, APN, телефонный номер и т. п.). Библиотека подключается аналогично стандартным библиотекам CODESYS.

В ПЛК интерфейсы Ethernet и PPP имеют, соответственно, номера 0 и 1.

Функция START_IFACE
Graphic
Графические отображение функции START_IFACE

Входная переменная IFACE типа DWORD – номер запускаемого интерфейса.

Выходная переменная START_IFACE типа BOOL – значение, указывающее на успешность выполнения команды. Если возвращается значение «0», запуск произошел успешно.

Функция STOP_IFACE
Graphic
Графические отображение функции STOP_IFACE

Входная переменная IFACE типа DWORD – номер закрываемого интерфейса.

Выходные переменные STOP_IFACE типа BOOL – значение, указывающие на успешность закрытия интерфейса. Если возвращается значение «0», интерфейс закрыт успешно.

Функция GET_IFACE_INFO
Graphic
Графические отображение функции GET_IFACE_INFO

Входная переменная IFACE типа DWORD – номер интерфейса.

Выходная переменная GET_IFACE_INFO типа POINTER TO IFACE_INFO возвращает указатель на структуру, содержащую информацию об интерфейсе:

TYPE IFACE_INFO: STRUCT     name: STRING(79); (* Имя интерфейса *)     itype: IFACE_TYPES; (* Тип интерфейса *)     addreses: ARRAY[0..9] OF ARRAY[0..31] OF BYTE; (* Все адреса интерфейса (МАС, IP, имя порта) список зависит от типа *)     atributes: IFACE_ATRIBUTES; (* Атрибуты интерфейса *) END_STRUCT END_TYPE

Поля структуры параметра GET_IFACE_INFO:

  • IFACE_TYPES – типы интерфейсов, поле может принимать следующие значения:

    • NO_IFACE 0 – нет интерфейса;

    • ETHERNET_IFACE 1 – интерфейс Ethernet;

    • PPP_IFACE 2 – использование модема.

  • IFACE_ATRIBUTES – атрибуты интерфейса, поле может принимать следующие значения:

    • HAVE_STATUS 1 – возвращает статус;

    • AUTOSTART 2 – запускается автоматически;

    • USE_DHCP 4 – настроен в режиме DHCP.

  • IFACE_ADDRESS_TYPES – массив из 10 полей типа Array [0..31] of BYTES, каждый элемент массива содержит информацию об определенных адресах интерфейса:

    • IFACE_MAC_ADDRESS 0 – массив, содержащий МАС-адрес;

    • IFACE_IP_ADDRESS 1 – массив, содержащий IP-адрес;

    • IFACE_IP_MASK 2 – массив, содержащий маску сети;

    • IFACE_IP_GATE 3 – массив, содержащий шлюз сети;

    • IFACE_TEL_NUMBER 4 – массив, содержащий телефонный номер текущего дозвона;

    • IFACE_APN_NAME 5 – массив, содержащий адрес APN-оператора.

Функция GET_IFACE_STATUS
Graphic
Графические отображение функции GET_IFACE_STATUS

Входная переменная IFACE типа DWORD – номер интерфейса.

Выходная переменная GET_IFACE_STATUS типа IFACE_STATUS возвращает статус модема, битовые поля которого имеют следующие значения, по битам:

  • IFACE_NOT_PRESENT – если возвращается 0, то интерфейс не запущен;

  • IFACE_PRESENT – 0 – интерфейс запущен;

  • IFACE_CONFIGURED – 1 – интерфейс настроен (есть настройки);

  • IFACE_CONNECTED – 2 – есть физическое соединение;

  • IFACE_WORKING – 3 – есть логическое соединение;

  • IFACE_SEND_DATA – 4 – в течение 5 секунд была отправлена посылка;

  • IFACE_READ_DATA – 5 – в течение 5 секунд была получена посылка;

  • IFACE_HAVE_ERROR – 6 – есть ошибки;

  • IFACE_NO_IFACE – если возвращается 16#FFFF, то такого интерфейса нет.

Модуль получения серийного номера USB-устройства OwenLibUSBSerial.lib

Модуль OwenLibUSBSerial.lib предназначен для получения статуса подключенных к USB-Host устройств и доступа к их серийному номеру. Модуль содержит только одну функцию – GETUSBSERIAL.

Graphic
Графическое отображение функции GETUSBSERIAL

Входные переменные:

  • Unit типа DINT – номер устройства, обычно 0;

  • Buffer типа POINTER TO BYTE – указатель на массив размером 24 байт, куда будет записан серийный номер.

Выходной параметр GetUSBSerial типа DINT возвращает значения:

  • 0 – чтение серийного номера прошло успешно;

  • (–1) – устройство USB не подключено;

  • (–2) – серийный номер прочитан с ошибкой.

Расшифровка массива, содержащего серийный номер USB:

Значения массива
OffsetFieldSizeValueDescription
0

bLength

1

N+2

Size of this descriptor in bytes

1

bDescriptorType

1

Constant

STRING Descriptor Type

2

wLANGID[0]

2

Number

LANGID code zero

N

wLANGID[x]

2

Number

LANGID code x

Расшифровка строки (вместо серийного номера):

Значения строки
OffsetFieldSizeValueDescription
0bLength1NumberSize of this descriptor in bytes
1bDescriptorType1ConstantSTRING Descriptor Type
2bString NNumberUNICODE encoded string

Модуль работы с HID-устройствами OwenLibHidEvent.lib

Модуль OwenLibHidEvent.lib предназначен для получения статуса подключенных к USB-Host HID-устройств. Общее число Mass Storage Device и HID-устройств не должно превышать 1 для каждого типа. Остальные устройства игнорируются. Инициализация устройств в порядке подключения.

Модуль содержит только одну функцию – GETHIDEVENT.

Graphic
Графическое представление функции GETHIDEVENT

Входная переменная pHIDEv типа POINTER TO BYTE – указатель на массив, в котором будут храниться данные. Размер массива должен быть равен 17 байтам.

Выходная переменная GetUSBSerial типа DINT возвращает указатель на массив, где хранятся данные:

  • Code:DINT; (*или xChange для мыши*) (*Для клавиатуры Code трактовать как DWORD*);

  • Value:DINT; (*или yChange для мыши*) (*Для клавиатуры Value трактовать как DWORD. Индицирует нажата/отпущена*);

  • WheelChange:DINT; (*как и x(y)Change относительное перемещение*);

  • ButtonState:DINT; (*биты нажатых кнопок*);

  • Event_type:BYTE; (*==1 - мышь ==2 - клавиатура*).

Модуль PING OwenLibPing.lib

Модуль OwenLibPing.lib предназначен для посылки команды «ping» по указанному адресу. Ответ ожидается в течение заранее установленного тайм-аута.

Функция SENDPING
Graphic
Графическое представление функции SENDPING

Входные переменные:

  • IFace типа DWORD – тип используемого интерфейса (0 – Ethernet, 1 – PPP);

  • IP_addr типа DWORD – IP-адрес устройства, которое требуется пинговать (например, 16#0A020B32 – устройство с IP-адресом 10.02.11.50);

  • timeout – предустановленный тайм-аут пинга в мс (минимум 50 мс, максимум 25000 мс).

Выходная переменная SendPing типа DINT возвращает статус пинга:

  • PING_SERVICE_READY:=1(*?*);

  • PING_SERVICE_IFACE_NOT_READY:=-1 (*интерфейс не поднят*);

  • PING_SERVICE_SENDING:=2 (*?*);

  • PING_SERVICE_TIMEOUT:=-2 (*таймаут ответа*);

  • PING_SERVICE_ANSV_RECEIVED:=3 (*?*);

  • PING_SERVICE_BUSY:=-3 (*запрос был послан,интерфейс занят*);

  • PING_SERVICE_DEST_UNREACHABLE:=-4 (*?*).

Функция GETPINGSTATUS
Graphic
Графическое представление функции GETPINGSTATUS

Функция не имеет входных переменных.

Выходная переменная GetPingStatus типа DINT возвращает статус. Если ошибка или PING_SERVICE_ANSV_RECEIVED, то после чтения статус сбрасывается в PING_SERVICE_READY.

Модуль таймера Timer.lib

Модуль Timer.lib используется для работы со встроенным таймером, по прерыванию которого может быть вызван отдельный программный элемент (POU), не связанный с выполнением основной программы ПЛК.

Подробное описание модуля находится в разделе и на странице CODESYS V2 на сайте owen.ru.

Модуль RetainControlLib.lib

Модуль RetainControlLib.lib используется для принудительной записи RETAIN по команде из пользовательской программы.

Примечание
Использование модуля RetainControlLib.lib возможно только в режиме записи по событию (SetCyclicMode установлен в значение «0»).

Модуль имеет одну функцию SAVENOW, которая служит для принудительной записи RETAIN-переменных.

Graphic
Графическое представление функции SAVENOW

Функция не имеет входных переменных.

Выходная переменная SAVENOW типа BOOL – флаг, возвращаемый функцией по завершению записи.

Внимание
Использование функции приостанавливает выполнение программы ПЛК до завершения полной записи RETAIN-переменных. Запись длится около 30 мс, поэтому рекомендуется вызывать функцию SAVENOW только когда значения RETAIN-переменных были изменены.
Пример
PROGRAM PLC_PRG VAR     xSaveRetain: BOOL; (* Переменная управления сохранением RETAIN.                Запись происходит по переднему фронту *)     xDone: BOOL; (* Флаг завершения записи *) END_VAR VAR RETAIN     rSetPoint: REAL; (* RETAIN переменная, которую хотим принудительно                                    сохранить *) END_VAR IF xSaveRetain = TRUE THEN     xDone := SaveNow();     IF xDone = TRUE THEN         xSaveRetain := FALSE;     END_IF END_IF

Создание и использование дополнительных программных модулей

Пользователь может разрабатывать и применять дополнительные программные модули. Такая необходимость может возникнуть в том случае, если применяемая программа должна содержать алгоритмы, которые не могут быть написаны с использованием готовых программных модулей.

Для создания пользовательского программного модуля следует:

  1. Создать новый проект (см. раздел).

  2. В проекта создать объект типа «Функциональный блок» (см. рисунок).

    Graphic
    Создание нового функционального блока
  3. Написать программу функционального блока, которую предполагается использовать в качестве пользовательского программного модуля.

    Graphic
    Пример кода нового программного компонента
  4. Удалить из проекта программный компонент PLC_PRG (команда «Удалить объект» контекстного меню объекта в дереве объектов), оставив в нем только созданный функциональный блок.

  5. Сохранить функциональный блок командой Файл → Сохранить как, задав в открывшемся окне в поле «Тип файла» тип файла – «Внешняя библиотека (*.lib)» и нажав кнопку «Сохранить».

  6. Сохраненный функциональный блок подключить к разрабатываемому проекту аналогично тому, как подключаются готовые программные модули (см. раздел).

  7. Новый функциональный блок отобразится в перечне доступных стандартных функциональных блоков окна «Ассистент ввода» и может быть добавлен в текущий проект аналогично тому, как это выполняется для функциональных блоков из состава поставляемых библиотек (см. раздел).

Graphic
Пользовательский модуль в окне «Ассистент ввода»

Многозадачность

По умолчанию в проекте всегда создается единственная «главная» программа PLC_PRG, выполняемая циклически (см. раздел). В проекте можно явно определить несколько задач с различными условиями выполнения. Задача – это единица обработки программы.

Каждая задача имеет:

  • Название – служит идентификатором задачи;

  • Тип – определяет условие вызова задачи. Условием может служить время (циклическое или свободное freewheeling выполнение), внутреннее или внешнее событие (например, превышение заданного порога глобальной переменной или прерывание в контроллере);

  • Приоритет – задается числом (от 1 до 15) и в сочетании заданными условиями вызова задачи определяет хронологический порядок выполнения задач.

Для каждой задачи назначается ряд программ, которые будут в ней выполняться. Если задача выполняется в текущем цикле, то выполняются все включенные в нее программы (по одному циклу каждая). Порядок выполнения задач определяется комбинацией приоритетов и условий вызова задач.

Для каждой задачи можно задать контроль времени выполнения («сторожевой таймер»). Возможности его использования и настройки определяются целевой платформой.

Выполнение каждой задачи можно разрешить или запретить независимо от других.

Конфигурирование задач

Задачи определяются в окне «Конфигурация задач», которое открывается на вкладке «Ресурсы» организатора объектов.

Graphic
Окно «Конфигурация задач»

В левой части окна отображается перечень задач текущего проекта в виде дерева конфигурации. В корневой позиции обязательно присутствует элемент «Конфигурация задач», под ним раскрывается список задач, представленных по именам.

Для добавления в проект новой задачи следует выбрать команду Вставка → Вставить задачу главного меню или команду «Вставить задачу» контекстного меню дерева задач.

После добавления задачи в проект она включается в дерево задач и снабжается пиктограммой, отображающей тип задачи:

  • Graphic – выполняемые по системным событиям (Старт, Стоп, Сброс);

  • Graphic – циклически выполняемые задачи;

  • Graphic – выполняемые по времени (свободному);

  • Graphic – выполняемые по событию (связанному с глобальными переменными проекта);

  • Graphic – выполняемые по внешнему событию.

В правой части окна отображаются поля задания атрибутов текущей (выбранной в дереве задач) задачи. Набор полей соответствует атрибутам задачи выбранного типа.

Задавая значения атрибутов, можно конфигурировать свойства задач (Task properties), вызова программ (Program call), задавать связи с системными событиями (System events). Эта возможность зависит от выбора целевой платформы. Она должна быть поддержана в системе исполнения и разрешена в опциях целевой системы. Если стандартный набор настроек расширен специфическими параметрами, они будут представлены на отдельной вкладке «Parameter» в правой части окна.

Внимание
Если в окне «Конфигурация задач» определена последовательность выполнения задач, то проект может не содержать PLC_PRG. В противном случае удалять или переименовывать программный компонент PLC_PRG нельзя. PLC_PRG является главной программой в однозадачном проекте.

Конфигурирование задач типа «Системные события», то есть выполняемых по одному из возможных системных событий включает:

  • Указание требуемого события – установкой флажка в поле переключателя в требуемой строке списка системных событий;

  • Указание имени программного компонента (POU), который должен выполняться по наступлению события (ввод с клавиатуры в столбце «Вызываемый POU» в требуемой строке списка системных событий). Если POU с указанным именем не существует в текущем проекте, то активируется кнопка «Создать POU <Имя POU>». По нажатию этой кнопки автоматически формируется программный компонент проекта, имеющий указанное имя. Он может редактироваться так же, как другие POU.

Конфигурирование задач других типов включает:

  • указание типа задачи – «Циклическая/Свободная/По событию/По внешнему событию;

  • для задачи циклического типа – указание интервала выполнения;

    Graphic
    Указание интервала выполнения для задачи циклического типа
  • для задачи, выполняемой по событию – указание события, по нажатию кнопки у правого края поля открывается окно «Ассистент ввода», в котором можно выбрать требуемую переменную;

    Graphic
    Указание переменной для задачи, выполняемой по событию
  • для задачи, выполняемой по внешнему событию – указание события, по нажатию кнопки у правого края поля открывается список задач, в котором можно выбрать требуемую задачу;

    Graphic
    Указание переменной для задачи, выполняемой по внешнему событию
  • для задач любого типа задание параметров контроля времени выполнения («сторожевого таймера»), если эта опция доступна в используемом ПЛК.

    Graphic
    Указание параметров сторожевого таймера
Примечание
Не следует использовать одни и те же строковые функции в разных задачах, что может привести к ошибкам перезаписи данных.

В режиме «Online» выполнение задач можно наблюдать в виде графической диаграммы.

Обработка событий

Системные события, которые контроллер способен обрабатывать (см. рисунок):

  • start – вызов функции, если программа начала выполняться (после загрузки в ОЗУ автоматически,либо по команде пользователя). Функция выполняется до начала выполнения первого цикла программы;

  • stop – вызов функции, если программа была остановлена. Функция выполняется сразу после получения системой команды остановки программы (из отладочной среды или с помощью управляющего тумблера на передней панели);

  • before_reset – вызов функции, если был произведен горячий рестарт системы с помощью трехпозиционного переключателя (переключатель удерживался пять и более секунд в положении «Сброс»). Функция выполняется до перезагрузки контроллера;

  • after_reset – вызов функции, если был произведен горячий рестарт системы с помощью трехпозиционного переключателя (переключатель удерживался пять и более секунд в положении «Сброс»). Функция выполняется после перезагрузки контроллера.

  • debug_loop – вызов функции, если включен режим отладки и выполнение программы дошло до отладочной точки останова.

  • Timer – вызов функции каждые 20 микросекунд.

Функции обработки событий должны иметь параметры, указанные во вкладке «Системные события» окна «Конфигурация задач». В случае с контроллером ПЛК110 функции обработки событий имеют одинаковый набор параметров: входными параметрами являются dwEvent, dwFilter и dwOwner типа INT, функция выдает значение типа WORD (см. Помощь по CODESYS – «Система программирования CODESYS» – «Ресурсы» – «Конфигуратор задач» – «Системные события»).

Отладка

Опция отладки заставляет компилятор формировать дополнительный код, упрощающий поиск ошибок. Опция «Отладочный код» включается установкой флажка переключателя «Отладочный код» в окне «Опции (Options)», вызываемом командой Проект → Опции главного меню на вкладке Генератор кода.

Graphic
Окно «Опции…», вкладка «Генератор кода»

Точки останова

Точки останова – это места, в которых выполнение программы будет приостанавливаться, что позволяет просмотреть значения переменных на определенном этапе работы программы. Точки останова можно задавать во всех редакторах. В текстовом редакторе точка останова устанавливается на номер строки, в языках FBD и LD – на графический элемент, в языке SFC – на шаг.

Внимание
Система исполнения CODESYS SP32 Bit Full автоматически деактивирует сторожевой таймер задачи, если она выходит на точку останова.

Пошаговое выполнение

Примечание

Подробнее о пошаговом выполнении можно узнать из встроенной помощи CODESYS:

  1. Вызвать справку (F1 или в главном меню → Справка → Содержание…).

  2. Выбрать в содержании Система программирования CODESYS → Что есть что в CODESYS → Отладка и Online-функции.

Пошаговое выполнение позволяет проверить логическую правильность программы. Под шагом подразумевается:

  • в языке IL – выполнить программу до следующего оператора CALL, LD или JMP;

  • в языке ST – выполнить следующую инструкцию;

  • в языках FBD, LD – выполнить следующую цепь;

  • в языке SFC – продолжить действие до следующего шага.

Выполнение по циклам

Команда Онлайн → Один цикл выполняет один рабочий цикл и останавливает контроллер после выполнения.

Эмуляция

Режим эмуляции последовательно включается и отключается выбором команды Онлайн → Режим эмуляции главного меню. Включенный режим маркируется установленным флажком в строке главного меню и записью «Эмул.» в строке состояния главного окна.

Во время эмуляции созданная программа выполняется не в ПЛК, а в ПК, на котором запущено ПО CODESYS. В режиме эмуляции доступны все функции онлайн, что позволяет проверить логическую правильность программ, не используя контроллер.

Внимание
В режиме эмуляции функции внешних библиотек не выполняются.

Бортжурнал (Log)

«Бортжурнал (Log)» хронологически записывает действия пользователя, внутренние сообщения системы исполнения, изменения состояния и исключения в режиме «Online», что позволяет анализировать условия возникновения ошибки во время отладки программы.

Записи «Бортжурнала (Log)» можно просмотреть в режиме, вызываемом командой «Бортжурнал (Log)» дерева ресурсов проекта на вкладке «Ресурсы» организатора объектов.