PLC-AUTOMATIZACE - PROGRAM - PROGRAMOVÉ BLOKY - PARAMETRIZACE PODPROGRAMŮ
- NEPŘÍMÉ |
Provoz webu zajišťuje:
|
NEPŘÍMÉ PŘEDÁVÁNÍ PARAMETRŮ
Charakteristika
Při nepřímém předávání parametrů se nepředávají konkrétní hodnoty proměnných do parametrů, ale zadává se parametr, který určuje se, odkud si je má
podprogram načíst. Tento způsob je vhodný pro velký objem hodnot, které se mají předávat a značně zjednodušuje a zpřehledňuje program, například při předávání
datového oblasti (telegramu) ke komunikaci.
|
Předání konkrétního DB v parametru
Volání podprogramu, který má definován pouze jeden parametr (DATA), očekává se, že parametru bude přiřazeno označení oblasti dat ke zpracování (DB n). Příklad
je vhodný pro případy, kdy jsou v daném místě programu zpracovávána stejná
data a na jiném místě stejným podprogramem zpracována data jiná. Oblasti dat, které jsou podprogramy předávány musí mít shodnou strukturu dat.
1a) Deklarace proměnných v datovém bloku DB 66 pro skupinu proměnných A:
|
|
|
|
|
|
|
|
|
|
|
|
DB 66 |
|
|
|
|
|
|
|
(adresa) |
(symbol) |
|
(typ) |
|
|
|
|
|
0.0 |
ENABLE |
|
Bool |
|
|
// proměnná jednoho bitu typu Bool |
|
|
0.1 |
STATUS |
|
Bool |
|
|
// proměnná jednoho bitu typu Bool |
|
|
2.0 |
VALUE |
|
Integer |
|
|
// celočíselná proměnná typu Integer |
|
|
4.0 |
COEFF |
|
Real |
|
|
// proměnná čísla s des. čárkou typu Real |
|
|
8.0 |
DIFF |
|
Integer |
|
|
// celočíselná proměnná typu Integer |
|
|
|
|
|
|
|
|
|
1a) Deklarace proměnných v datovém bloku DB 67 pro skupinu proměnných B:
|
|
|
|
|
|
|
|
|
|
|
|
DB 67 |
|
|
|
|
|
|
|
(adresa) |
(symbol) |
|
(typ) |
|
|
|
|
|
0.0 |
ENABLE |
|
Bool |
|
|
// proměnná jednoho bitu typu Bool |
|
|
0.1 |
STATUS |
|
Bool |
|
|
// proměnná jednoho bitu typu Bool |
|
|
2.0 |
VALUE |
|
Integer |
|
|
// celočíselná proměnná typu Integer |
|
|
4.0 |
COEFF |
|
Real |
|
|
// proměnná čísla s des. čárkou typu Real |
|
|
8.0 |
DIFF |
|
Integer |
|
|
// celočíselná proměnná typu Integer |
|
|
|
|
|
|
|
|
|
2) Volání podprogramu pro hodnoty A a B uložené v datovém bloku 66 a 67:
|
|
|
|
|
|
|
|
|
|
|
|
CALL |
|
TEST |
|
|
// volání podprogramu |
|
|
|
DATA: |
|
DB 66 |
|
|
// parametr: potřebné hodnoty jsou uloženy v datovém bloku DB 66 |
|
|
|
... |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
CALL |
|
TEST |
|
|
// volání podprogramu |
|
|
|
DATA: |
|
DB 67 |
|
|
// parametr: potřebné hodnoty jsou uloženy v datovém bloku DB 67 |
|
|
|
|
|
|
|
|
|
3) Podprogram
|
|
|
|
|
|
|
|
|
|
|
NAME: |
TEST |
|
|
|
|
// název podprogramu |
|
|
|
Inp: DATA |
|
Block |
|
|
// vstupní parametr: typ Blok |
|
|
|
|
|
|
|
|
|
|
|
|
OPN |
|
DATA |
|
|
// otevření (zpřístupnění) přiřazeného DB parametrem DATA |
|
|
|
L |
|
DW 2 |
|
|
// načtení hodnoty datového slova 2 VALU (Integer) |
|
|
|
ITD |
|
|
|
|
// pomocná konverze |
|
|
|
DTR |
|
|
|
|
// pomocná konverze |
|
|
|
L |
|
DD 4 |
|
|
// načtení hodnoty dvojitého datového slova 4 COEF (Real) |
|
|
|
-R |
|
|
|
|
// rozdíl hodnot |
|
|
|
TRUNC |
|
|
|
|
// pomocná konverze (DInt/DInt) |
|
|
|
T |
|
DW 8 |
|
|
// uložení výsledku do datového slova 8 / DIFF (Int) |
|
|
|
L |
|
0 |
|
|
// porovnávací hodnota (konstanta) |
|
|
|
>=F |
|
|
|
|
// porovnání |
|
|
|
A |
|
DBX 0.0 |
|
|
// podmínka výstupu datového bitu 0.0 ENBL (Bool) |
|
|
|
= |
|
DBX 0.1 |
|
|
// uložení výsledku podmíněného porovnání do datového bitu 0.1 STAT (Bool) |
|
|
|
RET |
|
|
|
|
// konec podprogramu |
|
|
|
|
|
|
|
|
|
|
Předání čísla DB jako parametru
Volání podprogramu, který má definován pouze jeden parametr (DB-NR), očekává se, že parametru bude přiřazeno pouze číslo datové oblasti (n). Vhodné pro případy, kdy mohou být
na jednom místě programu zpracovávány různá data.
1a) Deklarace proměnných v datovém bloku DB 66 pro skupinu proměnných A:
|
|
|
|
|
|
|
|
|
|
|
|
DB 66 |
|
|
|
|
|
|
|
(adresa) |
(symbol) |
|
(typ) |
|
|
|
|
|
0.0 |
ENABLE |
|
Bool |
|
|
// proměnná jednoho bitu typu Bool |
|
|
0.1 |
STATUS |
|
Bool |
|
|
// proměnná jednoho bitu typu Bool |
|
|
2.0 |
VALUE |
|
Integer |
|
|
// celočíselná proměnná typu Integer |
|
|
4.0 |
COEFF |
|
Real |
|
|
// proměnná čísla s des. čárkou typu Real |
|
|
8.0 |
DIFF |
|
Integer |
|
|
// celočíselná proměnná typu Integer |
|
|
|
|
|
|
|
|
|
1b) Deklarace proměnných v datovém bloku DB 67 pro skupinu proměnných B:
|
|
|
|
|
|
|
|
|
|
|
|
DB 67 |
|
|
|
|
|
|
|
(adresa) |
(symbol) |
|
(typ) |
|
|
|
|
|
0.0 |
ENABLE |
|
Bool |
|
|
// proměnná jednoho bitu typu Bool |
|
|
0.1 |
STATUS |
|
Bool |
|
|
// proměnná jednoho bitu typu Bool |
|
|
2.0 |
VALUE |
|
Integer |
|
|
// celočíselná proměnná typu Integer |
|
|
4.0 |
COEFF |
|
Real |
|
|
// proměnná čísla s des. čárkou typu Real |
|
|
8.0 |
DIFF |
|
Integer |
|
|
// celočíselná proměnná typu Integer |
|
|
|
|
|
|
|
|
|
2) Volání podprogram pro hodnoty A nebo B uložené v datovém bloku 66 nebo 67:
|
|
|
|
|
|
|
|
|
|
|
|
... |
|
n |
|
|
// určení čísla požadovaného datového bloku (n = 66, 67) |
|
|
|
T |
|
AREA |
|
|
// uložení do pomocné proměnné |
|
|
|
|
|
|
|
|
|
|
|
|
CALL |
|
TEST |
|
|
// volání podprogramu |
|
|
|
DB-NR: |
|
AREA |
|
|
// parametr určuje, že potřebné hodnoty jsou uloženy v DB n |
|
|
|
|
|
|
|
|
|
3) Podprogram
|
|
|
|
|
|
|
|
|
|
|
NAME: |
TEST |
|
|
|
|
// název podprogramu |
|
|
|
Inp: DB-NR |
|
Integer |
|
|
// vstupní parametr: číslo bloku, typ Integer |
|
|
|
|
|
|
|
|
|
|
|
|
OPN |
|
[DB-NR] |
|
|
// otevření (zpřístupnění) DB určeného číslem v parametru DB-NR |
|
|
|
L |
|
DW 2 |
|
|
// načtení hodnoty datového slova 2 VALU (Integer) |
|
|
|
ITD |
|
|
|
|
// pomocná konverze |
|
|
|
DTR |
|
|
|
|
// pomocná konverze |
|
|
|
L |
|
DD 4 |
|
|
// načtení hodnoty dvojitého datového slova 4 COEF (Real) |
|
|
|
-R |
|
|
|
|
// rozdíl hodnot |
|
|
|
TRUNC |
|
|
|
|
// pomocná konverze (DInt/DInt) |
|
|
|
T |
|
DW 8 |
|
|
// uložení výsledku do datového slova 8 / DIFF (Int) |
|
|
|
L |
|
0 |
|
|
// porovnávací hodnota (konstanta) |
|
|
|
>=F |
|
|
|
|
// porovnání |
|
|
|
A |
|
DBX 0.0 |
|
|
// podmínka výstupu datového bitu 0.0 ENBL (Bool) |
|
|
|
= |
|
DBX 0.1 |
|
|
// uložení výsledku podmíněného porovnání do dat. bitu 0.1 STAT (Bool) |
|
|
|
RET |
|
|
|
|
// konec podprogramu |
|
|
|
|
|
|
|
|
|
|
Předání čísla DB a OFFSETu dat v parametrech
Volání podprogramu, který má definován parametr (DB-NR) a očekává se, že parametru bude přiřazeno pouze číslo datové oblasti (n), druhému parametru (OFFSET) je přiřazena hodnota, která určuje, s kterou částí datové oblasti (posunutím dat) se má pracovat, respektive, kde se nachází první hodnota určená ke zpracování. Efekt je takový, že v jednom datovém bloku může být uloženo více datových skupin a vybírá se, kterou skupinu dat má podprogram zpracovat.
1) Deklarace proměnných v datovém bloku DB 70 pro skupinu proměnných A i B:
|
|
|
|
|
|
|
|
|
|
|
|
DB 70 |
|
|
|
|
|
|
|
(adresa) |
(symbol) |
|
(typ) |
|
|
|
|
|
|
|
|
|
|
|
// pro skupinu proměnných A |
|
|
0.0 |
A_ENABLE |
|
Bool |
|
|
// proměnná jednoho bitu typu Bool |
|
|
0.1 |
A_STATUS |
|
Bool |
|
|
// proměnná jednoho bitu typu Bool |
|
|
2.0 |
A_VALUE |
|
Integer |
|
|
// celočíselná proměnná typu Integer |
|
|
4.0 |
A_COEFF |
|
Real |
|
|
// proměnná čísla s des. čárkou typu Real |
|
|
8.0 |
A_DIFF |
|
Integer |
|
|
// celočíselná proměnná typu Integer |
|
|
10.0 |
A_REZ_1 |
|
DWord |
|
|
// rezerva |
|
|
14.0 |
A_REZ_2 |
|
Word |
|
|
// rezerva |
|
|
|
|
|
|
|
|
// pro skupinu proměnných B |
|
|
16.0 |
ENABLE |
|
Bool |
|
|
// proměnná jednoho bitu typu Bool |
|
|
16.1 |
STATUS |
|
Bool |
|
|
// proměnná jednoho bitu typu Bool |
|
|
18.0 |
VALUE |
|
Integer |
|
|
// celočíselná proměnná typu Integer |
|
|
20.0 |
COEFF |
|
Real |
|
|
// proměnná čísla s des. čárkou typu Real |
|
|
24.0 |
DIFF |
|
Integer |
|
|
// celočíselná proměnná typu Integer |
|
|
26.0 |
B_REZ_1 |
|
DWord |
|
|
// rezerva |
|
|
30.0 |
B_REZ_2 |
|
Word |
|
|
// rezerva |
|
|
|
|
|
|
|
|
// pro skupinu proměnných ... |
|
|
32.0 |
... |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2) Volání podprogramu pro hodnoty A / B uložené v datovém bloku 70:
|
|
|
|
|
|
|
|
|
|
|
|
CALL |
|
TEST |
|
|
// volání podprogramu |
|
|
|
DB-NR: |
|
+70 |
|
|
// potřebné hodnoty jsou v DB 70 |
|
|
|
OFFSET: |
|
+0 |
|
|
// posunutí výběru hodnot pro skupinu A o 0 pozic v DB (konstanta) |
|
|
|
... |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
CALL |
|
TEST |
|
|
// volání podprogramu |
|
|
|
DB-NR: |
|
+70 |
|
|
// potřebné hodnoty jsou v DB 70 |
|
|
|
OFFSET: |
|
+16 |
|
|
// posunutí výběru hodnot pro skupinu B o 16 pozic v DB (konstanta) |
|
|
|
|
|
|
|
|
|
Poznámka |
Místo přímého zadání čísla DB a OFFSETu je možno použít i proměnné obsahující tyto hodnoty. |
3) Podprogram:
|
|
|
|
|
|
|
|
|
|
|
NAME: |
TEST |
|
|
|
|
// název podprogramu |
|
|
|
Inp: DB-NR |
|
Integer |
|
|
// vstupní parametr: číslo bloku, typ Integer |
|
|
|
Inp: OFFSET |
|
Integer |
|
|
// vstupní parametr: velikost posunutí |
|
|
|
|
|
|
|
|
|
|
|
|
OPN |
|
[DB-NR] |
|
|
// otevření (zpřístupnění) DB určeného číslem v parametru DB-NR |
|
|
|
L |
|
OFFSET |
|
|
// načtení posunutí v datovém bloku |
|
|
|
... |
|
|
|
|
// zpracování offsetu posunutí pro adresování proměnných |
|
|
|
|
|
|
|
|
|
|
|
|
... |
|
|
|
|
// instrukce podprogramu |
|
|
|
|
|
|
|
|
|
|
|
|
RET |
|
|
|
|
// konec podprogramu |
|
|
|
|
|
|
|
|
|
|
Předání čísla DB a INDEXu dat v parametrech
Volání podprogramu, který má definován parametr (DB-NR) a očekává se, že parametru bude přiřazeno pouze číslo datové oblasti (n), druhému parametru (INDEX) je přiřazena hodnota, která určuje, s kolikátou částí datové oblasti (posunutím dat) se má pracovat, to určuje i to, kde se nachází první hodnota určená ke zpracování. Efekt je takový, že v jednom datovém bloku může být uloženo více datových skupin a vybírá se, s kterou skupinu dat má podprogram zpracovat, a to pomocí parametru INDEX, kdy pevná hodnota může být nahrazena proměnnou. V podprogramu je pak nutno interně dopočítat vlastní OFFSET.
1) Deklarace proměnných v datovém bloku DB 70 pro skupinu proměnných A i B:
|
|
|
|
|
|
|
|
|
|
|
|
DB 70 |
|
|
|
|
|
|
|
(adresa) |
(symbol) |
|
(typ) |
|
|
|
|
|
|
|
|
|
|
|
// pro skupinu proměnných A |
|
|
0.0 |
A_ENABLE |
|
Bool |
|
|
// proměnná jednoho bitu typu Bool |
|
|
0.1 |
A_STATUS |
|
Bool |
|
|
// proměnná jednoho bitu typu Bool |
|
|
2.0 |
A_VALUE |
|
Integer |
|
|
// celočíselná proměnná typu Integer |
|
|
4.0 |
A_COEFF |
|
Real |
|
|
// proměnná čísla s des. čárkou typu Real |
|
|
8.0 |
A_DIFF |
|
Integer |
|
|
// celočíselná proměnná typu Integer |
|
|
10.0 |
A_REZ_1 |
|
DWord |
|
|
// rezerva |
|
|
14.0 |
A_REZ_2 |
|
Word |
|
|
// rezerva |
|
|
|
|
|
|
|
|
// pro skupinu proměnných B |
|
|
16.0 |
B_ENABLE |
|
Bool |
|
|
// proměnná jednoho bitu typu Bool |
|
|
16.1 |
B_STATUS |
|
Bool |
|
|
// proměnná jednoho bitu typu Bool |
|
|
18.0 |
B_VALUE |
|
Integer |
|
|
// celočíselná proměnná typu Integer |
|
|
20.0 |
B_COEFF |
|
Real |
|
|
// proměnná čísla s des. čárkou typu Real |
|
|
24.0 |
B_DIFF |
|
Integer |
|
|
// celočíselná proměnná typu Integer |
|
|
26.0 |
B_REZ_1 |
|
DWord |
|
|
// rezerva |
|
|
30.0 |
B_REZ_2 |
|
Word |
|
|
// rezerva |
|
|
|
|
|
|
|
|
// pro skupinu proměnných ... |
|
|
32.0 |
... |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2) Volání podprogramu pro hodnoty A / B uložené v datovém bloku 70:
|
|
|
|
|
|
|
|
|
|
|
|
CALL |
|
TEST |
|
|
// volání podprogramu |
|
|
|
DB-NR: |
|
+70 |
|
|
// potřebné hodnoty jsou v DB 70 |
|
|
|
INDEX: |
|
+0 |
|
|
// ukazatel výběru hodnot pro skupinu A v DB |
|
|
|
... |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
CALL |
|
TEST |
|
|
// volání podprogramu |
|
|
|
DB-NR: |
|
+70 |
|
|
// potřebné hodnoty jsou v DB 70 |
|
|
|
INDEX: |
|
+1 |
|
|
// ukazatel výběru hodnot pro skupinu B v DB |
|
|
|
|
|
|
|
|
|
Poznámka |
Místo přímého zadání čísla DB a INDEXu je možno použít i proměnné obsahující tyto hodnoty. |
3) Podprogram:
|
|
|
|
|
|
|
|
|
|
|
NAME: |
TEST |
|
|
|
|
// název podprogramu |
|
|
|
Inp: DB-NR |
|
Integer |
|
|
// vstupní parametr: číslo bloku, typ Integer |
|
|
|
Inp: INDEX |
|
Integer |
|
|
// vstupní parametr: index posunutí |
|
|
|
|
|
|
|
|
|
|
|
|
OPN |
|
[DB-NR] |
|
|
// otevření (zpřístupnění) DB určeného číslem v parametru DB-NR |
|
|
|
L |
|
INDEX |
|
|
// načtení indexu posunutí v datovém bloku |
|
|
|
L |
|
+16 |
|
|
// velikost oblasti dat A / B (konstanta) |
|
|
|
*I |
|
|
|
|
|
|
|
|
... |
|
|
|
|
// zpracování offsetu posunutí pro adresování proměnných |
|
|
|
|
|
|
|
|
|
|
|
|
... |
|
|
|
|
// instrukce podprogramu |
|
|
|
|
|
|
|
|
|
|
|
|
RET |
|
|
|
|
// konec podprogramu |
|
|
|
|
|
|
|
|
|
|
|
PLC-AUTOMATIZACE - PROGRAM - PROGRAMOVÉ BLOKY - PARAMETRIZACE PODPROGRAMŮ - NEPŘÍMÉ
|