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

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

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

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

Создание нового проекта

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

../_images/image1441.png

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

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

../_images/image145.png

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

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

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

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

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

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

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

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

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

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

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

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

../_images/image147.png

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

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

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

Конфигурационные переменные проекта

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

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

../_images/image149.png

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

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

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

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

../_images/image150.png

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

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

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

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

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

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

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

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

../_images/image152.png

Рисунок 106 - Заполнение данных о проекте

Большая часть данных в информации проекте являются необязательным для заполнения, но обязательные должны быть заполнены, такие поля помечены в подсказках в именовании каждого пункта. После задания настроек проекта, как правило, следует добавление в проект необходимых программных модулей (функций, функциональных блоков и программ), реализация их алгоритмов и логики работы с помощью текстовых и графических языков стандарта 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

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

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

../_images/image154.png

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

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

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

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

../_images/image155.png

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

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

../_images/image156.png

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

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

../_images/image157.png

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

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

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

../_images/image158.png

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

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

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

../_images/image159.png

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

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

../_images/image160.png

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

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

../_images/image161.png

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

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

../_images/image162.png

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

Реализации на других языках полностью идентичны по набору входных, выходных и локальных переменных. Далее будут описаны примеры функциональных блоков на остальных четырех языках 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

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

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

../_images/image164.png

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

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

../_images/image165.png

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

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

../_images/image166.png

Рисунок 120 - Выбор коннектора для блока переменной

../_images/image167.png

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

Далее необходимо обратиться к редактору языка 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

Рисунок 122 - FBD диаграмма без соединений

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

../_images/image169.png

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

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

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

../_images/image170.png

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

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

../_images/image171.png

Рисунок 125 - Использование созданного функционального блока 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

Рисунок 126 - Добавление начального шага

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

../_images/image173.png

Рисунок 127 - Добавление альтернативного ветвления

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

../_images/image174.png

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

../_images/image175.png

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

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

../_images/image176.png

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

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

../_images/image177.png

Рисунок 131 - Шаги с действиями

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

../_images/image178.png

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

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

../_images/image179.png

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

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

../_images/image180.png

Рисунок 134 - Использование созданного функционального блока 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

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

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

../_images/image182.png

Рисунок 136 - Использование функционального блока 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

Рисунок 137 - Диалог добавления контакта

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

../_images/image184.png

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

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

../_images/image165.png

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

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

../_images/image185.png

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

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

../_images/image166.png

Рисунок 141 - Выбор коннектора для блока переменной

../_images/image167.png

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

Для написания алгоритма и логики выполнения данной программы будут добавлены две функции: «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

Рисунок 143 - LD диаграмма без соединений

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

../_images/image187.png

Рисунок 144 - Соединение блоков

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

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

../_images/image188.png

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

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

../_images/image189.png

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

Функция

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

../_images/image190.png

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

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

../_images/image191.png

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

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

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

../_images/image192.png

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

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

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

../_images/image193.png

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

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

../_images/image194.png

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

Ресурс

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

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

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

../_images/image195.png

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

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

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

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

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

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

Рисунок 153 - Выбор типа выполнения задачи

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

../_images/image197.png

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

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

../_images/image198.png

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

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

../_images/image199.png

Рисунок 156 - Добавленный итервал выполнения

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

../_images/image200.png

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

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

../_images/image201.png

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

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

../_images/image202.png

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

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

../_images/image203.png

Рисунок 160 - Выбор задачи для экземпляра

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

Типы данных

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

../_images/image204.png

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

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

../_images/image205.png

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

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

../_images/image206.png

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

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

../_images/image207.png

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

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

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

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

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

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

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

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

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

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

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

../_images/image209.png

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

Пересборку проекта можно осуществить, очистив директорию сборки проекта нажатием на кнопку «Очистить директорию сборки проекта» (см. табл.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

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

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

../_images/image2111.png

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

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

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

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

../_images/image212.png

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

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

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

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

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

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

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

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

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

../_images/image214.png

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

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

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

../_images/image215.png

Рисунок 170 - Панель отладчика

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

../_images/image216.png

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

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

../_images/image217.png

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

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

../_images/image218.png

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

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

../_images/image219.png

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

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

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

../_images/image220.png

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

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

../_images/image221.png

Рисунок 176 - Пример отлаживаемой FBD диаграммы

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

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

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

../_images/image222.png

Рисунок 177 - Отладка FBD диаграммы

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

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

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

../_images/image223.png

Рисунок 178 - Пример отладки LD диаграммы

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

../_images/image224.png

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

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

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

../_images/image225.png

Рисунок 180 - Пример отладки SFC диаграммы

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

../_images/image226.png

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

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

Cnt := ResetCounterValue;

Out := Cnt;

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

../_images/image227.png

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

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

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

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

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

../_images/image228.png

Рисунок 183 - График изменения переменных

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