Примечание

Документация находится в стадии разработки.

Устаревшая pdf-версия данного руководства доступна на сайте ИНЭУМ.

Среда разработки «Beremiz»

В данном руководстве представлено описание порядка работы со средой разработки «Beremiz». Документ содержит информацию о назначении программы, условиях выполнения, элементах пользовательского интерфейса, порядке разработки прикладных программ, работе с внешними модулями – плагинами. Рассмотрены основные её компоненты и их назначение с приведёнными примерами. Описан процесс работы с редакторами языков стандарта IEC 61131-3 и режимом отладки созданных прикладных программ. В документе приведены тексты сообщений, выдаваемых в ходе выполнения программы и описание их содержания.

В приложениях приведены порядок установки среды «Beremiz» под операционные системы Windows и Linux, описание стандартных функциональных блоков доступных для оператора и общие сведения о языках стандарта IEC 61131-3.

Назначение и условия применения программы

Среда разработки «Beremiz» предназначена для создания и отладки прикладных программ на языках стандарта IEC 61131-3 для целевых устройств (программируемых логических контроллеров) на базе СМ1820М. В качестве языков описания алгоритмов и логики работы данных программ, могут выступать как текстовые Structured Text (далее ST) и Instruction List (далее IL), так и графические Function Block Diagram (далее FBD), Ladder Diagram (далее LD), Sequential Function Chart (далее SFC).

Характеристики программы

Среда разработки «Beremiz» может выполняться на операционных системах Windows и Linux. Она написана с использованием кроссплатформенных языков Python, C, C++ и дополнительных библиотек к ним. Поэтому для запуска и работы «Beremiz», необходима сборка интерпретатора Python с определённым набором установленных пакетов (библиотек).

Инструкции по установке

Установка среды разработки «Beremiz» под операционную систему Windows 7

Для нормальной работы «Beremiz» под операционной системой Windows необходимо наличие следующих программных средств:

  • интерпретатор Python версии 2.7 со всеми необходимыми библиотеками (wxPython-2.8, twisted, simplejson, Pyro, numpy, nevow);
  • UNIX-подобная среда Cygwin c интерфейсом командной строки для Windows и установленным кросскомпиляторам для целевой архитектуры x86.

Интерпретатор языка Python и UNIX-подобная среда Cygwin находятся в папке BeremizProject на DVD диске. Для установки необходимо:

  1. скопировать папку BeremizProject в удобное для Вас место на жестком диске;
  2. перенести папку python из BeremizProject, например, на диск C;
  3. добавить путь к перенесённой папке python в «Переменных среды»

Добавление интерпретатора Python в переменные среды

Добавление интерпретатора языка Python осуществляется с помощью настроек операционной системы. Необходимо перейти в «Панель управления» и выбрать раздел «Система» (см. рис. 1.1).

image317

Рис. 1.1 – Панель управления в Windows 7. Раздел «Система и безопасность»

Далее выбирается пункт «Дополнительные параметры системы» в меню слева (см. рис. 1.2):

image318

Рис. 1.2 – Боковая панель диалога «Система» в Windows 7

Появится диалог «Свойства системы», в котором следует выбрать вкладку «Дополнительно» и нажать «Переменные среды…» (см. рис. 1.3).

image319

Рис. 1.3 – Диалог «Свойства системы» в Windows 7

Необходимо найти в разделе «Системные переменные» переменную «Path» (см. рис. 1.4) и нажать кнопку «Изменить».

image320

Рис. 1.4 – Диалог «Переменные среды» в Windows 7

В появившемся диалоге в поле «Значение переменной» добавляем, например, в середину строки, строку «C:\Python» (см. рис 1.5).

image321

Рис. 1.5 – Диалог изменения системной переменной под операционной системой Windows

Далее во всех открытых диалогах, необходимо нажать «OK», чтобы сохранить изменения. Теперь можно создать ярлык на рабочем столе со следующим адресом: «<путь с исполняемому файлу интерпретатора python >\pythonw.exe» «<путь к Beremiz>\beremiz\Beremiz.py».

Руководство программиста

Обращение к программе. Входные и выходные данные

Общая схема по созданию прикладной программы в среде разработки Beremiz представлена на рис. 1. Входными данными являются программные модули, написанные пользователем (в большинстве случаев инженером по автоматизации) на текстовых (ST, IL) и/или графических (FBD, SFC, LD) языках в соответствии со стандартом IEC 61131-3, объединённые в проект. Каждый такой проект представлен в формате XML и хранится в отдельной папке.

Выходными данными является сгенерированный исходный код и исполняемый файл:

  • Файл <название проекта> содержащий промежуточный код на языке ST, сгенерированный для всех программных модулей и ресурсов, транслируемый в язык C;
  • Файлы: config.c config.h, POUS.h, POUS.c и файлы, соответствующие ресурсам - содержат код (на языке C) реализации алгоритмов и логики работы программных модулей и ресурсов проекта;
  • Файлы plc_common_main.c и plc_debugger.c содержат код специфичный для целевой архитектуры и код для отладки прикладной программы на целевом устройстве из среды разработки Beremiz соответственно;
  • Файлы, содержащие код драйверов на языке С для взаимодействия с внешними модулями УСО;
  • Исполняемый файл в виде динамической библиотеки (с расширением so), компилируемый из этих вышеперечисленных C файлов.

Сгенерированный C код, с помощью кросскомпилятора, запущенного под UNIX-подобной оболочкой, компилируется в исполняемый бинарный файл, представленный в виде библиотеки.

Исполняемый файл, благодаря средствам Beremiz, может быть размещен на целевом устройстве через локальную сеть.

На целевом устройстве исполняемый файл запускается и в процессе работы выполняет следующие действия (см. Рисунок 1 ):

  • С помощью драйверов модулей УСО обменивается данными с внешними модулями;
  • Исполняет алгоритмы и логику, определенную пользователем в программных модулях проекта;
  • Предоставляет данные для трансляции в системы верхнего уровня;
  • Сохраняет и транслирует информацию для отладки прикладных программ.
_images/image144.png

- Обобщенная схема инструментальной среды Beremiz

Основные термины и определения

IEC 61131-3 - раздел международного стандарта МЭК 61131 (также существует соответствующий европейский стандарт EN 61131), описывающий языки программирования для программируемых логических контроллеров.

Среда разработки для языков стандарта IEC 61131-3 - система программных средств, используемая инженерами по автоматизации, для разработки прикладного программного обеспечения на высокоуровневых языках стандарта IEC 61131-3 под различные целевые платформы, которая включает в себя:

Текстовые и графические редакторы языков стандарта IEC 61131-3;

Транслятор диаграмм графических языков в текстовый язык;

Транслятор текстового языка в язык C;

Механизмы плагинов для взаимодействия с модулями УСО;

Механизмы добавления компиляторов под целевую платформу;

Механизмы соединений с целевыми устройствами;

Отладчик.

Модули УСО - модули ввода/вывода, обеспечивающие подключение датчиков и исполнительных механизмов.

Целевое устройство - аппаратное средство с определённой архитектурой процессора, на котором могут исполняться различные исполняемые файлы, обращающиеся с помощью него к модулям УСО.

Плагин для модуля УСО - интерфейс, состоящий из специальных драйверов и элементов пользовательского интерфейса для среды разработки Beremiz, позволяющий связывать переменные модулей УСО с переменными программных модулей, из которых состоит проект.

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

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

Ресурс - элемент, отвечающий за конфигурацию проекта: глобальные переменные и экземпляры проекта, связываемыми с программными модулями типа «Программа» и задачами.

Программный модуль - элемент, представляющий собой функцию, функциональный блок или программу. Каждый программный модуль состоит из раздела объявлений и кода. Для написания всего кода программного используется только один из языков программирования стандарта IEC 61131-3.

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

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

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

Задача - элемент представляющий время и приоритет выполнения программного модуля типа «Программа» в рамках экземпляра проекта.

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

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

Основные компоненты среды Beremiz

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

  • Главное меню программы;
  • Панель инструментов;
  • Дерево проекта;
  • Панель списка переменных и констант;
  • Панель настроек проекта;
  • Панель файлов проекта;
  • Панель отображения промежуточного кода;
  • Текстовые редакторы языков ST и IL;
  • Графические редакторы языков FBD, SFC, LD;
  • Панель редактирования ресурса;
  • Панель экземпляров проекта;
  • Панель библиотеки функций и функциональных блоков;
  • Отладочная консоль;
  • Поиск элементов в проекте;
  • Панель отладки;
  • Панель графика изменения значения переменной в режиме отладки.

Далее подробно рассказано про каждый компонент среды разработки Beremiz в отдельности.

Главное меню программы

Главное меню программы (см. Рисунок 2 ) содержит следующие пункты:

  • «Файл»;
  • «Редактировать»;
  • «Вид»;
  • «Помощь».
_images/image21.png

– Главное меню программы

Часть операций, выполняемых с помощью выбора определённого пункта меню мышью, могут быть исполнены с помощью «горячих клавиш». На выбор пользователя представлено два механизма обработки горячих клавиш. Первый механизм использует первые буквы названия пунктов меню, для выбора пункта необходимо нажать (ALT + ‘Клавиша первой буквы названия пункта в главном меню’) затем можно выбрать операцию или подменю, нажав на клавиатуре первую букву названия соответствующего пункта. Второй механизм использует установленные клавиатурные сочетания, далее будет подробно описан каждый пункт меню и соответствующая ему (если определена) «горячая клавиша».

Меню «Файл» предназначено для работы с проектом и предоставляет следующие пункты:

  • «Новый» - создание нового проекта (CTRL + N);
  • «Открыть» - открытие существующего проекта (CTRL + O);
  • «Недавние проекты» - быстрое открытие одного из десяти последних, недавно редактированных проектов;
  • «Сохранить» - сохранение текущего проекта пункт (CTRL + S);
  • «Сохранить как» - сохранение текущего проекта в папку отличную от той, в которой он сохранён на данный момент (CTRL + SHIFT + S);
  • «Закрыть вкладку» - закрытие активной вкладки (например, вкладки переменных плагина, конфигурации и т.д.) для открытого проекта (CTRL + W);
  • «Закрыть проект» - закрыть текущий, открытый проект (CTRL + SHIFT + W);
  • «Настройки страницы» - настройка параметров страницы для печати на принтере активной программы, представленной в виде диаграммы (CTRL + ALT + P);
  • «Просмотр» - предварительный просмотр результата перед печатью на принтере активной программы (CTRL + SHIFT + P);
  • «Печать» - печать на принтере активной программы (CTRL + P);
  • «Выход» - закрытие текущего проекта и выход из программы Beremiz (CTRL+ Q).
  • Меню «Редактировать» предназначено для работы с редакторами языков стандарта МЭК 61131-3 и предоставляет следующие возможности:
  • «Отмена» - отмена последней манипуляции в редакторе (CTRL + Z);
  • «Повторить» повтор отменённой манипуляции в редакторе (CTRL + Y);
  • «Вырезать» - удалить в буфер обмена выделенный(е) элемент(ы) в редакторе (CTRL + X);
  • «Копировать» - копировать в буфер обмена выделенный(е) элемент(ы) в редакторе (CTRL + C);
  • «Вставить» - вставить из буфера обмена находящиеся там элемент(ы) в редактор (CTRL + V);
  • «Поиск» - поиск в текущем функциональном блоке (CTRL + F);
  • «Поиск следующего» - подсветка следующего вхождения строки поиска (CTRL+K);
  • «Поиск предыдущего» - подсветка предыдущего вхождения строки поиска (CTRL + SHIFT + K);
  • «Поиск в проекте» - вызов диалога поиска данных в проекте (CTRL + SHIFT + F);
  • «Добавить элемент» - добавление одного из следующих элемента в текущий проект:
  • «Тип данных» - нового типа данных;
  • «Функция» - новой функции;
  • «Функциональный блок» - нового функционального блока;
  • «Программа» - новую программу;
  • «Ресурс» - новый ресурс;
  • плагины для модулей УСО;
  • «Выделить всё» - выделение всех элементов в активной вкладке редактора (CTRL +A);
  • «Удалить» - удаление программного модуля, выделенного в дереве проекта.

Меню «Вид» предназначено для работы с редакторами языков стандарта IEC-61131 и предоставляет следующие возможности:

  • «Обновить» - обновление данных и снятие выделения в редакторе (CTRL + R);
  • «Очистить ошибки» - очистка указателей ошибок в редакторе (CTRL + K);
  • «Приближение» - пункт, в котором можно выбрать в процентах величину масштаба;
  • «Сменить представление» - убирает все панели, оставляя только рабочее поле(F12)
  • «Сброс расположения панелей» - восстановление расположения панелей Beremiz в исходное состояние.

Меню «Помощь» предназначено для обращения к выводу информации в виде диалога о создателях данной среды - пункт «О программе».

Панель инструментов

Панель инструментов представляет собой панель с кнопками для быстрого обращения к часто используемым функциям среды разработки Beremiz. Она состоит из нескольких панелей, содержащих кнопки: главного меню, сборки проекта и установки связи с целевым устройством. Подробнее об этих панелях рассказано ниже. При редактировании программных модулей, написанных на графических языках, появляются дополнительные панели с кнопками. Они рассмотрены при описании редакторов графических языков стандарта IEC 61131-3 (см. п. 5.7).

Кнопки главного меню

Панель инструментов, содержащая кнопки главного меню представлена на Рисунок 3 .

Список кнопок и их функций описывается в таблице 1.

_images/image31.png

– Панель инструментов

Таблица 1 – Кнопки панели инструментов

Внешний вид кнопки Название кнопки Функция кнопки
image3 Новый проект Создать новый проект
image4 Открыть проект Открыть существующий проект
image5 Сохранить Сохранить текущий проект
image6 Сохранить как Сохранить текущий проект в определенную папку
image7 Печать Печать на принтере текущей программы
image8 Отмена Отмена последней манипуляции в редакторе
image9 Повторить Повтор отмененной манипуляции в редакторе
image10 Вырезать Удалить в буфер обмена выделенные в редакторе фрагменты
image11 Вставить Вставить фрагменты из буфера обмена в редактор
image12 Поиск в проекте Вызов диалога поиска данных в проекте

Кнопки сборки проекта и установки связи с целевым устройством

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

Часть кнопок данной панели показана на Рисунок 4 .

_images/image14.png

– Панель сборки проекта и соединения с целевым устройством

Таблица 2 – Кнопки сборки проекта и связи с целевым устройством на панели инструментов

Внешний вид кнопки Название кнопки Функция кнопки
image14 Сборка проекта в директории сборки Полная сборка(компиляция и компоновка) текущего проекта в папку build, находящийся в папке, где хранится проект
image15 Очистить директорию сборки проекта Удаление папки build, где был собран проект
image16 Подключиться к целевому ПЛК Соединиться с целевым устройством по адресу URI, который был указан в настройках проекта
image17 Показать код, сгенерированный PLCGenerator Показать код скомпилированного проекта языке ST
image18 Передать ПЛК Перенести исполняемый файл, полученный в ходе сборки проекта, на целевое устройство
image19 Запустить ПЛК Запустить на исполнение собранную прикладную программу на целевом устройстве
image20 Остановить запущенный ПЛК Остановить исполнение прикладной программы на целевом устройстве

В зависимости от того, произведено в настоящий момент времени соединение с целевым устройством или выполняется ли прикладная программа на нём, появляются и скрываются некоторые кнопки.

На Рисунок 5 приведено состояние данной в панели, когда соединение с целевым устройством установлено и на нём уже есть прикладная программа. Соответственно, можно запустить с помощью кнопки «Запуск прикладной программы» её или передать новую, используя кнопку «Передача прикладной программы».

_images/image22.png

- Панель инструментов сборки проекта и соединения с целевым устройством

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

Дерево проекта

Дерево проекта обычно расположено в левой части окна среды разработки Beremiz (см. Рисунок 6 ) и отображает структуру элементов, из которых состоит проект.

_images/image23.png

– Дерево проекта

В роли элементов могут выступать:

  • Ресурсы;
  • Программные модули (функции, функциональные блоки и программ) и их составные части;
  • Типы данных;
  • Плагины модулей УСО.

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

Добавление элемента в дерево проекта

В правом нижнем углу дерева проекта находится кнопка «+» (см. Рисунок 7 ), при нажатии на которую, появляется меню для выбора добавления необходимого элемента в проект.

_images/image24.png

– Всплывающее меню добавления элементов проекта

В случае добавления программного модуля, т.е. выбора пункта «Функция», «Функциональный блок» или «Программа», появится диалог «Создать новый программный модуль» (см. Рисунок 8 ).

_images/image25.png

– Диалог добавления программного модуля

В данном диалоге три поля:

  • «Имя программного модуля»;
  • «Тип программного модуля»;
  • «Язык».

Имя, присвоенное по умолчанию, может быть заменено на имя, соответствующее назначению данного программного модуля. В зависимости от того, какой программный модуль был выбран во всплывающем меню, в поле «Тип программного модуля» будет подставлено именование данного программного модуля. В поле «Язык» необходимо выбрать из списка (см. Рисунок 9 ) один из языков стандарта IEC 61131-3 (IL, ST, LD, FBD, SFC), на котором будут реализованы алгоритмы и логика работы данного добавляемого программного модуля.

_images/image26.png

– Выбор языка программного модуля

В случае выбора добавления типа данных, появится диалог (см. Рисунок 10 ), в котором необходимо указать механизм создания нового типа данных

_images/image27.png

– Добавление пользовательского типа данных

Добавление нескольких элементов одного типа, например нескольких программ, функций, функциональных блоков приводит к их группировке в дереве проекта. Еще одним способом добавления нового элемента является нажатие правой клавиши мыши по определённому разделу в дереве проекта. Например, при нажатии на «Функциональные блоки», появится всплывающее меню (см. Рисунок 11 ). В данном меню можно выбрать «Добавить программный модуль» или «Вставить программный модуль», если он был скопирован в буфер обмена.

Добавление нового элемента или выбор существующего в дереве проекта приводит к появлению панели редактирования и настроек соответствующего элемента:

  • Панель настроек проекта;
  • Панель, содержащая текстовый редактор языков ST и IL;
  • Панель, содержащая графические редакторы диаграмм языков FBD, SFC, LD;
  • Панель настроек ресурса;
  • Панель редактирование типа данных;
  • Панели настроек плагинов модулей УСО.

Каждая вышеперечисленная панель редактирования будет рассмотрена в последующих пунктах.

_images/image28.png

– Всплывающее меню добавления и вставки программного модуля

Удаление элемента в дереве проекта

Удаление осуществляется наведением на определённый элемент в дереве проекта и нажатием на него правой клавишей мыши, а далее в появившемся меню выбирается пункт «Удалить» (см. Рисунок 12 )

_images/image29.png

– Удаление элемента

Переименование, копирование и вставка программных модулей

Дерево проекта позволяет выполнять операции переименования, копирования и вставки для программных модулей. Копирование или переименование осуществляются с помощью нажатия правой клавиши мыши на элемент (см. Рисунок 13 ), соответствующий программному модулю в дереве проекта, и выбор соответствующего пункта появившегося меню.

_images/image29.png

– Копирование и переименование элемента

Вставка программного модуля осуществляется в меню (нажатие правой клавишей мыши по данному элементу) корневого элемента дерева проекта, соответствующего проекту (см. Рисунок 14 ):

_images/image30.png

– Вставка программного модуля

Другим способом выполнения вышеописанной операции является вызов меню для элемента группировки программных модулей одного типа (см. Рисунок 15 ).

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

_images/image311.png

– Вставка программного модуля

Панель списка переменных и констант

Панель списка переменных и констант (см. Рисунок 16 ) отображает с помощью таблицы переменные и константы, соответствующие выбранному программному модулю, ресурсу или в целом проекту.

_images/image32.png

– Панель переменных и констант

Каждая переменная имеет следующие параметры:

  • Имя, представляющее собой уникальный идентификатор переменной в пределах её области видимости и действия;
  • Класс: «Глобальный», «Вход», «Выход», «Вход/Выход», «Локальный», «Внешний», «Временный»;
  • Тип, определяющий тип переменной и может принадлежать базовому типу (в соответствии со стандартом IEC 61131-3), пользовательскому типу (псевдониму и поддиапазону существующего типа, перечислению, массиву, структуре) или типу функционального блока (стандартному или пользовательскому);
  • Размещение - идентификатор, необходимый для связывания данной переменной с переменной плагина модуля УСО;
  • Исходное значение значение - инициализация переменной некоторым начальным значением;
  • Настройка - задание константности, реманентности (сохранение её значения в энергонезависимой памяти) и нереманентности переменной;
  • Описание - комментарий к назначению данной переменной или константы.

Первый символ имени переменной или константы должен быть буквой, или символом подчеркивания, далее могут следовать цифры, буквы латинского алфавита и символы подчеркивания. Набор возможных вариантов классов переменных зависит от типа элемента проекта, редактирования которого осуществляется. Двойной клик на полю «Размещение» вызывает появление кнопки «…», показанной на Рисунок 17 :

_images/image33.png

- Поле «Размещение» панели переменных и констант

Нажатие на данную кнопку приводит к появлению диалога «Просмотр директорий» (см. Рисунок 18 ), т.е. списка переменных модулей УСО, которые могут быть связанны с переменой в панели переменных и констант. При выборе в данном диалоге определённой переменной и нажатии клавиши «OK» в поле «Адрес» будет добавлен адрес переменной внешнего модуля УСО.

_images/image34.png

- Диалог «Просмотр адресов», вызываемый из поля «Адрес»

Поле опции позволяет определить переменную как константу. Соответственно, если компилятор обнаружит в коде фрагмент, в котором происходит изменение этой переменной - будет выведена ошибка компиляции «Assignment to constant variables is not be allowed» в «Отладочной консоли». Квалификатор «Константа» не может быть использован в объявлении функциональных блоков. Добавление, удаление и перемещение переменных происходит с помощью специальных кнопок на панели переменных и констант. Описания данных кнопок представлены в таблице 3.

Панель переменных и констант предоставляет возможность фильтровать отображаемые переменные по их конкретным классам («Вход» ,«Выход», «Вход/Выход»,

«Внешний», «Локальный», «Временный») или сгруппированным классам («Интерфейс» и «Переменные»). Данная операция выполняется с помощью функции «Фильтр класса» (см. Рисунок 19 ).

_images/image35.png

- Фильтрация отображения переменных в панели переменных и констант

Таблица 3 - Кнопки добавления, удаление и перемещения переменных на панели переменных и констант

Внешний вид кнопки Название кнопки Функция кнопки
image38 Добавить переменную Добавить новую переменную в панель переменных и констант со значениями по умолчанию
image39 Удалить переменную Удалить выделенную переменную или константу
image40 Переместить переменную вверх Перемещение переменной в таблице переменных и констант вверх на одну позицию
image41 Переместить переменную вниз Перемещение переменной в таблице переменных и констант вниз на одну позицию
Панель настройки проекта

Панель редактирования проекта (см. Рисунок 20 ) состоит из панели переменных и констант, а также настроек сборки проекта и данных о проекте.

_images/image40.png

- Панели настройки проекта

Настройки сборки проекта (см. Рисунок 21 ) позволяют задать следующие параметры:

  • «URI системы исполнения» - унифицированный (единообразный) идентификатор ресурса, в данном случае под ресурсом понимается целевое устройство. Данный адрес необходим для режима отладки.
  • «Запретить расширения» - установка данного флага позволяет не учитывать при сборке проекта внешние плагины;
  • «Библиотеки» - подключаемые дополнительные библиотеки: «Native_Library», «Python_Library», «SVGUI_Library»;
  • «Целевая платформа» - выбор из списка компилятора для архитектуры целевого устройства;
  • «Компилятор» - имя исполняемого файла компилятора (если он определён в глобальных переменных среды), либо полный путь к нему;
  • «CFLAGS» - указание флагов С компилятора;
  • «Линковщик» - имя исполняемого файла компоновщика (если он определён в глобальных переменных среды), либо полный путь к нему;
  • «LDFLAGS» - указание флагов компоновщика;
_images/image411.png

- Панель с настройками проекта

Также в настройках сборки проекта имеются две кнопки, описание которых приведено в таблице 4.

Таблица 4 - Кнопки в панели настройки сборки проекта

Внешний вид кнопки Название кнопки Функция кнопки
image44 МЭК - код Вызов «Панели отображения промежуточного кода» (см. п. 5.5.1), для вывода кода, из которого генерируется ST код всего проекта
image45 Файлы проекта Вызов «Панели файлов проекта», в которой можно выбрать файлы необходимые для передачи на целевое устройство вместе с исполняемым файлом (см. п. 5.5.2)

Вкладка «Проект» (см. Рисунок 22 ) позволяет задать: имя проекта, версию проекта, имя продукта, версию продукта и релиз продукта.

_images/image44.png

– Вкладка с данными проекта

Вкладка «Автор» (см. Рисунок 23 ) позволяет задать: Имя компании, URL-адрес компании, Имя автора, Название организации.

_images/image45.png

– Вкладка данные об авторе проекта

Вкладка «Графика» (см. Рисунок 24 ) позволяет задать размеры страницы и разрешение сетки для редакторов диаграмм графических языков FBD, LD и SFC.

_images/image46.png

– Вкладка графика

Вкладка «Прочее», изображенная на Рисунок 25 , позволяет выбрать язык интерфейса для среды разработки Beremiz и указать дополнительное текстовое описание для проекта.

_images/image47.png

– Вкладка с настройками языка и описанием проекта

При запуске среды разработки Beremiz языком по умолчанию является язык, соответствующий текущей локали операционной системы, если файл для данной локали присутствуют. В случае отсутствия данных файлов, устанавливается английская локаль, которая доступна всегда. Файлы доступных локалей располагаются в папке beremiz/locale.

Панель отображения промежуточного кода

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

_images/image48.png

– Панель отображения промежуточного кода на языке ST

Открытие данной панели доступно после сборки проекта с помощью соответствующей кнопки (см. таблицу 2).

Панель файлов проекта

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

_images/image49.png

– Вкладка файлы проекта

Все манипуляции с файлами осуществляются с помощью кнопок, расположенных в середине данной панели. Их описание приведено в таблице 5.

Таблица 5 - Кнопки в панели файлов проекта

Внешний вид кнопки Название кнопки Функция кнопки
image39 Удалить файл из левой директории Удаление выделенного файла из левого списка добавленных файлов в проект
image52 Скопировать файл из правой директории в левую Добавить выделенный файл из проводника файлов в проект
image53 Скопировать файл из левой директории в правую Добавить в текущую папку проводника файлов слева выделенный файл в списке файлов проекта

Данные файлы будут переданы на целевое устройство вместе с исполняемым файлом. Как правило, этими дополнительными файлами проекта являются сторонние библиотеки, необходимые для корректной работы плагинов модулей УСО.

Текстовый редактор языков ST и IL

Текстовый редактор языков ST и IL (см. Рисунок 28 ) позволяет создавать и редактировать алгоритмы и логику выполнения программных модулей на языках ST и IL.

_images/image52.png

– Текстовый редактор языков ST и IL

Он обеспечивают следующие возможности:

  • Подсветку синтаксиса кода, написанного пользователем, т.е. выделения особыми параметрами шрифта ключевых слов данных языков;
  • Нумерации строк, что может быть полезным при возникновении ошибок в программе, т.к. транслятор кода ST в C выдаёт номер строки, в которой найдена ошибка;
  • Сворачивание кода структурных элементов языка: определения функции, определение типа и т. Д.

Увеличение или уменьшение размера шрифт выполняется с помощью Ctrl + <колёсико мыши>.

Описание синтаксиса, основных конструкций и примеров использования языков ST и IL приведены в описании языков стандарта МЭК 61131-3.

Графические редакторы диаграмм языков FBD, SFC, LD

Данные редакторы позволяют создавать и редактировать алгоритмы и логику выполнения программных модулей, написанных на языках FBD, SFC и LD.

Редактор языка FBD

Основными элементами языка FBD являются: переменные, функциональные блоки и соединения. При редактировании FBD диаграммы, в панели инструментов появляется следующая панель (см. Рисунок 29 ).

_images/image53.png

– Панель редактирования FBD диаграмм

С помощью данной панели можно добавить все элементы языка FBD (назначение каждой кнопки описано в таблице 6).

Таблица 6 - Кнопки в панели файлов проекта

Внешний вид кнопки Название кнопки Функция кнопки
image56 Выделение объектов на диаграмме Перевод указателя мыши в состояние, при котором можно осуществлять выделение объектов редакторе одного из графических языков
image57

Перемещение

диаграммы

Перевод указателя мыши в состояние, при котором можно изменять размеры редактора одного из графических языков, с помощью его перемещения
image58 Создать новый комментарий Вызов диалога создания комментария
image59 Добавить переменную Вызов диалога добавления переменной
image60

Добавить

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

Вызов диалога добавления функционального блока
image61 Добавить подключение Вызов диалога добавления соединения

Для этого необходимо указателем мыши выбрать необходимую кнопку и нажать на свободное место в области редактирования FBD диаграммы. В зависимости от выбранного элемента появятся определённые диалоги добавления данного элемента.

Аналогичные действия можно выполнить с помощью всплывающего меню в области редактирования FBD диаграмм. Вызов данного меню происходит нажатием правой клавишей мыши и выбором пункта «Добавить», в котором будет: «Блок», «Переменная», «Подключение», «Комментарий» (см. Рисунок 30 ).

_images/image60.png

- Всплывающее меню редактора языка FBD

Далее рассмотрено добавление каждого элемента в отдельности.

Добавление функционального блока

При добавлении функционального блока одним из описанных выше способов, появится диалог «Свойства блока» (см. Рисунок 31 ).

_images/image611.png

– Свойства функционального блока

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

Опция «Управление исполнением» добавляет в функциональный блок дополнительные параметры EN/ENO, о которых подробнее рассказано в приложении 5. Для сохранения изменений необходимо нажать «OK». Одним из свойств является «Порядок исполнения».

Добавление (путем копирования существующего блока), удаление и переименование функционального блока осуществляется при помощи команд меню «Редактирование» в главном меню или с помощью всплывающего меню диаграммы (см. Рисунок 31 ).

Следует отметить, что функциональный блок может быть так же добавлен из «Панели библиотеки функций и функциональных блоков», перетаскиванием мыши (Drag&Drop) выбранного блока на панель редактирования диаграммы FBD.

Добавление переменной

Переменные добавляются из панели переменных и констант с помощью перетаскивания (Drag&Drop) левой клавишей мыши за область, выделенную красным цветом на Рисунок 32 , в область редактирования FBD диаграмм.

_images/image62.png

– Добавление переменной из панели переменных и констант

Изменить параметры переменной можно в диалоге «Свойства переменной» (см. Рисунок 33 ), нажав на неё два раза левой клавишей мыши.

_images/image63.png

– Свойства переменной

В данном диалоге можно задать порядок исполнения переменной и изменить её класс («Вход», «Выход», «Вход/Выход»).

Добавление подключения

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

После выбора добавления элемента «Подключение» появится диалог «Свойства подключения» (см. Рисунок 34 ).

_images/image64.png

- Диалог добавления подключения для FBD

В данном диалоге можно выбрать тип соединения: «Выходное соединение» - для выходного значения, «Входное соединение» - для входного значения, а так же необходимо указать имя данного соединения. На Рисунок 35 представлен пример использования соединений.

_images/image65.png

- Пример FBD диаграммы с использованием подключений

Функция «MAX» на выходе «OUT» имеет некоторое значение, которое с помощью соединения «RESULT» передаётся на вход «IN1» в функцию «MIN». В функции «MAX» используется соединение типа «Выходное соединение», в функции «MIN» - типа «Входное соединение». Имена у этих соединений, соответственно, одинаковые.

Добавление комментариев

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

_images/image66.png

– Диалог добавления комментария

После нажатия кнопки «ОК» комментарий появится на диаграмме(см. Рисунок 37 )

_images/image67.png

– Добавленный комментарий к FBD диаграмме

Порядок выполнения функций и функциональных блоков

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

Если обратиться к Рисунок 38 , то порядок выполнения функций будет следующим: 1 – CounterST0; 2 – CounterFBD0; 3 – CounterSFC0.

_images/image68.png

- Схема, содержащая функции с порядком выполнения (обсчета) по расположению

Данная опция «Порядок выполнения» выделена красным цветом на Рисунок 39 .

_images/image69.png

- Свойство порядок выполнения функции или функционального блока

После задания порядка выполнения для каждой функции или функционального блока на схеме в правом нижнем углу будет указан его порядковый номер выполнения. Пример представлен на Рисунок 40 .

_images/image70.png

- Схема, содержащая функции с порядком выполнения заданным вручную

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

Редактор языка LD

Язык LD или РКС (Релейно-Контактные Схемы) представляет собой графическую форму записи логических выражений в виде контактов и катушек реле. Основными элементами языка LD являются: шина питания, катушка, контакт. Добавить данные элементы, так же как и элементы языка FBD, можно несколькими способами.

Как только активной становится вкладка с редактированием LD диаграммы, в панели инструментов появляется панель (см. Рисунок 41 ) с элементами языка LD.

_images/image711.png

- Панель редактирования LD диаграмм

Аналогично редактору языка FBD с помощью данной панели можно добавить все элементы языка LD, а так же и FBD, т.к. есть возможность комбинированного применения языков на одной диаграмме. В таблице 7 приведено описание кнопок данной панели. Описание остальных кнопок, относящихся к языку FBD, находится в таблице 6.

Таблица 7 - Кнопки панели редактирования LD диаграммы

Внешний вид кнопки Название кнопки Функция кнопки
image74 Создать новую шину питания Вызов диалога создания новой шины питания
image75 Создать новую катушку Вызов диалога создания новой катушки
image76 Создать новый контакт Вызов диалога создания нового контакта

Во всплывающем меню для редактора LD диаграмм (см. Рисунок 42 ), так же как и в панели инструментов помимо элементов LD языка, доступны элементы языка FBD.

_images/image75.png

- Всплывающее меню редактора языка LD

Добавление шины питания

При добавлении шины питания, одним из описанных выше способов, появится диалог «Свойства шины питания» (см. Рисунок 43 ).

В данном диалоге указываются следующие свойства:

  • Тип шины питания: шина питания слева или шина питания справа;
  • Количество контактов на добавляемой шине питания.
_images/image76.png

- Свойство шины питания

На Рисунок 44 приведены две добавленные шины питания: левая с тремя контактами и правая с одним контактом.

_images/image77.png

- Шины питания на LD диаграмме

Добавление контакта

При добавлении контакта на LD диаграмму появится диалог «Редактирование значения контакта» (см. Рисунок 45 ).

_images/image78.png

- Редактирование контакта

Данный диалог позволяет определить модификатор данного контакта:

  • «Обычный»;
  • «Инверсия»;
  • «Нарастающий фронт»;
  • «Спадающий фронт».

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

Еще одним способом добавления контакта на диаграмму является метод Drag&Drop из панели переменных и констант переменной типа BOOL и класса: «Вход»,

«Вход/Выход», «Внешний», «Локальный», «Временный». Для этого необходимо зажать левой кнопкой мыши за первый столбец (который имеет заголовок #) переменную, удовлетворяющую описанным выше критериям и перенести в область редактирования диаграммы (см. Рисунок 46 ).

_images/image79.png

- Добавление контакт на диаграмму из панели переменных и констант

Добавление катушки

При добавлении катушки на LD диаграмму появится диалог «Редактирование значения катушки» (см. Рисунок 47 ).

_images/image80.png

– Редактирование катушки

В данном диалоге можно определить модификатор данного контакта:

  • «Обычный»;
  • «Инверсия»;
  • «Установить»;
  • «Сброс»;
  • «Нарастающий фронт»;
  • «Спадающий фронт».

Кроме того, производится выбор из списка «Имя» переменной, «связываемой» с данным контактом. Эти переменные, как и для контактов, должны быть определены в панели переменных и констант для данного программного модуля типом BOOL.

Аналогично добавлению контакта с помощью Drag&Drop можно добавить и катушки, но в данном случае переменная должна относиться к классу «Выход» (см. Рисунок 48 ).

_images/image811.png

- Добавление катушки на диаграмму из панели переменных и констант

Описание языка LD, основных конструкций и примера его использования приведены в описании яызков стандарта МЭК 61131-3.

Редактор языка SFC

Основными элементами языка SFC являются: начальный шаг, шаг, переход, блок действий, дивергенции, «прыжок». Программа на языке SFC состоит из набора шагов, связанных переходами.

Как только активной становится вкладка с редактированием SFC диаграммы, в панели инструментов появляется следующая панель (см. Рисунок 49 ).

_images/image82.png

- Панель редактирования SFC диаграмм

В таблице 8 приведено описание кнопок данной панели. Описание остальных кнопок, относящихся к языку FBD и LD (за исключением катушки) и так же находящихся на этой панели, приведены в таблицах 6 и 7 соответственно.

Таблица 8 - Кнопки панели редактирования LD диаграммы

Внешний вид кнопки Название кнопки Функция кнопки
image85 Создать новый начальный шаг Вызов диалога редактирования шага
image86 Создать новый шаг Вызов диалога редактирования шага
image87 Создать новый переход Вызов диалога редактирования перехода
image88 Создать новый блок действий Вызов диалога редактирования блока действий
image89 Создать новое ветвление Вызов диалога создания новой дивергенции и конвергенции
image90 Создать новый безусловный переход Вызов диалога создания «прыжка»

Далее даётся описание добавления приведённых в таблице 8 элементов языка SFC.

Добавление шага инициализации и шага

Процедура добавления шага инициализации и обычного шага ничем не отличается. В обоих случаях вызывается диалог «Редактировать шаг» (см. Рисунок 53 ).

_images/image90.png

- Диалог редактирования шага инициализации SFC диаграммы

Согласно стандарту IEC 61131-3, на SFC диаграмме должен быть один шаг инициализации, который характеризует начальное состояние SFC-диаграммы и отображается со сдвоенными линиями на границах (см. Рисунок 51 ).

_images/image911.png

- Шаг инициализации языка SFC

В случае, если при добавлении шага не указано его имя - будет выдана ошибка (см. Рисунок 52 ).

_images/image92.png

– Ошибка отсутствия имени шага при его добавлении в диаграмму

При добавлении шага появляется диалог, в котором можно указать, с помощью галочек его соединители (см. Рисунок 53 ):

  • «Вход»;
  • «Выход»;
  • «Действие».
_images/image89.png

– Добавление шага SFC на диаграмму

«Действие» добавляет соединитель для связывания данного шага с блоком действий. «Вход» и «Выход» соединители, как правило, соединены с переходом. Соответственно, после нажатия кнопки OK, на диаграмму будет добавлен шаг с указанными соединителями (см. Рисунок 54 ).

_images/image93.png

- Шаг SFC диаграммы с соединителями входа и действия

Добавление перехода

При добавлении на SFC диаграмму перехода, появится диалог «Редактировать переход» (см. Рисунок 55 ).

_images/image94.png

– Добавление нового перехода в диаграмму

В данном диалоге необходимо выбрать тип перехода и его приоритет. Тип перехода может быть:

  • «Ссылка»;
  • «Встроенный код»;
  • «Соединение».

При выборе типа перехода «Ссылка» в открывающемся списке (см. Рисунок 56 ) будут доступны переходы, предопределённые в дереве проекта для данного программного модуля, написанного на языке SFC. Добавление предопределённого перехода описывается ниже после описания всех добавляемых элементов языка SFC.

_images/image95.png

- Всплывающий список с доступными предопределёнными переходами

При выборе типа перехода «Непосредственно» (см. Рисунок 57 ), условие перехода можно написать в виде выражения на языке ST.

_images/image96.png

- Условие перехода в виде встроенного кода, написанного на языке ST

Реализация перехода таким способом удобна в случае, когда необходимо короткое условие, например: переменные «F3» и «F4» типа INT равны. Встроенный код для такого условия выглядит следующим образом (см. Рисунок 57 ):

F3 = F4

Так же например можно в качестве условия просто указать переменную. В случае её значения равного 0 - будет означать FALSE, все остальные значения - TRUE.

При выборе типа перехода «Соединение» (см. Рисунок 58 ), в качестве условия перехода можно использовать выходные значения элементов языка FBD или LD.

_images/image97.png

- Выбор условия перехода как соединение с элементами других графических языков IEC 61131-3

При выборе типа перехода «Подключение», у добавленного перехода появится слева контакт, который необходимо соединить с выходным значением, например, функционального блока языка FBD или катушки LD диаграммы. Стоит отметить, что данное выходное значение должно быть типа BOOL. Ниже, на Рисунок 59 красным цветом выделен пример перехода, условия которого задано с помощью языка LD.

_images/image98.png

– Пример SFC диаграммы, в которой один из переходов задан с помощью языка LD

Добавление блока действий

При добавлении блока действий на диаграмму появится диалог «Редактировать свойство блока действий» (см. Рисунок 60 ).

_images/image99.png

- Диалог «Редактировать свойство блока действий»

Данный блок действий может содержать набор действий. Добавить новое действие можно нажав кнопку «Добавить» и установив необходимые параметры:

  • «Спецификатор»;
  • «Длительность»;
  • «Тип»: «Действие», «Переменная», «Непосредственно»;
  • «Значение»;
  • «Индикатор».

Поле «Спецификатор» определяет момент времени, когда действие начинается, сколько времени продолжается и когда заканчивается. Выбрать квалификатор можно из списка (см. Рисунок 61 ).

_images/image100.png

- Меню выбора спецификатора для действия в диаграмме SFC

Подробное описание спецификаторов, которые выбираются из предлагаемого списка при добавлении действия приведено в таблице 9.

Таблица 9 - Квалификаторы действий SFC диаграммы

Имя спецификатора Поведение блока действия
D Действие начинает выполняться через некоторое заданное время (если шаг еще активен) и выполняется до тех пор, пока данный шаг активен
L Действие выполняется в течение некоторого заданного интервала времени, после чего выполнение действия останавливается
N Действие выполняется, пока данный шаг активен
P Действие выполняется один раз, как только шаг стал активен
P0 Действие выполняется один раз, как только шаг стал неактивен
P1 Действие выполняется один раз, как только шаг стал активен
S Действие активируется и остается активным пока SFC диаграмма выполняется
R Действие выполняется, когда диаграмма деактивизируется
DS Действие начинается выполняться через некоторое заданное время, только в том случае если шаг еще активен
SL Действие активно в течении некоторого, заданного интервала
SD Действие начинается выполняться через некоторое время, даже в том случае если шаг уже не активен

Поле «Длительность» необходимо для установки интервала времени необходимого для некоторых квалификаторов, описанных выше в таблице 9.

«Тип» определяет код или конкретную манипуляцию, которая будет выполняться во время активации действия. В случае выбора «Действия» появляется возможность, как и в случае с переходом, использовать предопределённые действия в дереве проекта для данного программного модуля, написанного на языке SFC (см. Рисунок 62 ).

_images/image1011.png

- Выбор предопределённого действия

Добавление предопределённого действия также как добавление предопределённого перехода описывается ниже после описания всех добавляемых элементов языка SFC.

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

_images/image102.png

- Выбор предопределённой переменной

Как только шаг становится активным, данная переменная в зависимости от своего типа принимает значение 0, 0.0, FALSE и другие нулевые значения типов. Как только действие начинает выполняться, переменная принимает значение 1, 1.0, TRUE и другие единичные значения типов. В случае если действие прекратило своё выполнение переменная снова принимает значение 0, 0.0, FALSE и другое нулевое значение, в зависимости от своего типа.

В случае выбора «Непосредственно», появляется возможность в поле «Значение» написать на языке ST код, который будет выполняться, когда действие становится активным (см. Рисунок 64 ).

_images/image103.png

- Написание встроенного кода для действия

Следует отметить, что в конце встроенного кода для действия необходимо поставить «;», в отличие от встроенного кода для перехода.

После добавления блока действия на диаграмму необходимо его ассоциировать с конкретным шагом. Данная операция выполняется обычным соединением правого контакта у шага и левого контакта у действия (см. Рисунок 65 ).

_images/image104.png

- Ассоциирование шага ORANGE блоком действия, содержащим четыре действия

Добавление дивергенции и конвергенции

При добавлении ветвления, появится диалог «Создать новое ветвление» (см. Рисунок 66 ).

_images/image105.png

– Добавление альтернативного ветвления(дивергенции)

В первую очередь следует выбрать тип ветвления:

  • «Альтернативное ветвление»;
  • «Альтернативное объединения»;
  • «Параллельное ветвление»;
  • «Параллельное объединение».

Вторым параметром является количество разветвлений, которое определяет на сколько ветвей будет либо расходится (в случае выбора типа дивергенции «Альтернативное ветвление» или «Параллельное ветвление») одна ветвь, либо сколько ветвей будет сходиться в одну ветвь (в случае выбора типа дивергенции «Альтернативное объединения» или «Параллельное объединение»)

Пример дивергенции с двумя разветвлениями показан на Рисунок 67 и выделен красным цветом.

_images/image106.png

– Пример SFC диаграммы, содержащей альтернативное ветвление

Пример конвергенции выделен красным цветом на Рисунок 68 .

_images/image106.png

– Пример SFC диаграммы, содержащей альтернативное объединение

Пример параллельного ветвления показан на Рисунок 69 и выделен красным цветом.

_images/image107.png

– Пример SFC диаграммы с параллельным ветвлением

Согласно стандарту IEC 61131-3, каждая ветвь альтернативного ветвления должна оканчиваться переходом, при альтернативном объединении переход должен быть перед каждой ветвью. При параллельном ветвлении переход должен быть перед ветвлением, а при параллельном объединении переход необходим после объединения.

Добавление безусловного перехода

Элемент «безусловный переход» на SFC диаграмме подобен выполнению оператора GOTO при переходе на определённую метку в коде в различных языках программирования. После выбора добавления «прыжка» на SFC диаграмму, появится диалог (см. Рисунок 70 ), в котором необходимо выбрать из списка шаг, к которому будет происходить «прыжок» - переход от одного шага SFC диаграммы к другому.

_images/image108.png

– Диалог добавления безусловного перехода

В данном диалоге также присутствует и шаг инициализации (начальный шаг). После выбора шага и нажатия кнопки OK. На SFC диаграмме появится стрелочка, которую нужно соединить с переходом (см. Рисунок 71 ). Справа от стрелочки находится имя шага, к которому осуществляется переход в случае выполнения условия перехода, находящегося выше и соединённого с ней.

_images/image109.png

– Безусловный переход с шага Stop на начальный шаг Start

Согласно стандарту IEC 61131-3, между шагом и «прыжком» должен обязательно быть определён переход.

Предопределённые условия перехода и действия в дереве проекта

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

_images/image110.png

- Всплывающее меню SFC диаграммы в панели проекта

Далее появится диалог под названием «Создать новый переход» (см.:numref:image111). В нём необходимо выбрать уникальное имя перехода и язык, в котором будет описано данное условие.

_images/image1111.png

- Диалог «Создать новый переход»

В случае, если переходы с введённым именем уже существуют, то будет выведено сообщение об ошибке (см. Рисунок 74 ).

_images/image112.png

- Сообщение об ошибке добавления существующего программного модуля

Добавление действия в структуру SFC диаграммы (см. Рисунок 75 ) происходит аналогично добавлению перехода в данную структуру.

_images/image113.png

- Всплывающее меню SFC для структуры диаграммы

После выбора «Добавить действие» во всплывающем меню, вызванном с помощью нажатия правой клавиши мыши по программному модулю, написанном с помощью языка SFC, появится диалог «Создать новое действие» (см. Рисунок 76 ).

_images/image114.png

- Диалог «Создать новое действие»

В данном диалоге необходимо указать «Имя действия» (должно быть уникальным) и выбрать язык (ST, IL, FBD, LD), на котором будет написано данное действие. Если имя действия не заполнено будет выведено сообщение об ошибке (см. Рисунок 77 ).

_images/image115.png

- Ошибка не заполнения имени действия при его добавлении

После того как действие добавлено, необходимо реализовать его код на текстовом или графическом языке, в зависимости от языка, который был выбран в диалоге «Создать новое действие» (см. Рисунок 76 ). После добавления переходов и действий в дерево проекта они будут доступны для множественного использования.

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

Панель редактирования ресурса

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

_images/image116.png

- Вкладка ресурс главной рабочей области

Добавление переменных в ресурс ничем не отличается от добавления переменных в программные модули, единственное исключение - переменные могут быть только класса «Глобальная». Основной задачей данной панели является возможность добавить экземпляр, указать для него программный модуль типа «Программа», из ранее определённых в проекте, для поля «Тип» и выбрать задачу из добавленных в список «Задачи».

Панель редактирования типа данных

Панель редактирования типа данных (см. Рисунок 79 ) позволяет определить различные параметры создаваемого пользовательского типа данных.

_images/image117.png

- Вкладка создания нового типа данных

Главным параметром является список под названием «Механизм создания нового типа», позволяющим выбрать следующие типы:

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

Далее рассмотрены подробнее параметры для каждого из вышеперечисленных типов.

Синоним

При выборе «Синоним» (см. Рисунок 80 ), из списка указывается базовый тип и его начальное значение.

_images/image118.png

- Добавление псевдонима типа данных

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

Поддиапазон существующего типа

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

_images/image119.png

- Добавление нового типа данных, представляющего поддиапазон существующего типа

Перечисляемый тип

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

_images/image120.png

– Добавление перечисляемого типа данных

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

Таблица 10 - Кнопки редактирования значений перечисляемого типа

Внешний вид кнопки Название кнопки Функция кнопки
image129 Редактировать Редактировать выделенное поле в таблице
image130 Добавить Добавить новое поле в таблицу
image131 Удалить Удалить выделенное поле в таблице
image132 Переместить вверх Переместить вверх выделенное поле в таблице
image133 Переместить вниз Переместить вниз выделенное поле в таблице

Также есть возможность задать начальное значение данного перечисляемого типа в поле «Начальное значение».

Массив

При выборе механизма создания нового типа «Массив» (см. Рисунок 83 ) появится панель, в которой необходимо указать базовый тип, начальное значение, а также размерность массива.

_images/image122.png

- Добавление типа данных - массива

Размерность массива задаётся в следующем формате: <начальное значение>..<конечное значение>

Структура

При выборе механизма создания нового типа «Структура» (см. Рисунок 84 ), в появившейся таблице необходимо добавить необходимое количество полей структуры. Каждое поле имеет своё имя, тип и начальное значение.

_images/image123.png

– Добавление типа данных – структура

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

Выше были рассмотрены варианты редактирования различных элементов, из которых состоит проект, согласно стандарту IEC 61131-3. Далее будет продолжено рассмотрение остальных компонент среды разработки Beremiz.

Панель экземпляров проекта

Панель экземпляров проекта (см. Рисунок 85 ) обычно располагается слева в среде разработки Beremiz и отображаемые в ней экземпляры зависят от выбранного элемента в дереве проекта.

_images/image124.png

– Панель экземпляров проекта

При выборе в дереве проекта элемента, соответствующего ресурсу, в панели экземпляров проекта будут отображены экземпляры, определённые в данном ресурсе, а так же глобальные переменные ресурса. На Рисунок 86 показано, как в панели редактирования ресурса определен экземпляр для программного модуля «main_program»:

_images/image125.png

– Экземпляр main_instance для программного модуля main_program

Соответственно, при выборе в дереве проекта ресурса, в котором определены экземпляры (описанные выше) и глобальная переменная, панель экземпляров будет выглядеть, как показано на Рисунок 87 :

_images/image126.png

- Панель экземпляров при выборе элемента ресурса в дереве проекта

При выборе в дереве проекта элемента, соответствующего программным модулям «Программа» и «Функциональный блок» в панели экземпляров будут отображены переменные, определённые в них. Ниже на Рисунок 88 приведён пример программного модуля типа «Программа» с именем «program0», в котором определено 8 переменных различных пользовательских классов.

_images/image127.png

- Программный модуль типа «Программа»

Соответственно, при выборе в дереве проекта данного программного модуля в панели экземпляров будут отображены, определённые выше переменные (см. Рисунок 89 ).

_images/image128.png

- Панель экземпляров проекта при выборе в дереве проекта программного модуля main_program

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

Таблица 11 - Кнопки на панели экземпляров проекта

Внешний вид кнопки Название кнопки Функция кнопки
image141 Отладка экземпляра Кнопка запуска режима отладки для экземпляра
image142 Двойной щелчок по кнопке «Отладка экземпляра» Отображение графика изменения значения переменной в режиме отладки
image143 Родительский экземпляр Переход к родительскому экземпляру и его локальным переменным

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

Описанные выше кнопки доступны только в режиме отладки прикладной программы. Про данный режим подробнее рассказывается в п. 8.

Панель библиотеки функций и функциональных блоков

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

_images/image131.png

– Панель библиотеки функций и функциональных блоков

Выделены следующие разделы для функций и функциональных блоков: стандартные, дополнительные, преобразования типов данных, операций с числовыми данными, арифметических операций, временных операций, побитовых и смещения бит, операций выбора, операций сравнения, строковых операций, модулей «Python» и «SVGUI».

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

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

Отладочная консоль

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

_images/image132.png

– Успешная сборка в отладочной консоли

Она служит для отображения в виде текстовых сообщений:

  • Результатов генерации ST и C кода;
  • Результатов компиляции и компоновки прикладной программы;
  • Процесса соединения и передачи прикладной программы на целевое устройство;
  • Различных промежуточных манипуляций в процессы создания прикладной программы.

В случае, если необходимо вывести предупреждения среды разработки Beremiz или ошибки компиляторов (MatlEC или C кода) во время их работы цвет вывода текстовых сообщений становится красным. Критические ошибки также выделяется красным цветом, но при этом еще желтым фоном (см. Рисунок 92 ).

_images/image133.png

- Ошибка сборки проекта в отладочной консоли

Поиск элементов в проекте

Для поиска интересующего элемента в проекте используется диалог «Поиск в проекте» (см. Рисунок 93 ). Его вызов происходит с помощью главного меню программы или панели инструментов.

_images/image134.png

– Диалог поиска в проекте

В появившемся диалоге можно установить различные параметры поиска: шаблон поиска, область поиска, чувствительность к регистру при поиске, а так же записать шаблон поиска в виде регулярного выражения. После того как все параметры установлены, необходимо нажать кнопку «Поиск» в этом диалоге. Ниже на Рисунок 94 приведен пример поиска элемента с именем «LIGHT».

_images/image135.png

– Результаты поиска элемента с именем LIGHT

Результат поиска выводится в иерархической структуре. При двойном щелчке по одному из результатов - данный элемент будет выделен в проекте оранжевым цветом.

Панель отладки

Панель отладки располагается в правой части среды разработки Beremiz (см. Рисунок 95 ).

_images/image136.png

– Панель отладки

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

Изменение значений переменной во время отладки прикладной программы осуществляется нажатием левой клавишей мыши на иконку замка напротив интересующей переменной (см. Рисунок 96 ).

_images/image137.png

– Установка значения переменной

Далее появится диалог ввода значения для выбранной переменной (см. Рисунок 97 ).

_images/image138.png

– Диалог установки значения для переменной

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

_images/image139.png

– Освобождение значения переменной

На данной панели присутствует кнопка удаления переменной из панели отладчика, перемещать и передавать ссылку на переменные можно в Drag&Drop режиме.

Панель графика изменения значения переменной в режиме отладки

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

_images/image140.png

– Графики изменения значений счетчиков Cnt

На данной панели есть возможность установить:

  • «Интервал» - временной отрезок, за который отображается изменений графика;
  • «Масштаб» - задание приближения отображения графика;
  • «Позиция» - перемещение по отображению графика, от начала и до конца.

Также на данной панели в правом нижнем углу располагаются вспомогательные кнопки. Описание данных кнопок приведено в таблице 12:

Таблица 12 - Кнопки на панели графика изменения значения переменной

Внешний вид кнопки Функция кнопки
image154 Очистка отображения графика
image155 Переход к отображению текущего значения графика, т.е. сдвиг параметра «Позиция» максимально вправо
image156 Сброс настроек масштаба до настроек по умолчанию: x 1.0

Работа с проектом

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

Проект в Beremiz представляет собой именованную папку, в которой лежат исходные файлы. Папка должна быть обязательно пустой и не защищена от записи. Если в папке уже есть файлы, будет выдана соответствующая ошибка. В созданной папке будут сохранены следующие файлы и папки:

  • «beremiz.xml» – в данном XML файле сохраняются настройки специфичные для среды разработки Beremiz относительно проекта;
  • «plc.xml» – в данном XML файле сохраняется полное описание проекта: всех программных модулей, ресурсов, пользовательских типов данных, данных о проекте, настроек редакторов графических языков IEC 61131-3;
  • папка «build», которая хранит генерируемый ST и C код, а также получаемый исполняемый бинарный файл прошивки.
Создание нового проекта

Новый проект создаётся с помощью главного меню «Файл» – «Новый» (см. Рисунок 100 ), либо с помощью кнопки «Новый» на панели управления.

_images/image1441.png

- Создание нового проекта с помощью главного меню

Далее появится диалог (см. Рисунок 101 ) , в котором необходимо выбрать папку, где будет храниться данный проект.

_images/image145.png

- Диалог выбора папки для нового проекта

В появившемся диалоге вам будет предложено настроить основной программный модуль проекта (см. Рисунок 102 ). В данном диалоге три поля:

  • «Имя POU»;
  • «Тип POU»;
  • «Язык».
_images/image146.png

- Диалог добавления основного программного модуля

Имя программного модуля, присвоенное по умолчанию, может быть заменено на любое имя, соответствующее назначению данного программного модуля.

Тип основного программного модуля – «Программа», в дальнейшем в проект можно добавить дополнительные программные модули, функции и функциональные блоки.

В поле «Язык» необходимо выбрать из списка один из языков стандарта IEC 61131-3 (IL, ST, LD, FBD, SFC), на котором будут реализованы алгоритмы и логика работы данного добавляемого программного модуля.

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

В рамках описания процесса создания нового проекта за основу выбран проект «First steps» из стандартного набора тестовых проектов IDE Beremiz. Основной программный модуль в этом проекте написан на языке FBD, соответственно, в диалоге необходимо выбрать язык FBD, в дальнейшем язык основного программного модуля возможно изменить.

Настройка проекта

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

Вызов панели настройки проекта осуществляется при выборе (двойном щелчке левой кнопкой мыши) корневого элемента дерева проекта, который по умолчанию, сразу после создания проекта называется «Unnamed»(см. Рисунок 103 ).

_images/image147.png

- Панель настройки проекта

На панели присутствуют три вкладки:

  • Конфигурационные переменные;
  • Свойства проекта;
  • Конфигурация.
Конфигурационные переменные проекта

Конфигурационные переменные позволяют программным модулям типа «Программа» и «Функциональный блок» использовать общие переменные, которые будут определены в глобальной области видимости проекта.

Ниже, на Рисунок 104 , в панели переменных и констант добавим конфигурационную константу «ResetCounterValue» типа INT с начальным значением 17, с помощью кнопки «Добавить переменную» (см. таблицу 3).

_images/image149.png

- Объявление конфигурационной переменной

Для того чтобы к данной конфигурационной переменной можно было обращаться из программных модулей типа «Программа» или «Функциональный блок» необходимо в их панели редактирования в панели переменных и констант создать переменную с таким же именем, как и ранее объявленная глобальная, и установить её класс «Внешний».

Настройки сборки проекта и соединения с целевым устройством

Для использования написанной прикладной программы необходимо её собрать (скомпилировать и скомпоновать), т.е. получить исполняемый файл и передать на целевое устройство для отладки или просто исполнения. В связи с этим основными настройками являются: «URI системы исполнения» - адрес целевого устройства, и целевая платформа - архитектура платформы целевого устройства (см. Рисунок 105 ).

_images/image150.png

- Конфигурация проекта

Как правило, «URI системы исполнения» указывается в формате:

<Тип коннектора>)://<Адрес последовательного порта подключения>:<битрейт>

Тип коннектора выбирается в зависимости от типа сервиса подключения к целевому устройству. Например, для отладки прикладной программы на локальной машине при помощи Soft PLC, целевым устройством является служба «Beremiz service» и тип коннектора следует выбрать «LOCAL». Для отладки прикладной программы вне локальной машины используется библиотека PYRO, в это случае «URI целевого устройства» указывается в формате:

PYRO://<IP-адрес целевого устройства>:<порт>

Если в проекте используются дополнительные библиотеки, их следует добавить в конфигурации проекта, нажав «checkbox» напротив добавляемой библиотеки в подменю «Библиотеки».

Данные о проекте

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

_images/image152.png

- Заполнение данных о проекте

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

Программные модули

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

Проект «First steps» представляет собой основной программный модуль, написанный на языке FBD, в котором используются 5 функциональных блоков, написанных на пяти разных языках IEC 61131-3. Каждый функциональный блок это счетчик, увеличивающий значение выхода на единицу до тех пор, пока на входе Reset не будет установлено значение True. Инкрементация значения происходит в каждом цикле основной программы. Регулировать интервал цикла можно изменяя длительность задачи для экземпляра основной программы в панели ресурсов.

В созданный проект необходимо добавить программу program0, функцию и 5 функциональных блоков: CounterST, CounterLD, CounterFBD, CounterSFC, CounterIL. Если при создании проекта основной программный модуль program0 не был добавлен, его следует добавить вручную. Далее рассмотрено добавление каждого программного модуля в отдельности.

Программа

Ниже будет приведён пример добавления в проект программы, написанной на языке FBD. Логика и алгоритм работы данного программного модуля следующие: определена переменная Reset типа BOOL, отвечающая за сброс каждого из пяти счетчиков, определены пять переменных Cnt1..Cnt5 типа INT, в них хранится значение каждого из пяти счетчиков, и добавлены пять функциональных блоков, представляющих собой инкрементирующий счетчик на пяти языках IEC 61131-3. При запуске программы начальное значение переменной Reset устанавливается по умолчанию False. Значения счетчиков начнут увеличиваться, начиная со значения по умолчанию (для типа INT равно 0). Для сброса счетчиков переменную Reset необходимо форсировать значением True, затем вернуть значение False. Переменным Cnt1..Cnt5 будет присвоено начальное значение конфигурационной константы ResetCounterValue, таким образом значения счетчиков сбросятся, и начнется отсчет начиная с 17.

Сначала следует добавление программы в проект, осуществляемое с помощью меню дерева проекта, выбором пункта «Программа» (см. Рисунок 107 ):

_images/image153.png

- Добавление программы в проект

В появившемся диалоге (см. Рисунок 108 ) выберем язык FBD и тип POU «программа».

_images/image154.png

- Диалог добавления программы в проект

Добавим в панели переменных и констант переменную Reset типа BOOL, отвечающую за сброс каждого из пяти счетчиков, а так же пять переменных Cnt1..Cnt5 типа INT, в которых будут храниться значения каждого из пяти счетчиков. Далее необходимо обратиться к редактору языка FBD. Для написания алгоритма и логики выполнения данной программы нам понадобятся функциональные блоки счетчиков, создание которых рассмотрено в п. 6.3.2.

Для удобства редактирования FBD диаграмм в редакторе существует функция Drag&Drop , необходимые функциональные блоки и переменные можно добавить в поле редактирования из библиотеки функций и функциональных блоков и таблицы переменных путем перетаскивания в поле редактирования. необходимо левой клавишей мыши зажать столбец «#» для переменной в панели переменных и констант, далее перенести указатель на область редактирования FBD диаграммы и отпустить кнопку мыши (Drag&Drop).

Перенесем 5 экземпляров переменной Reset и все переменные Cnt1..Cnt5 в поле редактирования диаграммы как показано на Рисунок 109 :

_images/image155.png

- Перенос переменных в поле редактирования

Из библиотеки функций и функциональных блоков добавим пользовательские функциональные блоки. Добавление данных функциональных блоков удобнее осуществить переносом соответствующей функции с помощью мыши (Drag&Drop) из панели библиотеки функций и функциональных блоков в область редактирования FBD диаграммы данного программного модуля как показано на Рисунок 110 :

_images/image156.png

- Программа на языке FBD без связей

Добавим связи между функциональными блоками и входными и выходными переменными.

_images/image157.png

- Основной программный модуль на языке FBD

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

Добавление пользовательского функционального блока происходит путем нажатия на пункт «Функциональный блок» во всплывающем меню дерева проекта . В диалоговом окне (см. Рисунок 112 ) задайте имя функционального блока в поле «Имя POU», в поле «Тип POU» выберите «функциональный блок», в поле «Язык» выберите язык, на котором будет написан алгоритм работы блока.

_images/image158.png

- Диалог создания нового функционального блока

Функциональный блок на языке ST

Создайте функциональный блок с именем «CounterST» (см. Рисунок 113 ), в котором инструментами языка ST будет реализован счетчик , принимающий на вход переменную Reset типа BOOL, и возвращающий значение счетчика Out.

_images/image159.png

- Диалог добавления пользовательского функционального блока

В отличие от функции, функциональный блок может быть описан на любом языке стандарта IEC 61131-3, включая язык SFC. На Рисунок 114 показана реализация данного функционального блока на языке ST.

_images/image160.png

- описание пользовательского функционального блока на языке ST

Возвращаемое значение «Out» имеет тип INT и класс «Выход». Добавленные локальная переменная «Cnt» и внешняя конфигурационная переменная «ResetCounterValue» имеют тип INT, входная переменная «Reset» имеет тип BOOL. Реализованный функциональный блок становится доступным в панели библиотеки функций и функциональных блоков и может использоваться в программных модулях типа «Программа» и «Функциональный блок». На Рисунок 115 показано использование созданного функционального блока «CounterST» в основном программном модуле, написанном на языке FBD.

_images/image161.png

- Использование созданного функционального блока CounterST в основном программном модуле

С входом «Reset» соединена общая для всех счетчиков переменная «Reset» типа BOOL, результат выполнения помещается в переменную «Cnt1» типа INT. Следует отметить, что при попытке удаления функции или функционального блока из проекта (см. Рисунок 116 ), где эти добавленные программные модули уже используются, будет выдана ошибка.

_images/image162.png

- Сообщение об ошибке при удалении функционального блока

Реализации на других языках полностью идентичны по набору входных, выходных и локальных переменных. Далее будут описаны примеры функциональных блоков на остальных четырех языках IEC 61131-3.

Функциональный блок на языке FBD

Создайте функциональный блок с именем «CounterFBD», в котором инструментами языка FBD будет реализован счетчик , принимающий на вход переменную «Reset» типа BOOL, и возвращающий значение счетчика «Out». Для удобства редактирования FBD диаграмм в редакторе существует функция Drag&Drop , необходимые функциональные блоки и переменные можно добавить в поле редактирования из библиотеки функций и функциональных блоков и таблицы переменных путем перетаскивания в поле редактирования (см. Рисунок 117 ). необходимо левой клавишей мыши зажать столбец «#» для переменной в панели переменных и констант, далее перенести указатель на область редактирования FBD диаграммы и отпустить кнопку мыши (Drag&Drop).

Добавим возвращаемое значение «Out» типа INT и класса «Выход», локальную переменную «Cnt» типа INT, внешнюю конфигурационную переменную «ResetCounterValue» типа INT, и входную переменную «Reset» типа BOOL.

_images/image163.png

- Добавление переменной в поле редактирования

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

_images/image164.png

- Блоки переменных в поле редактирования

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

_images/image165.png

- Диалог создания переменной

Для того чтобы переменной «Cnt» можно было одновременно и присвоить значение и передать это значение переменной Out, задайте класс переменной «Вход/Выход». Сделать это можно щелчком правой кнопкой мыши по блоку переменной, во всплывающем меню следует выбрать «Вход/Выход» (см. Рисунок 120 ), или щелкнув по блоку двойным щелчком левой кнопки мыши, выбрав в выпадающем списке «Класс» вариант «Вход/Выход»(см. Рисунок 121 ).

_images/image166.png

- Выбор коннектора для блока переменной

_images/image167.png

- Диалог редактирования свойств блока переменной

Далее необходимо обратиться к редактору языка FBD. Для написания алгоритма и логики выполнения данной программы будут добавлены две функции: «ADD» и «SEL».

Функция «ADD» находится во вкладке «Математика» в Библиотеке функций и функциональных блоков , обозначает сложение от 2 до 20 входных значений (в нашем примере их 2) на входах «IN1» и «IN2», возвращает результат вычисления на выход «OUT».

Функция «SEL» обозначает «Выбор одного из двух значений» и находится во вкладке «Операции выбора». Она содержит три входных переменных «G», «IN0», «IN1» и одну выходную «OUT». Если «G» равно 0 (или FALSE), то выходной переменной «OUT» присваивается значение «IN0». Если «G» равно 1 (или TRUE), то выходной переменной «OUT» присваивается значение «IN1».

Добавление данных функций удобнее осуществить переносом соответствующей функции с помощью мыши (Drag&Drop) из панели Библиотеки функций и функциональных блоков в область редактирования FBD диаграммы функционального блока. Результатом вышеизложенных действий должна стать FBD диаграмма без соединений (см. Рисунок 122 ).

_images/image168.png

- FBD диаграмма без соединений

Следующим шагом станет соединение выходов переменных со входами функций. Соединим числовой литерал 1 с входом «IN1» функции ADD, а выход «OUT» функции ADD соединим с входом «IN0» функции SEL. В свою очередь, выход «OUT» функции SEL соединим с входным коннектором переменной Cnt, а выходной коннектор переменной Cnt соединим с входом переменной «Out». Соединение блоков осуществляется путем зажатия левой кнопки мыши на коннекторе блока, будет создана линия связи которую необходимо протянуть до коннектора присоединяемого блока (см. Рисунок 123 ).

_images/image169.png

- Соединение блоков в FBD диаграмме

Далее присоединим переменную «Reset», управляющую сбросом счетчика, на вход «G» функции «SEL», а конфигурационную переменную «ResetCounterValue» на вход «IN1». Таким образом, меняя значение переменной «Reset» мы управляем значением переменной «Cnt» через функцию выбора значения «SEL» . Осталось добавить связь между переменной «Cnt» и входом «IN2» функции сложения ADD, тем самым обеспечив увеличение значения счетчика на 1 за один цикл ПЛК.

Полученная реализация алгоритма счетчика на языке FBD представлена на Рисунок 124 .

_images/image170.png

- Функциональный блок на языке FBD

Функциональный блок становится доступным в панели библиотеки функций и функциональных блоков и может использоваться в программных модулях типа «Программа» и «Функциональный блок». На Рисунок 125 показано использование созданного функционального блока «CounterFBD» в основном программном модуле, написанном на языке FBD.

_images/image171.png

- Использование созданного функционального блока CounterFBD в основном программном модуле

Функциональный блок на языке SFC

Создайте функциональный блок с именем «CounterSFC», в котором инструментами языка SFC будет реализован счетчик , принимающий на вход переменную «Reset» типа BOOL, и возвращающий значение счетчика «Out».

Добавим в панель переменных и констант возвращаемое значение «Out» типа INT и класса «Выход», локальную переменную «Cnt» типа INT, внешнюю конфигурационную переменную «ResetCounterValue» типа INT, и входную переменную «Reset» типа BOOL.

Для удобства редактирования SFC диаграмм в редакторе существует функция Drag&Drop, необходимые функциональные блоки и переменные можно добавить в поле редактирования из библиотеки функций и функциональных блоков и таблицы переменных путем перетаскивания в поле редактирования (см. Рисунок 117 ). необходимо левой клавишей мыши зажать столбец «#» для переменной в панели переменных и констант, далее перенести указатель на область редактирования SFC диаграммы и отпустить кнопку мыши (Drag&Drop).

Добавим начальный шаг диаграммы, нажав на кнопку «Создать исходный шаг», в диалоге изменим название шага по умолчанию на название «Start», коннектор потребуется только «Выход»(cм. Рисунок 126 )

_images/image172.png

- Добавление начального шага

Следуя алгоритму, возможны два состояния – счетчик увеличивается и счетчик сброшен. Добавим альтернативное ветвление с двумя ветвями. Согласно стандарту IEC 61131-3, каждая ветвь альтернативного ветвления должна оканчиваться переходом. Условиями переходов будет являться состояние переменной «Reset» : для первой ветви выражение «NOT Reset» , для второй ветви просто значения «Reset» (см.:numref:image173).

_images/image173.png

- Добавление альтернативного ветвления

В первом состоянии добавим шаг с действием «Count» (см. Рисунок 128 ), в действии на языке ST опишем увеличение счетчика на единицу, и присвоение значения переменной «Out» (см. Рисунок 129 ).

_images/image174.png

- Добавление шага с коннектором действия

_images/image175.png

- Добавление действия инкрементации счетчика

Во второй ветви добавим шаг с действием «ResetCounter», в действии опишем присвоение переменной «Cnt» значение переменной «ResetCounterValue», и значению «Out» значение переменной «Cnt» (см.:numref:image176).

_images/image176.png

- Добавление действия сброса счетчика

Первая ветвь отвечает за инкрементацию счетчика, вторая – за сброс (см. Рисунок 131 ).

_images/image177.png

- Шаги с действиями

Для выходов из состояния добавим в первой ветви переход с условием «Reset», во второй ветви добавим переход с условием «NOT Reset»(см. Рисунок 132 ).

_images/image178.png

- Условные переходы для выхода из состояний

Далее, объединим ветви альтернативным объединением. Для того чтобы программа выполнялась циклически, после объединения добавим безусловный переход к начальному шагу «Start». Полученная реализация счетчика на языке SFC представлена на Рисунок 133 .

_images/image179.png

- Реализация счетчика на языке SFC

Функциональный блок становится доступным в панели библиотеки функций и функциональных блоков и может использоваться в программных модулях типа «Программа» и «Функциональный блок». На Рисунок 134 показано использование созданного функционального блока «CounterSFC» в основном программном модуле, написанном на языке FBD.

_images/image180.png

- Использование созданного функционального блока CounterSFC в основном программном модуле

Функциональный блок на языке IL

Создайте функциональный блок с именем «CounterIL», в котором инструментами языка IL будет реализован счетчик , принимающий на вход переменную Reset типа BOOL, и возвращающий значение счетчика Out.

Добавим в панель переменных и констант возвращаемое значение «Out» типа INT и класса «Выход», локальную переменную «Cnt» типа INT, внешнюю конфигурационную переменную «ResetCounterValue» типа INT, и входную переменную «Reset» типа BOOL.

Для удобства редактирования кода в редакторе IL существует функция Drag&Drop , необходимые переменные можно добавить в поле редактирования из таблицы переменных путем перетаскивания в поле редактирования (см. Рисунок 116 ). необходимо левой клавишей мыши зажать столбец «#» для переменной в панели переменных и констант, далее перенести указатель на область редактирования и отпустить кнопку мыши (Drag&Drop).

Напишем инструкции для сброса счетчика и сохранения результатов. Инструкцию для сброса счетчика назовем «ResetCnt», она загрузит операнд ResetCounterValue в аккумулятор:

ResetCnt:
(\* reset counter \*)
LD ResetCounterValue

Инструкцию для сохранения результатов назовем «QuitFb», она будет сохранять значения операндов «Cnt» и «Out»:

QuitFb:
(\* save results \*)
ST Cnt
ST Out

Загрузим в аккумулятор значение операнда «Reset». Если значение операнда «True», следует перейти к инструкции сброса счетчика ResetCnt, в случае значения «False» значение операнда должно увеличиться на единицу.

LD Reset
JMPC ResetCnt
(\* increment counter \*)
LD Cnt
ADD 1
JMP QuitFb
ResetCnt:
(\* reset counter \*)
LD ResetCounterValue
QuitFb:
(\* save results \*)
ST Cnt
ST Out

Полученная реализация счетчика на языке IL представлена на Рисунок 135 .

_images/image181.png

- Реализация счетчика на языке IL

Функциональный блок становится доступным в панели библиотеки функций и функциональных блоков и может использоваться в программных модулях типа «Программа» и «Функциональный блок». На Рисунок 136 показано использование созданного функционального блока «CounterIL» в основном программном модуле, написанном на языке FBD.

_images/image182.png

- Использование функционального блока CounterIL в основном программном модуле

Функциональный блок на языке LD

Создайте функциональный блок с именем «CounterLD», в котором инструментами языка LD будет реализован счетчик , принимающий на вход переменную «Reset» типа BOOL, и возвращающий значение счетчика «Out».

Добавим в панель переменных и констант возвращаемое значение «Out» типа INT и класса «Выход», локальную переменную «Cnt» типа INT, внешнюю конфигурационную переменную «ResetCounterValue» типа INT, и входную переменную «Reset» типа BOOL.

Для удобства редактирования LD диаграмм в редакторе существует функция Drag&Drop , необходимые функциональные блоки и переменные можно добавить в поле редактирования из библиотеки функций и функциональных блоков и таблицы переменных путем перетаскивания в поле редактирования (см. Рисунок 117 ). необходимо левой клавишей мыши зажать столбец «#» для переменной в панели переменных и констант, далее перенести указатель на область редактирования LD диаграммы и отпустить кнопку мыши (Drag&Drop).

Добавим шину питания, к ней присоединим контакт, связанный с переменной «Reset» (см. Рисунок 137 ).

_images/image183.png

- Диалог добавления контакта

Полученная конструкция будет подавать сигнал на сброс счетчика при переходе значения переменной «Reset» в True (см. Рисунок 138 )

_images/image184.png

- Контакт ассоциированный с переменной Reset

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

_images/image165.png

- Диалог создания переменной

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

_images/image185.png

- Блоки переменных в поле редактирования

Для того чтобы переменной «Cnt» можно было одновременно и присвоить значение и передать это значение переменной Out, задайте класс переменной «Вход/Выход». Сделать это можно щелчком правой кнопкой мыши по блоку переменной, во всплывающем меню следует выбрать «Вход/Выход» (см. Рисунок 141 ), или щелкнув по блоку двойным щелчком левой кнопки мыши, выбрав в выпадающем списке «Класс» вариант «Вход/Выход»(см. Рисунок 142 ).

_images/image166.png

- Выбор коннектора для блока переменной

_images/image167.png

- Диалог редактирования свойств блока переменной

Для написания алгоритма и логики выполнения данной программы будут добавлены две функции: «ADD» и «SEL».

Функция «ADD» находится во вкладке «Математика» в Библиотеке функций и функциональных блоков, и обозначает сложение от 2 до 20 входных значений (в нашем примере их 2) на входах «IN1» и «IN2», возвращает результат вычисления на выход «OUT».

Функция «SEL» обозначает «Выбор одного из двух значений» и находится во вкладке «Операции выбора». Она содержит три входных переменных «G», «IN0», «IN1» и одну выходную «OUT». Если «G» равно 0 (или FALSE), то выходной переменной «OUT» присваивается значение «IN0». Если «G» равно 1 (или TRUE), то выходной переменной «OUT» присваивается значение «IN1».

Добавление данных функций удобнее осуществить переносом соответствующей функции с помощью мыши (Drag&Drop) из панели Библиотеки функций и функциональных блоков в область редактирования FBD диаграммы функционального блока. Результатом вышеизложенных действий должна стать LD диаграмма без соединений.

_images/image186.png

- LD диаграмма без соединений

Следующим шагом станет соединение выходов переменных со входами функций. Соединим числовой литерал 1 с входом «IN1» функции ADD, а выход «OUT» функции ADD соединим с входом «IN0» функции SEL. В свою очередь, выход «OUT» функции SEL соединим с входным коннектором переменной Cnt, а выходной коннектор переменной Cnt соединим с входом переменной «Out». Соединение блоков осуществляется путем зажатия левой кнопки мыши на коннекторе блока, будет создана линия связи которую необходимо протянуть до коннектора присоединяемого блока .

_images/image187.png

- Соединение блоков

Далее присоединим сигнал с контакта, ассоциированного с переменной «Reset», управляющей сбросом счетчика, на вход «G» функции «SEL», а конфигурационную переменную «ResetCounterValue» на вход «IN1». Таким образом, меняя значение переменной «Reset» мы управляем значением переменной «Cnt» через функцию выбора значения «SEL» . Осталось добавить связь между переменной «Cnt» и входом «IN2» функции сложения ADD, тем самым обеспечив увеличение значения счетчика на 1 за один цикл ПЛК.

Полученная реализация алгоритма счетчика на языке LD представлена на Рисунок 145 .

_images/image188.png

- Функциональный блок на языке LD

Функциональный блок становится доступным в панели библиотеки функций и функциональных блоков и может использоваться в программных модулях типа «Программа» и «Функциональный блок». На рис. 146 показано использование созданного функционального блока «CounterFBD» в основном программном модуле, написанном на языке FBD.

_images/image189.png

- Использование функционального блока на языке LD в основном программном модуле

Функция

Добавление пользовательской функционального блока происходит путем нажатия на пункт «Функция» во всплывающем меню дерева проекта. В диалоговом окне задайте имя функции в поле «Имя POU», в поле «Тип POU» выберите «функция», в поле «Язык» выберите язык, на котором будет написан алгоритм работы функции.

_images/image190.png

- Диалог создания функции

Создадим функцию «AverageVal» на языке ST, которая будет вычислять среднее значение счетчиков в цикле. Поскольку счетчики никак не синхронизированы, среднее значение должно быть дробным. Выберем тип возвращаемого значения функции – для дробного значения это тип REAL.

_images/image191.png

- Выбор типа возвращаемого значения функции

В панели редактирования переменных и констант добавим пять переменных «Cnt1»..«Cnt5» типа INT, класса «Вход». К этим входам будут подключены выходные значения функциональных блоков, рассмотреных выше. Добавим переменную «InputsNumber» типа REAL, класса «Локальный».

Далее в редакторе языка ST пишется алгоритм и логика работы данной функции, как показано на рис. 149:

_images/image192.png

- Определение алгоритма и логики выполнения функции

Для приведения типа INT к типу REAL воспользуемся функцией INT_TO_REAL из библиотеки функций и функциональных блоков, она преобразует значение типа INT на входе IN в значение типа REAL на выходе OUT (INT:IN) =>(REAL:OUT).

Добавим функцию в основной программный модуль. На панели библиотеки функций и функциональных блоков в разделе «Пользовательские POU» необходимо выбрать функцию «AverageVal» и с помощью указателя мыши (зажав левую кнопку мыши) перенести данную функцию (Drag&Drop) в область редактирования FBD диаграммы программного модуля «program0».

_images/image193.png

- Добавление на FBD диаграмму пользовательской функции

Подключим к входам функции значения пяти счетчиков. Для сохранения результата вычисления функции создадим переменную «AVCnt». На Рисунок 151 показано использование созданной функции «AverageVal» в основном программном модуле, написанном на языке FBD.

_images/image194.png

- Использование функции в основном программном модуле

Ресурс

Согласно стандарту IEC 61131-3, каждый проект должен иметь как минимум один ресурс, с определённым в нём как минимум одним экземпляром. Экземпляр представляет собой элемент, связанный с программным модулем типа «Программа» и одной определённой задачей. По умолчанию, инструментальная среда разработки Beremiz создаёт для нового проекта один ресурс.

Глобальные переменные ресурса

Глобальные переменные ресурса объявляются аналогично глобальным переменным проекта на панели переменных и констан выбранного ресурса с использованием кнопки «Добавить переменную», либо «Добавить переменные» (см. таблицу 3).

_images/image195.png

- Пример объявления в проекте глобальной переменной

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

Задачи и экземпляры ресурса

Для создания экземпляра необходимо наличие как минимум одного программного модуля типа «Программа» в проекте и как минимум одной задачи, определённой в панели редактирования ресурса.

После добавления задачи с помощью кнопки «Добавить» (данная кнопка аналогична кнопки «Добавить» на панели переменных и констант), необходимо задать её уникальное имя (поле «Имя») и выбрать тип выполнения задачи (поле «Запуск», см. Рисунок 153 ):

  • «Циклический» – выполнение программного модуля типа «Программа» через заданный интервал времени, указанный в поле «Интервал»;
  • «Прерывание» – выполнение программного модуля типа «Программа» один раз при наступлении значения TRUE глобальной переменной типа BOOL, определённой на уровне проекта, либо на уровне ресурса, указанной в поле «Источник».
_images/image196.png

- Выбор типа выполнения задачи

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

_images/image197.png

- Добавление задачи с цикличным режимом выполнения

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

_images/image198.png

- Диалог редактирования длительности задачи

Завершение ввода времени кнопкой «OK» приводит к закрытию диалога и добавлению данного интервала времени в поле «Интервал» добавляемой задачи.

_images/image199.png

- Добавленный итервал выполнения

В случае выбора типа выполнения «Прерывание» в поле «Источник» необходимо указать переменную типа BOOL, определённую глобально либо на уровне проекта, либо на уровне ресурса. На Рисунок 157 выбирается переменная «globalFlag», определённая в данном ресурсе.

_images/image200.png

- Выбор переменной типа BOOL как источника прерывания для начала выполнения задачи

Задача будет выполнена один раз, как только значение переменной, определённой в этом поле, будет TRUE. Поле «Приоритет» позволяет указать приоритет выполнения задачи, по умолчанию все задачи имеют приоритет 0. Следует отметить, что в ресурсе должна быть определена как минимум одна задача с типом выполнения «Цикличное», в противном случае будет ошибка в компиляции в отладочной консоли . После того как задачи определены, их можно использовать в экземплярах. Создание экземпляра происходит аналогичным образом с помощью кнопки «Добавить». Необходимо выбрать уникальное имя экземпляра и далее указать программный модуль типа «Программа» в поле «Тип» и одну из задач в поле «Задача». Например, в проекте определено два программных модуля типа «Программа»: «program0» и «program1».

_images/image201.png

- Проект, содержащий два программных модуля типа «Программа»

Соответственно, при создании экземпляра в поле «Тип» оба этих программных модуля будут доступны (см. рис. 159).

_images/image202.png

- Выбор программного модуля типа «Программа» для экземпляра

Аналогичным образом выбирается задача из списка, в котором будут отображены определённые ранее задачи.

_images/image203.png

- Выбор задачи для экземпляра

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

Типы данных

Добавление типа данных происходит выбором пункта «Типа данных» в меню дерева проекта (см. Рисунок 161 ) в уже созданный проект, содержащий программный модуль типа «Программа» – «program0».

_images/image204.png

- Выбор пункта меню добавления пользовательского типа данных в дереве проекта

Будет создан массив типа INT размерностью 11 элементов. В дереве проекта появится панель редактирования добавленного типа данных с именем «datatype0». В поле «Механизм создания нового типа» необходимо выбрать «Массив» и указать тип INT, как показано на Рисунок 162 :

_images/image205.png

- Выбор базового типа для массива

С помощью кнопки «Добавить» (см. таблицу 10) создаётся поле для массива с указанием его размерности в соответствующем формате.

_images/image206.png

- Задание размерности для массива

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

_images/image207.png

- Выбор добавленного типа данных в панели переменных и констант программного модуля

Сборка и передача на целевое устройство прикладной программы

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

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

Возможность передачи на целевое устройство прикладной программы и её отладки определяется наличием запущенной на целевом устройстве серверной части среды разработки Beremiz.

Среда разработки Beremiz предоставляет следующие возможности отладки:

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

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

Сборка прикладной программы

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

Для сборки проекта нажмите кнопку «Сборка проекта в директории сборки» (см. табл. 2). Результаты сборки выводятся в консоль, расположенную в нижней части окна программы, ошибки сборки выделяются красным цветом. На примере проекта First_steps после сборки в консоль выведено сообщение о том, что сборка проведена успешно.

_images/image209.png

- Результаты сборки выведены в консоль

Пересборку проекта можно осуществить, очистив директорию сборки проекта нажатием на кнопку «Очистить директорию сборки проекта» (см. табл.2). Будет удален сгенерированный на языке ST код проекта и скомпилированный бинарный файл прошивки ПЛК. После этого нажмите кнопку «Сборка проекта в директории сборки», и проект будет собран заново.

Запуск серверной части для отладки

Серверная часть среды разработки Beremiz, необходимая для передачи исполняемого файла на целевое устройство и его отладки, находится в сценарии на языке Python в файле Beremiz_service.py. Запуск данного файла осуществляется из командной строки, следующей командой с параметрами по умолчанию (см. таблицу 13):

$ python Beremiz_service.py

Также, при запуске могут быть указаны параметры, представленные в таблице 13.

Таблица 13 - Параметры командной строки запуска серверной части среды Beremiz

Параметр Операция
-i Указание IP адреса для обращения клиента, по умолчанию 127.0.0.1 (localhost)
-p Номер порта, по умолчанию 3000
-h Вывод в консоль справки по работе с данным сервером
-a Автоматический запуск целевого устройства (0 – выключить, 1 – включить), по умолчанию 0.
-x Включить/выключить иконку в панели задач (0 – выключить,1 – включить), по умолчанию 0.
-t Web-интерфейс на базе библиотеки Twisted (0 – выключить, 1 – включить), по умолчанию 0. Он позволяет отслеживать состояние выполнения программы через браузер. Адрес: http://<ip-адрес целевого устройства>:<8009>. 8009 – порт по умолчанию.

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

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

Соединение с целевым устройством и передача исполняемого файла

После того как скрипт серверной части среды разработки Beremiz запущен, можно производить соединение с целевым устройством. В панели настроек проекта необходимо указать URI-адрес целевого устройства:

PYRO://<IP-адрес>:<номер порт>

На Рисунок 166 показан URI адрес целевого устройства LOCAL://,это адрес Soft PLC на локальной машине, и выделена красным цветом кнопка «Покдлючиться к целевому ПЛК» (см. таблицу 2), которая используется для соединения с целевым устройством.

_images/image210.png

- Соединение с целевым устройством

В случае успешного соединения, в отладочной консоли будет выведено соответствующее сообщение и выведен статус прикладной программы.

_images/image2111.png

- Отладочная консоль после соединения с целевым устройством

Статусы прикладной программы могут быть следующие:

  • «PLC Empty» – прикладная программа отсутствует;
  • «PLC Started» – прикладная программа на целевом устройстве есть и она выполняется;
  • «PLC Stopped» – прикладная программа на целевом устройстве есть, но остановлена.

Используя кнопки передачи, запуска и остановки прикладной программы на целевом устройстве (см. таблицу 2) можно передать исполняемый файл прикладной программы, запустить его и остановить. В отладочной консоли будут выведены соответствующие сообщения (после передачи, запуска и остановки прикладной программы), как показано на Рисунок 168 :

_images/image212.png

- Отладочная консоль после передачи прикладной программы, запуска и остановки

Отладка прикладной программы

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

Retain переменные в прикладной программе

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

Запуск отладчика

Осуществив передачу скомпилированной программы на SoftPLC, запустите отладку, нажав кнопку «Запустить ПЛК» (см. табл. 2). Переменные принимают исходные значения, затем начинается исполнение программы в ПЛК. Отладчик запущен.

Отладка текстовых языков

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

_images/image214.png

- Панель экземпляров проекта

Переход к родительскому экземпляру и его глобальным переменным осуществляется кнопкой «Родительский экземпляр»(см. табл. 11).

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

_images/image215.png

- Панель отладчика

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

_images/image216.png

- Форсирование переменной в панели отладки

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

_images/image217.png

- Диалог установки значения

Форсируя значение переменной, вы устанавливаете неизменяемое значение, переопределение которого выполняемой программой будет невозможно. После установки значения, его можно освободить, дав возможность программе изменять значение переменной. Для освобождения переменной нажмите кнопку «Освободить значение».

_images/image218.png

- Освобождение значения переменной

Для корректного изменения, вводимое значение должно соответствовать типу переменной, иначе будет выведено сообщение об ошибке, как показано на Рисунок 174 :

_images/image219.png

- Ошибка при вводе недопустимого значения изменяемой переменной в режиме отладки

Отладка графических языков

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

_images/image220.png

- Панель экземпляров проекта

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

_images/image221.png

- Пример отлаживаемой FBD диаграммы

Линии, не выделенные цветом передают либо булевое значение False, либо переменную не булевого типа (INT, DINT, WORD, REAL, TIME, и т.д.). Оранжевого цвета связи, передающие константное выражение. Светло-зелёным цветом выделены связи, которые передают булевое значение True. Связи, выделенные светло-голубым и тёмно-синим цветом передают значения непосредственно установленные пользователем, значение True соответствует светло-голубому цвету, False - тёмно-синему.

Отладка FBD диаграммы

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

_images/image222.png

- Отладка FBD диаграммы

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

Отладка LD диаграммы

Отладка LD диаграммы осуществляется аналогично отладке FBD диаграммы. Для вызова всплывающего меню (см. рис. 196), в котором можно установить желаемое значение для контакта или катушки необходимо нажать правую клавишу мыши.

_images/image223.png

- Пример отладки LD диаграммы

Появится диалог (см. Рисунок 179 ), в котором нужно ввести значение типа BOOL: TRUE–контакт «ON», FALSE – контакт «OFF».

_images/image224.png

- Диалог переключения состояния контакта

Отладка SFC диаграммы

Отладка SFC диаграммы происходит аналогично отладке диаграмм FBD и LD. С помощью всплывающего меню (см. Рисунок 180 ), есть возможность устанавливать активность для шагов и переходов.

_images/image225.png

- Пример отладки SFC диаграммы

На Рисунок 181 показано, как устанавливается значение (после выбора «Форсировать значение», появится диалог) TRUE для шага «ResetCounter».

_images/image226.png

- Изменение состояния шага «ResetCounter»

После установки значения шага в TRUE с помощью режима отладки, шаг будет выделен голубым цветом. Как можно заметить по Рисунок 182 , т.к. шаг «ResetCounter» стал активным, блок действий, ассоциированный с ним, так же стал активным (выделен зелёным цветом), а действия внутри него, в данном случае присвоение переменной «Cnt» значения конфигурационной переменной «ResetCounterValue», а переменной «Out» значения переменной «Cnt»:

Cnt := ResetCounterValue;

Out := Cnt;

стало выполняться.

_images/image227.png

- Форсирование блока действия

Так как квалификатор этого действия – N, то оно будет выполняться до тех пор, пока шаг активен.

График изменения значений переменной

Среда разработки Beremiz так же позволяет отображать в виде графика изменение значения переменной в режиме отладки. Для вывода панели с графиком, необходимо два раза кликнуть левой кнопкой мыши по кнопке «Отладка экземпляра» напротив переменной в панели экземпляров проекта.

Появившееся панель графика изменения переменной позволяет отслеживать то, как значение определённой переменной изменяется в течение времени.

_images/image228.png

- График изменения переменных

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

Описание библиотеки функций и функциональных блоков

Функции и функциональные блоки представляют собой предопределённые элементы, которые могут быть использованы при написании алгоритмов и логики программных модулей типа «Функциональный блок» и «Программа», как на текстовых, так и на графических языках стандарта IEC 61131-3.

Данные элементы имеют параметры на входе и на выходе. Как правило, каждый параметр имеет имя и своё назначение.

Стандартные функциональные блоки

Бистабильный SR-триггер

Данный функциональный блок представляет собой бистабильный SR-триггер, с доминирующим входом S (Set). Выход Q1 становится «1», когда вход S1 становится «1». Это состояние сохраняется, даже если S1 возвращается обратно в «0». Выход Q1 возвращается в «0», когда вход R становится «1». Если входы S1 и R находятся в «1» одновременно, доминирующий вход S1 установит выход Q1 в «1». Когда функциональный блок вызывается первый раз, начальное состояние Q1 это «0».

Бистабильный RS-триггер

Данный функциональный блок представляет собой бистабильный RS-триггер, с доминирующим входом R (Reset). Выход Q1 становится «1», когда вход S становится «1». Это состояние сохраняется, даже если S возвращается обратно в «0». Выход Q1 возвращается в «0», когда вход R1 становится «1». Если входы S и R1 находятся в «1» одновременно, доминирующий вход R1 установит выход Q1 в «0». Когда функциональный блок вызывается первый раз, начальное состояние Q1 это «0».

SEMA - Семафор

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

R_TRIG - Индикатор нарастания фронта

Данный функциональный блок представляет собой индикатор нарастания фронта, который генерирует на выходе одиночный импульс при нарастании фронта сигнала. Выход Q становится «1», если происходит переход из «0» в «1» на входе CLK . Выход остается в состоянии «1» от одного выполнения блока до следующего (один цикл); затем выход возвращается в «0».

F_TRIG - Индикатор спада фронта

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

Выход Q становится «1», если происходит переход из «1» в «0» на входе CLK . Выход будет оставаться в состоянии «1» от одного выполнения блока до следующего; затем выход возвращается в «0».

CTU - инкрементный счётчик

Данный функциональный блок представляет собой инкрементный счётчик. Сигнал «1» на входе R вызывает присваивание значения «0» выходу CV . При каждом переходе из «0» в «1» на входе CU значение CV увеличивается на 1. Когда CV >= PV, выход Q устанавливается в «1».

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

Входы CU, RESET и выход Q типа BOOL, вход PV и выход CV типа WORD.

По каждому фронту на входе CU (переход из FALSE в TRUE) выход CV увеличивается на 1. Выход Q устанавливается в TRUE, когда счетчик достигнет значения заданного PV. Счетчик CV сбрасывается в 0 по входу RESET = TRUE.

CTD - декрементный счётчик

Данный функциональный блок представляет собой декрементный счётчик. Сигнал «1» на входе LD вызывает присваивание значения на входе PV выходу CV . При каждом переходе из «0» в «1» на входе CD значение CV уменьшается на 1.

Когда CV <= 0, выход Q принимает значение «1».

Примечание: Счетчик работает только до достижения минимального значения

используемого типа данных. Переполнения не происходит.

CTUD - реверсивный счётчик

Данный функциональный блок представляет собой реверсивный счётчик. Сигнал «1» на входе R вызывает присваивание значения «0» выходу CV . Сигнал «1» на входе LD вызывает присваивание значения на входе PV выходу CV . При каждом переходе из «0» в «1» на входе CU значение CV увеличивается на 1. При каждом переходе из «0» в «1» на входе CD значение CV уменьшается на 1.

Если сигнал «1» приходит одновременно на входы R и LD, вход R обрабатывается первым.

Когда CV >= PV, выход QU имеет значение «1».

Когда CV <= 0, выход QD принимает значение «1».

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

TP - повторитель импульсов

Данный функциональный блок представляет собой повторитель импульсов и используется для генерирования импульса с заданной продолжительностью. Если IN становится «1», Q становится «1», и начинается отсчет внутреннего времени (ET). Если внутреннее время достигает значения PT, Q становится «0» (независимо от IN). Отсчет внутреннего времени останавливается/сбрасывается, если IN становится «0». Если внутреннее время не достигло значения PT, импульс IN не влияет на внутреннее время. Если внутреннее время достигло значения PT, и IN равен «0», отсчет внутреннего времени останавливается/сбрасывается, и Q становится «0».

TON - таймер с задержкой включения

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

Если IN становится «1», запускается отсчет внутреннего времени (ET). Если внутреннее время достигает значения PT, Q становится «1». Если IN становится «0», Q становится «0», а подсчет внутреннего времени останавливается/сбрасывается. Если IN становится «0» до того, как внутреннее время достигло значения PT, подсчет внутреннего времени останавливается/сбрасывается, а выход Q не устанавливается в «0».

TOF - таймер с задержкой отключения

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

Если IN становится «1», Q становится «1».

Если IN становится «0», запускается отсчет внутреннего времени (ET).

Если внутреннее время достигает значения PT, Q становится «0».

Если IN становится «1», Q становится «1», а подсчет внутреннего времени останавливается/сбрасывается.

Если IN становится «1» до того, как внутреннее время достигло значения PT, подсчет внутреннего времени останавливается/сбрасывается, а выход Q не устанавливается в «0».

Дополнительные функциональные блоки

RTC - часы реального времени

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

Вход PDT (Preset DT) предназначен для установки времени. Часы начинают отсчет времени от значения PDT. Выход Q (BOOL) повторят значение EN. Выход CDT (Current DT) дает текущее значение даты и времени.

INTEGRAL - Интеграл

Функциональный блок интеграл интегрирует входное значение XIN по времени.

DERIVATIVE - Производная

Функциональный блок производная выдаёт значение XOUT пропорционально скорости изменения входного параметра XIN.

PID - Пропорционально-интегрально-дифференциальный регулятор

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

HYSTERESIS - гистерезис

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

Числовые операции

ABS - модуль числа

Данная функция возвращает в OUT модуль входного числа IN.

SQRT - квадратный корень

Данная функция возвращает в OUT квадратный корень входного числа IN.

LN - натуральный логарифм

Данная функция возвращает в OUT значение натурального логарифма от IN.

LOG - логарифм по основанию 10

Данная функция возвращает в OUT значение логарифма по основанию 10 от IN.

EXP - возведение в степень экспоненты

Данная функция возвращает в OUT значение экспоненты, возведённой в степень IN.

SIN - синус

Данная функция возвращает в OUT значение синуса IN.

COS - косинус

Данная функция возвращает в OUT значение косинуса IN.

TAN - тангенс

Данная функция возвращает в OUT значение тангенса IN.

ASIN - арксинус

Данный функциональный блок возвращает в OUT значение арксинуса IN.

ACOS - арккосинус

Данная функция возвращает в OUT значение арккосинуса IN.

ATAN - арктангенс

Данная функция возвращает в OUT значение арктангенса IN.

Арифметические операции

ADD - сложение

Данная функция возвращает в OUT результат сложения IN1 и IN2.

MUL - умножение

Данная функция возвращает в OUT результат умножения IN1 и IN2.

SUB - вычитание

Данная функция возвращает в OUT результат вычитания из IN1 значения IN2.

DIV - деление

Данная функция возвращает в OUT результат деления IN1 на IN2.

MOD - остаток от деления

Данная функция возвращает в OUT остаток от деления IN1 на IN2.

EXPT - возведение в степень

Данная функция возвращает в OUT значение IN1 возведённое в степень IN2.

MOVE - присвоение

Данная функция возвращает в OUT значение IN.

Временные операции

ADD_TIME - сложение переменных типа TIME

Данная функция складывает входные значения IN(k) типа TIME и возвращает результат в OUT типа TIME. Количество входов IN(n) изменяемое - от 2 до 20. По умолчанию 2.

ADD_TOD_TIME - сложение времени дня TOD с интервалом времени TIME

Данная функция складывает входную переменную IN1 типа TOD (TIME_OF_DAY) с переменной IN2 типа TIME. Возвращаемая величина OUT имеет тип TIME_OF_DAY.

ADD_DT_TIME - прибавление промежутка времени TIME к моменту времени DT

Данная функция ADD_DT_TIME прибавляет промежуток времени (формат TIME) к моменту времени (формат DT) и поставляет в качестве результата новый момент времени (формат DT). Момент времени (параметр T) должен лежать в диапазоне от DT#1990-01-01-00:00:00.000 до DT#2089-12-31-23:59:59.999.

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

Для входного параметра Т и выходного параметра можно ставить в соответствие только символически определенную переменную.

MULTIME - умножение времени TIME на число

Данная функция выполняет умножение входного значения IN1 типа TIME на число IN2 типа ANY_NUM и возвращает результат в OUT типа TIME.

SUB_TIME - разность двух значений типа TIME

Данная функция вычитает из входного значения IN1 типа TIME значение на входе IN2 типа TIME и возвращает результат в OUT типа TIME.

SUB_DATE_DATE - разность двух значений типа DATE

Данная функция вычитает из входного значения IN1 типа DATE входное значение IN2 типа DATE и возвращает в OUT их разницу типа TIME.

SUB_TOD_TIME - вычитание из времени дня TOD интервала времени TIME

Данная функция вычитает из входного значения IN1 типа TOD (TIME_OF_DAY) входное значение IN2 типа TIME и возвращает результат в OUT типа TIME_OF_DAY.

SUB_DT_TIME - вычитание из момента времени DT промежутка времени TIME

Данная функция вычитает промежуток времени (формат TIME) из момента времени (формат DT) и поставляет в качестве результата новый момент времени (формат DT). Момент времени (параметр T) должен лежать в диапазоне от DT#1990-01-01-00:00:00.000 до DT#2089-12- 31-23:59:59.999. Функция не выполняет входной проверки. Если результат вычитания не лежит внутри допустимого диапазона, то результат ограничивается соответствующим значением и бит двоичного результата (BR) слова состояния устанавливается в «0».

Для входного параметра Т и выходного параметра можно ставить в соответствие только символически определенную переменную.

DIVTIME - деление времени TIME на число

Данная функция выполняет деление входного значения IN1 типа TIME на число IN2 типа ANY_NUM и возвращает результат в OUT типа TIME.

Операции смещения бит

SHL - арифметический сдвиг влево

Данная функция возвращает в OUT арифметический сдвиг аргумента IN на N бит влево с заполнением битов справа нулями.

SHR - арифметический сдвиг вправо

Данная функция возвращает в OUT арифметический сдвиг аргумента IN на N бит вправо с заполнением битов слева нулями.

ROR - циклический сдвиг направо

Данная функция возвращает в OUT циклический сдвиг аргумента IN на N бит влево.

ROL - циклический сдвиг влево

Данная функция возвращает в OUT циклический сдвиг аргумента IN на N бит вправо.

Побитовые операции

AND - побитовое И

Данный функциональный блок представляет собой организацию «логического И» для всех входных аргументов IN1…INn.

OR - побитовое ИЛИ

Данная функция представляет собой организацию «логического ИЛИ» для всех входных аргументов IN1…INn.

XOR - побитовое исключающее ИЛИ

Данная функция представляет собой организацию «логического исключающего ИЛИ» для всех входных аргументов IN1…INn.

NOT - побитовая инверсия

Данная функция представляет собой организацию «логической инверсии» для входного аргумента IN.

Операции выбора

SEL - выбор из двух значений

Данная функция возвращает в OUT один из двух аргументов IN1 или IN2 в зависимости от значения аргумента G. Если G = 0, то OUT равно Х1, иначе - OUT равно X2.

MAX - максимум

Данная функция возвращает в OUT максимум из входных аргументов IN1 и IN2.

MIN - минимум

Данная функция возвращает в OUT минимум из входных аргументов IN1 и IN2.

LIMIT - ограничитель значения

Данная функция возвращает в OUT значение входного аргумента IN, в случае превышения им значения MX - в OUT возвращается MX, в случае если IN меньше MN - в OUT возвращается MN.

MUX - Мультиплексор (выбор 1 из N)

Данная функция возвращает в OUT значение на входе IN(K), в зависимости от входного K. Количество входов IN:sub:(n) изменяемое - от 2 до 20. По умолчанию 2.

Операции сравнения

GT - больше чем

Данная функция сравнивает все входные аргументы и выдаёт на выходе OUT значение True, если выполнится следующее условие: (IN1 > IN2) & (IN2 > IN3) & … (INn-1 > INn), в противном случае в OUT выдаётся False. Количество входов IN(n) изменяемое - от 2 до 20. По умолчанию 2.

GE - больше чем или равно

Данная функция сравнивает все входные аргументы и выдаёт на выходе OUT значение True, если выполнится следующее условие: (IN1 >= IN2) & (IN2 >= IN3) & … (INn-1 >= INn), в противном случае в OUT выдаётся False. Количество входов IN(n) изменяемое - от 2 до 20. По умолчанию 2.

EQ - равенство

Данная функция сравнивает все входные аргументы и выдаёт на выходе OUT значение True, если выполнится следующее условие: (IN1 = IN2) & (IN2 = IN3) & … (INn-1 = INn), в противном случае в OUT выдаётся False. Количество входов IN(n) изменяемое - от 2 до 20. По умолчанию 2.

LT - меньше чем

Данная функция сравнивает все входные аргументы и выдаёт на выходе OUT значение True, если выполнится следующее условие: (IN1 < IN2) & (IN2 < IN3) & … (INn-1 < INn), в противном случае в OUT выдаётся False. Количество входов IN(n) изменяемое - от 2 до 20. По умолчанию 2.

LE - меньше чем или равно

Данная функция сравнивает все входные аргументы и выдаёт на выходе OUT значение True, если выполнится следующее условие: (IN1 <= IN2) & (IN2 <= IN3) & … (INn-1 <= INn), в противном случае в OUT выдаётся False. Количество входов IN(n) изменяемое - от 2 до 20. По умолчанию 2.

NE - не равно

Данная функция сравнивает все входные аргументы и выдаёт на выходе OUT значение True, если выполнится следующее условие: (IN1 <> IN2) & (IN2 <> IN3) & … (INn-1 <> INn), в противном случае в OUT выдаётся False. Количество входов IN(n) изменяемое - от 2 до 20. По умолчанию 2.

Строковые операции с переменными типа STRING

LEN - длина строки

Данная функция возвращает в OUT длину строки IN. Входному параметру можно ставить в соответствие только символически определенную переменную.

LEFT - левая часть строки

Данная функция возвращает в OUT из строки IN первые L символов. Если L больше, чем текущая длина переменной типа STRING, то возвращается входное значение. При L = 0 и при пустой строке в качестве входного значения возвращается пустая строка. Если число L отрицательно, то выводится пустая строка. Параметру IN и возвращаемому значению можно ставить в соответствие только символически определенную переменную.

RIGHT - правая часть строки

Данная функция возвращает в OUT из строки IN последние L символов. Если L больше, чем текущая длина переменной STRING, то возвращается входное значение. При L = 0 и при пустой строке в качестве входного значения возвращается пустая строка. Если число L отрицательно, то выводится пустая строка. Параметру IN и возвращаемому значению можно ставить в соответствие только символически определенную переменную.

MID - середина строки

Данная функция возвращает в OUT из строки IN L-символов, начиная с позиции P. Если сумма L и (P-1) превосходит текущую длину переменной типа STRING, то возвращается строка символов, начиная с P-го символа входной строки до ее конца. Во всех остальных случаях (P находится вне текущей длины, P и/или L равны нулю или отрицательны) выводится пустая строка. Параметру IN и возвращаемому значению можно ставить в соответствие только символически определенную переменную.

CONCAT - объединение двух переменных STRING

Данная функция возвращает в OUT объединение (конкатенацию) строк IN1 и IN2.

CONCAT_DAT_TOD - объединение (конкатенация) времени

Данная функция возвращает в OUT типа DT конкатенацию входных значений типов DATE и TOD, соответственно IN1 и IN2.

INSERT - вставка в переменной STRING

Данная функция возвращает в OUT строку IN1, в которую вставлена строка IN2, начиная с позиции P. Если P равно нулю, то вторая строка символов вставляется перед первой строкой символов. Если P больше, чем текущая длина первой строки символов, то вторая строка символов присоединяется к первой. Если P отрицательно, то выводится пустая строка. Входным параметрам IN1 и IN2 и выходному параметру можно ставить в соответствие только символически определенную переменную.

DELETE - удаление в переменной STRING

Данная функция возвращает в OUT строку IN1, в которой удалено L символов, начиная с позиции P. Если L и/или P равны нулю или P больше, чем текущая длина входной строки, то возвращается входная строка. Если сумма L и P больше, чем входная строка символов, то строка символов удаляется до конца. Если L и/или P имеют отрицательное значение, то выводится пустая. Входному параметру IN и выходному параметру можно ставить в соответствие только символически определенную переменную.

REPLACE - замена в переменной STRING

Данная функция возвращает в OUT строку IN1, в которой символы, начиная с позиции P, заменены L первыми символами строки IN2. Если L равно нулю, то возвращается первая строка символов. Если P равно нулю или единице, то замена происходит, начиная с 1-го символа (включительно). Если P лежит вне первой строки символов, то вторая строка присоединяется к первой строке. Если L и/или P отрицательны, то возвращается пустая строка. Входным параметрам IN1 и IN2 и выходному параметру можно ставить в соответствие только символически определенную переменную.

FIND - поиск в переменной STRING

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

Языки стандарта МЭК 61131-3

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

Общие сведения о языке ST

ST (Structured Text) – это текстовый язык высокого уровня общего назначения, по синтаксису схожий с языком Pascal. Удобен для программ, включающих числовой анализ или сложные алгоритмы. Может использоваться в программах, в теле функции или функционального блока, а также для описания действия и перехода внутри элементов SFC. Согласно IEC 61131-3 ключевые слова должны быть введены в символах верхнего регистра. Пробелы и метки табуляции не влияют на синтаксис, они могут использоваться везде.

Выражения в ST выглядят точно также, как и в языке Pascal:

[variable] := [value];

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

Типы данных

Согласно стандарту IEC 61131-3, язык ST поддерживает весь необходимый набор типов, аналогичный классическим языкам программирования. Целочисленные типы: SINT (char), USINT (unsigned char), INT (short int), UINT (unsigned int), DINT (long), UDINT (unsigned long), LINT (64 бит целое), ULINT (64 бит целое без знака). Действительные типы: REAL (float), LREAL (double). Специальные типы BYTE, WORD, DWORD, LWORD представляют собой битовые строки длиной 8, 16, 32 и 64 бит соответственно. Битовых полей в ST нет. К битовым строкам можно непосредственно обращаться побитно. Например:

a.3 := 1; (* Установить бит 3 переменной a *)

Логический тип BOOL может иметь значение TRUE или FALSE. Физически переменная типа BOOL может соответствовать одному биту. Строка STRING является именно строкой, а не массивом. Есть возможность сравнивать и копировать строки стандартными операторами. Например:

strA := strB;

Для работы со строками есть стандартный набор функций (см. приложение 2, раздел «Строковые операции с переменными типа STRING»).

Специальные типы в стандарте IEC определены для длительности (TIME), времени суток (TOD), календарной даты (DATE) и момента времени (DT).

В таблице 3.1 приведены значения по умолчанию, соответствующие описанным выше типам.

Таблица 3.1 – Значения по умолчанию для типов данных IEC 61131-3

Тип(ы) данных Значение
BOOL, SINT, INT, DINT, LINT 0
USINT, UINT, UDINT, ULINT 0
BYTE, WORD, DWORD, LWORD 0
REAL, LREAL 0.0
TIME T#0S
DATE D#0001-01-01
TIME_OF_DAY TOD#00:00:00
DATE_AND_TIME DT#0001-01-01-00:00:00
STRING ‘’ (пустая строка)

По умолчанию, все переменные инициализируются нулем. Иное значение переменной можно указать явно при ее объявлении. Например:

str1: STRING := ‘Hello world’;

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

Таблица 3.2 – Обобщения типов данных IEC 61131-3

ANY  
ANY_BIT ANY_NUM ANY_DATE

TIME

STRING

и другие типы данных

BOOL

BYTE

WORD

DWORD

LWORD

ANY_INT ANY_REAL

DATE

TIME_OF_DAY

DATE_AND_TIME

 

INT

SINT

DINT

LINT

UINT

USINT

UDINT

ULINT

REAL

LREAL

Конструкции языка

К конструкциям языка ST относятся:

  • арифметические операции;
  • логические (побитовые) операции;
  • операции сравнения;
  • операция присвоения;
  • конструкция IF – ELSEIF – ELSE;
  • цикл FOR;
  • цикл WHILE;
  • цикл REPAET UNTIL;
  • конструкция CASE.

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

Арифметические операции

К арифметическим операциям относятся:

  • «+» – сложение;
  • «-» – вычитание;
  • «*» – умножение;
  • «/» – деление;
  • «mod» – остаток от целочисленного деления.

Приоритет операций в выражениях указан в таблице 3.4 (чем выше приоритет, тем раньше исполняется операция).

Логические (побитовые) операции

К данным операциям относятся:

  • «OR» – Логическое (побитовое) сложение;
  • «AND» – Логическое (побитовое) умножение;
  • «XOR» – Логическое (побитовое) «исключающее ИЛИ»;
  • «NOT» – Логическое (побитовое) отрицание.
Операции сравнения

Поддерживаются следующие операции сравнения:

  • «=» – сравнение на равенство;
  • «<>» – сравнение на неравенство;
  • «>» – сравнение на больше;
  • «>=» – сравнение на не меньше;
  • «<» – сравнение на меньше;
  • «<=» – сравнение на не больше.

В качестве результата сравнения всегда используется значение типа BOOL.

Присвоение

Для обозначения присвоения используется парный знак «:=». В правой и левой части выражения должны быть операнды одного типа (автоматического приведения типов не предусмотрено). В левой части выражения (принимающая сторона) может быть использована только переменная. Правая часть может содержать выражение или константу.

В таблице 3.4 приведены приоритеты при выполнении описанных выше операций.

Таблица 3.4 – Приоритеты операций

Операция Приоритет
Сравнения 1
Сложение, вычитание 2
Умножение, деление 3
OR 4
AND, XOR 5
NOT 6
Унарный минус 7
Вызов функции 8

Конструкция IF – ELSEIF – ELSE

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

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

Конструкция IF-ELSEIF-ELSE имеет следующий формат:

IF <boolean expression> THEN <statement list>

[ELSEIF <boolean expression> THEN <statement list>]

[ELSE <statement list>]

END_IF;

Например:

IF Var <> 0

THEN Var := 1

ELSEIF Var > 0

THEN Var := 0;

ELSE Var := 10;

END_IF;

Конструкция допускает вложенность, т.е. внутри одного IF может быть еще один и т.д. Например:

IF Var > 10 THEN

IF Var < Var2 + 1

THEN Var := 10;

ELSE Var := 0;

END_IF;

END_IF;

Цикл FOR

Служит для задания цикла с фиксированным количеством итераций. Формат конструкции следующий:

FOR <Control Variable> := <expression1> TO <expression2>

[BY <expression3>] DO

<statement list>

END_FOR;

При задании условий цикла считается, что <Control Variable>, <expression1> … <expression3> имеют тип INT. Выход из цикла будет произведен в том случае, если значение переменной цикла превысит значение <expression2>. Например:

FOR i := 1 TO 10 BY 2 DO

k := k * 2;

END_FOR;

Оператор BY задает приращение переменной цикла (в данном случае i будет увеличиваться на 2 при каждом проходе по циклу). Если оператор BY не указан, то приращение равно 1. Например:

FOR i := 1 TO k / 2 DO

var := var + k;

k := k – 1;

END_FOR;

Внутри цикла могут использоваться другие циклы, операторы IF и CASE. Для выхода из цикла (любого типа) может использоваться оператор EXIT. Например:

FOR i := 1 TO 10 BY 2 DO

k := k * 2;

IF k > 20 THEN

EXIT;

END_IF;

END_FOR;

Примечание 1: Выражения <expression1> … <expression3> вычисляются до входа в цикл, поэтому изменения значений переменных, входящих в любое из этих выражений не приведет к изменению числа итераций. Например:

01: k := 10;

02: FOR I := 1 TO k / 2 DO

03: k := 20;

04: END_FOR;

В строке 3 производится изменение переменной k, но цикл все равно выполнится только пять раз. Примечание 2: Значение переменной цикла может изменяться внутри тела цикла, но в начале очередной итерации значение данной переменной будет выставлено в соответствие с условиями цикла. Например:

01: FOR I := 1 TO 5 DO

02: I := 55;

03: END_FOR;

При первом проходе значение I будет равно 1, потом в строке 2 изменится на 55, но на втором проходе значение I станет равно 2 – следующему значению по условиям цикла.

Цикл WHILE

Служит для определения цикла с предусловием. Цикл будет исполняться до тех пор, пока выражение в предложении WHILE возвращает TRUE. Формат конструкции следующий:

WHILE <Boolean-Expression> DO

<Statement List>

END_WHILE;

Значение <Boolean-Expression> проверяется на каждой итерации. Завершение цикла произойдет, если выражение <Boolean-Expression> вернет FALSE. Например:

k := 10;

WHILE k > 0 DO

i := I + k;

k := k –1;

END_WHILE;

Внутри цикла могут использоваться другие циклы, операторы IF и CASE. Для досрочного завершения цикла используется оператор EXIT (см. пример в описание цикла FOR).

Цикл REPEAT UNTIL

Служит для определения цикла с постусловием. Завершение цикла произойдет тогда, когда выражение в предложении UNTIL вернет FALSE. Другими словами: цикл будет выполняться, пока условие в предложении UNTIL не выполнятся. Формат конструкции следующий:

REPEAT

<Statement List>

UNTIL <Boolean Expression>;

END_REPEAT;

Например:

k := 10;

REPEAT

i := i + k;

k := k – 1;

UNTIL k = 0;

END_REPEAT;

Внутри цикла могут использоваться другие циклы, операторы IF и CASE. Для досрочного завершения цикла используется оператор EXIT (см. пример в описании цикла FOR).

Конструкция CASE

Данная конструкция служит для организации выбора из диапазона значений. Формат конструкции следующий:

CASE <Expression> OF

CASE_ELEMENT {CASE_ELEMENT}

[ELSE <Statement List>]

END_CASE;

CASE_ELEMENT – это список значений, перечисленных через запятую. Элементом списка может быть целое число или диапазон целых чисел. Диапазон задается следующим образом BEGIN_VAL .. END_VAL.

Если текущее значение <Expression> не попало ни в один CASE_ELEMENT, то управление будет передано на предложение ELSE. Если предложение ELSE не указано, то никаких действий выполнено не будет.

Значение <Expression> может быть только целым. Например:

01: CASE k OF

02: 1:

03: k := k * 10;

04: 2..5:

05: k := k * 5;

06: i := 0;

07: 6, 9..20:

08: k := k – 1;

09: ELSE

10: k := 0;

11: i := 1;

12: END_CASE;

Строка 4 содержит диапазон значений. Если значение k принадлежит числовому отрезку [2, 5], то будут выполнены строки 5 и 6.

В строке 7 использован список значений. Строка 8 выполнится, если значение k будет равно 6 или будет принадлежать числовому отрезку [9, 20].

Строки 10 и 11 будут выполнены в том случае, если k < 1, или 6 < k < 9, или k > 20 (в данном случае сработает предложение ELSE).

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

  • наборы значений внутри одного CASE не должны пересекаться;
  • при указании диапазона значений начало диапазона должно быть меньше его конца.

В таблице 3.5 приведены примеры кода записи правильной и неправильной записи конструкции CASE.

Действия, предусмотренные для обработки каждого из случаев CASE, могут использовать циклы, операторы IF и CASE.

Таблица 3.5 – Запись конструкции CASE

Неправильная запись Правильная запись

01: CASE k OF

02: 1:

03: k := k * 10;

04: 2..5:

05: k := k * 5;

06: i := 0;

07: 5, 9..20:

08: k := k – 1;

09: ELSE

10: k := 0;

11: i := 1;

12: END_CASE;

Диапазоны в строках 4 и 7 пересекаются

01: CASE k OF

02: 1:

03: k := k * 10;

04: 2..5:

05: k := k * 5;

06: i := 0;

07: 6, 9..20:

08: k := k – 1;

09: ELSE

10: k := 0;

11: i := 1;

12: END_CASE;

01: CASE k OF

02: 1:

03: k := k * 10;

04: 2..5:

05: k := k * 5;

06: i := 0;

07: 6, 20..9:

08: k := k – 1;

09: ELSE

10: k := 0;

11: i := 1;

12: END_CASE;

В строке 7 диапазон значений задан неправильно.

01: CASE k OF

02: 1:

03: k := k * 10;

04: 2..5:

05: k := k * 5;

06: i := 0;

07: 6, 9..20:

08: k := k – 1;

09: ELSE

10: k := 0;

11: i := 1;

12: END_CASE;

При написании программ на ST возможно использование стандартных и пользовательских функций и функциональных блоков.

Общие сведения о языке IL

IL (Instruction List) представляет собой текстовый язык программирования низкого уровня, который очень похож на Assembler, но к конкретной архитектуре процессора не привязан. Он позволяет описывать функции, функциональные блоки и программы, а также шаги и переходы в языке SFC. Одним из ключевых преимуществ IL является его простота и возможность добиться оптимизированного кода для реализации критических секторов программ. Особенности IL делают его неудобным для описания сложных алгоритмов с большим количеством разветвлений.

Операторы языка

Основа языка программирования IL, как и в случае Assembler, это переходы по меткам и аккумулятор. В аккумулятор загружается значения переменной, а дальнейшее выполнение алгоритма представляет собой извлечение значения из аккумулятора и совершение над ним операций. Далее в таблице 4.1 приведены операторы языка IL.

Таблица 1 – Операторы языка IL

Оператор Описание
LD Загрузить значение операнда в аккумулятор
LDN Загрузить обратное значение операнда в аккумулятор
ST Присвоить значение аккумулятора операнду
STN Присвоить обратное значение аккумулятора операнду
S Если значение аккумулятора TRUE, установить логический операнд
R Если значение аккумулятора FALSE, сбросить логический операнд
AND Поразрядное И аккумулятора и операнда
ANDN Поразрядное И аккумулятора и обратного операнда
OR Поразрядное ИЛИ аккумулятора и операнда
ORN Поразрядное ИЛИ аккумулятора и обратного операнда
XOR Поразрядное разделительное ИЛИ аккумулятора и операнда
XORN Поразрядное разделительное ИЛИ аккумулятора и обратного операнда
NOT Поразрядная инверсия аккумулятора
ADD Сложение аккумулятора и операнда, результат записывается в аккумулятор
SUB Вычитание операнда из аккумулятора, результат записывается в аккумулятор
MUL Умножение аккумулятора на операнд, результат записывается в аккумулятор
DIV Деление аккумулятора на операнд, результат записывается в аккумулятор
GT Значение аккумулятора сравнивается со значением операнда(>(greater than)). Значение (TRUE или FALSE) записывается в аккумулятор
GE Значение аккумулятора сравнивается со значением операнда(>=greater than or equal)). Значение (TRUE или FALSE) записывается в аккумулятор
EQ Значение аккумулятора сравнивается со значением операнда (=(equal)). Значение (TRUE или FALSE) записывается в аккумулятор
NE Значение аккумулятора сравнивается со значением операнда (<>(not equal). Значение (TRUE или FALSE) записывается в аккумулятор
LE Значение аккумулятора сравнивается со значением операнда (<=(less than or equal to)). Значение (TRUE или FALSE) записывается в аккумулятор
LT Значение аккумулятора сравнивается со значением операнда (<(less than)). Значение (TRUE или FALSE) записывается в аккумулятор
JMP Переход к метке
JMPC Переход к метке при условии, что значение аккумулятора TRUE
JMPCN Переход к метке при условии, что значение аккумулятора FALSE
CAL Вызов программного или функционального блока
CALC Вызов программного или функционального блока при условии, что значение аккумулятора TRUE
CALCN Вызов программного или функционального блока при условии, что значение аккумулятора FALSE
RET Выход из POU и возврат в вызывающую программу
RETC Выход из POU и возврат в вызывающую программу при условии, что значение аккумулятора TRUE
RETCN Выход из POU и возврат в вызывающую программу при условии, что значение аккумулятора FALSE
Пример программы на языке IL

На рис. 1 приведён пример программы на языке IL, которая эквивалентна следующему логическому выражению C = A AND NOT B:

image1

Рис. 1 – Пример программы на языке IL

Первый оператор примера LD помещает значение переменной A в аккумулятор, способный хранить значения любого типа. Второй оператор ANDN выполняет «побитовое И» аккумулятора и обратного значения операнда, результат всегда помещается в аккумулятор. Последний оператор примера ST присваивает переменной C значение аккумулятора.

Общие сведения о языке LD

LD (Ladder Diagram) – графический язык, основанный на принципах релейно-контактных схем (элементами релейно-контактной логики являются: контакты, обмотки реле, вертикальные и горизонтальные перемычки и др.) с возможностью использования большого количества различных функциональных блоков. Достоинствами языка LD являются: представление программы в виде электрического потока (близко специалистам по электротехнике), наличие простых правил, использование только булевых выражений. На рис. 6.1 приведён пример программы на языке LD (слева) и ее эквивалент в виде электрической цепи с реле и выключателями (справа).

image333

Рис. 6.1 – Программа на языке LD (слева) и ее эквивалент в виде электрической (справа)

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

Объекты языка программирования LD обеспечивают средства для структурирования программного модуля в некоторое количество контактов, катушек. Эти объекты взаимосвязаны через фактические параметры или связи.

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

Основные конструкции языка

Слева и справа схема на языке LD ограничена вертикальными линиями – шинами питания. Между ними расположены цепи, образованные контактами и катушками реле, по аналогии с обычными электронными цепями. Слева любая цепь начинается набором контактов, которые посылают слева направо состояние «ON» или «OFF», соответствующие логическим значениям TRUE или FALSE. Каждому контакту соответствует логическая переменная (типа BOOL). Если переменная имеет значение TRUE, то состояние передается через контакт. Иначе – правое соединение получает значение выключено («OFF»).

Контакты могут быть соединены параллельно, тогда соединение передает состояние «логическое ИЛИ». Если контакты соединены последовательно, то соединение передаёт «логическое И».

Контакт может быть инвертируемым. Такой контакт обозначается с помощью символа |/| и передает состояние «ON», если значение переменной FALSE.

Язык LD позволяет:

  • выполнять последовательное соединение контактов;
  • выполнять параллельное соединение контактов;
  • применять нормально разомкнутые или замкнутые контакты;
  • использовать переключаемые контакты;
  • записывать комментарии;
  • включать Set/Reset-выходы (Установка/Сброс);
  • переходы;
  • включать в диаграмму функциональные блоки;
  • управлять работой блоков по входам EN.

Контакт

Контактом является LD-элемент, который передаёт состояние горизонтальной связи левой стороны горизонтальной связи на правой стороне. Это состояние – результат булевой AND-операции состояния горизонтальной связи с левой стороны с состоянием ассоциированной переменной или прямого адреса. Контакт не изменяет значения связанной переменой или прямого адреса.

Для нормальных контактов (см. рис. 6.2) состояние левой связи передается в правую связь, если состояние связанного логического фактического параметра TRUE. Иначе, состояние правой связи FALSE.

image334

Рис. 6.2 – Нормальный контакт

Для инверсных контактов (см. рис. 6.3) состояние левой связи передается в правую связь, если состояние связанного логического фактического параметра FALSE. Иначе, состояние правой связи TRUE.

image335

Рис. 6.3 – Инверсный контакт

В контактах для обнаружения нарастания фронта (см. рис 6.4) правая связь устанавливается в состояние TRUE, если переход связанного фактического параметра происходит из FALSE в TRUE, и в то же время состояние левой связи TRUE. Иначе, состояние правой связи FALSE.

image336

Рис. 6.4 – Контакт для обнаружения нарастания фронта

В контактах для обнаружения спада фронта (см. рис. 6.5) правая связь устанавливается в состояние TRUE, если переход связанного фактического параметра происходит из True в False, и состояние левой связи True в то же время. Иначе, состояние правой связи FALSE.

image337

Рис. 6.5 – Контакт для обнаружения спада фронта

Катушка

Катушка является LD-элементом, который передаёт состояние горизонтальной связи на левой стороне неизменяемым горизонтальной связи на правой стороне. В этом процессе состояние связанной переменной или прямого адреса будет сохранено.

В нормальных катушках (см. рис. 6.6) состояние левой связи передается в связанный логический фактический параметр и в правую связь.

image338

Рис. 6.6 – Нормальная катушка

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

image339

Рис. 6.7 – Инвертирующая катушка

В катушке установки (см. рис. 6.8) состояние левой связи копируется в правую связь. Связанный логический фактический параметр устанавливается в состояние TRUE, если левая связь имеет состояние TRUE, иначе он не изменяется. Связанный логический фактический параметр может сбрасываться только катушкой сброса.

image340

Рис. 6.8 – Катушка установки

В катушке сброса (см. рис. 6.9) состояние левой связи копируется в правую связь. Связанный логический фактический параметр устанавливается в состояние FALSE, если левая связь имеет состояние TRUE, иначе он не изменяется. Связанный логический фактический параметр может устанавливаться только катушкой установки.

image341

Рис. 6.9 – Катушка сброса

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

image342

Рис. 6.10 – Катушка обнаружения нарастания фронта

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

image343

Рис. 6.11 – Катушка обнаружения спада фронта

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

Шина питания

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

Пример программы на языке LD

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

C = A AND NOT B

При создании LD диаграмм можно использовать только переменные типа BOOL. Добавим новый контакт и привяжем его к имени A (имени переменной). Далее добавляется шина питания слева, шина питания справа, нормальный контакт, инверсный контакт и нормальная катушка. Нормальный контакт ассоциируется с переменной A, инверсный контакт с переменой B, нормальная катушка с переменной C. Далее это всё последовательно соединяется (см. рис. 6.12), и результатом является программа, написанная на языке LD, реализующая логическое выражение:

C = A AND NOT B

image344

Рис. 6.12 – Пример LD диаграммы, реализующей логическое выражение C = A AND NOT B

Общие сведения о языке SFC

SFC (Sequential Function Chart) расшифровывается как «Последовательность функциональных диаграмм», и является одним из языков стандарта IEC 61131-3. SFC позволяет легко описывать последовательность протекания процессов в системе.

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

Основные понятия языка SFC

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

После вызова программного модуля, описанного языком SFC, первым выполняется начальный шаг. Шаг, выполняемый в данный момент, называется активным. Действия, связанные с активным шагом, выполняются один раз в каждом управляющем цикле. В режиме выполнения активные шаги выделяются салатовым цветом. Следующий за активным шагом шаг станет активным, только если в переходе между этими шагами условие будет истинно.

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

Далее описывается каждый элемент SFC диаграммы.

Шаг

Наиболее важным элементом языка SFC является шаг, который описывает одну операцию. Шаг изображается в виде прямоугольника с собственным именем внутри (см. рис. 7.1).

image345

Рис. 7.1 – Графическое представление «Шага» языка SFC

У каждого шага может быть 3 контакта. Сверху и снизу для соединения с переходом и справа для соединения с блоком действий. Шаг предваряется переходом, который определяет условие для активации данного шага в процессе выполнения программы и отображается в виде горизонтальной черты на ветви диаграммы процесса с указанием имени и условия. Два шага никогда не могут быть соединены непосредственно, они должны всегда отделяться переходом (см. рис. 7.2).

image346

Рис. 7.2 – Шаги «step2» и «step3», соединённые переходом «tr2_3»

Любая SFC диаграмма должна содержать начальный шаг (шаг, выделенный двойной рамкой), с которого начинается выполнение диаграммы.

Переход

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

(i<= 100) AND b

либо на любом другом языке.

На рис. 7.3 приведён пример перехода между шагом «Step3» и «Step5» с именем «transition4».

image347

Рис. 7.3 – Переход между шагами «Step3» и «Step5» с предопределённым условием «transition4»

В данном случае «transition4» это имя для предопределённого перехода, который может использоваться многократно на SFC диаграмме для определения переходов между несколькими шагами. Код для него может быть представлен, например, на языке ST:

:= (flag = True AND level > 10);

На рис. 7.4 представлен переход между шагами «Step6» и «Step7» в виде обычного условия:

level > 10

image348

Рис. 7.4 – Переход между шагами «step6» и «step7» с предопределённым условием «transition4»

На рис. 7.5 представлен переход между шагами «Step8» и «Step9» в виде значения логического выражения «AND» на языке FBD:

image349

Рис. 7.5 – Переход между шагами «step8» и «step9», заданный «логическим И» на языке FBD

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

Блок действий

Каждый шаг имеет нулевое или большее количеством действий, объединённых, как правило, на диаграмме, в блок действий. На рис. 7.6 показан примера шага «evaluateStep» и связанный с ним блок действий.

image350

Рис. 7.6 – Шаг «evaluateStep» и связанный с ним блок действий, содержащий 3 действия

Блок действий определяет операции, которые должны выполняться при активации (выполнении) шага. Шаги без связанного блока действий идентифицируются как ждущий шаг. Блок действий может состоять из предопределённых действий. Каждому предопределённому действию присваивается имя (на рис. 7.6 это «action0» и «action1»). Одно действие может использоваться сразу в нескольких шагах. Действие может выполняться непрерывно, пока активен шаг, либо единожды. Это определяется специальными квалификаторами, описание которых приведено в таблице 6. Квалификаторы также могут ограничивать время выполнения каждого действия в шаге.

«Прыжок» – переход на произвольный шаг

Шаг может быть также заменён «прыжком». Последовательности шагов всегда ассоциируются с прыжком к другому шагу той же самой последовательности шагов. Это означает, что они выполняются циклически. Переход на произвольный шаг – это соединение на шаг, имя которого указано под знаком «прыжка». Такие переходы нужны для того, чтобы избежать пересекающихся и идущих вверх соединений. На рис. 7.7 показана SFC диаграмма, содержащая два «прыжка».

image351

Рис. 7.7 – SFC диаграмма, содержащая «прыжки»

Первый делает переход к шагу «init» в случае выполнения условия «transition4», второй делает переход к шагу «step1», в случае выполнения условия «transition2».

Дивергенция и конвергенция

Дивергенция – это множественное соединение в направлении от одного шага к нескольким переходам. Активируется только одна из ветвей. Условия, связанные с различными переходами в начале дивергенции, не являются взаимоисключающими по умолчанию. Взаимоисключение должно быть явно задано в условиях переходов, чтобы гарантировать, что во время выполнения программы активируется одна конкретная ветвь. Пример дивергенции на SFC диаграмме приведён на рис. 7.8 и выделен красным цветом:

image352

Рис. 7.8 – Дивергенция на SFC диаграмме

Конвергенция – это множественное соединение, направленное от нескольких переходов к одному и тому же шагу. Она обычно используется для группировки ветвей SFC – программы, которые берут начало из одинарной дивергенции. Пример конвергенции на SFC диаграмме приведён на рис. 7.9 и выделен красным цветом:

image353

Рис. 7.9 – Конвергенция на SFC диаграмме

Параллельная дивергенция – это множественное соединение, направленное от одного перехода к нескольким шагам. Она соответствует параллельному выполнению операций процесса. Пример параллельной дивергенции на SFC диаграмме приведён на рис. 7.10 и выделен красным цветом:

image354

Рис. 7.10 – Параллельная дивергенция на SFC диаграмме

Параллельная конвергенция – это соединение нескольких шагов к одному и тому же переходу. Обычно она используется для группирования ветвей, взявших начало дивергенции. Пример параллельной конвергенции на SFC диаграмме приведён на рис. 7.11 и выделен красным цветом:

image355

Рис. 7.11 – Параллельная конвергенция на SFC диаграмме

Пример программы на языке SFC

На рис. 7.12 приведен пример SFC диаграммы состоящей из начального шага «initStep», шагов «firstStep» и «secondStep» и 3 перехода.

Переход «startFlag» представляет обычную переменную типа BOOL и полностью зависит от её значения. Переход между «firstStep» и «secondStep» зависит от LD диаграммы с двумя катушками, ассоциированными с переменными типа BOOL: «in1» и «in2». Переход активируется только в том случае, если «in1» и «in2» будут TRUE. Переход между «secondStep» и прыжком на initStep активирован, когда значение переменной «value» меньше -100.

Во время действия «firstStep» выполняется увеличение переменной count на 1. Во время действия «secondStep» из переменной «value» вычитается 10.

image356

Рис. 7.12 – SFC диаграмма

Общие сведения о языке FBD

FBD (Function Block Diagram) – это графический язык программирования высокого уровня, обеспечивающий управление потока данных всех типов. Позволяет использовать мощные алгоритмы простым вызовом функций и функциональных блоков. Удовлетворяет непрерывным динамическим процессам. Замечательно подходит для небольших приложений и удобен для реализации сложных вещей подобно ПИД регуляторам, массивам и т. д. Данный язык может использовать большую библиотеку блоков, описание которых приведено в приложении 2. FBD заимствует символику булевой алгебры и, так как булевы символы имеют входы и выходы, которые могут быть соединены между собой, FBD является более эффективным для представления структурной информации, чем язык релейно-контактных схем.

Основные понятия и конструкции языка

Согласно IEC 61131­3, основными элементами языка FBD являются: переменные, функции, функциональные блоки и соединения.

Переменные бывают входные, выходные и входные/выходные. На рис. 1 показаны: входная переменная – «in_var», выходная переменная – «out_var» и входная/выходная переменная – «in_out_var».

image1

Рис. 1 – Изображение переменной в языке FBD

Графическое изображение функции приведено на рис. 2. С левой стороны располагаются вхо­ды (IN1 и IN2), с правой стороны выходы (OUT).

image2

Рис. 2 – Изображение функции в языке FBD

Аналогично, изображение функционального блока, приведённое на рис. 3, имеет с левой стороны вхо­ды (S1 и R), с правой стороны выход (Q1).

image3

Рис. 3 – Изображение функционального блока в языке FBD

Соответственно, переменные соединяются с входными и выходными параметрами функций и функциональных блоков. Входные переменные могут быть соединены только с входными параметрами функции или функционального блока, выходные переменные – только с выходными параметрами функции или функционального блока, входные/выходные переменные – как входами, так и с выходами функции или функционального блока. Также выходной параметр одной функции или функционального блока может быть напрямую соединён с входным параметром другого.

image4

Рис. 4 – Пример соединения переменных, функций и функциональных блоков

Все функциональные блоки могут быть вызваны с дополнительными (необязатель­ными) формальными параметрами: EN (входом) и ENO (выходом). Пример такого функционального блока приведен на рис. 5.

image5

Рис. 5 – Изображение элементарного функционального блока с параметрами EN/ENO

Если функциональный блок вызывается с параметрами EN/ENO и при этом значе­ние EN равно нулю, то алгоритмы, определяемые в функциональном блоке, не будут вы­полняться. В этом случае значение ENO автоматически устанавлива­ется равным 0. Если же значение EN равно 1, то алгоритмы, опреде­ляемые функциональным блоком, будут выполнены. После выполнения этих алгоритмов без ошибок значение ENO автоматически устанавливается равным 1. Если же возникает ошибка во время выполнения этих алгоритмов, то значение ENO будет установлено равным 0. Поведение функционального блока одинаково как в случае вызова функционального блока с EN = 1, так и при вызове без параметров EN/ENO.

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

image6

Рис. 6 – Изображение соединений в языке FBD

Они бывают двух видов: входное соединение и выходное выходные соединение. Основная задача соединений – передать значение из одного выхода на другой вход без прямого соединения выхода и входа. На рис. 5.7 показан пример, в котором выходное значение OUT функции BOOL_TO_INT передаётся на вход IN2 функции ADD:

image7

Рис. 7 – Пример использования соединения на FBD диаграмме

Пример программы на языке FBD

На рис. 8 приведена FBD диаграмма, состоящая из следующих функциональных блоков: SR0, AND, TP0.

image8

Рис. 8 – пример FBD диаграммы

Функциональный блок SR0 представляет собой Бистабильный SR-триггер. У него имеются входы S1, R1 и выход Q1, а так же дополнительный вход EN и выход ENO, позволяющие включать и выключать выполнение SR0. Выход Q1 с помощью соединён с входом IN1 блока AND, представляющий собой «Логическое И». Вход IN2 типа BOOL соединён с литералом «BOOL#1», который всегда положительный. Выход OUT блока AND соединён с входом IN функционального блока TP0, представляющий собой повторитель импульсов. Вход PT типа TIME, соединён с литералом «T#5s», который задаёт значение 5 секунд.

Если после запуска выполнения данного функционального блока enabled равно True и переменная S1_IN тоже True, функциональный блок SR0 начинает выполняться. На выходе OUT функционального блока AND будет значение True как только Q1 у SR0 будет равен True. Следовательно, как только OUT становится True вход IN функционального блока TP0 принимает тоже True и начинается отсчёт таймера ET (см. рис. 9).

image9

Рис. 9 – Выполнение FBD диаграммы

Пока данный таймер не достигнет значения PT выход Q у функционального блока TP0 будет равен True. При достижении таймером ET значения PT, т.е. через 5 секунд выход Q становится False (см. рис. 10).

image10

Рис. 10 – Выполнение FBD диаграммы

Как только вход IN функционального блока TP0 становится значения FALSE, счётчик ET сбрасывается в T#0s.

Beremiz: Руководство разработчика

Документация softPLC

Отладчик

Debugger code.

On «publish», when buffer is free, debugger stores arbitrary variables content into, and mark this buffer as filled Buffer content is read asynchronously, (from non real time part), and then buffer marked free again.

Defines

BUFFER_FREE
BUFFER_BUSY
__Unpack_case_t(TYPENAME)
__Unpack_case_p(TYPENAME)
__RegisterDebugVariable_case_t(TYPENAME)
__RegisterDebugVariable_case_p(TYPENAME)
__ResetDebugVariablesIterator_case_t(TYPENAME)
__ResetDebugVariablesIterator_case_p(TYPENAME)

Typedefs

typedef void (*__for_each_variable_do_fp)(dbgvardsc_t *)

Functions

void __for_each_variable_do(__for_each_variable_do_fp fp)
void *UnpackVar(dbgvardsc_t *dsc, void **real_value_p, char *flags)
void Remind(unsigned int offset, unsigned int count, void *p)
void RemindIterator(dbgvardsc_t *dsc)
int CheckRetainBuffer(void)
void InitRetain(void)
void __init_debug(void)
void InitiateDebugTransfer(void)
void CleanupRetain(void)
void __cleanup_debug(void)
void __retrieve_debug(void)
void Retain(unsigned int offset, unsigned int count, void *p)
static void BufferIterator(dbgvardsc_t *dsc, int do_debug)
void DebugIterator(dbgvardsc_t *dsc)
void RetainIterator(dbgvardsc_t *dsc)
void PLC_GetTime(IEC_TIME *)
int TryEnterDebugSection(void)
long AtomicCompareExchange(long *, long, long)
long long AtomicCompareExchange64(long long *, long long, long long)
void LeaveDebugSection(void)
void ValidateRetainBuffer(void)
void InValidateRetainBuffer(void)
void __publish_debug(void)
void RegisterDebugVariable(int idx, void *force)
void ResetDebugVariablesIterator(dbgvardsc_t *dsc)
void ResetDebugVariables(void)
void FreeDebugData(void)
int WaitDebugData(unsigned long *tick)
int GetDebugData(unsigned long *tick, unsigned long *size, void **buffer)

Variables

long buffer_state = BUFFER_FREE
char debug_buffer[BUFFER_SIZE]
char *buffer_cursor = debug_buffer
unsigned int retain_offset = 0
dbgvardsc_t dbgvardsc[]

= {

}


unsigned long __tick
struct dbgvardsc_t

Public Members

void *ptr
__IEC_types_enum type

Участие в разработке документации

Для написании документации на Beremiz используется формат restructredText.

Быстрый старт

  1. Установить Docker

  2. Загрузить исходники Beremiz:

    git clone https://github.com/jubnzv/beremiz beremiz
    
  3. Для сборки документации:

    cd beremiz/doc
    make -f Makefile.docker
    

Сгенерированные документы в форматах pdf и html будут расположны в директории beremiz/doc/build.

Настройка окружения и сборка документации

По умолчанию: Использование Docker

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

  1. Установить Docker

  2. Загрузить исходники Beremiz:

    git clone https://github.com/jubnzv/beremiz beremiz
    
  3. Для сборки документации:

    cd beremiz/doc
    make -f Makefile.docker
    

Сгенерированные документы в форматах pdf и html будут расположны в директории beremiz/doc/build.

Альтернатива: Нативная установка (Debian GNU/Linux)

Для Debian Stretch потребуется установить следующие пакеты:

apt-get -y install make \
            python2.7 \
            python-sphinx \
            python-sphinx-rtd-theme \
            doxygen \
            graphviz \
            python-breathe \
            breathe-doc \
            texlive-base \
            texlive-latex-base \
            texlive-lang-cyrillic \
            texlive-fonts-recommended \
            texlive-generic-extra \
            texlive-latex-extra \
            texlive-latex-recommended

После этого сборка может быть запущена нативно:

cd beremiz/doc
make html latexpdf

TODO

  • [ ] Текущий раздел:

    • [X] Quick start
    • [X] Linux installation notes
    • [ ] Краткое введение в rst и инструкции по настройке редакторов (emacs + pycharm)
    • [ ] Документирование кода (C-темплейты из targets и Python-код)
    • [ ] Работа с LaTeX и сборка pdf: внесение изменений в генерируемый .tex-код и модификация дефолтных опций форматирования
  • [ ] IEC Guide

    • [ ] Актуализировать информацию для текущей версии Beremiz
  • [ ] Usage Guide

    • [X] Обновить информацию; убрать функционал, относящийся к модулям ИНЭУМ
    • [ ] Разбить документ на отдельные файлы по разделам
  • [ ] Install guide

    • [ ] Обновить раздел с Windows 7
    • [ ] Установка на *nix
    • [ ] Инструкции для Windows 10