S3 - это надежность

  • S3 - это аппаратная защита кода и данных критически важных задач благодаря сверхнадежной RTOS QNX.
  • S3 - это постоянный мониторинг состояния процессов, их диагностика, перезапуск, протоколирование ситуаций
  • S3 - это защита переменных, а не элеменов интерфейса от несанкционированного изменения
  • S3 - это более чем 8 успешных лет опыта использования программного продукта SilverTM , предшественника S3

Содержание материала

Программирование S3

Создадим простейший демонстрационный пример, на основе ПЛК DVP20SX, потому что в нем есть встроенные потенциометры для иммитации аналогового сигнала. Вообще программирование ПЛК Delta очень мало отличается от серии к серии.

Наш демонстрационный пример будет делать следующее:

  • Выводить значение текущего состояния выхода Y0 на экран ввиде лампочки

  • Управлять выходом Y1 кнопкой

  • Разрешать и запрещать внутренний потенциометр еще одной кнопкой

  • Выводить значение потенциометра в столбик и ввиде цифрового значения.

Создаем глобальный S3 проект, в котором создаем S3-HMI проект.

Для этого нажимаем CTRL-N ( либо через меню, кнопку на панели, либо по правому щелчку мыши в окне проект - кому как удобнее).

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

S3-1.jpg

В окне проекта появится узел DemoPLC. Щелкаем правой кнопкой мышы на нем и в выпадающем меню выбираем “Создать проект”-> “HMIProject”

s3-2.jpg

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

S3-3.jpg

Добавляем универсальный Modbus драйвер, устанавливаем его свойства.

s3-6.jpg

Тип связи serial, режим master.

В поле “Устройство” прописываем в случае Windows COM7, в случае Ubuntu /dev/ttyUSB0

Устанавливаем параметры порта 9600, even, 8, 1.

Поле “Задержка ответа” - это таймаут, время в микросекундах,в течении которого S3 будет ждать ответ от контроллера, по истечении которого будет выставляться ошибка обмена. Слишком маленькое время может не дать успеть контроллеру сформировать ответ. Слишком большое время приведет к “залипанию” цикла обмена на станции, с которой потеряна связь на длительное время. Для нашего случая 0.2 сек - достаточно. Вводим 200000 микросекунд.

Остальные параметры - как на картинке.

К драйверу добавляем новый узел (станцию), в параметрах узла указываем его адрес в сети Modbus (номер). Так как  в нашем ПЛК мы установили адрес 1, то ставим номер узла 1.

S3-5.jpg

В дереве узла появляются разделы IS (Input Single, битовый вход, только чтение), CS (Coil Single, единичная обмотка реле, чтение и запись), HR (Holding Register регистр на чтение и запись) , IR (Input Register, входной регистр).

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

Во-первых входы и выходы ПЛК Delta Electronics нумеруются в восьмеричной системе исчисления.  Т.е. например, после выходя с номером Y7, следующим будет Y10, после X17 следующий X20, и так далее. Т.е. порядковый десятичный номер например входа X27 будет 2*8^1+7=23.

Расположение внутренних регистров  ПЛК Delta Electronics различных типов приведены в Таблице 1

Устройство

Диапазон

Тип

Адрес (Hex)

Эффективный диапазон

ES/EX/SS

SA/SX/SH

EH

S

000~255

бит

0000~00FF

0~127

0~1023

0~1023

S

246~511

бит

0100~01FF

S

512~767

бит

0200~02FF

S

768~1023

бит

0300~03FF

X

000~377 (Octal)

бит

0400~04FF

0~177

0~177

000~377

Y

000~377 (Octal)

бит

0500~05FF

T

000~255

бит/ слово

0600~06FF

0~127

000~255

000~255

M

000~255

бит

0800~08FF

0~1279

0~4095

0000~4095

M

256~511

бит

0900~09FF

M

512~767

бит

0A00~0AFF

M

768~1023

бит

0B00~0BFF

M

1024~1279

бит

0C00~0CFF

M

1280~1535

бит

0D00~0DFF

M

1536~1791

бит

B000~B0FF

M

1792~2047

бит

B100~B1FF

M

2048~2303

бит

B200~B2FF

M

2304~2559

бит

B300~B3FF

M

2560~2815

бит

B400~B4FF

M

2816~3071

бит

B500~B5FF

M

3072~3327

бит

B600~B6FF

M

3328~3583

бит

B700~B7FF

M

3584~3839

бит

B800~B8FF

M

3840~4095

бит

B900~B9FF

C

0~199

16-бит

бит/слово

0E00~0EC7

0~127

0~199

0~199

200~255

32-бит

бит/ 2xслово

0EC8~0EFF

232~255

200~255

200~255

D

000~256

слово

1000~10FF

0~1311

0~4999

0000~9999

D

256~511

слово

1100~11FF

D

512~767

слово

1200~12FF

D

768~1023

слово

1300~13FF

D

1024~1279

слово

1400~14FF

D

1280~1535

слово

1500~15FF

D

1536~1791

слово

1600~16FF

D

1792~2047

слово

1700~17FF

D

2048~2303

слово

1800~18FF

D

2304~2559

слово

1900~19FF

D

2560~2815

слово

1A00~1AFF

D

2816~3071

слово

1B00~1BFF

D

3072~3327

слово

1C00~1CFF

D

3328~3583

слово

1D00~1DFF

D

3584~3839

слово

1E00~1EFF

D

3840~4095

слово

1F00~1FFF

D

4096~4351

слово

9000~90FF

D

4352~4607

слово

9100~91FF

D

4608~4863

слово

9200~92FF

D

4864~5119

слово

9300~93FF

D

5120~5375

слово

9400~94FF

D

5376~5631

слово

9500~95FF

D

5632~5887

слово

9600~96FF

D

5888~6143

слово

9700~97FF

D

6144~6399

слово

9800~98FF

D

6400~6655

слово

9900~99FF

D

6656~6911

слово

9A00~9AFF

D

6912~7167

слово

9B00~9BFF

D

7168~7423

слово

9C00~9CFF

D

7424~7679

слово

9D00~9DFF

D

7680~7935

слово

9E00~9EFF

D

7936~8191

слово

9F00~9FFF

D

8192~8447

слово

A000~A0FF

D

8448~8703

слово

A100~A1FF

D

8704~8959

слово

A200~A2FF

D

8960~9215

слово

A300~A3FF

D

9216~9471

слово

A400~A4FF

D

9472~9727

слово

A500~A5FF

D

9728~9983

слово

A600~A6FF

D

9984~9999

слово

A700~A70F

 

Адрес выхода Y0 будет 0x500, а Y1 - 0x501 (0x500 + порядковый номер выхода)

Значение потенциометра VR0 контроллера выводится в регистр D1178 в виде слова.  Смотрим таблицу - регистры с адресами D1024-D1278 отображаются в адресное пространство 0x1400-0x14FF.  Смещение нашего регистра относительно начала окна = 1178-1024 = 154 или 0x9A в шестнадцатеричной системе (можно воспользоваться калькулятором Windows для перевода систем исчисления).. Тогда адрес Modbus у него будет 0x1400+0x9A = 0x149A

Но, согласно документации Delta, необходимо сначала разрешить считывание этого потенциометра путем взвода служебного бита M1178. Аналогично, по таблице находим, что M1024~1279 отображаются в адреса 0x0C00~0xCFF. Смещение M1178 относительно начала окна 1178-1024=154 или 0x9A. Адрес Modbus этого бита будет 0x0C00+0x9A=0xC9A.

Щелкаем два раза мышкой по иконке CS в окне проекта - откроется окно каналов. Переходим в это окно, из выпадающего меню выбираем - “Создать канал” ( либо просто нажимаем Insert ).

Правой кнопкой вызываем то-же меню и отмечаем “Шест. адрес” - шестнадцатеричный режим адресов. В поле адрес вводим “500”, на экране отображается 0x500. В поле Описание вводим произвольное описание, например “Y0” (не обязательно).

S3-7.jpg

В поле переменная начинаем вводить ее имя.

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

До той поры, как имя является уникальным, оно отображается красным. Если же такая переменная уже есть в системе - ее имя отобразится черным. По завершению ввода “черная” переменная привяжется к каналу, “красная” переменная будет создана через диалог создания переменной. Начинаем вводить “Lamp” - это первая переменная в проекте, поэтому она отображается красным. По завершении ввода открывается диалог.

S3-8.jpg

Выбираем “Обновление” 0.1 сек, вводим описание - “Состояние Y0”.

Аналогично добавляем следующий канал. По умолчанию S3 присвоит ему следующий адрес - 0x501. Нас это устраивает. Выберем для имени переменной Pump и проделаем все то-же самое.

Добавляем 3-й битовый канал Modbus для разрешения чтения потенциометра. В поле адрес вводим C9A. Называем переменную Enable. Все то-же самое, только для разнообразия будем писать изменения этой переменной в протокол. Зададим сообщение для состояния “Истина” и “Ложь” (1 и 0).

S3-9.jpg

Осталось подключить потенциометр. Дважды щелкаем в окне проекта на иконке HR. Открывается окно списка каналов типа регистр.

Добавляем канал, переводим в 16-ти ричный режим адреса  и в поле адрес вводим “149A”. Отображается 0x149A. Называем переменную VR0.

S3 считает, что инфорямация по Modbus всегда передается уже в физической величине. Поэтому физическая шкала, либо шкала инженерных величин не используется для масштабирования, однако может использоваться в скриптах и для отображения. Зададим ее 0~100 ( не обязательно). Зададим технологический диапазон 30~50, по достижению 50% будем формировать тревогу. Удалять состояние тревоги будем по исчезновению условия аварийной ситуации:

s3-10.jpg

Собственно все. Каналы сконфигурированы, переменные созданы и подключены. Теперь эти переменные можно использовать в любых компонентах S3, на любых узлах распределенной системы упраления. Имя переменной становится глобальным в рамках одного проекта и к нему можно обратится в любом редакторе. Если необходимо обратится к переменной из другого проекта, тогда обращение выполняется в форме имя_переменной@имя_проекта

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

Из выпадающего меню на правый клик на иконке Display проекта выбираем “Создать мнемосхему…”. В диалоге вводим имя мнемосхемы, опять только английскими буквами, система не даст ввести другие, и ее размеры.

s3-11.jpg

Откроется редактор мнемосхем. Сделаем виртуальную лампочку  из виджета “Текст”. Берем из палитры элемент “Текст” и располагаем его на мнемосхеме. Дважды щелкаем по нему - откроется окно свойств. Меняем по вкусу цвета, шрифты, границы, выводимый текст и т.п.

s3-12.jpg

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

Из выпадающего меню при щелчке на нашем виджете, выбираем - “Добавить событие”. Из списка доступных событий выбираем - “Изменение переменной”. С помощью последующих диалогов выбираем переменную Lamp. Если вы точно помните имя переменной, то ее можно просто напечатать в диалоге “Свойство события”. Иногда это быстрее, особенно, если в системе много переменных. Если вы не ошиблись, то имя переменной будет отображаться черным и последующих диалогов не возникнет, если же такой переменной S3 не знает, то по завершению редактирования откроется следующий диалог выбора.

s3-13.jpg

Из выпадающего меню по правому клику на лампочке выбираем “Добавить Действие”. Из меню вариантов действий выбираем “Изменить фон”.

s3-14.jpg

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

s3-15.jpg

Все эти же действия можно было добавить и из окна “События и действия”, которое открывается по горячей клавише CTRL-3, либо из меню. В окне можно редактировать события и действия, а так же вырезать и копировать их между компонентами.

Теперь наша лампочка будет отображаться зеленым цветом, если Y0 = 0 и красным, если Y0 =1. Напомним, что в ПЛК Delta к Y0 подключен односекундный меандр из M1013

Управлять выходом Y1 будем кнопкой. Берем из палитры виджет “Кнопка” , устанавливаем его на мнемосхему, редактируем свойства по вкусу. Мы можем использовать любое изображение в качестве кнопки. Например изображение объекта, который эта кнопка включает. Устанавливаем в свойствах кнопки изображение и убираем текст. Добавляем событие - клик левой кнопкой и действие toggle. В поле переменной для действие toggle вводим переменную Pump

s3-16.jpg

Теперь по нажатию на кнопку с изображением насоса, значение переменной Pump будет инвертироваться.  В отличие от многих интерфейсов общего назначения, где нажатие кнопки происходит как по одинарному, так и по двойному щелчку, S3 нажимает кнопку строго по одинарному щелчку. Поэтому, если вы будете слишком быстро щелкать мышью, кнопка не будет нажиматься. Это сделано преднамеренно, исходя из опыта эксплуатации человеко-машинных интерфейсов АСУ ТП и исключает ненужные срабатывания пускателей и пуски механизмов из-за небрежности оператора.

Для взведения бита M1178 , который привязан к переменной Enable будем использовать еще одну кнопку. Но, для демонстрации работы скриптов, на событие клик левой кнопкой определим действие вызвать скрипт. Возьмите в палитре еще одну кнопку, напишите что-нибудь в поле текст. Например “Разрешить чтение VR0”. Привяжите событие - “Клик левой кнопкой мыши”, к которому привяжите действие “Вызвать скрипт”.

Откроется окно редактора скриптов на языке ST согласно МЭК-61131.

s3-20.jpg

Введите следующий скрипт.

if Enable then
setComponentProperty("PtButton_1", "font","Arial;9;")
Enable := false
else
setComponentProperty("PtButton_1","font","Arial;10;b")
Enable := true
end_if

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

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

s3-19.jpg

Если в скрипте - ошибка, окно редактора не будет закрываться при попытке его закрыть, а строка с ошибкой будет подсвечена.

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

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

s3-21.jpg

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

S3-22.jpg

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

Теперь можно запустить проект на выполнение. Переводим ПЛК в режим Run, если он не был переведен. Затем просто нажимаем F5, либо кликаем кнопку.

S3-23.jpg

Появится диалог загрузки проекта. В принципе мы можем запускать и инсталлировать проект и удаленно, на удаленной машине, если там установлена S3-HMI с менеджером проектов.

s3-24.jpg

На экране появится наша простейшая  мнемосхема:

S3-25.jpg

В S3 намеренно сделано так, что основную мнемосхему, в отличие от других, невозможно закрыть, она не имеет привычных элементов управления. Закрыть ее можно только из IDE, нажав CTRL-F5, либо из скрипта, который можно присоединить к элементу управления, доступ к которому может быть открыт только нужным пользователям. Сделано это для того, что бы оператор по небрежности не потерял контроль над серьезным объектом.

И так, лампочка должна мигать с периодом 1 сек, при нажатии на насос должен включаться/отключаться выход Y0 ПЛК, после нажатия на кнопку “Разрешить чтение VR0”,значение резистора будет выводится в столбик, а столбик будет менять цвет. Кроме того, должна срабатывать тревога, установленная в свойствах переменной VR0. В протокол работы системы должны записываться срабатывания переменных, для которых был установлен признак “Запись в протокол”.

S3-28.jpg

s3.com.ua