AdminThomas
Level-1
- Beiträge
- 3
- Reaktionspunkte
- 0
-> Hier kostenlos registrieren
hallo,
@AdminThomas:
Nein, ich habe keine Erfahrung mit InTouch. Aber es gibt im Haus Intouch-Programmierer, die mir da sicher bissl helfen können.
Deine Lösung in SCL würde mich brennend interessieren, wenn sie auf mein Problem anwendbar ist.
Liebe Grüße
Sascha
Hey hallo, hab mal ein ähnliches problem gehabt.
Ich wollte einen "Fehler" sichtbar machen der nur alle Jubeljahre auftrat.
Mit follgendem FB hab ich die SPS-Zeit ausgelesen. (HH MM SS Msec)
die wiederum in einen DB geschrieben...
SCL-Quelle:
FUNCTION_BLOCK FB50
//
//Funktion liest CPU Zeit und Datum
//
//Aufruf: in OB1 freier Zyklus
//
// Kopf
TITLE= 'Uhrzeit_aus_SPS'
VERSION: '1.0'
AUTHOR: 'Thomas'
VAR_IN_OUT
iStdExt: INT; //Stunde
iMinExt: INT; //Minute
iSekExt: INT; //Sekunde
iMscExt: INT; //Milisekunde
iJahExt: INT; //Jahr vierstellig !
iMonExt: INT; //Monat
iTagExt: INT; //Tag
END_VAR
VAR_OUTPUT
rTime: REAL; //Uhrzeit im REAL-Format z.B. 12.351965 (HH.MMSSms)
END_VAR
VAR// statische Variablen im Instanz DB
dtDateTime: DATE_AND_TIME;
abDate AT dtDateTime: ARRAY [0..7] OF BYTE; //Byteweise Sicht auf Datum und Uhrzeit
END_VAR
VAR_TEMP// temporäre Variablen
iErrorCode: INT;
END_VAR
iErrorCode:=READ_CLK(CDT := dtDateTime); //SPS-Uhr lesen
iJahExt:=BCD_TO_INT(abDate[0])+2000;
iMonExt:=BCD_TO_INT(abDate[1]);
iTagExt:=BCD_TO_INT(abDate[2]);
iStdExt:=BCD_TO_INT(abDate[3]);
iMinExt:=BCD_TO_INT(abDate[4]);
iSekExt:=BCD_TO_INT(abDate[5]);
iMscExt:=BCD_TO_INT(abDate[6]);
rTime:=iStdExt+(iMinExt*0.01)+(iSekExt*0.0001)+(iMscExt*0.000001); //Uhrzeit mit 2 Vor- und 6 Nachkommastellen
END_FUNCTION_BLOCK
in rTime steht die Uhrzeit im REAL-format (HH.MM SS Msec)
als zweites hab ich dann einen FB100 geschrieben, den ich von aussen antriggern kann (boStart), und mit der Uhrzeit (rAktualZeit) aus FB50 (DB50.DBD0) beschreiben kann.
diesen hab ich dann in OB35 verdrahtet.
SCL-Quelle:
FUNCTION_BLOCK FB100
VAR // statische Variablen im Instanz DB
arZeitstempel: ARRAY[1..10]OF REAL:=0.0; //Messwerte Array
iZeitstempelZeiger: INT:=1; //Zeiger auf aktuellen Messwert
END_VAR
VAR_INPUT //Eingangsvariablen
rAktualZeit: REAL:= 0.0; //Aktualzeit CPU aus DB50
boStart: BOOL:= FALSE; //Baustein-Startimpuls
iAdresse: INT := 8;
END_VAR
// Anweisungsteil
IF boStart THEN
arZeitstempel[iZeitstempelZeiger]:=rAktualZeit; //
IF iZeitstempelZeiger < 10 THEN
iZeitstempelZeiger:=iZeitstempelZeiger + 1; //
ELSE
iZeitstempelZeiger:=1; //
END_IF;
END_IF;
END_FUNCTION_BLOCK
in meinem beispiel hab ich mal 10 werte in einen DB schreiben lassen
(arZeitstempel: ARRAY[1..10]OF REAL:=0.0)
dies währe erst einmal für den Zeitstempel.... erweiten kann mann das ganze dann ja auch auf den Analogwert (bekommt mann hin)
Nun zu InTouch, hier braucht mann wirklich einen Specialisten
(SIDirect DAServer 1.5) wie hier die geschwindigkeit ist müsstest du dich einmal genau erkundigen, aber hiermit könntest du auf den DB zugreifen und z.B. die Uhrzeit sowie die Messwerte auslesen.
hoffe ein bischen geholfen zu haben.. bei fragen bitte melden...