FB_IEC870_PartyLineCtrl

FB_IEC870_PartyLineCtrl 1:

Mit dem Funktionsbaustein FB_IEC870_PartyLineCtrl kann der Datenaustausch zur Zentralstation im Linienbetrieb (partyline) betrieben werden. Der Funktionsbaustein muss in der SPS-Task zyklisch aufgerufen werden. Mit dem eMode-Eingang kann der Linienbetrieb aktiviert/deaktiviert werden. Wenn Sie den Funktionsbaustein nicht benutzen (Default Einstellung) wird kein Linienbetrieb betrieben.

Die hSerial-Variable ist eine Struktur und dient dem internen Datenaustausch zwischen der schnellen und langsamen Kommunikationstask. Jedes Mal wenn der IEC-Slave senden will wird der bRTS-Ausgang (request to send) zuerst auf TRUE gesetzt. Nachdem der Sendebetrieb eingeschaltet wurde wird dies dem IEC-Slave durch das Setzen des bCTS-Eingangs (clear to send) auf TRUE mitgeteilt. Danach beginnt der IEC-Slave zu senden. Nachdem die Daten gesendet wurden (interne Hardware-Puffer sind leer) setzt der IEC-Slave den bRTS-Ausgang auf FALSE zurück. Jetzt kann die Sendeleitung für den anderen Teilnehmer freigegeben werden. Wenn dies geschehen ist, muss dies ebenfalls am bCTS-Eingang mit FALSE dem IEC-Slave mitgeteilt werden. D.h. der Zustand des bCTS-Eingangs folgt immer dem Zustand des bRTS-Ausgangs.

Bei der seriellen PC-Schnittstelle wird der bRTS-Ausgang erst dann auf FALSE gesetzt (Daten gesendet), wenn die Abfrage des internen Hardware-Sendepuffers Null Bytes im Puffer zurückliefert.

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
    eMode    : E_IEC870_5_101PartylineMode := eIEC870_PartylineMode_Off;
    deviceID : UDINT := 0;
    bCTS     : BOOL := FALSE;
END_VAR

eMode : Partyline-Aktivierungsmode.

deviceID : Dieser Parameter wird in TwinCAT 3.1 nicht verwendet und muss nicht gesetzt werden.

bCTS : Clear to send (für den IEC-Link-Layer).

VAR_OUTPUT

VAR_IN_OUT
    bError  : BOOL;
    nErrID  : UDINT;
    bRTS    : BOOL := FALSE;
END_VAR

bError: Wird TRUE, sobald ein Fehler aufgetreten ist.

nErrID: Liefert bei einem gesetzten bError-Ausgang den Fehlercode.

bRTS: Request to send (vom IEC-Link-Layer).

Beispiel für Linienbetrieb-Konfiguration:

Die RTS-Leitung kann direkt als ein IO-Ausgang in die SPS gemappt werden. Sie müssen im TwinCAT System Manager die "Extended Ctrl/Status" Option aktivieren. Der eMode-Parameter an dem Funktionsbaustein muss eMode := eIEC870_PartylineMode_Ext_On gesetzt werden.

FB_IEC870_PartyLineCtrl 2:

Die "serial_ExtCtrl "-Variable muss mit "ExtCtrl " (RTS-Ausgang ) und die "serial_ExtStatus "-Variable mit "ExtStatus " verknüpft werden.

FB_IEC870_PartyLineCtrl 3: FB_IEC870_PartyLineCtrl 4:

PROGRAM P_SerialComm_HighSpeed
VAR
    serial_In         AT%I*   : PcComInData;
    serial_Out        AT%Q*   : PcComOutData;
    KL6_In            AT%I*   : KL6inData5B;
    KL6_Out           AT%Q*   : KL6outData5B;
    serial_ExtStatus  AT%I*   : WORD;
    serial_ExtCtrl    AT%Q*   : WORD;

    hSerial          : T_HSERIALCTRL;(* Serial connection control handle *)
    fbSerialLineCtrl : FB_IEC870_SerialLineCtrl := ( Mode := SERIALLINEMODE_PC_COM_PORT(*SERIALLINEMODE_KL6_5B_STANDARD *),
                        Baudrate := 19200,
                        NoDatabits := 8,
                        Parity := PARITY_EVEN,
                        Stopbits := 1,
                        Handshake := HANDSHAKE_NONE,
                        ContinousMode := FALSE );

    fbPartyLineCtrl  : FB_IEC870_PartyLineCtrl := ( eMode := eIEC870_PartylineMode_Ext_On );
    delay            : TON;
    tRTS_DEALY_ON    : TIME := T#100ms;
    tRTS_DELAY_OFF   : TIME := T#100MS;
END_VAR
fbSerialLineCtrl(  pComIn := SEL( fbSerialLineCtrl.Mode = SERIALLINEMODE_KL6_5B_STANDARD, ADR( serial_In ), ADR( KL6_In ) ),
        pComOut := SEL( fbSerialLineCtrl.Mode = SERIALLINEMODE_KL6_5B_STANDARD, ADR( serial_Out ), ADR( KL6_Out ) ),
        SizeComIn :=  SEL( fbSerialLineCtrl.Mode = SERIALLINEMODE_KL6_5B_STANDARD, SIZEOF( serial_In ), SIZEOF( KL6_In ) ),
        hSerial  := hSerial );

fbPartyLineCtrl( hSerial:= hSerial );
IF fbPartyLineCtrl.bRTS <> fbPartyLineCtrl.bCTS THEN
    IF fbPartyLineCtrl.bRTS THEN
        serial_ExtCtrl.1  := TRUE;(* Switch RTS line ON *)
        delay( in := TRUE, PT := tRTS_DEALY_ON );(* Wait until line enabled *)
     IF delay.Q THEN
            delay( in := FALSE );
            fbPartyLineCtrl.bCTS := TRUE;(* Set clear to send *)
        END_IF
    ELSE
        IF serial_ExtStatus.15  THEN
            delay( in := TRUE, PT := tRTS_DELAY_OFF );(* Wait until all data send *)
            IF delay.Q THEN
                delay( in := FALSE );
                serial_ExtCtrl.1  := FALSE;(* Switch RTS line OFF *)
                fbPartyLineCtrl.bCTS := FALSE;(* Reset clear to send *)
            END_IF
        END_IF
    END_IF
END_IF

Implementierung des Linienbetriebs in der schnellen Kommunikationstask: Über die RTS_SWITCH-Variable (serial_ExtCtrl.1) wird die Leitung für den Sendebetrieb EIN- und AUS-geschaltet. Die tRTS_DEALY_ON-Verzögerungszeit (Vorlaufzeit) stellt sicher, dass die Freischaltung der Leitung für den IEC-Slave abgeschlossen wurde, die tRTS_DELAY_OFF-Verzögerungszeit (Nachlaufzeit) stellt sicher, dass auch das letzte gesendete Datenbyte von der Zentralstation empfangen wurde (serial_ExtStatus.15) .

FB_IEC870_PartyLineCtrl 5:

Voraussetzungen

Entwicklungsumgebung

Zielplattform

Einzubindende SPS Bibliotheken (Kategoriegruppe)

TwinCAT v3.1.4012.0

PC oder CX (x86, x64, ARM)

Tc2_IEC60870_5_10x (Communication->IEC60870)
Tc2_SerialCom (Communication->Serial)
Tc2_TcpIp (Communication->TcpIp)
Tc2_Utilities (System)