Einstellung "Empfangen beendet“ durch Zeitüberschreitung auswerten
Wenn in dem empfangenen Datenstrom kein Endezeichen erwartet wird (z.B. bei der Übertragung binärer Daten), kann mit diesem Funktionsbaustein das Ende des Datenempfangs über eine Zeitsteuerung erkannt werden.
Eingang
Legt die Kommunikationsschnittstellen fest (je nach SPS-Typ):
COM-Schnittstelle z.B. SYS_COM0_PORT
Ethernet-Schnittstelle z.B. SYS_ETHERNET_USER_CONNECTION_1
MCU/SCU z.B. 16#xx01 (xx = Steckplatznummer) in COM01
Zeitspanne ohne weiteren Datenempfang nach der IsDone auf TRUE gesetzt wird.
Gilt für die Anfangsadresse des Empfangspuffers.. Diese Adresse enthält die Anzahl der empfangenen Bytes. (Nur CPU)
Ausgang
Wird auf TRUE gesetzt, wenn ein oder mehrere Bytes emfangen wurden und sich die Anzahl der empfangenen Bytes in der durch TimeOutForCPU oder im Dialogfeld "MCU-Einstellungen" festgelegten Zeit nicht geändert hat.
Handelt es sich um die Kommunikationsschnittstelle einer CPU, muss das erste Wort des Empfangspuffers an NoOfBytesReceived (Anzahl der empfangenen Bytes) angelegt werden. Wenn sich die Anzahl der empfangenen Bytes in der durch TimeOutForCPU angegebenen Zeit nicht ändert, wird IsDone auf TRUE gesetzt.
Bei einem MCU-Modul und FP7 wird der Merker "Empfangen beendet" ausgewertet. Die Wartezeit wird im PROG-Modus im Dialogfeld “MCU-Einstellungen” oder im RUN-Modus mit dem Befehl F159_MWRT_PARA eingestellt (nur FP2).
Auswertung des Merkers "Empfangen beendet"
Wenn für die angegebene Zeit keine weiteren Bytes empfangen werden oder der Befehl ClearReceiveBuffer ausgeführt wird, wird der Ausgang IsDone auf TRUE gesetzt. Weiterer Datenempfang ist unmöglich. Mit F159_MTRN oder ClearReceiveBuffer wird der Merker "IsDone" auf FALSE gesetzt.
Das Empfangsende lässt sich auch durch Auswertung des Empfangspufferinhalts feststellen (z.B. die Anzahl der empfangenen Bytes). Die Anzahl der empfangenen Bytes kann sich innerhalb eines Zyklus ändern. Zum Beispiel, wenn die Anzahl der empfangenen Bytes mehr als einmal gelesen wurde, existieren eventuell verschiedene Status innerhalb eines Zyklus.
Im POE-Kopf werden alle Ein- und Ausgangsvariablen deklariert, die für die Programmierung dieser Funktion verwendet werden. Für alle Programmiersprachen wird der gleiche POE-Kopf verwendet.
VAR
IsReceptionDone1: IsReceptionDoneByTimeOut;
END_VAR
VAR_EXTERNAL
g_awReceiveBuffer: ARRAY [0..10] OF WORD;
END_VAR
VAR
bIsRecDone1: BOOL:=FALSE;
wPort: WORD:=0;
END_VAR
BODY
WORKSPACE
NETWORK_LIST_TYPE := NWTYPELD ;
ACTIVE_NETWORK := 0 ;
END_WORKSPACE
NET_WORK
NETWORK_TYPE := NWTYPELD ;
NETWORK_LABEL := ;
NETWORK_TITLE := ;
NETWORK_HEIGHT := 8 ;
NETWORK_BODY
B(B_FB,IsReceptionDoneByTimeOut!,IsReceptionDone1,11,1,24,6,,?BPort?BTimeOutForCPU?BNoOfBytesReceived?AIsDone);
B(B_VARIN,,wPort,9,2,11,4,);
B(B_VARIN,,T#20ms,9,3,11,5,);
B(B_VAROUT,,IsRecDone1,24,2,26,4,);
B(B_VARIN,,g_awReceiveBuffer[0],9,4,11,6,);
L(1,0,1,8);
END_NETWORK_BODY
END_NET_WORK
END_BODY
IsReceptionDone1(Port := wPort,
TimeOutForCPU := T#20ms,
NoOfBytesReceived := g_awReceiveBuffer[0],
IsDone => bIsRecDone1);