Структура программы в различных ПЛК 

Структура программы в различных ПЛК

3.4

Из языков высокого уровня программисты предпочитают использовать Pascal и С, которые хорошо структурированы благодаря встроенным в них конструкциям, а к «неструктурированным» языкам, таким как BASIC или FORTRAN, относятся несколько пренебрежительно. Это отчасти несправедливо; и на языке BASIC можно писать отлично структурированные программы, но ответственность за это возлагается на программиста, а программа на языках Pascal или С может легко выродиться в макаронную, если не принять меры, препятствующие этому.

Аналогичные наблюдения можно сделать в отношении программ для ПЛК. Многие машины средних возможностей (и все малые машины) вообще не имеют встроенных структурных компонентов, предоставляя программисту самому решать, как разбить программу на модули и придерживаться строго установленного порядка. На рис. 3.5 приведена программа для небольшого ПЛК, входящего в состав системы управления трехступенчатым умягчителем воды; структура программы достаточно проста, и ошибку, скажем, в строке Fast Rinse (быстрая промывка) ступени 2 легко можно обнаружить в теле программы.

Более крупные и более совершенные машины обладают встроенными структурными конструкциями. Они в значительной степени защищают программиста от совершения ошибок подобно тому, как это имеет место в языках Pascal или С. Эти ПЛК предоставляют программисту методы разбиения программы на небольшие, легко понимаемые модули (некоторые большие машины, такие как Allen Bradley 5/250, имеют конструкции Repeat/Until, Whiledo/Endwhile, For/Next, позволяющие многократно выполнять одну и ту же операцию над блоками данных).

Наиболее структурированным языком, по-видимому, является ABB Master, который подобен компилируемым языкам высокого уровня в том, что все переменные и процедуры обязательно должны быть декларированы. Основная программа разбивается на более мелкие программы, обозначаемые PCI, РС2 и т. д. Рекомендуется, чтобы каждая из них относилась к определенной, отличной от других, сфере действия объекта, причем эти программы могут иметь различные скорости прогона.

Эти программы содержат управляющие модули, которые могуь быть задействованы или заблокированы либо могут включаться на выполнение через определенные интервалы времени. Внутри управляющих модулей находятся функциональные модули и модули последовательности операций, причем последние содержат шаги, соответствующие диаграммам состояния, описанным в разд. 2.9.2. Функциональные модули или шаги последовательности операций реализуются при помощи реальных логических элементов. Таким образом, полная программа может выглядеть так, как на рис. 3.6 (а), а на рис. 3.6 (б) показано, какую древовидную структуру она имеет для конкретного примера (почти как в MSDOS или UNIX). Фактически структура является более гибкой по сравнению с тем, как здесь было описано: так, функциональные модули могут содержать управляющие модули, может быть образована иерархия модулей по принципу главный/подчиненный, но основная идея должна быть очевидной.

Для обозначения модулей принят иерархический порядок вплоть до элементного уровня; так, на рис. 3.7 вентиль AND, обозначенный PC 1.2.3.2, представляет собой второй логический элемент функционального блока 3 в управляющем модуле 2 программы РС1 (и именно так должен быть продекларирован как часть построения базы данных). Это формальное правило обязывает программиста соблюдать определенную дисциплину.

Рис. 3.3. Структура системы управления сталеплавильной печью с помощью ПЛК и разбиение одной ветви
Рис. 3.4. Два блока из рис. 3.3 с соответствующими сигналами
Рис. 3.5. Хорошо структурированная и документированная программа для ПЛК, разбитая на области из приблизительно десяти звеньев. Это позволяет легко обнаруживать ошибки
Рис. 3.6. Внутренняя структура ABB Master: (а) типичная структура программы Master; (б) программа в виде дерева

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

Рис. 3.7. Обозначение логического вентиля в ABB Master

Рис. 3.8. Типичная внутренняя организация ПЛК Siemens

Allen Bradley в своих PLC-5 использует аналогичную идею. Программист разбивает программу высокого уровня на более мелкие программные модули, к которым при необходимости можно обратиться из основной программы. В PLC-5 все программы связываются с помощью схемы последовательности функций (SFC), которая очень напоминает диаграмму перехода состояний, описанную в разд. 2.9.2. Каждое состояние и соответствующий переход — это небольшая программа типа многоступенчатой схемы; типичный пример приведен на рис. 3.9.

Рис. 3.9. Схема последовательности функций в PLC-5 Allen Bradley
Рис. 3.10. Подпрограммы, используемые во многих ПЛК

ПЛК Allen Bradley и Siemens поддерживают концепцию подпрограмм (в Siemens они называются функциональными блоками). Это небольшие программы, которые используются для выполнения определенных задач и которые могут многократно вызываться из программы более высокого уровня (рис. 3.10). Например, некоторые ПЛК непосредственно обеспечивают вычисление тригонометрических функций (синус, косинус, тангенс). Синус угла достаточно просто вычислить, используя разложение в ряд

где значение угла х задается в радианах. В большинстве прикладных задач для достижения приемлемой точности достаточно первых трех членов. Например, синус угла 6 (theta) в градусах можно найти с помощью последовательности операций, изображенной на рис. 3.11, используя всего несколько звеньев многоступенчатой схемы или логических элементов. Давайте создадим подпрограмму под именем Sine (а как же иначе?), которая имела бы на входе угол в градусах и возвращала значение синуса предназначенной для этого переменной, как на рис. 3.11. Входная и выходная переменные называются параметрами. Каждый раз, когда нам необходимо вычислить синус угла, мы теперь можем вызвать подпрограмму Sine.

Мы можем пойти еще дальше. Косинус угла определяется выражением

cos (theta) = sin (90 - theta), (3.2)

где угол в (theta) задается в градусах, поэтому мы можем написать еще одну подпрограмму для вычисления косинуса, она представлена на рис. 3.12 (а). Заметим, что она имеет всего два блока и вызывает подпрограмму Sine (которая выполняет большую часть работы). Наконец, зная, что

tan (theta) = sin (theta)/cos (theta), (3.3)

мы можем создать подпрограмму Tangent, представленную на рис. 3.12 (б). Она вызывает как подпрограмму Sine, так и Cosine. Подпрограммы, вызываемые из подпрограммы более высокого уровня, называются «вложенными».

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

Многие ПЛК позволяют разбивать программу на исполняемые блоки; в PLC-5 Allen Bradley это можно сделать с помощью инструкции MCR (сокращение от Master Control Relay), а в GEM-80 — с помощью команды Start/End Block. Они позволяют пропустить (игнорировать) ряд звеньев, если управляющая инструкция на входе блока не является истинной, как показано на рис. 3.13. Эти инструкции кроме того, что позволяют разбить программу на небольшие блоки, способствуют также сокращению времени ее выполнения за счет игнорирования звеньев, которые в данный момент не являются необходимыми. Однако они могут среди ночи привести в замешательство обслуживающий персонал, поскольку разбиение программы является далеко не очевидным.

Рис. 3.12. Подпрограммы Cosine и Tangent (использующие подпрограмму Sine):(a) Cosine; (б) Tangent

Рис. 3.13. Пример структуры с использованием команд Start/End Block