FB_IEC870_PartyLineCtrl
Ab der Produktversion: TwinCAT PLC Library IEC870-5-101 Unterstation v2.0.2 und höher.
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.
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.
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.
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) |