Laboratorium Podstaw Automatyki i Regulacji Automatycznej II
1
7
Programowanie w języku Instruction List
Informacje wst
ę
pne:
JĘZYK LISTY INSTRUKCJI (INSTRUCTION LIST) DLA PLC
J
ę
zyk programowania Instruction List jest j
ę
zykiem opartym na akumulatorze. Przy wykonywaniu funkcji
binarnych akumulator jest typu BOOL.
Format rozkazu:
<etykieta:> operator <argument> ‘komentarz
Funkcje binarne
Operator
Argument
Opis
LD_BOOL
zmienna
akumulator := argument
LDN_BOOL
zmienna
akumulator := NOT argument
ST_BOOL
zmienna
argument := akumulator
warto
ść
akumulatora nie ulega zmianie
STN_BOOL
zmienna
argument := NOT akumulator
warto
ść
akumulatora nie ulega zmianie
S
zmienna
argument SET := akumulator
warto
ść
akumulatora nie ulega zmianie
R
zmienna
argument RESET := akumulator
warto
ść
akumulatora nie ulega zmianie
PT
zmienna
argument uaktywniany zboczem narastaj
ą
cym := akumulator
warto
ść
akumulatora nie ulega zmianie
NT
zmienna
argument uaktywniany zboczem opadaj
ą
cym := akumulator
warto
ść
akumulatora nie ulega zmianie
NOT
akumulator := NOT akumulator
AND
zmienna
akumulator := akumulator AND argument
ANDN
zmienna
akumulator := akumulator AND NOT argument
AND(
zagnie
ż
d
ż
one
wyra
ż
enie
logiczne
akumulator := akumulator AND zagnie
ż
d
ż
one wyra
ż
enie logiczne
otwarcie nawiasu powoduje zło
ż
enie bie
żą
cej funkcji na stosie, zamkni
ę
cie
nawiasu powoduje pobranie ze stosu i wykonanie funkcji z aktualnym
stanem akumulatora
ANDN(
zagnie
ż
d
ż
one
wyra
ż
enie
logiczne
akumulator := akumulator AND NOT zagnie
ż
d
ż
one wyra
ż
enie logiczne
otwarcie nawiasu powoduje zło
ż
enie bie
żą
cej funkcji na stosie, zamkni
ę
cie
nawiasu powoduje pobranie ze stosu i wykonanie funkcji z aktualnym
stanem akumulatora
OR
zmienna
akumulator := akumulator OR argument
ORN
zmienna
akumulator := akumulator OR NOT argument
OR(
zagnie
ż
d
ż
one
wyra
ż
enie
logiczne
akumulator := akumulator OR zagnie
ż
d
ż
one wyra
ż
enie logiczne
otwarcie nawiasu powoduje zło
ż
enie bie
żą
cej funkcji na stosie, zamkni
ę
cie
nawiasu powoduje pobranie ze stosu i wykonanie funkcji z aktualnym
stanem akumulatora
Programowanie w j
ę
zyku Instruction List
2
Laboratorium Podstaw Automatyki i Regulacji Automatycznej II
ORN(
zagnie
ż
d
ż
one
wyra
ż
enie
logiczne
akumulator := akumulator OR NOT zagnie
ż
d
ż
one wyra
ż
enie logiczne
otwarcie nawiasu powoduje zło
ż
enie bie
żą
cej funkcji na stosie, zamkni
ę
cie
nawiasu powoduje pobranie ze stosu i wykonanie funkcji z aktualnym
stanem akumulatora
XOR
zmienna
akumulator := akumulator XOR argument
XORN
zmienna
akumulator := akumulator XOR NOT argument
XOR(
zagnie
ż
d
ż
one
wyra
ż
enie
logiczne
akumulator := akumulator XOR zagnie
ż
d
ż
one wyra
ż
enie logiczne
otwarcie nawiasu powoduje zło
ż
enie bie
żą
cej funkcji na stosie, zamkni
ę
cie
nawiasu powoduje pobranie ze stosu i wykonanie funkcji z aktualnym
stanem akumulatora
XORN(
zagnie
ż
d
ż
one
wyra
ż
enie
logiczne
akumulator := akumulator XOR NOT zagnie
ż
d
ż
one wyra
ż
enie logiczne
otwarcie nawiasu powoduje zło
ż
enie bie
żą
cej funkcji na stosie, zamkni
ę
cie
nawiasu powoduje pobranie ze stosu i wykonanie funkcji z aktualnym
stanem akumulatora
Je
ż
eli wyra
ż
enie logiczne zaczyna si
ę
od operatora:
AND(
ANDN(
OR(
ORN(
XOR(
XORN(
to nast
ę
pn
ą
instrukcj
ą
musi by
ć
operator LD_BOOL lub LDN_BOOL.
Wyra
ż
enia logiczne mo
ż
na zagnie
ż
d
ż
a
ć
do 8 poziomów.
Przykład 1.
Napisz w j
ę
zyku Instruction List podprogram steruj
ą
cy dla czterech wej
ść
dwustanowych W1, W2, W3 i W4
realizuj
ą
cy nast
ę
puj
ą
c
ą
funkcj
ę
logiczn
ą
:
W4)
(W3
•
W2)
(W1
+
+
Wynik operacji ma sterowa
ć
wyj
ś
ciem o nazwie Z.
Rozwi
ą
zanie
W tym celu nale
ż
y zało
ż
y
ć
blok podprogramu, który zostanie napisany w j
ę
zyku
Instruction List oraz
zadeklarowa
ć
akumulator. Na akumulator potrzeba 8 referencji binarnych i 2 referencje o organizacji słowowej
nigdzie nie u
ż
ywane w programie.
Programowanie w j
ę
zyku Instruction List
Laboratorium Podstaw Automatyki i Regulacji Automatycznej
3
Nast
ę
pnie nale
ż
y umie
ś
ci
ć
w bloku _MAIN wywołanie podprogramu (CALL) i przej
ść
do edycji podprogramu.
Prawym klawiszem myszy wprowadzamy słowo kluczowe,
a nast
ę
pnie równie
ż
prawym klawiszem myszy deklarujemy zmienn
ą
:
Programowanie w j
ę
zyku Instruction List
4
Laboratorium Podstaw Automatyki i Regulacji Automatycznej II
Tak b
ę
dzie wygl
ą
da
ć
gotowy podprogram:
Przykład 2.
Napisa
ć
podprogram w j
ę
zyku IL realizuj
ą
cy funkcj
ę
XOR (eXclusive-OR)
WEJ2
WEJ1
WYJ2
¨’
=
Rozwi
ą
zanie I
Rozwi
ą
zanie II
Przykład 3.
Napisz program w j
ę
zyku IL dla trzech wej
ść
dwustanowych WEJ1, WEJ2 i WEJ3 realizuj
ą
cy nast
ę
puj
ą
c
ą
funkcj
ę
logiczn
ą
:
WEJ3)
•
(WEJ2
WEJ1
+
Wynik operacji ma sterowa
ć
wyj
ś
ciem WYJ1.
Rozwi
ą
zanie I
Rozwi
ą
zanie II (korzystaj
ą
c z prawa de Morgana)
Programowanie w j
ę
zyku Instruction List
Laboratorium Podstaw Automatyki i Regulacji Automatycznej
5
Przykład 4.
Napisz program do przeł
ą
czania kierunku wirowania osi silnika. Przyciski niestabilne P_PRAWO i P_LEWO
słu
żą
do wyboru kierunku wirowania osi silnika, czyli wł
ą
czania wyj
ść
S_PRAWO i S_LEWO. Przycisk
rozwierny STOP zatrzymuje ruch silnika.
P_PRAWO
P_LEWO
STOP
S_PRAWO
S_LEWO
Rozwi
ą
zanie
Przykład 5.
Napisz program steruj
ą
cy dla PLC, który b
ę
dzie powodował mruganie lampki podł
ą
czonej do wyj
ś
cia
dwustanowego o nazwie LAMPKA z cz
ę
stotliwo
ś
ci
ą
1 Hz. Lampka ma mruga
ć
od momentu naci
ś
ni
ę
cia przez
operatora przycisku niestabilnego START do momentu naci
ś
ni
ę
cia przycisku rozwiernego STOP.
START
STOP
LAMPKA
Rozwi
ą
zanie
Przykład 6.
Napisz program sterowania wyj
ś
ciem WYJ1 zgodnie z poni
ż
szym przebiegiem czasowym:
WEJ1
WEJ2
WYJ1
Programowanie w j
ę
zyku Instruction List
6
Laboratorium Podstaw Automatyki i Regulacji Automatycznej II
Rozwi
ą
zanie
Funkcje matematyczne
W programowaniu sterowników PLC za pomoc
ą
j
ę
zyka listy instrukcji wykorzystuje si
ę
funkcje podobne do
asemblerowych, które korzystaj
ą
z akumulatora oraz modyfikuj
ą
jego zawarto
ść
, a tak
ż
e instrukcje b
ę
d
ą
ce
wywołaniem bloków funkcyjnych.
Operator
Argument
Opis
LD_INT
zmienna lub stała
akumulator := argument
LD_ENO
brak
akumulator := Enable Output
ST_INT
zmienna
argument := akumulator
ST_DINT
zmienna
argument := akumulator
ST_REAL
zmienna
argument := akumulator
ADD
zmienna lub stała
akumulator := akumulator + argument
akumulator typu INT
SUB
zmienna lub stała
akumulator := akumulator – argument
akumulator typu INT
MUL
zmienna lub stała
akumulator := akumulator * argument
akumulator typu INT
DIV
zmienna lub stała
akumulator := akumulator / argument
akumulator typu INT
MOD
zmienna lub stała
akumulator := akumulator modulo argument (funkcja modulo czyli
reszta z dzielenia całkowitoliczbowego)
akumulator typu INT
Bloki funkcyjne z grupy Math
Blok funkcyjny
Typ argumentów
ENO
Opis
ADD_INT(
in1, in2)
ADD_DINT(
in1, in2)
ADD_REAL(
in1, in2)
in1: INT, DINT lub REAL
in2: INT, DINT lub REAL
akumulator: INT, DINT lub REAL
tak
akumulator:= in1 + in2
SUB_INT(
in1, in2)
SUB_DINT(
in1, in2)
SUB_REAL(
in1, in2)
in1: INT, DINT lub REAL
in2: INT, DINT lub REAL
akumulator: INT, DINT lub REAL
tak
akumulator:= in1 - in2
MUL_INT(
in1, in2)
MUL_DINT(
in1, in2)
MUL_REAL(
in1, in2)
in1: INT, DINT lub REAL
in2: INT, DINT lub REAL
akumulator: INT, DINT lub REAL
tak
akumulator:= in1 * in2
DIV_INT(
in1, in2)
DIV_DINT(
in1, in2)
DIV_REAL(
in1, in2)
in1: INT, DINT lub REAL
in2: INT, DINT lub REAL
akumulator: INT, DINT lub REAL
tak
akumulator:= in1 / in2
MOD_INT(
in1, in2)
MOD_DINT(
in1, in2)
in1: INT lub DINT
in2: INT lub DINT
akumulator: INT lub DINT
tak
akumulator:= in1 modulo in2
(funkcja modulo czyli reszta
z dzielenia
całkowitoliczbowego)
Programowanie w j
ę
zyku Instruction List
Laboratorium Podstaw Automatyki i Regulacji Automatycznej
7
SCALE_INT(
ihi, ilo, ohi, olo, in)
SCALE_WORD(
ihi, ilo, ohi, olo, in)
ihi: INT lub WORD
ilo: INT lub WORD
ohi: INT lub WORD
olo: INT lub WORD
in: INT lub WORD
akumulator: INT lub WORD
tak
akumulator:= warto
ść
po
przeskalowaniu
Przykład 7.
Zakładamy,
ż
e do 4 rejestrów o nazwach POMIAR1, POMIAR2, POMIAR3 i POMIAR4 s
ą
przekazywane
odczyty czterech temperatur mierzonych w zakresie 0-1000
°
C. Napisa
ć
program obliczaj
ą
cy
ś
redni
ą
arytmetyczn
ą
z czterech temperatur z dokładno
ś
ci
ą
do 1°C. Obliczona
ś
rednia ma by
ć
przechowywana w
rejestrze o nazwie SREDNIA. Zmiana któregokolwiek pomiaru ma powodowa
ć
od razu uaktualnienie
obliczanej
ś
redniej.
Rozwi
ą
zanie I
Rozwi
ą
zanie II
Funkcje steruj
ą
ce
Operator
Argument
Opis
JMP
etykieta
bezwarunkowy skok do etykiety
JMPC
etykieta
skok do etykiety, je
ż
eli akumulator=1
JMPCN
etykieta
skok do etykiety, je
ż
eli akumulator=0
CAL
nazwa podprogramu
bezwarunkowe wywołanie podprogramu
CALC
nazwa podprogramu
wywołanie podprogramu, je
ż
eli akumulator=1
CALCN
nazwa podprogramu
wywołanie podprogramu, je
ż
eli akumulator=0
RET
brak
bezwarunkowy powrót z podprogramu
RETC
brak
powrót z podprogramu, je
ż
eli akumulator=1
RETCN
brak
powrót z podprogramu, je
ż
eli akumulator=0
Programowanie w j
ę
zyku Instruction List
8
Laboratorium Podstaw Automatyki i Regulacji Automatycznej II
W j
ę
zyku
Instruction List mo
ż
na pisa
ć
nie tylko podprogramy
, ale równie
ż
blok _MAIN. W tym celu nale
ż
y
usun
ąć
blok _MAIN, a nast
ę
pnie zało
ż
y
ć
blok typu IL nadaj
ą
c mu nazw
ę
_MAIN. Je
ż
eli w bloku _MAIN
u
ż
ywamy funkcji powrotu z podprogramu RET, RETC, RETCN, to spowoduje ona powrót do pocz
ą
tku bloku
_MAIN.
Przykład 8.
Napisa
ć
program w j
ę
zyki IL b
ę
d
ą
cy odpowiednikiem nast
ę
puj
ą
cego programu w j
ę
zyku LD:
Rozwi
ą
zanie z wykorzystaniem bloków funkcyjnych:
Rozwi
ą
zanie oparte na funkcjach asemblerowych
Bloki czasowe
Blok funkcyjny
Typ argumentów
ENO
Opis
TMR_TENTHS(
address, PV)
TMR_HUNDS(
address, PV)
TMR_THOUS(
address, PV)
address: array 3 WORD
PV: INT
akumulator: BOOL
tak
akumulator = true, to zwi
ę
ksza
CV
akumulator = false, to zeruje CV
ustawia
akumulator:= true, gdy
CV
≥
PV
ONDTR_TENTHS(
address, R, PV)
ONDTR_HUNDS(
address, R, PV)
ONDTR_THOUS(
address, R, PV)
address: array 3 WORD
R: BOOL
PV: INT
akumulator: BOOL
tak
akumulator = true, to zwi
ę
ksza
CV
akumulator = false, to pami
ę
ta
ostatnie
CV
ustawia
akumulator:= true, gdy
CV
≥
PV
OFDT_TENTHS(
address, PV)
OFDT_HUNDS(
address, PV)
OFDT_THOUS(
address, PV)
address: array 3 WORD
PV: INT
akumulator: BOOL
tak
akumulator = true, to zeruje CV
akumulator = false, to zwi
ę
ksza
CV,
a
ż
CV=PV
ustawia
akumulator:= true, gdy
CV<PV
Programowanie w j
ę
zyku Instruction List
Laboratorium Podstaw Automatyki i Regulacji Automatycznej
9
Przykład 9.
Po naci
ś
ni
ę
ciu niestabilnego przycisku PLUCZ, uruchamiana jest pompa powoduj
ą
ca przepłukanie instalacji.
Prac
ą
pompy steruje wyj
ś
cie dwustanowe o nazwie POMPA. Płukanie powinno trwa
ć
10 s, po czym pompa
powinna samoczynnie si
ę
wył
ą
czy
ć
.
PLUCZ
POMPA
10 s
Rozwi
ą
zanie I
Rozwi
ą
zanie II
Bloki liczników
Blok funkcyjny
Typ argumentów ENO
Opis
UPCTR(
address, r, PV)
address: WORD
r: BOOL
PV: INT
akumulator: BOOL
tak
Enable 0
→
1, to zwi
ę
ksza
CV
r=1, to zeruje CV
ustawia
akumulator:= true, gdy CV
≥
PV
DNCTR(
address, r, PV)
address: WORD
r: BOOL
PV: INT
akumulator: BOOL
tak
Enable 0
→
1, to zmniejsza
CV
r=1, to ustawia CV:=PV
ustawia
akumulator:= true, gdy CV
≤
0
Funkcje relacji
Operator
Argument
Opis
EQ
zmienna lub stała
akumulator := (akumulator = argument)
akumulator typu BOOL
NE
zmienna lub stała
akumulator := (akumulator
≠
argument)
akumulator typu BOOL
GT
zmienna lub stała
akumulator := (akumulator > argument)
akumulator typu BOOL
Programowanie w j
ę
zyku Instruction List
10
Laboratorium Podstaw Automatyki i Regulacji Automatycznej II
GE
zmienna lub stała
akumulator := (akumulator
≥
argument)
akumulator typu BOOL
LT
zmienna lub stała
akumulator := (akumulator < argument)
akumulator typu BOOL
LE
zmienna lub stała
akumulator := (akumulator
≤
argument)
akumulator typu BOOL
Bloki funkcyjne z grupy Relational
Przykład 10.
Napisa
ć
program w j
ę
zyku IL sygnalizuj
ą
cy na wyj
ś
ciu BUCZEK przekroczenie górne i dolne sygnału
na wej
ś
ciu analogowym o nazwie TEMPERATURA. Próg górny wynosi 10000, a dolny 2000. Program ma
wykorzystywa
ć
funkcje asemblerowe, a nie bloki funkcyjne.
Rozwi
ą
zanie
Blok funkcyjny
Typ argumentów
ENO
Opis
EQ_INT(
in1, in2)
EQ_DINT(
in1, in2)
EQ_REAL(
in1, in2)
in1: INT, DINT lub REAL
in2: INT, DINT lub REAL
akumulator: BOOL
nie
akumulator:= (in1 = in2)
NE_INT(
in1, in2)
NE_DINT(
in1, in2)
NE_REAL(
in1, in2)
in1: INT, DINT lub REAL
in2: INT, DINT lub REAL
akumulator: BOOL
nie
akumulator:= (in1
≠
in2)
GT_INT(
in1, in2)
GT_DINT(
in1, in2)
GT_REAL(
in1, in2)
in1: INT, DINT lub REAL
in2: INT, DINT lub REAL
akumulator: BOOL
nie
akumulator:= (in1 > in2)
GE_INT(
in1, in2)
GE_DINT(
in1, in2)
GE_REAL(
in1, in2)
in1: INT, DINT lub REAL
in2: INT, DINT lub REAL
akumulator: BOOL
nie
akumulator:= (in1
≥
in2)
LT_INT(
in1, in2)
LT_DINT(
in1, in2)
LT_REAL(
in1, in2)
in1: INT, DINT lub REAL
in2: INT, DINT lub REAL
akumulator: BOOL
nie
akumulator:= (in1 < in2)
LE_INT(
in1, in2)
LE_DINT(
in1, in2)
LE_REAL(
in1, in2)
in1: INT, DINT lub REAL
in2: INT, DINT lub REAL
akumulator: BOOL
nie
akumulator:= (in1
≤
in2)
RANGE_INT(
i1, i2, in)
RANGE_DINT(
i1, i2, in)
RANGE_WORD(
i1, i2, in)
i1: INT, DINT lub WORD
i2: INT, DINT lub WORD
in: INT, DINT lub WORD
akumulator: BOOL
nie
akumulator:= (i1
≤
in
≤
i2)
lub
akumulator:= (i2
≤
in
≤
i1)
Programowanie w j
ę
zyku Instruction List
Laboratorium Podstaw Automatyki i Regulacji Automatycznej
11
Bloki przesyłania danych
Blok funkcyjny
Typ argumentów
ENO
Opis
BLK_CLR_WORD(
in, length)
in: WORD
length: 0-256
tak
zerowanie bloku referencji
zaczynaj
ą
cego si
ę
od parametru
in i składaj
ą
cego si
ę
z tylu
WORD, ile wynosi
length
MOVE_INT(
in, length, q)
MOVE_WORD(
in, length, q)
MOVE_BOOL(in,
length, q)
MOVE_REAL(
in, length, q)
in: INT, WORD, BOOL lub REAL
length: 0-256
q: INT, WORD, BOOL lub REAL
tak
kopiowanie bloku referencji
zaczynaj
ą
cego si
ę
od
in
i składaj
ą
cego si
ę
z tylu INT,
WORD, BOOL lub REAL ile
wynosi
length, do obszaru
referencji zaczynaj
ą
cego si
ę
od
q
BLKMOV_INT(
in1, in2, in3, in4,
in5, in6, in7,q)
BLKMOV_WORD(
in1, in2, in3,
in4, in5, in6, in7,q)
BLKMOV_REAL(
in1, in2, in3,
in4, in5, in6, in7,q)
in1: INT, WORD lub REAL
in2: INT, WORD lub REAL
in3: INT, WORD lub REAL
in4: INT, WORD lub REAL
in5: INT, WORD lub REAL
in6: INT, WORD lub REAL
in7: INT, WORD lub REAL
q: INT, WORD lub REAL
tak
wpis 7 stałych
in1-in7 do bloku
referencji zaczynaj
ą
cego si
ę
od
q
SHFR_WORD(
r, in, st, length, q)
SHFR_BIT(
r, in, st, length, q)
r: BOOL
in: WORD lub BOOL
st: WORD lub BOOL
length: 0-256
q: WORD lub BOOL
tak
wstawia
in do obszaru referencji
zaczynaj
ą
cego si
ę
od
st
i składaj
ą
cego si
ę
z tylu WORD
lub BOOL, ile wynosi
length;
przesuwa dane w bloku
referencji oraz wysuwa ostatni
ą
dan
ą
do
q; r=1 - zeruje blok
referencji zdefiniowany przez
st
i
length
Bloki działa
ń
binarnych
Blok funkcyjny
Typ argumentów
ENO
Opis
AND_WORD(
in1, in2)
in1: WORD
in2: WORD
akumulator: INT
tak
akumulator:= in1 AND in2
OR_WORD(
in1, in2)
in1: WORD
in2: WORD
akumulator: INT
tak
akumulator:= in1 OR in2
XOR_WORD(
in1, in2)
in1: WORD
in2: WORD
akumulator: INT
tak
akumulator:= in1 XOR in2
NOT_WORD(
in)
in: WORD
akumulator: INT
tak
akumulator:= NOT in
ROL_WORD(
in, n, length, q)
in: WORD
n: INT
length: 1-256
q: WORD
tak
Powoduje rotacj
ę
o
n bitów w lewo
ci
ą
gu bitów, którego pocz
ą
tek okre
ś
la
in i składa si
ę
z tylu WORD, ile wynosi
length. Wynik po rotacji
przechowywany jest w obszarze,
którego pocz
ą
tek okre
ś
la
q.
ROR_WORD(
in, n, length, q)
in: WORD
n: INT
length: 1-256
q: WORD
tak
Powoduje rotacj
ę
o
n bitów w prawo
ci
ą
gu bitów, którego pocz
ą
tek okre
ś
la
in i składa si
ę
z tylu WORD, ile wynosi
length. Wynik po rotacji
przechowywany jest w obszarze,
którego pocz
ą
tek okre
ś
la
q.
Programowanie w j
ę
zyku Instruction List
12
Laboratorium Podstaw Automatyki i Regulacji Automatycznej II
SHIFTL_WORD(
in, n, length, b1 q)
in: WORD
n: INT
length: 1-256
b1: BOOL
q: WORD
tak
Powoduje przesuni
ę
cie o
n bitów
w lewo ci
ą
gu bitów, którego pocz
ą
tek
okre
ś
la
in i składa si
ę
z tylu WORD, ile
wynosi
length. Wynik po przesuni
ę
ciu
przechowywany jest w obszarze,
którego pocz
ą
tek okre
ś
la
q. b1 – bit
wsuwany..
SHIFTR_WORD(
in, n, length, b1 q)
in: WORD
n: INT
length: 1-256
b1: BOOL
q: WORD
tak
Powoduje przesuni
ę
cie o
n bitów
w prawo ci
ą
gu bitów, którego pocz
ą
tek
okre
ś
la
in i składa si
ę
z tylu WORD, ile
wynosi
length. Wynik po przesuni
ę
ciu
przechowywany jest w obszarze,
którego pocz
ą
tek okre
ś
la
q. b1 – bit
wsuwany.
BIT_SET_WORD(
in, bit, length)
in: WORD
bit: INT
length: 1-256
tak
Ustawia dokładnie jeden bit o numerze
bit w ci
ą
gu bitów, którego pocz
ą
tek
okre
ś
la
in i składa si
ę
z tylu WORD, ile
wynosi
length (bity s
ą
numerowane od
1).
BIT_CLR_WORD(
in, bit, length)
in: WORD
bit: INT
length: 1-256
tak
Zeruje dokładnie jeden bit o numerze
bit w ci
ą
gu bitów, którego pocz
ą
tek
okre
ś
la
in i składa si
ę
z tylu WORD, ile
wynosi length (bity s
ą
numerowane od
1).
BIT_TEST_WORD(
in, bit, length)
in: WORD
bit: INT
length: 0-256
akumulator: BOOL
tak
Testuje stan bitu o numerze
bit w ci
ą
gu
bitów, którego pocz
ą
tek okre
ś
la
in
i składa si
ę
z tylu WORD, ile wynosi
length.
akumulator:= stan testowanego bitu
BIT_POS_WORD(
in, length)
in: WORD
length: 0-256
akumulator: INT
tak
Przeszukuje ci
ą
g bitów, którego
pocz
ą
tek okre
ś
la
in i składa si
ę
z tylu
WORD, ile wynosi
length, w celu
znalezienia pierwszej jedynki.
akumulator:= nr bitu, gdzie znalazł
pierwsz
ą
jedynk
ę
BIT_SEQ(
address, r, dir, n, st, length)
r: BOOL
dir: BOOL
n: INT
st: BYTE
length: 0-256
address: 3 WORD
akumulator: INT
tak
Zbocze narastaj
ą
ce na wej
ś
ciu
Enable
powoduje przesuni
ę
cie jedynki w ci
ą
gu
bitów, którego pocz
ą
tek okre
ś
la
st i
składa si
ę
z tylu bitów, ile wynosi
length.
dir - kierunek przesuni
ę
cia.
r=1 zeruje obszar okre
ś
lony przez
st i
length oraz ustawia jedynk
ę
na bicie o
numerze okre
ś
lonym przez
n. Dopóki
r=1, Enable nie reaguje na zbocza
narastaj
ą
ce.
akumulator:= warto
ść
ostatniej
sekwencji
MASK_COMP_WORD(
in1, in2, m, bit,
length, q, bn)
MASK_COMP_DWORD(
in1, in2, m,
bit, length, q, bn)
in1: WORD lub
DWORD
in2: WORD lub
DWORD
m: WORD lub
DWORD
bit: INT
length: 1-4096
q: WORD lub
DWORD
bn: INT
tak
Porównuje dwa ci
ą
gi bitów, których
pocz
ą
tki okre
ś
laj
ą
in1 i in2 i które
składaj
ą
si
ę
z tylu WORD lub DWORD,
ile wynosi
length. Porównywanie
odbywa si
ę
z mask
ą
m, tzn. sprawdza
tylko te bity, które maska ma
wyzerowane.
bit– nr bitu, od którego zaczyna
porównywa
ć
(bity s
ą
numerowane od
0).
mc =1 – znalazł ró
ż
nic
ę
.
q – wynik porównania
bn – nr bitu, na którym wyst
ą
piła
ró
ż
nica (bity s
ą
numerowane od 1)
Programowanie w j
ę
zyku Instruction List
Laboratorium Podstaw Automatyki i Regulacji Automatycznej
13
Operacje na tablicach danych
Blok funkcyjny
Typ argumentów
ENO
Opis
ARRAY_MOVE_INT(
sr, snx,
dnx, n, length, ds)
ARRAY_MOVE_DINT(
sr,
snx, dnx, n, length, ds)
ARRAY_MOVE_WORD(
sr,
snx, dnx, n, length, ds)
ARRAY_MOVE_BYTE(
sr,
snx, dnx, n, length, ds)
ARRAY_MOVE_BOOL(
sr,
snx, dnx, n, length, ds)
sr: INT, DINT, WORD, BYTE,
BOOL
snx: UINT
dnx: UINT
n: UINT
ds: INT, DINT, WORD, BYTE
lub BOOL
length: 32767
tak
Kopiuje n elementów z tablicy
ź
ródłowej zdefiniowanej przez sr
i length pocz
ą
wszy od elementu o
numerze snx do tablicy
przeznaczenia zdefiniowanej przez
ds i length pocz
ą
wszy od elementu o
numerze dnx. Elementami tablic s
ą
INT, DINT, WORD, BYTE lub BOOL
liczone od 1.
SEARCH_EQ_INT(
ar, inx, in,
length, onx)
SEARCH_EQ_DINT(
ar, inx,
in, length, onx)
SEARCH_EQ_WORD(
ar,
inx, in, length, onx)
SEARCH_EQ_BYTE(
ar, inx,
in, length, onx)
ar: INT, DINT, WORD, BYTE
inx: UINT
onx: UINT
in: INT, DINT, WORD, BYTE
length: 32767
tak
Przeszukuje tablic
ę
zdefiniowan
ą
przez ar i length pocz
ą
wszy od
elementu inx w celu znalezienia
elementów równych wzorcowi in.
Je
ż
eli wynik przeszukiwania b
ę
dzie
pozytywny, to onx = numer
znalezionego elementu tablicy.
Elementami tablicy s
ą
INT, DINT,
WORD lub BYTE, 0
≤
inx
≤
length-1,
1
≤
onx
≤
length.
SEARCH_NE_INT(
ar, inx, in,
length, onx)
SEARCH_NE_DINT(
ar, inx,
in, length, onx)
SEARCH_NE_WORD(
ar,
inx, in, length, onx)
SEARCH_NE_BYTE(
ar, inx,
in, length, onx)
ar: INT, DINT, WORD, BYTE
inx: UINT
onx: UINT
in: INT, DINT, WORD, BYTE
length: 32767
tak
Przeszukuje tablic
ę
zdefiniowan
ą
przez ar i length pocz
ą
wszy od
elementu inx w celu znalezienia
elementów ró
ż
nych od wzorca in.
Je
ż
eli wynik przeszukiwania b
ę
dzie
pozytywny, to onx = numer
znalezionego elementu tablicy.
Elementami tablicy s
ą
INT, DINT,
WORD lub BYTE, 0
≤
inx
≤
length-1,
1
≤
onx
≤
length.
SEARCH_GT_INT(
ar, inx, in,
length, onx)
SEARCH_GT_DINT(
ar, inx,
in, length, onx)
SEARCH_GT_WORD(
ar,
inx, in, length, onx)
SEARCH_GT_BYTE(
ar, inx,
in, length, onx)
ar: INT, DINT, WORD, BYTE
inx: UINT
onx: UINT
in: INT, DINT, WORD, BYTE
length: 32767
tak
Przeszukuje tablic
ę
zdefiniowan
ą
przez ar i length pocz
ą
wszy od
elementu inx w celu znalezienia
elementów wi
ę
kszych od wzorca in.
Je
ż
eli wynik przeszukiwania b
ę
dzie
pozytywny, to onx = numer
znalezionego elementu tablicy.
Elementami tablicy s
ą
INT, DINT,
WORD lub BYTE, 0
≤
inx
≤
length-1,
1
≤
onx
≤
length.
SEARCH_GE_INT(
ar, inx, in,
length, onx)
SEARCH_GE_DINT(
ar, inx,
in, length, onx)
SEARCH_GE_WORD(
ar,
inx, in, length, onx)
SEARCH_GE_BYTE(
ar, inx,
in, length, onx)
ar: INT, DINT, WORD, BYTE
inx: UINT
onx: UINT
in: INT, DINT, WORD, BYTE
length: 32767
tak
Przeszukuje tablic
ę
zdefiniowan
ą
przez ar i length pocz
ą
wszy od
elementu inx w celu znalezienia
elementów wi
ę
kszych lub równych
wzorcowi in. Je
ż
eli wynik
przeszukiwania b
ę
dzie pozytywny, to
onx = numer znalezionego elementu
tablicy. Elementami tablicy s
ą
INT,
DINT, WORD lub BYTE,
0
≤
inx
≤
length-1, 1
≤
onx
≤
length.
SEARCH_LT_INT(
ar, inx, in,
length, onx)
SEARCH_LT_DINT(
ar, inx,
in, length, onx)
SEARCH_LT_WORD(
ar, inx,
in, length, onx)
SEARCH_LT_BYTE(
ar, inx,
in, length, onx)
ar: INT, DINT, WORD, BYTE
inx: UINT
onx: UINT
in: INT, DINT, WORD, BYTE
length: 32767
tak
Przeszukuje tablic
ę
zdefiniowan
ą
przez ar i length pocz
ą
wszy od
elementu inx w celu znalezienia
elementów mniejszych od wzorca in.
Je
ż
eli wynik przeszukiwania b
ę
dzie
pozytywny, to onx = numer
znalezionego elementu tablicy.
Elementami tablicy s
ą
INT, DINT,
WORD lub BYTE, 0
≤
inx
≤
length-1,
1
≤
onx
≤
length.
Programowanie w j
ę
zyku Instruction List
14
Laboratorium Podstaw Automatyki i Regulacji Automatycznej II
SEARCH_LE_INT(
ar, inx, in,
length, onx)
SEARCH_LE_DINT(
ar, inx,
in, length, onx)
SEARCH_LE_WORD(
ar, inx,
in, length, onx)
SEARCH_LE_BYTE(
ar, inx,
in, length, onx)
ar: INT, DINT, WORD, BYTE
inx: UINT
onx: UINT
in: INT, DINT, WORD, BYTE
length: 32767
Przeszukuje tablic
ę
zdefiniowan
ą
przez ar i length pocz
ą
wszy od
elementu inx w celu znalezienia
elementów mniejszych lub równych
wzorcowi in. Je
ż
eli wynik
przeszukiwania b
ę
dzie pozytywny, to
onx = numer znalezionego elementu
tablicy. Elementami tablicy s
ą
INT,
DINT, WORD lub BYTE,
0
≤
inx
≤
length-1, 1
≤
onx
≤
length.
Program
ć
wiczenia:
Zad. 1.
Napisa
ć
w j
ę
zyku
Instruction List dla PLC podprogram wykonywany bezwarunkowo, równowa
ż
ny poni
ż
szemu
schematowi drabinkowemu. Napisa
ć
tablic
ę
prawdy i sprawdzi
ć
działanie podprogramu wykorzystuj
ą
c tablic
ę
Data Watch.
Zad. 2.
Napisa
ć
w j
ę
zyku
Instruction List dla PLC wykonywany bezwarunkowo podprogram obliczaj
ą
cy nast
ę
puj
ą
c
ą
warto
ść
bezwzgl
ę
dn
ą
:
(REJ1
•
REJ2) – REJ3
Wynik ma by
ć
przechowywany w rejestrze o nazwie WYNIK. Zakładamy,
ż
e warto
ś
ci w rejestrach s
ą
z przedziału [-100, +100], czyli wystarczy format INT.
Zad. 3.
W zakładzie produkuj
ą
cym wózki akumulatorowe znajduje si
ę
magazyn wyrobów gotowych wyposa
ż
ony
w czujnik wjazdu wózka do magazynu CZ_WE i czujnik wyjazdu wózka z magazynu CZ_WY. Napisz program,
którego zadaniem jest zliczanie liczby wózków w magazynie w rejestrze o nazwie MAGAZYN. Pojemno
ść
magazynu wynosi 20 wózków. Je
ś
li magazyn jest pełny (MAGAZYN=20), to nale
ż
y wł
ą
czy
ć
blokad
ę
wjazdu
wózków do magazynu (wyj
ś
cie ZAPORA=1). Wówczas czujnik wjazdu nie powinien działa
ć
.
Napisa
ć
program
w j
ę
zyku
Instruction List dla PLC.
Zad. 4.
Czujnik z przetwornikiem mierzy temperatur
ę
w zakresie 100-500
°
C i daje sygnał napi
ę
ciowy w zakresie
0-10 V. Napisz program sterowania sygnalizacj
ą
przekroczenia górnego. Je
ś
li temperatura przekroczy 300
°
C,
nale
ż
y wł
ą
czy
ć
sygnalizator LAMPKA mrugaj
ą
cy z cz
ę
stotliwo
ś
ci
ą
1 Hz (alarm
ż
ółty). Wył
ą
czenie
sygnalizatora LAMPKA nast
ą
pi po skasowaniu alarmu przyciskiem niestabilnym KASUJ (o ile temperatura
spadnie poni
ż
ej poziomu alarmu
ż
ółtego). Je
ż
eli temperatura przekroczy 350
°
C, nale
ż
y wł
ą
czy
ć
sygnalizator
d
ź
wi
ę
kowy BUCZEK (alarm czerwony). Wył
ą
czenie sygnalizacji d
ź
wi
ę
kowej nast
ą
pi po obni
ż
eniu temperatury
poni
ż
ej poziomu alarmu czerwonego z histerez
ą
10
°
C. Napisa
ć
w j
ę
zyku
Instruction List program
wykorzystuj
ą
c funkcje asemblerowe (nie bloki funkcyjne). Program nie wymaga wy
ś
wietlania temperatury
po przeskalowaniu.
Zad. dod. 1.
Naci
ś
ni
ę
cie niestabilnego przycisku START powoduje zał
ą
czenie jednego agregatu (wyj
ś
cie o nazwie
AGREGAT1). Ponowne naci
ś
ni
ę
cie tego samego przycisku powoduje zał
ą
czenie drugiego agregatu (wyj
ś
cie
o nazwie AGREGAT2). Dalsze naciskanie przycisku START niczego ju
ż
nie zmienia. Rozwierny niestabilny
przycisk STOP wył
ą
cza pracuj
ą
ce agregaty. Napisa
ć
program w j
ę
zyku
Instruction List dla PLC.
Programowanie w j
ę
zyku Instruction List
Laboratorium Podstaw Automatyki i Regulacji Automatycznej
15
Zad. dod. 2.
Napisa
ć
w j
ę
zyku
Instruction List program archiwizuj
ą
cy produkcj
ę
wody mineralnej. Zakład pracuje na dwie
zmiany. O tym, która zmiana aktualnie pracuje decyduje przeł
ą
cznik ZMIANA. Równolegle pracuj
ą
trzy linie
napojów. O wyprodukowaniu butelki z wod
ą
na linii informuje nas fotokomórka sygnałem impulsowym
(fotokomórki F1, F2, F3). System powinien monitorowa
ć
liczb
ę
wyprodukowanych skrzynek na ka
ż
dej linii
i zapami
ę
tywa
ć
w rejestrach o nazwach LINIA1, LINIA2, LINIA3. Skrzynka zawiera 12 butelek. System
powinien przechowywa
ć
w pami
ę
ci produkcj
ę
dwóch poprzednich zmian (rejestry o nazwach PRODUKCJA1,
PRODUKCJA2) oraz generowa
ć
raport dzienny sumuj
ą
cy produkcj
ę
pierwszej i drugiej zmiany (rejestr
RAPORT).
Zad. dod. 3.
Napisz program w j
ę
zyku
Instruction List dla PLC obliczaj
ą
cy warto
ść
nast
ę
puj
ą
cego wyra
ż
enia:
REJ3
REJ2
-
REJ1
z kontrol
ą
mo
ż
liwo
ś
ci wykonania oblicze
ń
w rejestrze o nazwie STATUS. Wynik oblicze
ń
ma znale
źć
si
ę
w rejestrze o nazwie WYNIK.
Znaczenie bitów w rejestrze STATUS:
Bit 1 = 1 - przekroczenie zakresu,
Bit 2 = 1 - próba dzielenia przez zero,
Bit 3 = 1 - próba obliczania pierwiastka kwadratowego z liczby ujemnej.
Wymagana wiedza:
-
prawa algebry Boole’a,
-
skalowanie sygnałów analogowych, liczniki, działania arytmetyczne, porównania,
-
metody programowania sterowników PLC (norma IEC61131-3) – j
ę
zyk listy instrukcji,
-
podstawy obsługi oprogramowania narz
ę
dziowego Proficy ME Logic Developer PLC,
Warunek zaliczenia:
-
obecno
ść
na zaj
ę
ciach,
-
wykazanie si
ę
wymagan
ą
wiedz
ą
w trakcie
ć
wicze
ń
,
-
wykonanie zada
ń
według instrukcji. Ka
ż
dy program powinien znajdowa
ć
si
ę
w oddzielnym projekcie
o nazwie: T7_X_ZZ (X – nr zadania, ZZ – nr sekcji). Wszystkie projekty powinny zawiera
ć
konfiguracj
ę
zgodn
ą
ze sprz
ę
tem znajduj
ą
cym si
ę
na stanowisku, nazwy zmiennych zgodne z tre
ś
ci
ą
zadania
i komentarze. Do projektu dla zad. 1 nale
ż
y doł
ą
czy
ć
tablic
ę
prawdy. Konfiguracja sterownika powinna
posiada
ć
adresy referencji dwustanowych zaczynaj
ą
ce si
ę
od numeru referencji wyliczanego ze wzoru:
nr sekcji * 8 – 7
oraz adresy referencji analogowych zaczynaj
ą
ce si
ę
od numeru sekcji. W komentarzu powinny znale
źć
si
ę
nazwiska członków sekcji oraz opis programu.
-
przesłanie backup’ow projektów w terminie podanym w systemie e-learning’u,
-
pozytywne zaliczenie projektów,
-
uzyskanie pozytywnej oceny z ustnej lub pisemnej odpowiedzi na pytania kontrolne.
-
zadania dodatkowe nale
ż
y przysyła
ć
w systemie e-learning’u w projektach o nazwach T7_X_nazwisko.
Nie s
ą
one wymagane do zaliczenia, natomiast prawidłowo rozwi
ą
zane przez pierwsz
ą
osob
ę
w grupie s
ą
premiowane ocen
ą
bardzo dobr
ą
.
Literatura:
[1] Oprogramowanie Proficy Machine Edition. Logic Developer PLC - pakiet do programowania sterowników
GE Fanuc. Pierwsze kroki. Astor Kraków.
[2] VersaPro. Podr
ę
cznik u
ż
ytkownika. Astor, Kraków 1999.
[3] PN-EN 61131-3: 1998 Sterowniki programowalne. J
ę
zyki programowania.