F_iecChangeLinkLayerMode
Mit dieser Funktion kann das Defaultverhalten jedes einzelnen ASDU-Frames auf der Link-Layer-Ebene in der Primärstation festgelegt bzw. verändert werden. Das zu versendende ASDU-Frame kann als SEND/NO REPLY-Frame (Funktion 4) oder Broadcast-Frame gekennzeichnet werden. Die Kennzeichnung der Frames erfolgt vor dem Ablegen des Frames in dem TX-Puffer. D.h. vor dem Aufruf der FB_IEC870_5_101TBufferCtrl.TxAddObj-Aktion.
Wenn Sie die Funktion nicht verwenden, dann werden in der Primärstation alle Frames als SEND/CONFIRM-Frames (Funktion 3) versendet. Als Linkadresse wird in diesem Fall die konfigurierte Stationsadresse verwendet.
|
Syntax
FUNCTION F_iecChangeLinkLayerMode: BOOL
VAR_INPUT
sendNoReplay : BOOL;
globalLinkAddr : BOOL;
END_VAR
VAR_IN_OUT
asdu : ST_IEC870_5_101AOGen;
END_VAR
Eingänge
sendNoReplay: Dieser Parameter legt fest ob beim Versenden des Frames die Link-Layer-Funktion: SEND/NO REPLY (TRUE = Funktion 4) oder SEND/CONFIRM (FALSE = Funktion 3) verwendet werden soll;
globalLinkAddr: Dieser Parameter legt fest ob beim Versenden des Frames statt der konfigurierten Stations-Linkadresse eine globale (Broadcast) Adresse verwendet werden soll. Beim Wert TRUE wird als Linkadresse im gesendeten Frame 16#FF bzw. 16#FFFF verwendet (one octet size, two octets size link address);
Rückgabewert
Rückgabeparameter | Beschreibung |
---|---|
FALSE | Funktion fehlgeschlagen. |
TRUE | Kein Fehler. |
Beispiel 1 in ST (Ausschnitt)
Die spontanen Daten eines Bitstrings sollen mit der Hilfe der Funktion SEND/NO REPLY an die Zentralstation gesendet werden (Balanced-Mode).
...
(* Send spontanous bitstring data *)
IF ( txQDS <> BITSTRING_QUALITY_100 ) OR ( txBSI <> BITSTRING_100 ) THEN
txBSI := BITSTRING_100;
txQDS := BITSTRING_QUALITY_100;(* Get quality *)
txTT := SYSTEMTIME_TO_CP56Time2a( fbRTC.CDT, TRUE );(* Get current time stamp *)(* create asdu *)
txAsdu.ident.eType := M_BO_TB_1; (* Bit string with time tag *)
txAsdu.ident.bSQ := FALSE;
txAsdu.ident.nObj := 1;
txAsdu.ident.eCOT := eIEC870_COT_SPONTAN;
txAsdu.ident.nORG := sysPara.nOrg;(* Set originator address *)
txAsdu.ident.bPN := FALSE;
txAsdu.ident.bT := FALSE;
txAsdu.ident.eClass := eIEC870_Class_1;(* Put to the high priority tx buffer *)
txAsdu.ident.asduAddr := sysPara.asduAddr;(* Set common asdu address *)
txAsdu.info.objAddr := 100;(* Set information object address *)
F_iecResetStream( 0, txAsdu.info.stream ); (* clear previous data (this sets the stream length = 0 *)
F_iecCopyBufferToStream( ADR( txBSI ), SIZEOF( txBSI ), txAsdu.info.stream ); (* put BSI to stream *)
F_iecCopyBufferToStream( ADR( txQDS ), SIZEOF( txQDS ), txAsdu.info.stream ); (* put QDS to stream *)
F_iecCopyBufferToStream( ADR( txTT ), 7 (*SIZEOF( txTT )-1*), txAsdu.info.stream ); (* put time tag to stream *)F_iecChangeLinkLayerMode( TRUE, FALSE, txAsdu );
fbBuffer.TxAddObj( putObj := txAsdu, buffer := buffer ); (* put asdu to the TX fifo *)F_iecChangeLinkLayerMode( FALSE, FALSE, txAsdu );
IF fbBuffer.bOk THEN
fbLog( put := CONCAT( '<=', IEC101ASDU_TO_STRING(txAsdu) ) );
ELSE(* Report send buffer overflow error *)
fbLog( put := 'TX buffer overflow (spontanous bitstring data)!' );
END_IF
END_IF
...
Die txAsdu-Variable wird zum Versenden weiterer Datenpunkte verwendet. Die Default-Konfiguration des txAsdu-Frames wird durch einen weiteren F_iecChangeLinkLayerMode(FALSE, FALSE, ...)-Funktionsaufruf hergestellt. Andere ASDUs sollen nicht als SEND/NO REPLY-Telegramme gesendet werden.
Beispiel 2 in ST (Ausschnitt)
Ein Einzelbefehl soll mit der Hilfe der Funktion SEND/NO REPLAY an die Unterstation gesendet werden (Unbalanced-Mode).
...
(* Send one single command *)
IF SND_SCS_2100 THEN
SND_SCS_2100 := FALSE; (* Reset flag *)
txAsdu.ident.eType := C_SC_NA_1; (* Single command *)
txAsdu.ident.bSQ := FALSE;
txAsdu.ident.nObj := 1;
txAsdu.ident.eCOT := eIEC870_COT_ACT; (* Command activation *)
txAsdu.ident.nORG := sysPara.nOrg;(* Set originator address *)
txAsdu.ident.bPN := FALSE;
txAsdu.ident.bT := FALSE;
txAsdu.ident.eClass := eIEC870_Class_1;(* Put to the high priority tx buffer *)
txAsdu.ident.asduAddr := sysPara.asduAddr;(* Set common asdu address *)
txAsdu.info.objAddr := 2100;(* Set information object address *)
tmpByte := INT_TO_BYTE(SCS_2100);(* Set single command state *)
tmpByte.7 := 0;(* Set select/execute bit *)
F_iecResetStream( 0, txAsdu.info.stream ); (* Clear previous data (this sets the stream length = 0 *)
F_iecCopyBufferToStream( ADR( tmpByte ), SIZEOF( tmpByte ), txAsdu.info.stream ); (* put QCC to stream *) F_iecChangeLinkLayerMode( TRUE, FALSE, txAsdu );
fbBuffer.TxAddObj( putObj := txAsdu, buffer := buffer ); (* put asdu to the TX fifo *)
F_iecChangeLinkLayerMode( FALSE, FALSE, txAsdu );
IF fbBuffer.bOk THEN
timerCON( IN := FALSE );(* Reset timer *)
timerTERM( IN := FALSE );(* Reset timer *)
fbLog( put := CONCAT( '<=', IEC101ASDU_TO_STRING(txAsdu) ) );
state := 80;(* Wait for command confirmation *)
ELSE(* Report send buffer overflow error *)
fbLog( put := 'TX buffer overflow (single command)!' );
state := 1;
END_IF
END_IF
...
Voraussetzungen
Entwicklungsumgebung |
Zielplattform |
Einzubindende SPS Bibliotheken (Kategoriegruppe) |
---|---|---|
TwinCAT v3.1.4012.0 |
PC oder CX (x86, x64, ARM) |
Tc2_IEC60870_5_10x (Communication->IEC60870) |