Mapping der SPS- und IEC-Prozessdaten
Die TwinCAT SPS-Prozessdaten werden zur Programmlaufzeit zyklisch in die IEC-Prozessdaten (Applikationsobjekte) und umgekehrt gemappt (kopiert). Für das Mapping der IEC<->SPS Prozessdaten können bis zu 4 Prozessdatenbereiche (IO-Eingänge, IO-Ausgänge, Merkerbereich, Datenbereich) als Puffervariablen im SPS-Programm deklariert werden. Die Bytegröße der Puffer ist frei wählbar und kann für jeden Bereich unterschiedlich gewählt werden. Unbenutzte Bereiche müssen nicht unbedingt deklariert werden.
In unserem Einführungsbeispiel deklarieren wir 4 SPS-Prozessdatenbereiche mit jeweils 3000 Bytes:
PROGRAM P_MAIN_LowSpeed
VAR
AODB : ARRAY[0..49] OF ST_IEC870_5_101AODBEntry;
hTable : T_HAODBTable;
init : BOOL := TRUE;
initError : UDINT;
asduAddr : UDINT := 7;
inputs AT%IB0 : ARRAY[0..2999] OF BYTE;
outputs AT%QB0 : ARRAY[0..2999] OF BYTE;
memory AT%MB0 : ARRAY[0..2999] OF BYTE;
data : ARRAY[0..2999] OF BYTE;
END_VAR
Die Zuordnung, wie die Prozessdaten zur Laufzeit gemappt werden sollen, wird während der Konfiguration der Applikationsobjekte mit der F_iecAddTableEntry Funktion festgelegt.
Siehe auch in: Applikationsobjekte definieren und konfigurieren.
Die Puffervariablen wurden nun als Byte-Arrays deklariert. Um auf die gewünschten Daten besser zugreifen zu können definieren wir die einzelnen Variablen ein zweites Mal und legen diese auf die entsprechenden Byte/Bit-Offsetadressen. Bei einer Änderung im Byte-Array wird die entsprechende einzelne Variable gleichzeitig geändert und umgekehrt. Dies ist aber nicht zwingend notwendig. Sie können direkt auf die Bytes/Bits der Byte-Array-Puffervariablen zugreifen.
VAR_GLOBAL(* Memory offset 0..99 unused *)
(* Single points *)
msgSingle_0 AT%MX100.0 : BOOL;
msgSingle_1 AT%MX100.1 : BOOL;
msgSingle_2 AT%MX100.2 : BOOL;
(* Double points *)
(* Bit 0..1 = first double point,
Bit 2..3 = second double point,
Bit 4..5 = third double point,
Bit 6..7 = fourth double point *)
msgDouble_0 AT%MB200 : BYTE;
(* Regulating step values *)
msgStep_0 AT%MB300 : BYTE;
msgStep_1 AT%MB301 : BYTE;
msgStep_2 AT%MB302 : BYTE;
(* 32 bit strings *)
msgBitStr_0 AT%MD400 : DWORD;
msgBitStr_1 AT%MD404 : DWORD;
msgBitStr_2 AT%MD408 : DWORD;
(* Measured values, normalized values *)
msgNormalized_0 AT%MW500 : WORD;
msgNormalized_1 AT%MW502 : WORD;
msgNormalized_2 AT%MW504 : WORD;
(* Measured values, scaled values *)
msgScaled_0 AT%MW600 : INT;
msgScaled_1 AT%MW602 : INT;
msgScaled_2 AT%MW604 : INT;
(* Measured values, short floating point values *)
msgFloating_0 AT%MD700 : REAL;
msgFloating_1 AT%MD704 : REAL;
msgFloating_2 AT%MD708 : REAL;
(* Integrated totals *)
msgTotal_0 AT%MD800 : UDINT;
msgTotal_1 AT%MD804 : UDINT;
msgTotal_2 AT%MD808 : UDINT;
(* Single commands *)
cmdSingle_0 AT%MX2100.0 : BOOL;
cmdSingle_1 AT%MX2100.1 : BOOL;
cmdSingle_2 AT%MX2100.2 : BOOL;
(* Double commands *)
(* Bit 0..1 = first double command,
Bit 2..3 = second double command,
Bit 4..5 = third double command,
Bit 6..7 = fourth double command *)
cmdDouble_0 AT%MB2200 : BYTE;
(* 32 bit string commands *)
cmdBitStr_0 AT%MD2400 : DWORD;
cmdBitStr_1 AT%MD2404 : DWORD;
cmdBitStr_2 AT%MD2408 : DWORD;
(* Set point, normalized values *)
cmdNormalized_0 AT%MW2500 : WORD;
cmdNormalized_1 AT%MW2502 : WORD;
cmdNormalized_2 AT%MW2504 : WORD;
(* Set point, scaled values *)
cmdScaled_0 AT%MW2600 : INT;
cmdScaled_1 AT%MW2602 : INT;
cmdScaled_2 AT%MW2604 : INT;
(* Set point, short floating point values *)
cmdFloating_0 AT%MD2700 : REAL;
cmdFloating_1 AT%MD2704 : REAL;
cmdFloating_2 AT%MD2708 : REAL;
END_VAR
Mapping der IEC<->SPS Prozessdaten in der Zentralstation
Prozessdaten in Überwachungsrichtung (Slave->Master information)
Beispiel 1
Single point information (M_SP_NA_1) mit der IOA = 100, SPS Merkerbereich, Byteoffset = 100, Bitoffset = 0.
Unterstation -> ... -> Zentralstation FB -> memory[100].0 == msgSingle_0
Beispiel 2
Measured value, short floating point value (M_ME_NC_1) mit der IOA = 700, SPS Merkerbereich, Byteoffset = 700, Bitoffset = 0 (bedeutungslos).
Unterstation -> ... -> Zentralstation FB -> memory[700..703] == msgFloating_0
Prozessdaten in Steuerungsrichtung (Master->Slave commands)
Beispiel 1
Single command state (C_SC_NA_1) mit der IOA = 10, SPS Merkerbereich, Byteoffset = 2100, Bitoffset = 0.
cmdSingle_0 == memory[2100].0 -> Zentralstation FB -> ... -> Unterstation
Beispiel 2
Set point, short floating point value (C_SE_NC_1) mit der IOA = 70, SPS Merkerbereich, Byteoffset = 2700, Bitoffset = 0 (bedeutungslos).
cmdFloating_0 == memory[2700..2703] -> Zentralstation FB -> ... -> Unterstation