FB_IEC870_5_101Slave

FB_IEC870_5_101Slave 1:

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

protParaIEC60870-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).

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)