И.А. Баранов, к.т.н. А.В. Глухов I. Baranov, А. Glukhov

advertisement
И.А. Баранов, к.т.н. А.В. Глухов (ОАО «ИНЭУМ им. И.С. Брука»)
I. Baranov, А. Glukhov
ЯЗЫКИ СТАНДАРТА IEC-61131 ДЛЯ ВЫЧИСЛИТЕЛЬНЫХ КОМПЛЕКСОВ НА
БАЗЕ ОТЕЧЕСТВЕННЫХ МИКРОПРОЦЕССОРОВ С АРХИТЕКТУРОЙ SPARC
OPEN INTERNATIONAL IEC-61131 STANDARD COMPLIANT PROGRAMMING
LANGUAGES FOR COMPUTATION SYSTEMS BASED ON RUSSIAN SPARC
ARCHITECTURE MICROPROCESSORS
Рассматриваются вопросы применения инструментальных средств разработки прикладного программного
обеспечения с использованием технологических языков стандарта IEC-61131 на вычислительных комплексах, построенных на базе отечественных микропроцессоров с архитектурой SPARC. Приводится пример процесса адаптации существующих инструментальных средств под данную платформу. Описывается механизм плагинов как интерфейс для коммуникаций с модулями УСО и системами верхнего уровня.
Ключевые слова: МЭК-61131, интегрированная среда
разработки, SPARC, ПЛК, языки программирования.
This article covers the issues of using software development
tools supporting IEC-61131 standard technological programming
languages for computation systems based on Russian SPARC architecture microprocessors. It describes the process of existing
tools adaptation to the architecture and plug-in mechanism that
serves as an interface between I/O modules and top level systems.
Keywords: IEC-61131, IDE, SPARC, PLC, programming
languages.
Введение
Управление технологическими процессами, как правило, осуществляется с помо-
щью программируемых логических контроллеров (ПЛК), или Programmable Logic
Controller (PLC). ПЛК – комплекс электронных и программных компонент и средств
(включая модули ввода-вывода), предназначенный для выполнения логических функций
(не включает в себя сенсоры, исполнительные элементы и средства взаимодействия с оператором). ПЛК пришли на смену релейно-контактным схемам управления с жесткой логикой. Программируемые контроллеры упростили схему управления технологическими
процессами и обеспечили высокий уровень надежности и долговечности.
В настоящее время ПЛК широко применяются в системах управления, решая локальные задачи участка технологического процесса и обеспечивая трансляцию данных о
процессе в системы диспетчерского контроля и управления.
Современные вычислительные комплексы на базе отечественных микропроцессоров с архитектурой SPARC (МЦСТ R-500S) являются достаточно миниатюрными и имеют
высокую производительность, что позволяет создавать на их базе ПЛК, отвечающие всем
современным требованиям по производительности, надежности и защищенности, предъявляемым к этому классу устройств.
Раньше основными средствами написания прикладных программ для ПЛК были
традиционные языки, такие как C или C++, следовательно, требовалась высокая квалификация инженеров, занимавшихся данным вопросом. С целью упрощения процесса создания прикладных программ для ПЛК был разработан международный стандарт IEC 611313, определяющий требования к высокоуровневым языкам программирования, которые
ориентированы в первую очередь на инженеров-технологов, не имеющих специальных
навыков в области программирования на традиционных языках. Поддержка языков данного стандарта является необходимым компонентом любого современного ПЛК.
Стандарт IEC 61131-3 устанавливает пять языков программирования ПЛК (три
графических и два текстовых) со следующими названиями:
 структурированный текст (ST – Structured Text);
2
 последовательные функциональные схемы (SFC – Sequential Function Chart);
 диаграммы функциональных блоков (FBD – Function Block Diagram);
 релейно-контактные схемы, или релейные диаграммы (LD – Ladder Diagram);
 список инструкций (IL – Instruction List).
Языки IEC 61131-3 базируются на определённых принципах. Вся программа разбивается на множество функциональных элементов – Program Organization Units (POU),
каждый из которых может состоять из функций, функциональных блоков и программ.
Любой элемент IEC-программы может быть сконструирован иерархически из более простых элементов. Стандарт требует строгой типизации данных. Указание типов данных
позволяет легко обнаруживать большинство ошибок в программе до ее исполнения. Имеются средства для исполнения разных фрагментов программы в разное время, с разной
скоростью, а также параллельно. Для выполнения операций в определенной последовательности, которая задается моментами времени или событиями, используется специальный язык последовательных функциональных схем (SFC). Стандарт поддерживает структуры для описания разнородных данных. Например, температуру подшипников насоса,
давление и состояние «включено-выключено» можно описать с помощью единой структуры «Pump» и передавать ее внутри программы как единый элемент данных. Стандарт
обеспечивает совместное использование всех пяти языков, поэтому для каждого фрагмента задачи может быть выбран любой, наиболее удобный, язык. Программа, написанная
для одного контроллера, может быть перенесена на любой контроллер, совместимый со
стандартом IEC 61131-3.
Любой ПЛК работает в циклическом режиме. Цикл начинается со сбора данных с
модулей ввода, затем исполняется программа ПЛК и оканчивается цикл выводом данных
в устройства вывода. Поэтому величина контроллерного цикла зависит от времени исполнения программы и быстродействия процессорного модуля.
Процесс адаптации исполнительной части существующих средств программирова3
ния ПЛК, отвечающих стандарту IEC 61131-3, под архитектурное решение унифицированных электронных модулей процессоров, являющихся вычислительным ядром создаваемых ПЛК, включает в себя следующие этапы:
 адаптация и запуск среды исполнения программ на процессорных модулях ПЛК;
 разработка функциональных блоков для интерфейсов CAN, Modbus и т.д., обеспечивающих связь с удаленными модулями ввода-вывода, другими ПЛК и системами
верхнего уровня;
 разработка функциональных блоков для обмена данными с драйверами создаваемых унифицированных электронных модулей ввода/вывода сигналов.
На данный момент существует ряд широко известных инструментов разработки
прикладных программ для ПЛК на языках стандарта IEC 61131-3, например ISaGRAF,
CoDeSyS и т.д. Но в процессе адаптации таких сред разработки для ПЛК с аппаратной частью на новой, нестандартной, архитектуре может возникнуть ряд проблем. Например,
отсутствие необходимых компиляторов под конкретную архитектуру или невозможность
внесения изменений, требующих доступа к исходному коду определённого компонента
среды. Кроме того, данные инструменты являются коммерческим продуктом и для их
применения необходимо пройти процесс лицензирования, требующий больших финансовых вложений. Существует и ряд других инструментов, одним из которых является свободно-распространяемая среда с открытым исходным кодом Beremiz (www.beremiz.org).
Возможность иметь доступ ко всем её компонентам и вносить любые изменения даёт преимущества для адаптации данного инструмента под конкретную аппаратную архитектуру,
поэтому для написания прикладных программ на языках IEC 61131-3 для вычислительных
комплексов на базе отечественных микропроцессоров с архитектурой SPARC предлагается адаптировать среду разработки Beremiz.
Обзор Beremiz
4
Beremiz представляет собой интегрированную среду разработки (IDE) прикладных
программ для ПЛК на языках стандарта IEC 61131-3. Разработчиками сформулировано
два важных требования, касающихся развития этой среды разработки в целом:
 чёткое соблюдение стандарта IEC 61131-3;
 поддержка кросс-платформенности.
Beremiz состоит из пользовательского интерфейса, где основным компонентом является редактор PLCOpen; компилятора MatIEC, преобразующего программы на языках
стандарта IEC-61131-3 в эквивалентный С код, который можно скомпилировать и выполнить на различных платформах; а также механизма плагинов, позволяющего связывать
модули устройства связи с объектом (УСО) и другие источники данных со средой исполнения Beremiz.
На рис. 1 представлена общая схема работы Beremiz. Программы, написанные на
языках стандарта IEC 61131-3, c помощью компилятора MatIEC преобразуются в эквивалентный C код, который дальше может быть скомпилирован под интересующую нас архитектуру процессора (в данном случае это архитектура SPARC). Настройки компилятора
выполняются с помощью диалогового окна, в котором можно задать путь, флаги компилятора, путь сохранения исполняемого файла.
Возможность получать или изменять внешние переменные, напрямую связанные с
датчиками и исполнительными механизмами объекта управления через модули УСО, реализуется использованием глобальных указателей. Они указывают на адреса переменных,
связанных с параметрами модулей УСО (Located Vars), а также соотнесены с переменными программ (POUs params Variables) на языках IEC 61131-3. Для пользователя эти глобальные указатели недоступны, их задача заключается в том, чтобы связать с помощью
пользовательских диалогов переменные модулей УСО (Located Vars) с переменными программ IEC 61131-3 (POUs params Variables).
5
MatIEC
IEC to C
compiler
IEC-61131-3
Languages
GCC SPARC
crosscompiler
function
calls
[debug /
read
trace code] write
Target
specific
code
run (tick)
SoftPLC
function
calls
POUs params
Variables
read
write
IEC std
lib
Located Vars
User
code
ANSI-C
code
IO lib
Рис. 1
Общая схема работы системы Beremiz
Доступ к переменным модулей УСО осуществляется с помощью плагинов. Они
могут быть добавлены в Beremiz для каждого конкретного модуля или для другого внешнего интерфейса данных. В окне плагинов каждый отдельный модуль имеет свой идентификатор, например: 0.0.x, 0.1.x. Вместо «x» подставляется конкретный идентификатор переменной, который используется при её именовании. Таким образом, достигается уникальность именования всех генерируемых перемененных и функций в целом для написанной программы.
Процесс написания программ осуществляется с помощью специальных визуальных
редакторов языков стандарта IEC 61131-3, соответствующих спецификации «XML formats
for IEC 61131-3», принятой международной организацией PLCOpen. Это даёт возможность открывать их в других средах разработки, поддерживающих описанный выше стандарт. Сами редакторы написаны на языке Python с использованием кросс-платформенной
библиотеки wxWidgets. Это позволяет обеспечить хорошую переносимость системы
Beremiz между различными платформами, такими как Windows, Linux, QNX и т.д.
Beremiz полностью поддерживает три типа различных высокоуровневых про6
граммных блоков стандарта IEC 61131-3: функции, функциональные блоки и программы.
Они могут быть запрограммированы в одном из двух текстовых (IL или ST) или графических (LD или FBD) языков. Также определён графический язык SFC для создания конечных автоматов. Следующим этапом после написания программы на языках IEC 61131-3,
используя редакторы Beremiz, является её преобразование в C код с помощью компилятора MatIEC.
Редакторы обладают средствами для экспорта программ на языках FB, LD и SFC в
эквивалентные им программы на языках ST и IL. Соответственно, задача компилятора
MatIEC создать эквивалентный языкам ST и IL код на языке C. Его работа состоит в выполнении четырёх основных этапов: лексический анализ, синтаксический анализ, семантический анализ, генерация исходного кода на языке C – а далее уже C-компилятор под
определённую платформу генерирует исполняемый код.
Код на языках ST и IL легко переносится в C, т.к. многие конструкции языков ST и
IL доступны и в C. Функциональные блоки и программы отображаются в C коде в виде
структур, содержащих все внутренние и интерфейсные переменные для функциональных
блоков и программ. В результате полученный код на языке C является самодостаточным и
самовызываемым, что позволяет переносить его на различные платформы, на которых
есть C-компилятор.
Разработка плагинов
Для адаптации среды Beremiz под конкретное УСО, необходимо разработать и добавить соответствующий плагин. Основные его функции – это обеспечение интерфейса
между переменными Beremiz и внешними переменными процесса, а также пользовательский интерфейс настройки проекта. Каждый плагин может поддерживать интерфейс к какому-то определённому модулю, либо к некоторому семейству модулей. Тем самым есть
возможность построения некоторой иерархии интерфейсов для работы с внешними дан7
ными. Один из примеров плагина – интерфейс для работы с семейством модулей дискретного ввода и вывода.
Добавление нового плагина реализуется с помощью создания новых классов на
языке программирования Python и определения в них следующих методов: генерации кода
на языке C для обращения к параметрам модуля, описания работы диалогов пользовательского интерфейса для удобного доступа к переменным модулей УСО, возможности дополнительной конфигурации плагина, сохранения настроек и т.д.
Beremiz автоматически определяет все установленные плагины. Файлы каждого
плагина должны находиться в отдельной папке, которая располагается в beremiz\plugins,
например, beremiz\plugins\testModules. В ней необходимо создать файл __init__.py, содержащий следующий код на языке Python: from <название файла с классами плагина, без
расширения py> import *. Соответственно, если описание классов находится в файле
testmodules.py, то в папке testModules располагаются два файла: testmodules.py и
__init__.py, содержащий from testmodules import *. Отметим, что в этой папке могут находиться и другие файлы, например, содержащие описание пользовательского интерфейса
диалогов плагина и т.д.
Плагин реализуется в классе под названием RootClass (см. листинг 1), а сами модули, семейство которых он определяет, описываются в члене класса PlugChildsTypes, представляющем собой список кортежей. Для каждого конкретного модуля в этом списке описывается его идентификатор, название класса, определяющего реализацию этого модуля, а
также название, отображаемое в пользовательском интерфейсе Beremiz.
Листинг 1:
class RootClass:
PlugChildsTypes = [ ( "MDO_16", MDO16, "MDO16" ),
( "MDV_16", MDV16, "MDV16" ), ]
def PlugGenerate_C( self, buildpath, locations ):
return [],"",False
8
Реализованы классы MDV16 и MDO16, соответствующие модулю дискретного
ввода и модулю дискретного вывода. Благодаря тому, что Python является объектноориентированным языком, появляется возможность построить иерархию, в которой базовые классы содержат методы, характерные для всех модулей, а производные классы –
только для конкретного модуля. Тем самым отсутствует необходимость написания одного
и того же кода для разных модулей.
Главной задачей плагина является генерация кода на языке C, описывающего реализацию функций, с помощью которых считываются значения параметров модулей УСО
(или других источников данных) в переменные или в соответствии со значением переменной изменяются эти параметры. Определяются глобальные указатели, указывающие на
адреса этих переменных, с другой стороны, эти указатели связываются с одной или несколькими переменными программ на языках IEC 61131-3. В листинге 2 показано, как
глобальный указатель __IX0_1_1 связывает с переменной PIN1IN программы на языке
IEC 61131-3.
Листинг 2:
void PROG_init__(PROG *data__, BOOL retain) {
__INIT_LOCATED(BOOL,__IX0_1_1,data__->PIN1IN,retain)
__INIT_LOCATED_VALUE(data__->PIN1IN,__BOOL_LITERAL(FALSE))
…
Таким образом, эти указатели являются интерфейсом для доступа высокоуровневых программ, написанных на Beremiz, к низкоуровневым параметрам модулей УСО.
Определение этих глобальных указателей и функций на языке C генерируется с помощью
метода PlugGenerate_C (см. листинг 3), который будет иметь разную реализацию в классах
MDV16 и MDO16.
Листинг 3:
def PlugGenerate_C( self, buildpath, locations ):
// объявление глобальных интерфейсных указателей
9
// генерация кода методов __init, __retrieve, __publish
// сохранение этого кода в определённый *.c файл
Названия глобальных указателей при генерации кода берутся из входного аргумента locations функции PlugGenerate_C. Данный аргумент представляет собой список описаний структур, в которых хранятся описания тех внешних переменных, которые используются в программах на языках IEC 61131-3, т.е. соотнесены с переменными этих программ.
Генерируемая функция __init определяет C код начальной инициализации всех переменных модулей УСО, внешних протоколов и глобальных указателей. Необходима
также генерация функций __retrieve и __publish. Первая нужна для получения значений
обновлённых параметров модуля и занесения их в соответствующие переменные, связанные с ними (как уже упоминалось, на эти переменные указывают глобальные указатели,
которые используются в программах на языках IEC 61131-3). Аналогично и с функцией
__publish, только она предназначена для изменения определённого параметра модуля в
соответствии со значением переменной, связанной с этим параметром. Для получения и
изменения параметров модуля используются низкоуровневые функции драйверов физических устройств.
Листинг 4:
int __init_0_1( int argc,char **argv )
{
// инициализация глобальных указателей
}
void __retrieve_0_1( void )
{
// считывание параметров с физических устройств
// и заполнение значениями этих параметров
// глобальных переменных, связанных с ними
}
10
void __publish_0_1( void )
{
// изменение параметров физических устройств
// в соответствии со значением глобальных переменных,
// связанных с каждым параметром
}
Для всех модулей вызов функций retrieve и publish происходит через заданные интервалы времени каждым созданным экземпляром программы в Beremiz. Частота обращения к ним определяется задачей (task), связанной с конкретным экземпляром программы в
конфигурации. К названиям переменных, указателей и функций (см. листинг 4) в конце
добавляется идентификатор, определяемый в зависимости от идентификатора плагина и
конкретного добавленного модуля, чтобы исключить конфликт глобальных имён.
На данный момент широкое распространение в мире имеет операционная система
Windows, в связи с чем представляется важным предоставить разработчику программ
ПЛК возможность работать именно под этой операционной системой. Для этого в первую
очередь необходим компилятор, позволяющий из сгенерированного Beremiz кода на языке
C в операционной системе Windows получать исполняемый код под архитектуру процессора SPARC. Для таких целей существуют кросс-компиляторы GCC, которые могут быть
собраны с помощью специальных скриптов crosstool. Для работы данного компилятора
под операционной системой Windows необходима оболочка-эмулятор Unix-подобной системы. Эту задачу будет решать среда Cygwin.
Обзор Cygwin
Cygwin представляет собой UNIX-подобную среду и интерфейс командной строки
для Microsoft Windows. Он обеспечивает тесную интеграцию приложений, данных и ресурсов Windows с приложениями, данными и ресурсами UNIX-подобной среды. Из среды
11
Cygwin можно запускать Windows приложения, также можно использовать инструменты
Cygwin из Windows.
Данная UNIX-подобная среда состоит из двух частей: динамически подключаемой
библиотеки (DLL) cygwin1.dll, которая обеспечивает совместимость API и реализует значительную часть стандарта POSIX, и огромной коллекции приложений, которые обеспечивают привычную среду UNIX. Cygwin представляет собой инструмент для переноса
программного обеспечения UNIX в Windows и библиотеку, реализующую интерфейс прикладного программирования POSIX на основе системных вызовов Win32. Кроме того,
Cygwin включает в себя инструменты разработки GNU для выполнения основных задач
программирования, а также некоторые прикладные программы, эквивалентные базовым
программам UNIX. Cygwin и связанные с ним программные средства распространяются
на основе GNU (General Public License).
Обзор Crosstool
Crosstool представляет собой набор сценариев для сборки инструментариев компиляции под требуемую архитектуру аппаратной части различных вычислительных комплексов. С их помощью происходит процесс сборки набора необходимых пакетов программ для компиляции и генерации выполняемого кода из исходных текстов программ
ОС Linux.
Пример сценария для сборки компиляторов C и C++ под архитектуру SPARC:
#!/bin/sh
set -ex
TARBALLS_DIR=$HOME/downloads
RESULT_TOP=/opt/crosstool
export TARBALLS_DIR RESULT_TOP
GCC_LANGUAGES="c,c++"
export GCC_LANGUAGES
12
mkdir -p $RESULT_TOP
eval `cat sparc.dat gcc-3.4.3-glibc-2.3.5-tls.dat` sh all.sh -notest
echo Done.
В сценарии указываются необходимые языки, версии компилятора и библиотеки
glib, а также куда будут помещены собранные компиляторы.
Таким образом, собрав под запущенной в операционной системе Windows оболочкой Cygwin компилятор gcc (и все необходимые для него библиотеки) требуемой версии и
под требуемую архитектуру (в данном случае SPARC), появляется возможность написания программ на языке C в среде Windows под отечественные вычислительные комплексы
на базе микропроцессоров с архитектурой SPARC. Заключительным шагом является добавление нового компилятора в Beremiz. Этот механизм подобен добавлению нового плагина, описанному выше. Необходимо также создать конфигурационный файл для нового
компилятора, описывающий настройки компилятора, изменение которых предоставляются пользователю в диалогах.
В результате появляется возможность создания прикладных программ на языках,
отвечающих стандарту IEC 61131-3, для вычислительных комплексов на базе отечественных микропроцессоров SPARC из операционной системы Windows. Благодаря поддержке
Beremiz ряда международных стандартов, программы, написанные в этой среде, обладают
хорошей переносимостью и могут быть использованы в других продуктах, таких как
ISaGRAF, CoDeSys и т.д. Всё это позволяет иметь полноценную среду создания прикладных программ, адаптированную для разрабатываемого отдельного класса устройств (программируемые логические контроллеры) на базе отечественных микропроцессоров с архитектурой SPARC.
13
Download