Step 7 SFC1 austauschen gegen direktes auslesen.

tommylik

Level-2
Beiträge
115
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

Habe folgenden SCL Code im Internet gefunden:

Code:
[COLOR=#000000]DATA_BLOCK Umlaufspeicher_DT
[COLOR=#000000]STRUCT
[COLOR=#000000]fm_trigger : BOOL;
[COLOR=#000000]schreib_index : INT;
[COLOR=#000000]zeiten : ARRAY [0..20] OF DATE_AND_TIME;
[COLOR=#000000]END_STRUCT
[COLOR=#000000]BEGIN
[COLOR=#000000]END_DATA_BLOCK[/COLOR][/COLOR][/COLOR][/COLOR][/COLOR][/COLOR][/COLOR]
[/COLOR]

Code:
FUNCTION ZeitenMerken_DT : VOID
VAR_INPUT
NIO_TVR : BOOL; // NiO Merker
END_VAR
VAR_TEMP
 x : INT;
 jetzt : DATE_AND_TIME;
 rv : INT;
END_VAR
BEGIN
 IF e0.1 AND NOT Umlaufspeicher_DT.fm_trigger THEN
 rv := Read_Clk (CDT := jetzt);
 x := Umlaufspeicher_DT.schreib_index;
 Umlaufspeicher_DT.zeiten[x] := jetzt;
 IF x = 20 THEN
 Umlaufspeicher_DT.schreib_index := 0;
 ELSE
 Umlaufspeicher_DT.schreib_index := x+1;
 END_IF;
 END_IF;
 Umlaufspeicher_DT.fm_trigger := e0.1;
END_FUNCTION

Womit ich über ein Eingangssignal Zeiten als Date_and_Time in einem Ringpuffer abspeichern kann.

Funktioniert vom Grundprinzip bestens aber ich habe ein Problem mit unserem System.

Der SFC1 liest ja die Zeit aus der Baugruppe herraus und die hat absichtlich einen
Versatz von 2 Stunden gegenüber der PG Zeit. Hat irgendetwas mit Zeitservern zu tun.

Da ich dies als Logbuch nutzen wollte kann ich das so nicht gebrauchen.

Könnte mir einer behilflich sein den SCL Code so abzuändern das nicht mehr mit dem SFC 1 die Zeit
gelesen wird sondern aus einem DB die Zeit entnommen wird.

Wir haben einen FB1 und DB1 der extra für diese 2 Stunden Versatz geschrieben wurde.
Jedenfalls ist in diesem DB1.dbd20 immer die aktuelle Zeit vorhanden als Date_and_Time.

Im voraus vielen Dank.

Mfg Tommylik
 
Die Zeile mit Read-Clk einfach weglassen und dann die Variable "Jetzt" durch deine DB Variable ersetzen....
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo TP-Inc,

Vielen Dank für deine Antwort.

Meinst du das so:

Code:
FUNCTION ZeitenMerken_DT : VOID
VAR_INPUT
e0.1 : BOOL; // NiO Merker
END_VAR
VAR_TEMP
 x : INT;
 DB1.DBD20 : DATE_AND_TIME;  >> [COLOR=#ff0000]Fehlender oder ungültiger Bezeichner.[/COLOR]
 END_VAR
BEGIN
 IF e0.1 AND NOT Umlaufspeicher_DT.fm_trigger THEN
 
 x := Umlaufspeicher_DT.schreib_index;
 Umlaufspeicher_DT.zeiten[x] := DB1.DBD20;
 IF x = 20 THEN
 Umlaufspeicher_DT.schreib_index := 0;
 ELSE
 Umlaufspeicher_DT.schreib_index := x+1;
 END_IF;
 END_IF;
 Umlaufspeicher_DT.fm_trigger := e0.1;
END_FUNCTION

Dann bekomme ich folgende Fehlermeldung:

Fehlender oder ungültiger Bezeichner.

Habe ich die Variable Jetzt auf der falschen Seiter ersetzt.

Vielen Dank nochmal für die Hilfe

Mfg Tommylik
 
Ein DATE_AND_TIME belegt 8 Bytes und kann daher unmöglich in einem DBD20 liegen (kann höchstens bei DBB20 anfangen). Ein DATE_AND_TIME kann nur symbolisch verwendet werden.
Die angemeckerte Deklaration in VAR_TEMP musst Du ganz weglassen. Und im Code musst Du den DATE_AND_TIME symbolisch angeben:
Code:
Umlaufspeicher_DT.zeiten[x] := "NameMeinesDB1".NameDerVariable;

Harald
 
Hallo Harald,

Vielen Dank für deine Antwort und Hilfe.

Funktioniert bestens. Ich kenn mich mit SCL leider
nicht aus aber ich soll es noch lernen. Bei uns ist alles
in AWL oder SCL geschrieben.

Kann mir einer von Euch ein richtig gutes Buch über SCL empfehlen?

Vielen Dank nochmal an alle für die tolle Hilfe.

Mfg Tommylik
 
Zurück
Oben