Tag Archives: ST

Работа с таймерами на языке ST

Пример работы с дискретными входами и выходами ПЛК, а также с таймерами ton и tof. Пример на языке ST.

При замыкании первого входа замыкается первый выход.

При замыкании первого и второго входа замыкается второй выход.

Через 5 секунд после замыкания третьего входа замыкается третий выход.

Через 10 секунд после размыкания четвертого входа размыкается четвертый выход.

Листинг:

PROGRAM PLC_PRG

VAR

tim1:TON;

tim2:TOF;

END_VAR

(*plc100-24.K-L core 2-03 target 2-02-4*)

out1:=in1;

Out2:=in1 AND in2;

(*задержка включения*)

tim1(IN := in3, PT := T#5s);

out3:=tim1.Q;

(*задержка выключения*)

tim2(IN := in4, PT := T#10s);

out4:=tim2.Q;

Условные операторы и операторы циклов языка ST

Инструкция RETURN

Инструкция RETURN позволяет выйти из POU, например, в зависимости от условия.

Инструкция IF

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

Синтаксис:

IF <Boolean_expression1> THEN

<IF_instructions>

{ELSIF <Boolean_expression2> THEN

<ELSIF_instructions1>

.

.

.ELSIF <Boolean_expression n> THEN

<ELSIF_instructions n-1>

ELSE

<ELSE_instructions>}

END_IF;

Часть конструкции фигурных скобках не обязательна.

Если < <Boolean_expression1> возвращает истину, тогда <IF_Instructions> выполняется.

В противном случае будут выполняться остальные логические выражения одно за другим, пока одно из них не возвратит истину. Тогда выполняются инструкции, стоящие после этого логического выражения до следующего ELSIF или ELSE.

Если все логические выражения ложны, то выполняются инструкции, стоящие после ELSE.

Пример:

IF temp < 17

THEN heating_on: = TRUE;

ELSE heating_on: = FALSE;

END_IF

В этом примере нагревание (heating) включается, когда температура опустится ниже 17 . градусов, иначе оно останется выключенным.

Инструкция CASE

C помощью инструкции CASE можно нескольким различным значениям целочисленной переменной сопоставить различные инструкции.

Синтаксис:

CASE <Var1> OF

<Value1>: <Instruction 1>

<Value2>: <Instruction 2>

<Value3, Value4, Value5>: <Instruction 3>

<Value6 .. Value10>: <Instruction 4>

<Value n>: <Instruction n>

ELSE <ELSE instruction>

END_CASE;

Инструкция CASE выполняется согласно следующим правилам:

·  Если переменная <Var1> имеет значение <Value i>, то выполняется инструкция <Instruction i>

·  Если <Var1> не принимает ни одного из указанных значений, то выполняется <ELSE Instruction>.

·  Чтобы одна и та же инструкция выполнялась при различных значениях переменной <Var1>, необходимо перечислить эти значения через запятую.

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

Пример:

CASE INT1 OF

1, 5: BOOL1 : = TRUE;

BOOL3 : = FALSE;

2: ВОOL2 : = FALSE;

BOOL3 : = TRUE;

10. 20: BOOL1: = TRUE;

BOOL3:= TRUE;

ELSE

BOOL1 := NOT BOOL1;

BOOL2 := BOOL1 OR BOOL2;

END_CASE;

Цикл FOR

С помощью FOR можно программировать повторяющиеся процессы.

Синтаксис:

INT_Var :INT;

FOR <INT_Var> := <INIT_VALUE> TO <END_VALUE> {BY <Step size>} DO

<Instructions>

END_FOR

Часть конструкции, заключенная в фигурные скобки, не обязательна.

<Instructions> выполняются, пока счетчик <INT_Var> не больше <END_VALUE>. Это условие проверяется перед выполнением <Instructions>, поэтому раздел <Instructions> не выполняется, если <INIT_VALUE> больше <END_VALUE>.

Всякий раз, когда выполняются <Instructions>, значение <INIT_VALUE>, увеличивается на <Step_size>. <Step_ size> может принимать любое целое значение. По умолчанию шаг устанавливается равным 1.

Пример:

FOR Counter: =1 TO 5 BY 1 DO

Var1: =Var1*2;

END_FOR;

Erg:=Var1;

В этом примере предполагается, что начальное значение Var1 равно 1. После выполнения цикла эта переменная будет равна 32.

Замечание: <END_VALUE>: не должно быть равно предельному значению счетчика <INT_VAR>. Например, если счетчик является переменной типа SINT и <END_VALUE> равно 127, то цикл становится бесконечным.

Цикл WHILE

Цикл WHILE может использоваться, как и цикл FOR, с тем лишь различием, что условие выхода определяется логическим выражением. Это означает, цикл выполняется, пока верно заданное условие.

Синтаксис:

WHILE <Boolean expression>

<Instructions>

END_WHILE

Раздел <Instructions> выполняется циклически до тех пор, пока <Boolean_expression> дает TRUE. Если <Boolean_expression> равно FALSE уже при первой итерации, то раздел <Instructions> не будет выполнен ни разу. Если <Boolean_expression> никогда не примет значение FALSE, то раздел <Instructions> будет выполняться бесконечно.

Пример:

WHILE counter<>0 DO

Var1: = Var1*2;

сounter := сounter-1;

END_WHILE

Цикл REPEAT

Цикл REPEAT отличается от цикла WHILE тем, что первая проверка условия выхода из цикла осуществляется, когда цикл уже выполнился 1 раз. Это означает, что независимо от условия выхода цикл выполняется хотя бы один раз.

Синтаксис:

REPEAT

<Instructions>

UNTIL <Boolean expression>

END_REPEAT

Раздел <Instructions> выполняется циклически до тех пор, пока <Boolean_expression> дает TRUE. Если<Boolean_expression> равно FALSE уже при первой итерации, то раздел <Instructions> не будет выполнен один раз. Если <Boolean_expression> никогда не примет значение FALSE, то раздел <Instructions> будет выполняться бесконечно.

 

Пример работы ОВЕН ПЛК с ICMP протоколом.

Введение

Пример предназначен для демонстрации функционирования протокола ICMP на  ОВЕН ПЛК посредством посылки стандартной команды PING с ПЛК на любое удаленное устройство, подключенное к сети. Функционально программа   выполняет 1000 циклов в каждом из которых с помощью команды SysSockSendTo отсылается ICMP пакет с типом PING и кодом 0х00. После этого по прошествии задержки в 0.003с вызывается функция приема SysSockRecvFrom. Далее производится сравнивнение содержимго переданного и принятого пакета, и если проверяемое устройство корректно ответило, то  инкрементируется  флаг успеха suces, в противном случае флаг неудачи faul.

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

Типовая аппаратная конфигурация

Программа  испытывалась с двумя ОВЕН ПЛК 100 при подключении через сеть Ethernet.

При посылки 1000 запросов с временем ожидания 0.003с. ответ был получен на 970 запросов, что говорит о быстрой работе TCP/IP стека на ПЛК. При работе с другими устройствами время ожидания ответа необходимо увеличивать (например PC под управлением Windows) .

Описание программы

Программа функционирует через UDP сокеты, где при его создании необходимо указывать ICMP тип, в номере порта старший байт обозначает тип ICMP пакета, младший код пакета и IP адрес удаленной машины. Далее с помощью стандартных команд SysSockSendTo и  SysSockRecvFrom можно обмениваться данными с удаленной машиной через ICMP протокол.

Описание работы с ICMP протоколом

(*Программа опроса {Ping-запроса} через ICMP протокол*)

CASE web_stat OF

0:

(*Участок выполняемый при старте программы*)

web_stat:=1;

sock_adr.sin_addr:=16#0A00065F;

(*IP Адрес опрашиваемого устройства {создается сокет на опрашивающем устройстве}*)

sock_adr.sin_family:=SOCKET_AF_INET;

(*Стек протоколов TCP/IP*)

sock_adr.sin_port:=16#0800;

(*Старший байт- Тип ICMP пакета {08 — Ping} младший байт- код ICMP пакета { 0- Ping}*)

sock_adr1.sin_addr:=16#0A000626;

(*То же самое для функции чтения {в принципе не важно}*)

sock_adr1.sin_family:=SOCKET_AF_INET;

sock_adr1.sin_port:=16#1111;

my_BUFs:=’qwertyuiopasdfghjklzxcvbnm123456′;

(*Буфер передачи, данная информация используется для контроля ответа, может быть любой*)

my_BUFr:=»;

(*Буфер приема*)

sock:=SysSockCreate(SOCKET_AF_INET,SOCKET_DGRAM,SOCKET_IPPROTO_ICMP);

send:=FALSE;

suces:=0;

faul:=0;

count:=0;

1:

(*Участок выполняемый в цикле опроса*)

IF NOT send THEN

send:=TRUE;

resd:=SysSockSendTo(sock,ADR(my_bufs),32,0,ADR(sock_adr),SIZEOF(sock_adr));

(*Собственно посылаем запрос в ICMP формате c параметрами sock_adr*)

END_IF

tmr(IN:=start_TON,PT:=t#0.003s);

(*Организуем таймер для обеспечении временной задержки ожидания ответа*)

IF NOT start_TON THEN

start_TON:=TRUE;

END_IF

IF tmr.Q THEN

resd:=SysSockRecvFrom(sock,ADR(my_bufr),32,0,ADR(sock_adr1),SIZEOF(sock_adr1));

(*Время ожидания истекло считываем данные*)

IF FIND(my_BUFr,’pasd’)<>0           THEN

suces:=suces+1;

(*Сравниваем переданные и принятые данные в случае идентичности увеличиваем счетчик удачного Ping*)

ELSE

faul:=faul+1;

(*В противном случае увеличиваем счетчик неудачного Ping запроса*)

END_IF

my_BUFr:=»;

(*Очишаем буфер приема*)

send:=FALSE;

start_TON:=FALSE;

(*Устанавливаем переменные состояния для следующего запроса*)

count:=count+1;

(*Увеличиваем счетчик сформированных запрсов*)

END_IF

IF count=1000 THEN

(*Если выполнено определенное кол-во запрсов «останавливаем программу»*)

web_stat:=3;

END_IF

(*Участок выполняемый при останове программы*)

3:

;

END_CASE

 

Языки программирования ПЛК. Проект ПЛК

У ПЛК есть несколько основных языков программирования. Во-первых, это что-то похожее на языки программирования высокого уровня. Называется язык структурированного текста (по-буржуйски ST). Исключительно удобная штука, если есть навыки программирования. Собственно, для программистов и придумана. Однако когда ПЛК разрабатывался и внедрялся, профессия программиста (в смысле толкового программиста с хорошей технической подготовкой) была еще более дефицитной, чем в наши суровые времена. Посему практичные янки и весь мир следом разработали несколько видов графических языков. Для электриков создали язык релейных диаграмм (по-буржуйски LD). Ничего в общем сложного – шина входов, шина выходов, между ними – схема из релюшек, нормально замкнутых или разомкнутых, ну и таймеров, конечно, триггеров всяких. Плюс в простоте – была бы схема, а программа напишется. Минус в трудностях работы с аналоговыми сигналами.

Другой вид графических языков – язык функциональных блоков (по-буржуйски FBD). Мне он очень напоминает работу, например, с пакетом Simulink программного комплекса Matlab, товарищу напротив — Vissim. Да, в общем, получить техническое образование ни разу не столкнувшись с такого рода ПО трудно.  Основа всего — блоки, соединенные в нужной последовательности линиями связи. Если вы – технарь, пожалуй, наиболее прост для освоения и активного использования. Плюс – наглядность, интуитивная понятность реализуемых алгоритмов. Минусы – работа с циклами. Можно, конечно, но на ST такого рода программки и пишутся легче и короче.
Последний вариант графического языка – алгоритмический (SFC). Это наиболее высокий по уровню графический язык. Каждый его шаг – маленькая (или большая) программа. Очень красивый язык, справедливо обожаемый технологами всех мастей. Позволяет создавать жестко структурированные, удобные для отладки проекты. Минус всего один – браться за его изучение стоит, лишь в достаточной степени освоив язык ST, LD или FBD. Программы для отдельного шага все равно писать на них.

Ах, да. Чуть не забыл. Есть еще что-то похожее на ассемблер. Называется  списком инструкций (по-буржуйски IL). Если вы фанат бесконечной работы с аккумулятором – это для вас. Минусы – длинный программный код, хорошо смотрящийся только в приложениях к диссертации, проблемы отладки. Короче в моем понимании – пятое колесо в телеге программирования ПЛК. Могу быть не прав.

Программа или проект?

Давайте сразу отделим котлеты от мух. Тот код, который мы героически пишем – это конечно программа. Вернее, более точно, программа – это код определяющий цикл работы ПЛК.  Их у контроллера может быть не одна,  не две, а много. Меняться они могут по времени, внешнему или программному событию. То есть программа – вещь достаточно частная. Совокупность же того, что «залито» в контроллер, принято называть проект. Помимо набора программ проект включает в себя подключенные библиотеки, типы данных, визуализации, конфигурации,  настройки конкретного ПЛК и многое другое.

 

Мой блог находят по следующим фразам