Tag Archives: CoDeSys

Командная строка в CoDeSys

Параметры, указанные в командной строке при запуске CoDeSys, определяют дополнительные режимы работы программы. Все параметры начинаются символом «/». Регистр знаков не учитывается. Команды выполняются слева направо.

/online  Непосредственно после запуска CoDeSys перейти в режим online текущего проекта.
/batch CoDeSys стартует без пользовательского интерфейса, выполняет командный файл и немедленно завершает работу, возвращая результат выполнения в формате  HRESULT. Выполнение командного файла будет остановлено, если при выполнении очередной команды произойдет ошибка. Предупреждения не прерывают выполнение. Если ошибок и предупреждений не произошло, то возвращает значение S_OK.
/run  После подключения автоматически запускает приложение.Имеет смысыл только совместно с /online
/show …/show hide

/show icon

/show max

/show normal

Вид окна при старте CoDeSysОкно не показывается, нет индикатора в панели задач

Окно свернуто

Развернуто на весь экран

Размер окна равен размеру, установленному в предыдущем сеансе работы.

/out <outfile>  Все сообщения программы дополнительно записываются в файл <outfile>.
/noinfo Не показывать заставку при запуске
/userlevel <group> Определение пользовательской группы (например, «/userlevel 0» для группы 0)
/password <password> Прямой ввод пароля пользовательской группы (например, «/password abc»)
/openfromplc Будет загружен проект из целевой системы.
/visudownload Если CoDeSys HMI запускается с проектом, не соответствующим присутствующему в целевой системе, то будет дан диалог подтверждения загрузки.
/notargetchange Изменение целевой платформы может быть выполнено только через командный файл (См. описание команды «target…»).
/cmd <cmdfile> После запуска выполнить команды из файла <cmdfile>.

Формат командной строки:

«<Путь CoDeSys-exe>» «<Путь проекта>» /<команда1> /<c команда2> ….

Пример командной строки:

Открывается проект ampel.pro, все окна закрыты. Далее выполняются команды, указанные в command.cmd. Путь указывается в кавычках!

«D:dir1codesys» «C:projectsampel.pro» /show hide /cmd command.cmd

ПЛК – браузер CoDeSys

ПЛК-Браузер присутствует на вкладке Ресурсы Организатора объектов, если он активирован в настройках целевой платформы (категория Сетевая функциональность).

Окно ПЛК-Браузер состоит из строки команд и окна отображения результатов. Выпадающий список в строке команд содержит все ранее введенные команды со времени запуска проекта. Это упрощает их повторение. Новые команды автоматически добавляются в данный список.

По нажатию клавиши <Enter> команда передается в контроллер. Если Online соединение не установлено, команда отображается в том виде в котором она передается в контроллер. В режиме Online в окне отображается ответ контроллера.

Набор команд ПЛК-Браузера

Чаше всего ПЛК-Браузер выполняет стандартный набор команд 3S, поддержанный в системе исполнения. Он включает функции манипулирования памятью и информационные функции системы исполнения. Список доступных команд задан в ini файле, включенном в состав пакета целевой платформы.  Для расширения состава команд необходимо включить их реализацию в систему исполнения и описать в ini файле.

При открытии проекта, список доступных команд ПЛК-Браузера считывается из ini файла. Доступ к этим командам можно получить кнопкой  через диалог «Вставка стандартной команды» или клавишей <F2>. Дать команду можно и через меню ‘Вставка ‘Стандартные команды’. Кроме того, команду можно ввести в ручную.

Синтаксис команд:

<команда><пробел><параметры>

Список параметров определяется типом команды. Переданная команда повторяется в окне отображения вместе с ответом контроллера.

Пример: Запрос кода идентификатора проекта (Id) командой «pid»:

pid…..

Вывод результата:

pid
Project-ID: 16#0025CFDA

Для каждой команды можно запросить текст подсказки: ?<пробел><команда>. Текст подсказки находится в ini файле. В контроллер эта команда ни чего не передает.

Список стандартных 3S команд PLC-Browser:

Команда Описание
? Запрос у системы исполнения актуального списка всех поддерживаемых команд. Данный список не зависит от описаний включенных в файлы целевой системы..
mem Hex дамп области памятиСинтаксис 1: mem <start address> <end address>

Синтаксис 2: mem <start address>-<end address>

Адрес вводится в виде десятичного, шестнадцатеричного числа (префикс 16#) или макро.

memc Относительный Hex дамп области кода; аналогична mem, адрес задается от начала области кода
memd Относительный Hex дамп области данных; аналогична mem, адрес задается от начала области данных
reflect Возврат строки (для тестирования)
dpt Чтение таблицы указателей данных
ppt Чтение таблицы POU
pid Чтение Id проекта
pinf Чтение информации о проекте
tsk Показать список IEC задач
startprg Запуск ПЛК программы
stopprg Останов ПЛК программы
resetprg Сброс ПЛК программы.  Инициализируются только не энергонезависимые переменные.
resetprgcold Холодный сброс ПЛК программы.  Инициализируются в том числе энергонезависимые переменные
resetprgorg Заводской сброс ПЛК программы.  Полная очистка областей кода и данных…
reload Перезапись загрузочного кода проекта
getprgprop Свойства программы
getprgstat Статус программы 
filedir Файловая команда «dir»
filecopy Копирование файла [from] [to]
filerename Переименование файла [old] [new]
filedelete Удаление файла [filename]
saveretain Запись сохраняемых  (retain) переменных
restoreretain Чтение сохраняемых  (retain) переменных
setpwd Установить пароль на контроллерСинтаксис: setpwd <password> [level]

<level> может быть «0» (по умолчанию) действительный для подключения системы программирования, или «1» действительный для всех приложений

delpwd Удалить пароль

Если команда (ключевое слово) не распознана контроллером, в окне результата выводится сообщение ‘Keyword not found’.

Макро расширения команд ПЛК-Браузера:

Если в строке команд введена команда с макро расширением, оно будет раскрыто до передачи команды контроллеру. Результат выполнения дается в «раскрытом» виде.

Синтаксис: <команда><макрос>

Макросы:

%P<NAME> Если NAME имя POU то, макрос раскрывается в индекс <POU-Index>, в противном случае текст не изменяется
%V<NAME> Если NAME имя переменной то, макрос раскрывается в #<INDEX>:<OFFSET>, в противном случае текст не изменяется, (нотация #<INDEX>:<OFFSET> интерпретируется контроллером как адрес памяти)
%T<NAME> IЕсли NAME имя переменной то, макрос раскрывается в <VARIABLENTYP>, в противном случае текст не изменяется
%S<NAME> Если NAME имя переменной то, макрос раскрывается в <SIZEOF(VAR)>, в противном случае текст не изменяется

Следующий за обратной косой чертой символ % игнорируется. Если необходимо передать символ косой черты, введите: .

Пример:

Ввод в строке команды (дамп памяти для переменной  .testit):

mem %V.testit

Вывод результата:

mem #4:52
03BAAA24 00 00 00 00 CD CD CD CD ….ÍÍÍÍ

Вспомогательные команды ПЛК-Браузера

В меню ‘Дополнения’ и панели команд ПЛК_Браузера присутствуют вспомогательные команды для ускорения ввода и просмотра истории:

Кнопки просмотра История далее и История ранее  дают возможность «прокрутить» результаты выполненных команд. Запись истории сохраняется до закрытия проекта.

Команда Отменить прерывает начатый запрос.

Команда Сохранить историю команд  сохраняет результаты выполненных команд в файле с расширением *.bhl. (Browser History List). Команда Печать последней команды открывает стандартный диалог печати. На печать будет выведен текущий запрос и его результат.

Библиотека SysLibShm.lib

Данная библиотека включает функции размещения и доступа к разделяемой памяти процессов (Shared-Memory, сокращенно ShM) по физическим адресам.

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

  • SysShmOpen
  • SysShmClose
  • SysShmRead
  • SysShmWrite

SysShmOpen

Функция типа DWORD, открывает разделяемую память.

Возвращает дескриптор ShM, который можно применять как указатель. Дескриптор используется другими функциями данной библиотеки.

Переменная Тип данных Описание

stName                                STRING         Имя Shared Memory, может быть произвольным

dwPhysicalAddress       DWORD        Либо:

— необходимый значимый физический адрес ShM;

— 0, для произвольной области ShM

pdwSize                            DWORD          Указатель на размер области ShM

— если ShM уже существует, то здесь возвращается ее текущий размер.

— иначе создается ShM заданного размера. Задание здесь «0»

приведет к ошибке создания. Данную функцию можно

применить для проверки существования ShM.

SysShmClose

Функция типа BOOL закрывает ShM, которая идентифицируется соответствующим дескриптором. Возвращает TRUE при успешном завершении, иначе FALSE.

Переменная Тип данных Описание

hShm                               DWORD                       Дескриптор ShM (См. SysShmOpen)

SysShmRead

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

Переменная Тип данных Описание

hShm                                            DWORD                     Дескриптор ShM (См. SysShmOpen)

dwOffset                                      DWORD                    Смещение от начала области данных

pData                                           DWORD                      Адрес буфера данных для чтения

dwSize                                         DWORD                                      Число байт

SysShmWrite

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

Переменная Тип данных Описание

hShm                                                   DWORD                                   Дескриптор ShM

dwOffset                                             DWORD                 Смещение от начала области данных

pData                                                  DWORD                     Адрес буфера данных для записи

dwSize                                                DWORD                                              Число байт

 

Объектно-ориентированные расширения МЭК 611313

ЦЕЛИ

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

Говорят, что это происходит в силу некоторой консервативности, свойственной программистам контроллеров (ПЛК). Отчасти это действительно так. Но всё же в более значительной степени здесь сказываются ограниченные возможности инструментов программирования. Конечно, почти все современные контроллерные платформы дают возможность так или иначе использовать C++ (за дополнительные деньги). Однако компилятор обеспечивает только лишь аспекты чистого программирования. Функции отладки и ввода в эксплуатацию этих систем практически непригодны для контроллерных приложений. Даже для элементарного мониторинга значений входов-выходов приходится писать вызовы библиотечных функций. О таких приёмах, как «горячая» замена кода прикладной программы без остановки контроллера, вообще нужно забыть. Помимо этого автоматы и задачи с битовыми операциями реализуются в C++ достаточно сложно.

ТРЕБОВАНИЯ

В результате компанией 3S_Smart Software Solutions было принято решение расширить нормы стандарта МЭК 61131-3, введя поддержку ООП в новое поколение системы программирования CoDeSys. Расширения стандарта должны подчиняться следующим требованиям:

● ООП-расширения должны быть не обязательными, а опциональными;

● ООП- и не ООП-программирование можно совмещать;

● существующие приложения должны полностью поддерживаться с возможностью их плавной трансформации в ООП с учетом целесообразности;

● ООП должно быть применимо во всех языках МЭК 61131-3;

● программист не должен сталкиваться со сложными определениями.

РАСШИРЕНИЯ

Основное расширение МЭК 61131_3 касается превращения функционального блока (FUNCTION_BLOCK) в класс. Подобным образом структуры выросли в классы в языке C++. Это достигается введением методов. Фактически метод — это функция, встроенная в функциональный блок. В реализации функции доступны не только значения её параметров и локальных переменных, но и данные экземпляра функционального блока. В итоге вызов метода всегда включает имена экземпляра и метода.

Следующий пример показывает определение и вызов простого метода.

TYPE Direction: (Forward, Backward);

END_TYPE

FUNCTION_BLOCK Pump

VAR

Enabled: BOOL;

Direction: Direction;

END_VAR

METHOD GetState : BOOL

GetState := Enabled;

END_METHOD

METHOD Start: BOOL (* Метод Start *)

VAR_INPUT

WantedDirection: Direction;

END_VAR

Enabled := TRUE;

Direction := WantedDirection;

END_METHOD

END_FUNCTION_BLOCK

PROGRAM Main

VAR

Pump1: Pump;

Pump2: Pump;

END_VAR

Pump1.Start(Forward); (*Вызов метода Start*)

Pump2.Start(Backward);

END_PROGRAM

Естественно, вызов метода можно выполнить и в графических языках (рис. 1). Даже если функциональный блок имеет методы, ничто не мешает использовать его обычным образом, как определено в стандарте МЭК 61131-3.

Рис. 1. Пример вызова метода в FBD

Помимо пользовательских методов и стандартной реализации, функциональный блок включает два предопределённых метода: Init и Exit. Init вызывается неявно для всех экземпляров всех функциональных блоков после загрузки кода приложения или «холодного» рестарта контроллера. Exit вызывается перед «горячим» обновлением кода экземпляра, перед сбросом или управляемым отключением питания ПЛК. Например, его можно применить для корректного завершения работы.

Для упрощения правила видимости заданы жёстко:

Уже существующий класс может быть дополнен с помощью ключевого слова EXTENTS.

FUNCTION_BLOCK MonitoredPump EXTENTS Pump

VAR

MonitoredState: (OK, Error);

END_VAR

METHOD HasError : BOOL;

HasError := MonitoredState <> OK;

END_METHOD

END_FUNCTION_BLOCK

PROGRAM Main

VAR

Pump1: Pump;

Pump2: MonitoredPump;

END_VAR

Pump1.Start(Forward);

IF NOT Pump2.HasError THEN

(* Все методы базового класса доступны *)

Pump1.Start(Backward);

END_IF

END_PROGRAM

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

Следующий пример иллюстрирует данную технику:

INTERFACE Drive

METHOD HasError : BOOL;

END_METHOD

METHOD Home : BOOL;

END_METHOD

METHOD MoveAbsolute : BOOL;

VAR_INPUT

Pos: DINT;

END_VAR

END_METHOD

END_INTERFACE

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

FUNCTION_BLOCK CANDrive IMPLEMETS Drive

VAR

CANId: DINT;

State: (OK, ParamError, DriveError, CommError);

InHoming: BOOL;

END_VAR

METHOD HasError : BOOL;

HasError: State <> OK;

END_METHOD

METHOD Home : BOOL;

IF NOT InHoming THEN

WriteSDO(CANId, 16#4711, 16#02, 1);(*Команда на исх.*)

InHoming := TRUE;

ELSE

Home := ReadSDO(CANId, 16#4711, 16#03);

InHoming := NOT Home;

END_IF

END_METHOD

METHOD MoveAbsolute : BOOL;

VAR_INPUT

Pos: DINT;

END_VAR

… (* Реализация абсолютного перемещения *)

END_METHOD

METHOD SetCanId : BOOL;

VAR_INPUT

Id: DINT;

END_VAR

CANId := Id;

END_METHOD

END_FUNCTION_BLOCK

Как можно видеть, все методы интерфейса Drive наполнены специальными реализациями, построенными на CAN-сообщениях. Сверх того здесь присутствуют некоторые специфические переменные и методы. В данном случае это метод, устанавливающий CAN Id. Далее мы могли бы описать еще один вид привода, например аналоговый (AnalogDrive). В нём можно реализовывать методы совершенно иначе, чем для цифрового привода (CANDrive).

Теперь можно написать функциональный блок, получающий интерфейс в качестве параметра:

FUNCTION_BLOCK InitMove

VAR_INPUT

D: Drive;

Pos: INT;

END_VAR

VAR_OUTPUT

Done: BOOL;

END_VAR

IF Drive.Home() THEN

IF Drive.MoveAbsolute(Pos) THEN

Done := TRUE;

END_IF

END_IF

END_FUNCTION_BLOCK

Данный POU сможет работать с разными типами приводов, причём обратите внимание, что никакой их дифференциации в нём нет.

VAR

IM1, IM2: InitMove;

DriveCAN1: CANDrive;

DriveAna2: AnalogDrive;

END_VAR

DriveCAN1.SetCANId(12);

IM1(D := DriveCAN1, Pos := 100);

IM2(D := DriveAna2, Pos := 200);

Можно легко применять интерфейсы так же, как обычные типы данных, например, создавать массивы. Это позволяет использовать следующий приём:

VAR

AD: ARRAY[1..2] OF Drive;

DriveCAN1: CANDrive;

DriveAna2: AnalogDrive;

I: INT;

END_VAR

DriveCAN1.SetCANId(12);

AD[1] := DriveCAN1;

AD[2] := DriveAna2;

FOR I := 1 TO 2 DO

AD[I].Home();

END_FOR

Библиотека SysLibDir.lib

Данная библиотека позволяет работать с директориями файловой системы, если это поддержано в

системе исполнения. Выполнение функций библиотеки синхронное.

Библиотека содержит следующие функции:

  • SysDirCreate
  • SysDirOpen
  • SysDirRead
  • SysDirRemove
  • SysDirRename

SysDirCreate

Функция типа BOOL, создает новую директорию. Функция возвращает TRUE, если директория успешно создана, иначе FALSE.

SysDirOpen

Функция типа DWORD, открывает указанную директорию. Она возвращает дескриптор, типа DWORD, который можно использовать для чтения состава директории (файлы, поддиректории) функцией SysDirRead.

SysDirRead

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

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

Входныепеременные Тип данных Описание
hDir DWORD Дескриптор директории
stDirEntry STRING Имя элемента директории (файл или директория), не более 80символов.
pDirInfo POINTER TODIRECTORY_INFO Указатель на структуру DIRECTORY_INFO, которая будетзаполнена информацией об элементе. Можно задать нулевой

указатель (0) если данная информация не требуется.

SysDirRemove

Функция типа BOOL, удаляет указанную директорию. Возвращает TRUE при успешном удалении директории, иначе FALSE.

SysDirRename

Функция типа BOOL, переименовывает указанную директорию. Возвращает TRUE при успешном переименовании директории, иначе FALSE.

Структура DIRECTORY_INFO

Элементы данной структуры служат для представления информации о файлах (директориях). Структура используется в функции SysDirRead.

Элементы структуры:

Структура DIRFILETIME

Элементы данной структуры служат для представления времени и даты создания, доступа и последнего изменения файла (директории). Используется в структуре DIRECTORY_INFO.

Элементы структуры:

Библиотека SysLibCom.lib

Данная библиотека поддерживает работу с последовательным портом. Реализуется в системе исполнения (опционально). Библиотека содержит следующие функции (выполнение синхронное):

  • SysComOpen
  • SysComSetSettings
  • SysComSetSettingsEx
  • SysComClose
  • SysComRead
  • SysComWrite
  • SysComGetVersion2300

SysComOpen

Данная функция типа DWORD открывает последовательный порт. Она возвращает дескриптор порта, который используется при вызове других функций библиотеки.В случае ошибки,возвращается 0xFFFFFFFF.

Перечисление PORTS:

TYPE PORTS : (COM1:=1, COM2, COM3, COM4, COM5, COM6, COM7, COM8);

END_TYPE

SysComSetSettings

Данная функция типа BOOL, устанавливает скорость, число стоповых бит, контроль паритета, таймаут, размер буфера и период опроса для последовательного порта. Требуемые параметры передаются посредством указателя на структуру COMSETTINGS. Возвращает TRUE при успешной установке параметров, иначе FALSE.

Элементы структуры COMSETTINGS, определены следующим образом:

Port:PORTS; Порт (См. PORTS).

dwBaudRate:DWORD; Скорость: 4800, 9600, 19200, 38400, 57600, 115200

byStopBits:BYTE; 0 = один стоп бит, 1=полтора, 2=два

byParity:BYTE; 0 = нет бита контроля, 1 = нечетность, 2 = четность

dwTimeout:DWORD; Таймаут интерфейса в мс, по умолчанию 0

dwBufferSize:DWORD; Размер встроенного буфера, по умолчанию 0

dwScan:DWORD; Время полинга последовательного интерфейса; должно быть 0

Перечисление PORTS:

TYPE PORTS : (COM1:=1, COM2, COM3, COM4, COM5, COM6, COM7, COM8);

END_TYPE

SysComSetSettingsEx

Данная функция типа BOOL, применяется для установки расширенных параметров порта. В дополнение к параметрам, определяемым SysComOpen, она задает управление потоком и размер символов. Требуемые параметры передаются посредством указателя на структуру

COMSETTINGSEX.

Возвращает TRUE при успешной установке параметров, иначе FALSE. В зависимости от аппаратной реализации, не всегда возможно многократно менять параметры открытого порта. В этом случае, закройте его и откройте заново.

Элементы структуры COMSETTINGSEX определены следующим образом:

Size:INT; Размер структуры в байтах. Используйте sizeof() для заполнения этого поля. Необходимо для совместимости с пред. версиями.

Port:PORTS; Порт (См. PORTS).

dwBaudRate:DWORD; Скорость: 4800, 9600, 19200, 38400, 57600, 115200

byStopBits:BYTE; 0 = один стоп бит, 1=полтора, 2=два

byParity:BYTE; 0 = нет бита контроля, 1 = нечетность, 2 = четность

dwTimeout:DWORD; Таймаут интерфейса в мс, по умолчанию 0

dwBufferSize:DWORD; Размер встроенного буфера, по умолчанию 0

dwScan:DWORD; Время полинга последовательного интерфейса; должно быть 0, если в документации изготовителя аппаратуры нет иных указаний.

cByteSize : BYTE; 4…8: размер символа в битах

fOutxCtsFlow : BOOL; TRUE означает контроль потока передачи по сигналу CTS.

fDtrControl : BYTE; 0: DTR всегда 0 для открытого порта.

1: DTR

2: Управление по DTR

fDsrSensitivity : BOOL; При TRUE запрещен прием при отсутствии сигнала DSR.

fRtsControl : BYTE; 0: RTS всегда 0 для открытого порта.

1: RTS всегда 1 для открытого порта.

2: драйвер держит RTS пока буфер приемника заполнен менее чем на половину. Драйвер снимает RTS, если буфер заполнен более чем на три четверти.

3: Управление по RTS: Драйвер устанавливает RTS на время передачи. После передачи всех данных из буфера, RTS снимается.

fOutxDsrFlow : BOOL; Разрешает управление по DSR. При переходе DSR в ноль, передача приостанавливается.

Перечисление PORTS:

TYPE PORTS : (COM1:=1, COM2, COM3, COM4, COM5, COM6, COM7, COM8);

END_TYPE

Пример настройки параметров для аппаратного хендшекинга:

dwHandle: DWORD;

pt_comsettingsex:COMSETTINGSEX:=(Port:=COM1,

dwBaudRate:=38400,

byStopBits:=0,

dwTimeout:=5000,

cByteSize:=7,

byParity := 2,

fOutxCtsFlow := FALSE,

fOutxDsrFlow:=TRUE,

DtrControl := 2,

fRtsControl := 2);

Реализация:

pt_comsettingsex.Size := sizeof(pt_comsettingsex);

SysComSetSettingsEx(dwHandle := Handle, ComSettingsExt :=ADR(pt_comsettingsex));

Где Handle есть значение, полученное вызовом SysComOpen(COM1).

SysComClose

Функция типа BOOL, закрывает COM порт. Возвращает TRUE при успешном завершении, иначе FALSE.

SysComWrite

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

SysComRead

Функция типа DWORD, читает принятые данные из порта. Возвращает число считанных байтов.

SysComGetVersion2300

Функция типа DWORD, всегда возвращает 0. Используется для внутренней автоматической проверки версии. В прикладных программах ее вызывать ненужно.

Библиотека SysLibCallback.lib

Данная библиотека позволяет активировать пользовательские функции обратного вызова для событий системы исполнения. Она содержит функции SysCallbackRegister и SysCallbackUnregister.

Обе функции имеют тип BOOL и возвращают TRUE, если соответствующая функция обратного вызова успешно зарегистрирована или отключена, соответственно. Функции выполняются синхронно.

Прототип функции обратного вызова должен выглядеть так:

FUNCTION Callback : DWORD

VAR_INPUT

dwEvent:DWORD; // (* Событие *)

dwFilter:DWORD; // (* Фильтр *)

dwOwner:DWORD; // (* Источник *)

END_VAR

 

Внимание:  в целевых платформах RISC и Motorola 68K имя функции обратного вызова должны начинаться с „callback“!

 

Библиотечные функции SysCallbackRegister и SysCallbackUnregister имеют одинаковый набор параметров:

 

Входные 

переменные

Тип данных Описание
iPOUIndex INT POU индекс функции обратного вызова, может быть получен при помощи оператора INDEXOF(<имя функции >).
Event RTS_EVENT Событие в системе исполнения, по которому должна вызываться callback-функция. Определяется значением перечисления RTS_EVENT, определенного в данной библиотеке (см. ниже).

 

Перечисление RTS_EVENT определено следующим образом:

TYPE RTS_EVENT :

(

EVENT_ALL,
(* Общие события *)
EVENT_START,
EVENT_STOP,
EVENT_BEFORE_RESET,
EVENT_AFTER_RESET,
EVENT_SHUTDOWN,
(* Исключения системы исполнения *)
EVENT_EXCPT_CYCLETIME_OVERFLOW, (* Переполнение времени цикла *)
EVENT_EXCPT_WATCHDOG, (* Сработал программный сторожевой таймер МЭК задачи *)
EVENT_EXCPT_HARDWARE_WATCHDOG, (* Сработал аппаратный сторожевой таймер. Фатальная ошибка. *)
EVENT_EXCPT_FIELDBUS, (* Ошибка Fieldbus *)
EVENT_EXCPT_IOUPDATE, (* Ошибка обновления входов-выходов *)
(*Исключения выполнения *)
EVENT_EXCPT_ILLEGAL_INSTRUCTION, (* Недопустимая инструкция *)
EVENT_EXCPT_ACCESS_VIOLATION, (* Ошибка доступа *)
EVENT_EXCPT_PRIV_INSTRUCTION, (* Привилегированная операция *)
EVENT_EXCPT_IN_PAGE_ERROR, (* Ошибочная страница *)
EVENT_EXCPT_STACK_OVERFLOW, (* Переполнение стека *)
EVENT_EXCPT_MISALIGNMENT, (* Ошибка размещения по типу данных *)
EVENT_EXCPT_ARRAYBOUNDS, (* Выход за границы массива *)
EVENT_EXCPT_DIVIDEBYZERO, (* Деление на 0 *)
EVENT_EXCPT_OVERFLOW, (* Переполнение *)
EVENT_EXCPT_NONCONTINUABLE, (* Авария системы, продолжение работы невозможно *)
EVENT_EXCPT_NO_FPU_AVAILABLE, (* Мат. сопроцессор (FPU) недоступен *)
EVENT_EXCPT_FPU_ERROR, (* FPU: Неопределенная ошибка *)
EVENT_EXCPT_FPU_DENORMAL_OPERAND, (* FPU: Ошибочный операнд *)
EVENT_EXCPT_FPU_DIVIDEBYZERO, (* FPU: Деление на 0 *)
EVENT_EXCPT_FPU_INVALID_OPERATION, (* FPU: Ошибочная операция *)
EVENT_EXCPT_FPU_OVERFLOW, (* FPU: Переполнение*)
EVENT_EXCPT_FPU_STACK_CHECK, (* FPU: Перегрузка стека *)
(* События входов-выходов *)
EVENT_AFTER_READING_INPUTS,
EVENT_BEFORE_WRITING_OUTPUTS,
(* Прочие события *)
EVENT_TIMER, (* Прерывание по таймеру*)
EVENT_DEBUG_LOOP, (* Отладка по точке останова *)
(* Онлайн сервисы *)
EVENT_ONLINE_SERVICES_BEGIN := 500,
EVENT_LOGIN,
EVENT_CUSTOM_SERVICES,
(* Прерывания *)
EVENT_INT_0:=1000,
EVENT_INT_1,
EVENT_INT_2,
EVENT_INT_3,
EVENT_INT_4,
EVENT_INT_5,
EVENT_INT_6,
EVENT_INT_7,
EVENT_INT_8,
EVENT_INT_9,
EVENT_INT_10,
EVENT_INT_11,
EVENT_INT_12,
EVENT_INT_13,
EVENT_INT_14,
EVENT_INT_15,
EVENT_INT_255:=1255,
EVENT_MAX

);

END_TYPE

 

    Менеджер рецептов (Watch and Receipt Manager)

    Менеджер контроля и заказа значений переменных или коротко «Менеджер рецептов» позволяет просматривать значения заданного списка переменных, заранее определять наборы констант для переменных данного списка и моментально присваивать их одной командой записи: «Write Receipt». Кроме того, образ текущих значений переменных контроллера можно считать и сохранить (команда «Read Receipt«). Эта функция полезна, например, для быстрого восстановления определенного состояния системы.

    Для работы с Watch and Receipt Manager откройте соответствующее окно на вкладке Resource организатора объектов. Перечень доступных списков переменных находится в левой части окна. Списки можно выбирать с помощью мышки или клавишами управления курсором. В правой части окна показывается состав выбранного списка.

    Менеджер рецептов в режиме Offline

    В режиме Offline можно создать несколько именованных списков переменных, используя команду «Insert» «New Watch List». Сами переменные вводятся с помощью Ассистента ввода или с клавиатуры согласно следующему правилу:

    <POUName>.<Variable Name> [:= <Const>]

    Для глобальной переменной часть POU Name (имя программного компонента) не нужна. Ввод глобальной переменной начинается с точки. Имя переменной может быть многоуровневым. Можно использовать прямые адреса.

    Пример многоуровневой переменной:

    PLC_PRG.Instance1.Instance2.Structure.Componentname

    Пример глобальной переменной: .global1.component1

    Менеджер рецептов в режиме Offline

     

    Для присвоения константы переменной используется стандартный оператор присваивания : =. В режиме online заданные значения констант можно будет записать в контроллер командой ‘Write Receipt’.

    Пример:

    PLC_PRG.TIMER:= 50

    В примере переменная PLC_PRG.TIMER получает значение 50.

    По команде «Extras» «Write Receipt» заданные константы будут переданы в PLC.

    Относительно массивов и структур: Вы должны ввести имена отдельных элементов для последующего доступа к ним. Например: вы определили структуру с элементами a, b, c объявили переменную struvar данного типа в PLC_PRG.

    Предварительное помещение в список элементов a,b,c вместе со значениями выполняется так:

    PLC_PRG.struvar.a:=<value>

    PLC_PRG.struvar.b:=<value>

    PLC_PRG.struvar.c:=<value>

    Предварительное помещение в список элементов массива выполняется аналогично. Например, для массива переменных типа ARRAY[0…6]:

    PLC_PRG.arr_var[0]:=<value>

    PLC_PRG.arr_var[1]:=<value>

    Для функционального блока fb, содержащего переменные x,y и имеющего экземпляр fb_inst, объявленный в PLC_PRG, введите следующие строки:

    PLC_PRG.fb_inst.x:=<value>

    PLC_PRG.fb_inst.y:=<value>

    «Insert»»NewWatch List»

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

    «Extras» «Rename Watch List»

    Изменить имя выбранного списка переменных.

    «Extras» «Save Watch List»

    Сохранить выбранный список переменных в файле с расширением «*.wtc».

    «Extras» «Load Watch List»

    Загружает список переменных, сохраненный командой «SaveWatch List».

    Менеджер рецептов в режиме Online

    В режиме Online значения выбранного списка переменных отображаются на экране.

    Переменные структурного типа (массивы, структуры, экземпляры функциональных блоков) помечаются значком «плюс» перед именем переменной. Открывается такая переменная двойным щелчком мыши или клавишей <Enter>. Для просмотра значений переменных экземпляров функциональных блоков используйте команды контекстного меню ‘Zoom’ и ‘Open instance’.

    Для добавления новых переменных надо отключить режим отображения командой «Extra» «Active Monitoring». Сделайте необходимые изменения и включите отображение этой же командой.

    Менеджер рецептов в режиме Online

    В режиме Online значения определенных заранее в списке констант записываются в контроллер командой «Extras» «Write Receipt».

    Команда «Extras» «Read Receipt» заменяет константы текущими значениями переменных.

    «Extras» «Monitoring Active»

    В режиме Online эта команда включает или выключает окно показа значений переменных. Если выбран режим показа значений переменных, то команда отмечена галочкой.

    Для ввода новых переменных или задания констант (см. режим Offline) режим должен быть выключен с помощью этой команды.

    «Extras» «Write Receipt»

    С помощью этой команды заданные константы загружаются в контроллер.

    «Extras» «Read Receipt»

    С помощью этой команды в режиме Online константы, определенные в режиме Offline, заменяются на текущие значения переменных.

    Фиксация переменных

    В окне Watch and Receipt Manager вы можете изменять значения переменных, как и при мониторинге программ. Запись значений в ПЛК и фиксация значений выполняются обычными командами «Write values» и «Force values». Фиксированные значения отображаются красным цветом.

     

     

      Установка дополнительных библиотек для проекта CoDeSys

      В CoDeSys все файлы библиотек дополнительных программных компонентов имеют расширения  *.lib (Library) и находятся в папке Library. Она расположена по месту размещения основной программы на диске компьютера (по умолчанию – C:Program Files3S SoftwareCoDeSys V2.3Library).

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

      Чтобы увидеть, какие библиотеки уже подключены к проекту, и подключить дополнительные библиотеки, используется «Менеджер библиотек (Library Manager)», – его можно открыть из главного меню CoDeSys командами «Окно (Window)4Менеджер библиотек (Library Manager)» или выбором на вкладке организатора объектов «Ресурсы (Resources)» режима работы «Менеджер библиотек (Library Manager)», см. рисунок 1.1. В средней верхней части появившегося окна отображается список установленных библиотек.

      Рисунок 1.1 – Окно вкладки организатора объектов «Ресурсы (Resources)» с режимом работы «Менеджер библиотек (Library Manager)»

      Установка дополнительных библиотек выполняется из главного меню последовательным выбором команд: Вставка (Insert) 4 Добавить библиотеку (Additional Library) 4 в открывшемся окне папки Library (рисунок 1.2) выделяется файл c именем нужной библиотеки (например, sound.lib) и дается команда Открыть.

      Рисунок 1.2 – Окно выбора подключаемой к проекту дополнительной библиотеки

      Теперь в перечне библиотек, доступных в проекте, появится вновь установленная библиотека.

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

      Примечания.

      1.  Рекомендуется размещать все библиотеки, которые планируется подключать, в папке для хранения библиотек, создаваемой CoDeSys автоматически.

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

       

      Удаление выделенной библиотеки выполняется из контекстного меню командой Удалить (Delete) (или из главного меню командой  Правка (Edit) 4 Удалить (Delete), рисунок 1.3 (или нажатием клавиши <Delete>).

       

       

       

      а)  

       

       

      в)

      Рисунок 1.3 – Удаление дополнительной библиотеки:  а) для CoDeSys с английским интерфейсом; в) для CoDeSys с русским интерфейсом

        Библиотека sound

        Формирование звукового сигнала (BeepForTimeUser)

        Структурная схема

         

        Таблица 1

        Имя программного компонента BeepForTimeUser
        Тип программного компонента Функциональный блок   Функция  Программа
        Особенности работы Для работы не требуется установка в проекте дополнительных библиотек
        Применение на контроллерах ПЛК63, ПЛК73, ПЛК410
        Входные переменные: Тип данных Пояснения
        Time_ms WORD Время в миллисекундах, на которое необходимо включить зуммер. Диапазон значений от 1 до 5000 (задается пользователем)
        freq WORD Частота зуммера в герцах. Диапазон значений от 21 до 15000 (задается пользователем)
        Выходная переменная: Тип данных Пояснения
        BeepForTimeUser INT Функция ничего не возвращает

         

        Описание работы

        Функция включает встроенный в ПЛК звуковой излучатель на заданное в параметре Time_ms время с частотой, указанной в параметре freq.

        На время, когда включен звуковой излучатель, блокируется изменение его состояния как системными звуками (например, подтверждение нажатия клавиш), так и из программного кода (функцией BeepForTimeUser). Это значит, что:

        – если в течение времени звучания звукового излучателя происходит нажатие клавиш, то звукового подтверждения их нажатия не будет;

        – если в момент звукового подтверждения нажатия клавиши происходит вызов функции BeepForTimeUser, то этот вызов будет проигнорирован;

        – если в течение времени звучания звукового излучателя происходит вызов функции BeepForTimeUser, то этот вызов будет проигнорирован.

         

        Пример вызова данной функции в составе программы, которая на встроенный в ПЛК звуковой излучатель (зуммер) выводит сигнал с частотой 2 кГц на интервал времени 1000 мс, выглядит следующим образом (на языке ST):

         

        BeepForTimeUser(1000,2000);