FB_IEC870_5_101Slave
Mit einer Instanz des Funktionsbausteins FB_IEC870_5_101Slave kann in der TwinCAT SPS eine IEC60870-5-101 Unterstation (Slave) implementiert werden.
VAR_IN_OUT
VAR_IN_OUT
hSerial : T_HSERIALCTRL;
END_VAR
hSerial : Verbindungs-Handle zum FB_IEC870_SerialLineCtrl-Funktionsbaustein. Über diese Variable werden mit dem FB_IEC870_SerialLineCtrl-Funktionsbaustein die zu sendenden und empfangenen Daten ausgetauscht.
VAR_INPUT
VAR_INPUT
protPara : ST_IEC870_5_101ProtocolParams; (* IEC60870-5-101 serial link protocol communication params *)
sysPara : ST_IEC870_5_101SystemParams; (* IEC60870-5-101 slave system params *)
pAOEntries : POINTER TO ARRAY[0..IEC870_ANYSIZE_ARRAY] OF ST_IEC870_5_101AODBEntry; (* Pointer to the first element of application database object array *)
cbAOEntries : UDINT; (* Byte size (length) of application database object array *)
pInputs : POINTER TO ARRAY[0..IEC870_ANYSIZE_ARRAY] OF BYTE;
cbInputs : UDINT;
pOutputs : POINTER TO ARRAY[0..IEC870_ANYSIZE_ARRAY] OF BYTE;
cbOutputs : UDINT;
pMemory : POINTER TO ARRAY[0..IEC870_ANYSIZE_ARRAY] OF BYTE;
cbMemory : UDINT;
pData : POINTER TO ARRAY[0..IEC870_ANYSIZE_ARRAY] OF BYTE;
cbData : UDINT;
bEnable : BOOL := TRUE;
END_VAR
protPara: IEC60870-5-101-Protokollparameter.
sysPara: Systemparameter.
pAOEntries: Adresse der Applikationsobjekt-Datenbankvariablen.
cbAOEntries: Bytegröße der Applikationsobjekt-Datenbankvariablen.
pInputs: Adresse des SPS-Prozessdatenbereichs der Eingänge.
cbInputs: Bytegröße des SPS-Prozessdatenbereichs der Eingänge.
pOutputs: Adresse des SPS-Prozessdatenbereichs der Ausgänge.
cbOutputs: Bytegröße des SPS-Prozessdatenbereichs der Ausgänge.
pMemory: Adresse des SPS-Prozessdatenbereichs der Merker.
cbMemory: Bytegröße des SPS-Prozessdatenbereichs der Merker.
pData: Adresse des SPS-Datenbereichs.
cbData: Bytegröße des SPS-Datenbereichs.
bEnable : Aktiviert/Deaktiviert den Funktionsbaustein (Kommunikation und Verbindung).
VAR_OUTPUT
VAR_OUTPUT
system : ST_IEC870_5_101SystemInterface;
eState : E_IEC870_5_101SerialLinkState := eSERIALLINK_DISCONNECTED; (* Serial link connection state *)
END_VAR
system: System-Interface. Diese Variable dient anderen SPS Funktionen oder Funktionsbausteinen als Kommunikationsschnittstelle zum IEC-Gerät (hier: Unterstation).
- Membervariable system.device wird z.B. von der F_iecSetAOQuality-Funktion als VAR_IN_OUT-Parameter erwartet.
- Membervariable system.device.errors ist ein Gerätefehler-Fifo. Die registrierten Fehler können von der SPS-Applikation ausgelesen und ausgewertet werden.
eState: Verbindungsstatus zum Master.
Beispiel:
Beispielprojekte: IEC60870-5-101 Unterstation
Aufruf in ST:
PROGRAM test
VAR
slave1AODB : ARRAY[1..50] OF ST_IEC870_5_101AODBEntry;
inputs AT%IB0 : ARRAY[0..999] OF BYTE;
outputs AT%QB0 : ARRAY[0..999] OF BYTE;
memory AT%MB0 : ARRAY[0..999] OF BYTE;
data : ARRAY[0..999] OF BYTE;
server1 : FB_IEC870_5_101Slave;
bEnable : BOOL;
eState : E_IEC870_5_101SerialLinkState;
bError : BOOL;
iecError : ST_IEC870_5_101ErrorFifoEntry;
END_VAR
server1.protPara.linkAddr := 220;
server1.protPara.eLinkMode := eIEC870_LinkMode_Unbalanced;
server1.protPara.elinkAddrSize := eIEC870_LinkAddr_TwoOctets;
server1.sysPara.asduFmt.eAsduAddrSize := eIEC870_AsduAddr_TwoOctets;
server1.sysPara.asduFmt.eObjAddrSize := eIEC870_ObjAddr_ThreeOctets;
server1.sysPara.asduFmt.eCOTSize := eIEC870_COT_TwoOctets;
server1.sysPara.asduAddr := 7;
server1.sysPara.bUsePCTime := TRUE;
server1.sysPara.bSyncTime := TRUE;
server1.sysPara.bSyncPCTime := FALSE;
server1.sysPara.bEndOfInit := TRUE;
server1.sysPara.bPerCyclic := FALSE;
server1.sysPara.tPerCyclicBase := T#5s;
server1.sysPara.bBackScan := FALSE;
server1.sysPara.tBackScanCycle := T#30s;
server1.sysPara.bPerFRZ := TRUE;
server1.sysPara.tPerFRZCycle := T#15s;
server1.sysPara.dbgMode := IEC870_DEBUGMODE_LINKLAYER;(* OR IEC870_DEBUGMODE_DEVSTATE OR IEC870_DEBUGMODE_ASDU;*)
server1.sysPara.bTimeCOT3 := FALSE;
server1( pInputs := ADR( inputs ),
cbInputs := SIZEOF( inputs ),
pOutputs := ADR( outputs ),
cbOutputs := SIZEOF( outputs ),
pMemory := ADR( memory ),
cbMemory := SIZEOF( memory ),
pData := ADR( data ),
cbData := SIZEOF( data ),
pAOEntries := ADR( slave1AODB ),
cbAOEntries := SIZEOF( slave1AODB ),
hSerial := P_SerialComm_HighSpeed.hSerial,
bEnable := bEnable,
eState=>eState );
Im folgenden Beispiel wird der Gerätefehler-Fifo zyklisch ausgelesen und die registrierten Fehler ins Windows Application Log geschrieben.
REPEAT
server1.system.device.errors.RemoveError( getError=>iecError, bOk=>bError );
IF bError THEN
ADSLOGSTR( ADSLOG_MSGTYPE_ERROR OR ADSLOG_MSGTYPE_LOG, 'IEC60870-5-101 slave error: 0x%s', DWORD_TO_HEXSTR( iecError.nErrId, 8, FALSE) );
END_IF
UNTIL NOT bError
END_REPEAT
Voraussetzungen
Entwicklungsumgebung | Zielplattform | Einzubindende SPS Bibliotheken |
---|---|---|
TwinCAT v2.9.0 Build >= 1030 | PC or CX (x86) | TcIEC870_5_101Slave.Lib ( Standard.Lib; TcBase.Lib; TcSystem.Lib; TcUtilities.Lib; TcIEC870_5_101Link.Lib; TcIEC870_5_101.Lib; COMLibV2.Lib werden automatisch eingebunden ) |
TwinCAT v2.10.0 Build >= 1301 | CX (ARM) |