Создадим простейший демонстрационный пример, на основе ПЛК DVP20SX, потому что в нем есть встроенные потенциометры для иммитации аналогового сигнала. Вообще программирование ПЛК Delta очень мало отличается от серии к серии.
Наш демонстрационный пример будет делать следующее:
-
Выводить значение текущего состояния выхода Y0 на экран ввиде лампочки
-
Управлять выходом Y1 кнопкой
-
Разрешать и запрещать внутренний потенциометр еще одной кнопкой
-
Выводить значение потенциометра в столбик и ввиде цифрового значения.
Создаем глобальный S3 проект, в котором создаем S3-HMI проект.
Для этого нажимаем CTRL-N ( либо через меню, кнопку на панели, либо по правому щелчку мыши в окне проект - кому как удобнее).
Вводим имя проекта, например DemoPLC. В поле описания можно ввести любой опциональный текст, он потом поможет выбрать нужный проект прямо из окна выбора, не загружая проект.
В окне проекта появится узел DemoPLC. Щелкаем правой кнопкой мышы на нем и в выпадающем меню выбираем “Создать проект”-> “HMIProject”
Вводим имя проекта английскими буквами, другие не введутся. Так как мы не собираемся инсталлировать проект на рабочем месте с помощью менеджера проектов, то в поле порт выбираем любой свободный порт на компьютере, например 8887.
Добавляем универсальный Modbus драйвер, устанавливаем его свойства.
Тип связи serial, режим master.
В поле “Устройство” прописываем в случае Windows COM7, в случае Ubuntu /dev/ttyUSB0
Устанавливаем параметры порта 9600, even, 8, 1.
Поле “Задержка ответа” - это таймаут, время в микросекундах,в течении которого S3 будет ждать ответ от контроллера, по истечении которого будет выставляться ошибка обмена. Слишком маленькое время может не дать успеть контроллеру сформировать ответ. Слишком большое время приведет к “залипанию” цикла обмена на станции, с которой потеряна связь на длительное время. Для нашего случая 0.2 сек - достаточно. Вводим 200000 микросекунд.
Остальные параметры - как на картинке.
К драйверу добавляем новый узел (станцию), в параметрах узла указываем его адрес в сети Modbus (номер). Так как в нашем ПЛК мы установили адрес 1, то ставим номер узла 1.
В дереве узла появляются разделы 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” (не обязательно).
В поле переменная начинаем вводить ее имя.
Внимание - имя переменной должно быть английским, запрещенные символы просто не введутся.
До той поры, как имя является уникальным, оно отображается красным. Если же такая переменная уже есть в системе - ее имя отобразится черным. По завершению ввода “черная” переменная привяжется к каналу, “красная” переменная будет создана через диалог создания переменной. Начинаем вводить “Lamp” - это первая переменная в проекте, поэтому она отображается красным. По завершении ввода открывается диалог.
Выбираем “Обновление” 0.1 сек, вводим описание - “Состояние Y0”.
Аналогично добавляем следующий канал. По умолчанию S3 присвоит ему следующий адрес - 0x501. Нас это устраивает. Выберем для имени переменной Pump и проделаем все то-же самое.
Добавляем 3-й битовый канал Modbus для разрешения чтения потенциометра. В поле адрес вводим C9A. Называем переменную Enable. Все то-же самое, только для разнообразия будем писать изменения этой переменной в протокол. Зададим сообщение для состояния “Истина” и “Ложь” (1 и 0).
Осталось подключить потенциометр. Дважды щелкаем в окне проекта на иконке HR. Открывается окно списка каналов типа регистр.
Добавляем канал, переводим в 16-ти ричный режим адреса и в поле адрес вводим “149A”. Отображается 0x149A. Называем переменную VR0.
S3 считает, что инфорямация по Modbus всегда передается уже в физической величине. Поэтому физическая шкала, либо шкала инженерных величин не используется для масштабирования, однако может использоваться в скриптах и для отображения. Зададим ее 0~100 ( не обязательно). Зададим технологический диапазон 30~50, по достижению 50% будем формировать тревогу. Удалять состояние тревоги будем по исчезновению условия аварийной ситуации:
Собственно все. Каналы сконфигурированы, переменные созданы и подключены. Теперь эти переменные можно использовать в любых компонентах S3, на любых узлах распределенной системы упраления. Имя переменной становится глобальным в рамках одного проекта и к нему можно обратится в любом редакторе. Если необходимо обратится к переменной из другого проекта, тогда обращение выполняется в форме имя_переменной@имя_проекта
Создадим простейшую мнемосхему для отображения значений переменных и управления выходами контроллера.
Из выпадающего меню на правый клик на иконке Display проекта выбираем “Создать мнемосхему…”. В диалоге вводим имя мнемосхемы, опять только английскими буквами, система не даст ввести другие, и ее размеры.
Откроется редактор мнемосхем. Сделаем виртуальную лампочку из виджета “Текст”. Берем из палитры элемент “Текст” и располагаем его на мнемосхеме. Дважды щелкаем по нему - откроется окно свойств. Меняем по вкусу цвета, шрифты, границы, выводимый текст и т.п.
Каждый элемент мнемосхемы может реагировать на одно, либо несколько событий, путем выполнения одного, либо нескольких действий, на каждое такое событие. Кроме того, из языка ST, который S3 использует в качестве скриптового, можно программно менять любое свойство из диалога выше. Этим достигается гибкость и разнообразие вариантов использования небольшого количества базовых виджетов S3.
Из выпадающего меню при щелчке на нашем виджете, выбираем - “Добавить событие”. Из списка доступных событий выбираем - “Изменение переменной”. С помощью последующих диалогов выбираем переменную Lamp. Если вы точно помните имя переменной, то ее можно просто напечатать в диалоге “Свойство события”. Иногда это быстрее, особенно, если в системе много переменных. Если вы не ошиблись, то имя переменной будет отображаться черным и последующих диалогов не возникнет, если же такой переменной S3 не знает, то по завершению редактирования откроется следующий диалог выбора.
Из выпадающего меню по правому клику на лампочке выбираем “Добавить Действие”. Из меню вариантов действий выбираем “Изменить фон”.
В следующем диалоге задаем варианты фона для нуля и единицы. Если бы у нас была аналоговая переменная, мы могли бы задать градиент и плавно менять цвет в зависимости от значения переменной по градиенту.
Все эти же действия можно было добавить и из окна “События и действия”, которое открывается по горячей клавише CTRL-3, либо из меню. В окне можно редактировать события и действия, а так же вырезать и копировать их между компонентами.
Теперь наша лампочка будет отображаться зеленым цветом, если Y0 = 0 и красным, если Y0 =1. Напомним, что в ПЛК Delta к Y0 подключен односекундный меандр из M1013
Управлять выходом Y1 будем кнопкой. Берем из палитры виджет “Кнопка” , устанавливаем его на мнемосхему, редактируем свойства по вкусу. Мы можем использовать любое изображение в качестве кнопки. Например изображение объекта, который эта кнопка включает. Устанавливаем в свойствах кнопки изображение и убираем текст. Добавляем событие - клик левой кнопкой и действие toggle. В поле переменной для действие toggle вводим переменную Pump
Теперь по нажатию на кнопку с изображением насоса, значение переменной Pump будет инвертироваться. В отличие от многих интерфейсов общего назначения, где нажатие кнопки происходит как по одинарному, так и по двойному щелчку, S3 нажимает кнопку строго по одинарному щелчку. Поэтому, если вы будете слишком быстро щелкать мышью, кнопка не будет нажиматься. Это сделано преднамеренно, исходя из опыта эксплуатации человеко-машинных интерфейсов АСУ ТП и исключает ненужные срабатывания пускателей и пуски механизмов из-за небрежности оператора.
Для взведения бита M1178 , который привязан к переменной Enable будем использовать еще одну кнопку. Но, для демонстрации работы скриптов, на событие клик левой кнопкой определим действие вызвать скрипт. Возьмите в палитре еще одну кнопку, напишите что-нибудь в поле текст. Например “Разрешить чтение VR0”. Привяжите событие - “Клик левой кнопкой мыши”, к которому привяжите действие “Вызвать скрипт”.
Откроется окно редактора скриптов на языке ST согласно МЭК-61131.
Введите следующий скрипт.
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.
Если в скрипте - ошибка, окно редактора не будет закрываться при попытке его закрыть, а строка с ошибкой будет подсвечена.
И, наконец, выведем значение переменной VR0 в виде столбика (впрочем цифровое значение может быть легко выведено и в виде цифр виджетом текст.)
Выбираем из палитры компонет “Прогресс” и устанавливаем флаги “Отображать занчение”, “Сегментация” ( если хотим полосатый столбик), устанавливаем свойство “Ориентация” - вертикальная.
Подключаем событие - изменение переменной, выбираем переменную VR0, добавляем действие “Вывести значение”, что бы на столбике выводилось числовое значение переменной, а так-же флаги верхняя граница и нижняя граница, для того, что бы столбик менял цвет при переходе через границы.. В открывшемся диалоге задаем диапазон значений переменных, которые будут соответсвовать высотам столбика от нуля до максимальной. В качетсве такого диапазона можно выбрать одну из шкал (физическую, возможную, технологическую), либо задать произвольные значения.
Кроме того, можно задать границы при переходе которых столбик будет менять цвет.
Теперь можно запустить проект на выполнение. Переводим ПЛК в режим Run, если он не был переведен. Затем просто нажимаем F5, либо кликаем кнопку.
Появится диалог загрузки проекта. В принципе мы можем запускать и инсталлировать проект и удаленно, на удаленной машине, если там установлена S3-HMI с менеджером проектов.
На экране появится наша простейшая мнемосхема:
В S3 намеренно сделано так, что основную мнемосхему, в отличие от других, невозможно закрыть, она не имеет привычных элементов управления. Закрыть ее можно только из IDE, нажав CTRL-F5, либо из скрипта, который можно присоединить к элементу управления, доступ к которому может быть открыт только нужным пользователям. Сделано это для того, что бы оператор по небрежности не потерял контроль над серьезным объектом.
И так, лампочка должна мигать с периодом 1 сек, при нажатии на насос должен включаться/отключаться выход Y0 ПЛК, после нажатия на кнопку “Разрешить чтение VR0”,значение резистора будет выводится в столбик, а столбик будет менять цвет. Кроме того, должна срабатывать тревога, установленная в свойствах переменной VR0. В протокол работы системы должны записываться срабатывания переменных, для которых был установлен признак “Запись в протокол”.