Hintergrundkommunikation

Die Kommunikation zwischen der seriellen Hardware und den Datenpuffer vom Typ ComBuffer wird je nach Anforderung in der Standardtask oder in einer separaten schnellen Task abgewickelt.

Eine separate schnelle Task ist notwendig bei Verwendung hoher Baudraten oder KL6001 Klemmen, welche ein kleines Prozessabbild besitzen (nur 3 oder 5 Bytes). Siehe auch Kommunikationskonzept.

Das Tutorial nutzt folgende drei Hardwareschnittstellen:

Hardwareschnittstelle

Hintergrundkommunikation

Pc COM Port

in der Standardtask

EL6001

in der seperaten schnellen Task

KL6001 (3 Bytes)

in der seperaten schnellen Task

Datenstrukturen

Um eine serielle Schnittstelle anzusprechen, sind vier Datenstrukturen notwendig.

Zwei verschiedene Arten von Datenstrukturen werden unterschieden:
- Hardwareabhängige Strukturen stellen die Verbindung zur Hardware in Sende- und Empfangsrichtung her.
- Zusätzlich werden zwei Datenpuffer als Zwischenspeicher benötigt.

Pc COM Port:

PROGRAM MAIN
VAR
    (* I/O variables for a PC-COM port *)
    stIn_PcCom AT %I* : PcComInData; (* linked to the port in the TwinCAT System Manager *)
    stOut_PcCom AT %Q* : PcComOutData; (* linked to the port in the TwinCAT System Manager *)
    RxBufferPcCom     : ComBuffer; (* Receive data buffer; used with all receive function blocks *)
    TxBufferPcCom     : ComBuffer; (* Transmit data buffer; used with all receive function blocks *)
END_VAR

EL6xxx und KL6xxx:

VAR_GLOBAL
    RxBufferEL : ComBuffer; (* Receive data buffer; used with all receive function blocks *)
    TxBufferEL : ComBuffer; (* Transmit data buffer; used with all receive function blocks *)

    RxBufferKL : ComBuffer; (* Receive data buffer; used with all receive function blocks *)
    TxBufferKL : ComBuffer; (* Transmit data buffer; used with all receive function blocks *)
END_VAR
PROGRAM Background
VAR
    (* I/O variables for a EL6001 terminal*)
    stIn_EL6001 AT %I*     : EL6inData22B; (* linked to the EL6001 in the TwinCAT System Manager *)
    stOut_EL6001 AT %Q*     : EL6outData22B;(* linked to the EL6001 in the TwinCAT System Manager *)
    (* I/O variables for a KL6001 terminal*)
    stIn_KL6001 AT %I*     : KL6inData; (* linked to the KL6001 in the TwinCAT System Manager *)
    stOut_KL6001 AT %Q*     : KL6outData; (* linked to the KL6001 in the TwinCAT System Manager *)
END_VAR

SerialLineControl

Der SerialLineControl Funktionsbaustein muss in jeden PLC Zyklus aufgerufen werden.
Er kommuniziert mit dem seriellen Hardwaregerät und übermittelt sowie empfängt Daten.
Der Baustein kann sowohl aus der Standardtask als auch aus der separaten schnellen Task aufgerufen werden.

Aufgerufen durch die Standardtask, Pc COM Port:

PROGRAM MAIN
VAR
    (* background communication with the PC COM port device *)
    fbPcComCtrl       : SerialLineControl;
    bPcComCtrlError   : BOOL;
    ePcComCtrlErrorID : ComError_t;
END_VAR
(* background communication with the PC COM port device *)
fbPcComCtrl(
    Mode      := SERIALLINEMODE_PC_COM_PORT, 
    pComIn    := ADR(stIn_PcCom), 
    pComOut   := ADR(stOut_PcCom), 
    SizeComIn := SIZEOF(stIn_PcCom), 
    Error     => bPcComCtrlError, 
    ErrorID   => ePcComCtrlErrorID, 
    TxBuffer  := TxBufferPcCom, 
    RxBuffer  := RxBufferPcCom );

Aufgerufen durch die separate schnelle Task, EL6xxx und KL6xxx:

PROGRAM Background
VAR
    (* background communication with the EL6001 terminal *)
    fbEL6001Ctrl       : SerialLineControl;
    bEL6001CtrlError   : BOOL;
    eEL6001CtrlErrorID : ComError_t;

    (* background communication with the KL6001 terminal (3byte) *)
    fbKL6001Ctrl         : SerialLineControl;
    bKL6001CtrlError     : BOOL;
    eKL6001CtrlErrorID   : ComError_t;
    fbKL6001Config       : KL6configuration;
    bKL6001ConfigError   : BOOL;
    eKL6001ConfigErrorID : ComError_t;
    bKL6001ConfigExe     : BOOL := TRUE;
END_VAR
(* background communication with the EL6001 terminal *)
fbEL6001Ctrl(
    Mode:= SERIALLINEMODE_EL6_22B,
    pComIn:= ADR(stIn_EL6001),
    pComOut:= ADR(stOut_EL6001),
    SizeComIn:= SIZEOF(stIn_EL6001),
    Error=> bEL6001CtrlError,
    ErrorID=> eEL6001CtrlErrorID,
    TxBuffer:= TxBufferEL,
    RxBuffer:= RxBufferEL );

(* background communication with the KL6001 terminal (3byte) *)
fbKL6001Config(
    Execute:= bKL6001ConfigExe,
    Mode:= SERIALLINEMODE_KL6_3B_ALTERNATIVE,
    Baudrate:= 9600,
    NoDatabits:= 8,
    Parity:= 0,
    Stopbits:= 1,
    Handshake:= HANDSHAKE_NONE,
    ContinousMode:= FALSE,
    pComIn:= ADR(stIn_KL6001),
    pComOut:= ADR(stOut_KL6001),
    SizeComIn:= SIZEOF(stIn_KL6001),
    Done=> ,
    Busy=> ,
    Error=> bKL6001ConfigError,
    ErrorId=> eKL6001ConfigErrorID );
IF NOT fbKL6001Config.Busy AND NOT bKL6001ConfigError THEN
    bKL6001ConfigExe := FALSE;
    fbKL6001Ctrl(
        Mode:= SERIALLINEMODE_KL6_3B_ALTERNATIVE,
        pComIn:= ADR(stIn_KL6001),
        pComOut:= ADR(stOut_KL6001),
        SizeComIn:= SIZEOF(stIn_KL6001),
        Error=> bKL6001CtrlError,
        ErrorID=> eKL6001CtrlErrorID,
        TxBuffer:= TxBufferKL,
        RxBuffer:= RxBufferKL );
END_IF