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 MAIN
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

Das zugehörige Tutorial SPS-Beispiel kann hier heruntergeladen werden.