FB_IEC870_PartyLineCtrl
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.
Die "serial_ExtCtrl "-Variable muss mit "ExtCtrl " (RTS-Ausgang ) und die "serial_ExtStatus "-Variable mit "ExtStatus " verknüpft werden.
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) .
Voraussetzungen
Entwicklungsumgebung |
Zielplattform |
Einzubindende SPS Bibliotheken (Kategoriegruppe) |
---|---|---|
TwinCAT v3.1.4012.0 |
PC oder CX (x86, x64, ARM) |
Tc2_IEC60870_5_10x (Communication->IEC60870) |