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