PARAMETRY PŘEDÁVANÉ FORMÁLNÍM PARAMETREM
Charakteristika
Předání parametrů formálním parametrem je podobné jako nepřímé předání parametrů s tím, že pomocí ukazatele je možno určit různé paměťové
oblasti nebo objekty, které
obsahují potřebné parametry.
Jako paměťovou oblast je možno určit:
- datový blok
- paměťové příznaky
- čítače, časovače
- oblast vstupů, výstupů
- ... další oblasti uvolněné výrobcem PLC
|
Předání parametrů typem BLOCK
Volání podprogramu, který má definován pouze jeden parametr typu BLOCK, očekává se, že parametru bude přiřazen konkrétní datový blok. 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í podprogramu pro hodnoty A nebo B uložené v datovém bloku 66 nebo 67:
|
|
|
|
|
|
|
|
|
|
|
|
CALL |
|
TEST |
|
|
// volání podprogramu |
|
|
|
BLOCK: |
|
DB66 |
|
|
// parametr určuje, že potřebné hodnoty jsou uloženy v DB 66 |
|
|
|
|
|
|
|
|
|
|
|
|
... |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
CALL |
|
TEST |
|
|
|
|
|
|
BLOCK: |
|
DB67 |
|
|
// parametr určuje, že potřebné hodnoty jsou uloženy v DB 67 |
|
|
|
|
|
|
|
|
|
3) Podprogram
|
|
|
|
|
|
|
|
|
|
|
NAME: |
TEST |
|
|
|
|
// název podprogramu |
|
|
|
Inp: BLOCK |
|
BLOCK-DB |
|
|
// vstupní parametr: typ bloku |
|
|
|
|
|
|
|
|
|
|
|
|
OPN |
|
#P_BLOCK |
|
|
// 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í parametrů typem ANY / POINTER
Volání podprogramu, který má definovány parametry typu ANY a POINTER a očekává se, že parametrům bude přiřazen takový význam (adresová hodnota), který určuje
oblast dat a posunutí v datové oblasti. 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.
Příklad:
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 a B uložené v datovém bloku 70:
|
|
|
|
|
|
|
|
|
|
|
|
CALL |
|
TEST |
|
|
// volání podprogramu |
|
|
|
P_ANY: |
|
P#DB70.DBX 0.0 BYTE 16 |
|
|
// parametr: hodnoty jsou uloženy v datovém bloku DB 70 |
|
|
|
P_PNT: |
|
P#0.0 |
|
|
// parametr: ukazatel na oblast dat od adresy 16 |
|
|
|
|
|
|
|
|
|
|
|
|
... |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
CALL |
|
TEST |
|
|
// volání podprogramu |
|
|
|
P_ANY: |
|
P#DB70.DBX 0.0 BYTE 16 |
|
|
// parametr: hodnoty jsou uloženy v datovém bloku DB 70 |
|
|
|
P_PNT: |
|
P#16.0 |
|
|
// parametr: ukazatel na oblast dat od adresy 16 |
|
|
|
|
|
|
|
|
|
3) Podprogram:
|
|
|
|
|
|
|
|
|
|
|
NAME: |
TEST |
|
|
|
|
// název podprogramu |
|
|
|
Inp: P_ANY |
|
Any |
|
|
// vstupní parametr: číslo bloku, typ Integer |
|
|
|
Inp: P_PNT |
|
Pointer |
|
|
// vstupní parametr: velikost posunutí |
|
|
|
|
|
|
|
|
|
|
|
|
L |
|
P##P_ANY |
|
|
// načtení datového bloku |
|
|
|
LAR1 |
|
|
|
|
// zpracování v adresovém registru |
|
|
|
L |
|
P##P_POINTER |
|
|
// zpracování posunutí |
|
|
|
|
|
|
|
|
|
|
|
|
... |
|
|
|
|
// instrukce podprogramu |
|
|
|
|
|
|
|
|
|
|
|
|
RET |
|
|
|
|
// konec podprogramu |
|
|
|
|
|
|
|
|
|
Poznámka |
U různých typů PLC, různých výrobců, může být použití instrukcí a parametry odlišné. |
|