PROGRAM _INIT
// Schnittstellenparameter für Waage
// BD (Baud) = 1200
// PA (Parity) = O (ODD)
// DB (Data Bits) = 7
// SB (Stop Bit) = 1
Schnittstelle_Mode := '/BD=1200 /PA=O /DB=7 /SB=1';
Schnittstelle_Device := 'IF1';
Schnittstelle_config.idle := 10; // max. Leerzeit zwischen Zeichen
Schnittstelle_config.rx_cnt := 1; // Anzahl Empfangspuffer
Schnittstelle_config.tx_cnt := 1; // Anzahl Sendepuffer
Schnittstelle_config.rx_len := 256; // Länge (Byte) Empfangspuffer
Schnittstelle_config.tx_len := 256; // Länge (Byte) Sendepuffer
Schnittstelle_config.argc := 0; // Anzahl zusätzliche Argumente
Schnittstelle_config.argv := 0; // Zusätzliche Argumente
Schnittstelle_config.delim[0] := 0; // Frameendezeichen
Schnittstelle_config.delim[1] := 0; // Frameendezeichen
Schnittstelle_config.delimc := 0; // Frameendezeichen aktiv = 0
// Schrittketten zurücksetzen
Komm_Schritt := 0;
// Puffer löschen
Puffer_Lesen := '';
Puffer_Schreiben := '';
END_PROGRAM
PROGRAM _CYCLIC
// Steuerzeichen ESC für Abfrage Waage
ESC := 27;
PC_enabled := TRUE;
// Senden und Empfangen aktivieren, wenn die Option in der Visu eingeschaltet ist.
IF PC_enabled THEN
// Lesen und Schreiben über die Schnittstelle aktivieren
Lesen := TRUE;
IF ((PC_Komm_OK = FALSE) AND (Komm_Schritt = 0)) THEN
Komm_Schritt := 10;
END_IF
CASE Komm_Schritt OF
10 : // Schnittstelle öffnen
FRM_xopen1(enable := TRUE, device := ADR(Schnittstelle_Device), mode := ADR(Schnittstelle_Mode), config := ADR(Schnittstelle_config));
// Status der Schnittstelle abfragen
Status_FRM_xopen := FRM_xopen1.status;
Komm_Schritt := 20;
20 : // Status der Schnittstelle auswerten
IF Status_FRM_xopen <> 0 THEN // Im Fehlerfall in Schritt 40 springen
Komm_Schritt := 40;
END_IF
IF Status_FRM_xopen = 0 THEN // läuft alles glatt, dann in Schritt 30 weitermachen
Komm_Schritt := 30;
END_IF
30 : // Status aktualisieren "Kommunikation aufgebaut"
IF Status_FRM_xopen = 0 THEN
// Bit setzen, dass Kommunikation aufgebaut ist
PC_Komm_OK := 1;
Komm_Schritt := 50;
END_IF
40 : // Es konnte keine Kommunikation aufgebaut werden
IF Status_FRM_xopen <> 0 THEN
// Fehlerbehandlung für Visu
END_IF
// Alarmmeldung ausgeben
50 : // Schnittstelle initialisiert
Komm_Schritt := 0;
FRM_ident := FRM_xopen1.ident;
END_CASE
ELSE
Lesen := FALSE;
Schreiben := FALSE;
PC_Komm_OK := FALSE;
// Schnittstelle deaktivieren
FRM_close1(enable := TRUE, ident := FRM_ident);
// Status abfragen
Status_FRM_close := FRM_close1.status;
// Fehlermeldung ausgeben, wenn bei Schließen ein Fehler aufgetreten ist.
CASE Status_FRM_close OF
8071 : // frmERR_NOBUFFER Kein Puffer in der Sendepuffer-Verwaltung frei.
Fehler_Schliessen := TRUE;
8072 : // frmERR_INVALIDBUFFER Ungültiger Puffer wird zurückgewiesen
Fehler_Schliessen := TRUE;
8073 : // frmERR_IOCTL_NOTVALID Ungültiger IO-Control-Code
Fehler_Schliessen := TRUE;
8078 : // frmERR_TRANSMITOVERRUN Sende-Puffer-Warteschlage voll
Fehler_Schliessen := TRUE;
8079 : // frmERR_INPUTERROR Frame-Puffer mit defektem Zeichen
Fehler_Schliessen := TRUE;
8210 : // 8210 + x; Analyse des fehlerhaften Puffers. x liegt zwischen 1 und 31.
Fehler_Schliessen := TRUE;
8251 : // frmERR_NOTOPENED Device ist nicht GEöffnet
Fehler_Schliessen := TRUE;
8252 : // frmERR_DEVICEDESCRIPTION Device nicht gefunden
Fehler_Schliessen := TRUE;
8253 : // frmERR_MODEDESCRIPTION Syntaxfehler im Mode-Parameter-STRING, oder Mode-Parameter wird vom spezifischen Device nicht unterstützt.
Fehler_Schliessen := TRUE;
8254 : // frmERR_MAXOPEN Zu viele Devices gleichzeitig GEöffnet.
Fehler_Schliessen := TRUE;
8255 : // ERR_DEV_SPSSW_VERSION Im Zielsystem ist ein Betriebssystem mit einer Version kleiner 2.00 installiert. Es muss eine Version größer oder gleich 2.00 verwendet werden.
Fehler_Schliessen := TRUE;
8256 : // frmERR_PA_DB_SB /PA, /DB, /SB müssen immer gemeinsam angegeben werden !
Fehler_Schliessen := TRUE;
8257 : // frmERR_IOCTL_NOTSUPPORTED Kommando wird vom Treiber (Hardware) nicht unterstützt
Fehler_Schliessen := TRUE;
8258 : // frmERR_NORESOURCES benötigte Ressourcen nicht verfügbar (Speicher, OS-Objekte, ...)
Fehler_Schliessen := TRUE;
END_CASE
END_IF
// Daten über die serielle Schnittstelle empfangen und auswerten
IF Lesen = TRUE THEN
// Daten von der Schnittstelle einlesen
FRM_read1(enable := TRUE, ident := FRM_ident);
// Adresse und Länge des Lesepuffers einlesen
Lesen_Puffer := FRM_read1.buffer;
Lesen_Puffer_Laenge := FRM_read1.buflng;
// Status Daten lesen abfragen
Lesen_Status := FRM_read1.status;
IF Lesen_Status <> 0 THEN
CASE Lesen_Status OF
8071 : // frmERR_NOBUFFER Kein Puffer in der Sendepuffer-Verwaltung frei.
Fehler_Lesen := TRUE;
8072 : // frmERR_INVALIDBUFFER Ungültiger Puffer wird zurückgewiesen
Fehler_Lesen := TRUE;
8073 : // frmERR_IOCTL_NOTVALID Ungültiger IO-Control-Code
Fehler_Lesen := TRUE;
8078 : // frmERR_TRANSMITOVERRUN Sende-Puffer-Warteschlage voll
Fehler_Lesen := TRUE;
8079 : // frmERR_INPUTERROR Frame-Puffer mit defektem Zeichen
Fehler_Lesen := TRUE;
8210 : // 8210 + x; Analyse des fehlerhaften Puffers. x liegt zwischen 1 und 31.
Fehler_Lesen := TRUE;
8251 : // frmERR_NOTOPENED Device ist nicht GEöffnet
Fehler_Lesen := TRUE;
8252 : // frmERR_DEVICEDESCRIPTION Device nicht gefunden
Fehler_Lesen := TRUE;
8253 : // frmERR_MODEDESCRIPTION Syntaxfehler im Mode-Parameter-STRING, oder Mode-Parameter wird vom spezifischen Device nicht unterstützt.
Fehler_Lesen := TRUE;
8254 : // frmERR_MAXOPEN Zu viele Devices gleichzeitig GEöffnet.
Fehler_Lesen := TRUE;
8255 : // ERR_DEV_SPSSW_VERSION Im Zielsystem ist ein Betriebssystem mit einer Version kleiner 2.00 installiert. Es muss eine Version größer oder gleich 2.00 verwendet werden.
Fehler_Lesen := TRUE;
8256 : // frmERR_PA_DB_SB /PA, /DB, /SB müssen immer gemeinsam angegeben werden !
Fehler_Lesen := TRUE;
8257 : // frmERR_IOCTL_NOTSUPPORTED Kommando wird vom Treiber (Hardware) nicht unterstützt
Fehler_Lesen := TRUE;
8258 : // frmERR_NORESOURCES benötigte Ressourcen nicht verfügbar (Speicher, OS-Objekte, ...)
Fehler_Lesen := TRUE;
END_CASE
END_IF
// Wenn Daten empfangen wurden, die umkopieren
IF Lesen_Status = 0 THEN
// Empfangspuffer löschen, damit keine alten Daten mehr vorhanden sind
Puffer_Lesen := '';
FOR i := 0 TO 255 DO
Lesen_Daten[i] := 0;
END_FOR
// gelesene Daten in Empfangspuffer umkopieren
memcpy(ADR(Lesen_Daten), Lesen_Puffer, Lesen_Puffer_Laenge);
memcpy(ADR(Puffer_Lesen), ADR(Lesen_Daten), 256);
// Lesepuffer freigeben
FRM_rbuf1(enable := TRUE, ident := FRM_ident, buffer := Lesen_Puffer, buflng := Lesen_Puffer_Laenge);
// Lesepuffer freigeben Status abfragen
Lesen_Freigabe_Puffer_Status := FRM_rbuf1.status;
Lesen := FALSE;
Neue_Daten := TRUE;
END_IF
END_IF
// Daten an PC senden
IF Schreiben = TRUE THEN
// Sendepuffer vorbelegen
Status_Puffer_Schreiben := strcpy(ADR(Puffer_Schreiben), ADR(ESC));
Status_Puffer_Schreiben := strcat(ADR(Puffer_Schreiben), ADR('P'));
Status_Puffer_Schreiben := strcat(ADR(Puffer_Schreiben), ADR(CRLF));
END_IF
IF ((Schreiben = TRUE) AND (Puffer_Schreiben <> '')) THEN
// Sendepuffer initialisieren
FRM_gbuf1(enable := TRUE, ident := FRM_ident);
// Anforderung zum Senden zurücksetzen
Schreiben := FALSE;
// Adresse von Sendepuffer herausfinden
pPuffer_Schreiben := FRM_gbuf1.buffer;
// Status Sendepuffer ermitteln
Status_FRM_gbuf := FRM_gbuf1.status;
// Länge des Sendepuffers bestimmen
Sende_Puffer_Laenge := strlen(ADR(Puffer_Schreiben));
// Daten senden, wenn kein Fehler vorliegt
IF Sende_Status = 0 THEN
FRM_write_0(enable := TRUE, ident := FRM_ident, buffer := ADR(Puffer_Schreiben), buflng := Sende_Puffer_Laenge);
// Status abfragen
Sende_Status := FRM_write_0.status;
// Wenn die Daten gesendet wurden, den Puffer wieder freigeben
IF Sende_Status <> 0 THEN
FRM_robuf1(enable := TRUE, ident := FRM_ident, buffer := ADR(Puffer_Schreiben), buflng := Sende_Puffer_Laenge);
Sende_Robuf_Status := FRM_robuf1.status;
END_IF
END_IF
END_IF
// Wenn neue Daten eingelesen wurden, den String auswerten
IF Neue_Daten = TRUE THEN
IF Puffer_Lesen = 'HMALL' THEN
Puffer_Lesen := '';
END_IF
END_IF
END_PROGRAM