FB_IEC870_PartyLineCtrl

Ab der Produktversion: TwinCAT PLC Library IEC870-5-101 Unterstation v2.0.2 und höher.

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 deviceID-Eingangsvariable muss der Geräte ID aus der TwinCAT System Manager IO-Konfiguration entsprechen (Allgemeinreiter der COM-Schnittstelle) und wird nur dann benötigt wenn Sie für die Kommunikation im Linienbetrieb die serielle PC-Schnittstelle benutzen.

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 ADS-Abfrage des internen Hardware-Sendepuffers Null Bytes im Puffer zurückliefert.

VAR_IN_OUT

VAR_IN_OUT
    hSerial         : T_HSERIALCTRL;
ND_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; (* Partyline modes (On/Off)*)
    deviceID    : UDINT := 0; (*Used by SERIALLINEMODE_PC_COM_PORT only. DeviceId specifies the device on which the function is to be executed.
    The device Ids are specified by the TwinCAT System Manager during the hardware configuration.*)
    bCTS        : BOOL := FALSE; (* Clear to send *)
END_VAR

eMode : Partyline-Aktivierungsmode.

deviceID : TwinCAT System Manager Geräte-ID. Dieser Parameter wird nur bei der Kommunikation über die serielle PC-Schnittstelle benötigt.

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

VAR_OUTPUT

VAR_IN_OUT
    bError      : BOOL;
    nErrID      : UDINT;
    bRTS        : BOOL := FALSE; (* Request to send *)
ND_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 TwinCAT v2.10 Build < 1313 oder älter (CE image < 2.16 oder älter):

Implementierung des Linienbetriebs in der schnellen Kommunikationstask: Über die RTS_SWITCH-Variable 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.

FB_IEC870_PartyLineCtrl 2:
PROGRAM P_SerialComm_HighSpeed
VAR
    fbSerialLineCtrl    : FB_IEC870_SerialLineCtrl;
    Mode        : ComSerialLineMode_t := SERIALLINEMODE_PC_COM_PORT; (* SERIALLINEMODE_KL6_5B_STANDARD *)

    serial_in AT%IB0   : PcComInData;
    serial_out AT%QB0  : PcComOutData;
    KL6_in AT%IB100    : KL6inData5B;
    KL6_out AT%QB100   : KL6outData5B;

    hSerial         : T_HSERIALCTRL;
    fbPartyLineCtrl     : FB_IEC870_PartyLineCtrl;
    delay       : TON;
    tRTS_DEALY_ON   : TIME := T#100ms;
    tRTS_DELAY_OFF  : TIME := T#100ms;
    RTS_SWITCH AT%QX200.0 : BOOL; (* RTS line switch *)
END_VAR

 

fbSerialLineCtrl( Mode := Mode,
        Baudrate := 19200,
        NoDatabits := 8,
        Parity := PARITY_EVEN,
        Stopbits := 1,
        Handshake := HANDSHAKE_NONE,
        ContinousMode := FALSE,
        pComIn := SEL( Mode = SERIALLINEMODE_KL6_5B_STANDARD, ADR( serial_in ), ADR( KL6_in ) ),
        pComOut := SEL( Mode = SERIALLINEMODE_KL6_5B_STANDARD, ADR( serial_out ), ADR( KL6_out ) ),
        SizeComIn := SEL( Mode = SERIALLINEMODE_KL6_5B_STANDARD, SIZEOF( serial_in ), SIZEOF( KL6_in ) ),
        hSerial := hSerial );


(* The deviceID may vary! *)
fbPartyLineCtrl( eMode:= eIEC870_PartylineMode_On, hSerial:= hSerial, deviceID := 1 );
IF fbPartyLineCtrl.bRTS <> fbPartyLineCtrl.bCTS THEN
    IF fbPartyLineCtrl.bRTS THEN
        RTS_SWITCH := 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
        delay( in := TRUE, PT := tRTS_DELAY_OFF ); (* wait until all data send *)
        IF delay.Q THEN
            delay( in := FALSE );
            RTS_SWITCH := FALSE; (* switch RTS line OFF *)
            fbPartyLineCtrl.bCTS := FALSE; (* reset clear to send *)
        END_IF
    END_IF
END_IF

 

 

Beispiel für eine TwinCAT v2.10 Build >= 1313 oder neuer (CE image v2.16 oder neuer):

Bei einer neueren TwinCAT-Version kann die RTS-Leitung 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. Der deviceID-Parameter wird in dieser Betriebsart nicht benutzt und muss nicht konfiguriert werden.

FB_IEC870_PartyLineCtrl 3:

 

Die RTS_SWITCH-Variable muss mit dem Bit 1 im ExtCtrl (RTS-Ausgang ) und die TX_BUFFER_EMPTY-Variable mit dem Bit 15 im ExtStatus verknüpft werden.

 

FB_IEC870_PartyLineCtrl 4:
FB_IEC870_PartyLineCtrl 5:

 

PROGRAM P_SerialComm_HighSpeed
VAR
    fbSerialLineCtrl    : FB_IEC870_SerialLineCtrl;
    Mode        : ComSerialLineMode_t := SERIALLINEMODE_PC_COM_PORT; (* SERIALLINEMODE_KL6_5B_STANDARD *)

    serial_in AT%IB0   : PcComInData;
    serial_out AT%QB0  : PcComOutData;
    KL6_in AT%IB100    : KL6inData5B;
    KL6_out AT%QB100   : KL6outData5B;

    hSerial         : T_HSERIALCTRL;
    fbPartyLineCtrl     : FB_IEC870_PartyLineCtrl;
    delay       : TON;
    tRTS_DEALY_ON   : TIME := T#100ms;
    tRTS_DELAY_OFF  : TIME := T#100ms;
    RTS_SWITCH AT%QX200.0 : BOOL; (* RTS line switch *)
    TX_BUFFER_EMPTY AT%IX200.0 : BOOL; (* UART's tx buffer is empty *)
END_VAR
fbSerialLineCtrl( Mode := Mode,
        Baudrate := 19200,
        NoDatabits := 8,
        Parity := PARITY_EVEN,
        Stopbits := 1,
        Handshake := HANDSHAKE_NONE,
        ContinousMode := FALSE,
        pComIn := SEL( Mode = SERIALLINEMODE_KL6_5B_STANDARD, ADR( serial_in ), ADR( KL6_in ) ),
        pComOut := SEL( Mode = SERIALLINEMODE_KL6_5B_STANDARD, ADR( serial_out ), ADR( KL6_out ) ),
        SizeComIn := SEL( Mode = SERIALLINEMODE_KL6_5B_STANDARD, SIZEOF( serial_in ), SIZEOF( KL6_in ) ),
        hSerial := hSerial );



fbPartyLineCtrl( hSerial:= hSerial, eMode := eIEC870_PartylineMode_Ext_On );
IF fbPartyLineCtrl.bRTS <> fbPartyLineCtrl.bCTS THEN
    IF fbPartyLineCtrl.bRTS THEN
        RTS_SWITCH := 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 TX_BUFFER_EMPTY THEN
            delay( in := TRUE, PT := tRTS_DELAY_OFF ); (* wait until all data send *)
            IF delay.Q THEN
                delay( in := FALSE );
                RTS_SWITCH := FALSE; (* switch RTS line OFF *)
                fbPartyLineCtrl.bCTS := FALSE; (* reset clear to send *)
            END_IF
        END_IF
    END_IF
END_IF

 

Voraussetzungen

Entwicklungsumgebung

Zielplattform

Einzubindende SPS Bibliotheken

TwinCAT v2.9.0 Build >= 1030

PC oder CX (x86)

TcIEC870_5_101Link.Lib

( Standard.Lib; TcBase.Lib; TcSystem.Lib; TcUtilities.Lib; TcIEC870_5_101.Lib; COMlibV2.Lib; werden automatisch eingebunden )

TwinCAT v2.10.0 Build >= 1301

CX (ARM)