TIA String to TOD

MTH

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

ich habe ein kleines Problem.
Ich habe eine Zenon Visu die das TOD (Time of Day) Format von S7300 er nicht kennt.
Mein Problem ist: ich habe in der S7 CPU eine Zeit Schaltuhr die einen Motor von...... bis....... Uhrzeit einschaltet.
Das Funktioniert ja wunderbar aber in der Visu würde die Uhrzeit der Schaltuhr gerne im String Format z.B. von 10:30:00 bis 11:25:30 eingeben.
Kennt jemand einen Weg wie das am einfachsten zu lösen ist.
PS: Ich denke das wird wohl am besten in SCL gehen oder?

Bin für jede Hilfe Dankbar.

SG
Mathias
 
Hallo,
die TOD ist die Zeit in Millisekunden der S7, die seit 0:00 Uhr abgelaufen sind.
Du brauchst also nur die einzelnen Komponenten deines Strings ausschneiden und entsprechend zu multiplizieren und schließlich in eine als TOD typisierte Variable hineinschreiben. Zum Berechnen kannst du aber einen DINT hernehmen.
Ich würde das Ganze sehr wahrscheinlich in SCL programmieren, da es dort m.E. übersichtlicher wird - es geht aber auch sicherlich in AWL.

Gruß
Larry
 
Hallo,
nein ... habe ich nicht.
Aber ein paar Tipps :
Es gibt Funktionen zur String-Manipulation - in SCL heißen die z.B. MID. Hiermit könnte man sich einen Teil des Quellstrings ausschneiden und mit einer Umwandlungs-Funktion wie z.B. String_to_DINT daraus eine Zahl machen.
Diese Zahl dann entsprechend multiplizieren um daraus Millisekunden zu machen (Sekunden mit 1000 multiplizieren, Minuten mit 60000 und Stunden mit 3600000) - die Teil-Ergebnisse aufaddieren und schon hast du den Wert, den du mit DINT_to_TOD in deine TOD hineinschreiben kannst.

Möchtest du dich daran mal versuchen ?

Gruß
Larry
 
Hallo Larry,

Danke hat mir geholfen :)
Habs in TIA V13 geschrieben. Funktioniert.
Jetzt würde ich das ganze gern auch in Step7 V5.5 verwenden und hab ne Quelle erstellt aber so wie es aussieht mag das Step7 das so nicht wie ich mit der MID Funktion arbeite (siehe unten).
FUNCTION FC1 : VOID
TITLE = 'STR_TO_TOD'
//
//
//
//
VERSION : '1.2'
AUTHOR : MTH
NAME : STR_TO_TOD
FAMILY : Umwandeln


VAR_IN_OUT
String_Time_von_Pc : STRING [10];
END_VAR

VAR_OUTPUT
TOD_DINT : TIME_OF_DAY;
END_VAR

VAR_Temp
String_Std : STRING [2];
String_Min : STRING [2];
String_Sek : STRING [2];
Std_DINT : DINT;
Min_DINT : DINT;
Sek_DINT : DINT;
Gesammt_DINT : DINT;

END_VAR

BEGIN
//Strind to TOD wandeln
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
//Das TOD Format geht nur von 00:00:00 bis 23:59:59
//
//Wenn Std > 24 dann wird der Kommplette String mit 00:00:00 überschrieben
IF String_Std >= '24' THEN
String_Time_von_Pc:= MID(IN:='00', L:=2,P:=1);
END_IF;

IF String_Min > '59' THEN
String_Time_von_Pc := MID(IN := '00', L := 2, P := 4);
END_IF;

IF String_Sek > '59' THEN
String_Time_von_Pc := MID(IN := '00', L := 2, P := 7);
END_IF;



//Aus Time_String Std/Min/Sek ausschneiden
String_Std := MID(IN := String_Time_von_Pc, L := 2, P := 1);

String_Min := MID(IN := String_Time_von_Pc, L := 2, P := 4);

tring_Sek := MID(IN := String_Time_von_Pc, L := 2, P := 7);

//Stringwert in DINT umwandeln
Std_DINT := STRING_TO_DINT(IN := String_Std);

Min_DINT := STRING_TO_DINT(IN := String_Min);

Sek_DINT := STRING_TO_DINT(IN := String_Sek);

//Tages Millisekunden Addieren
Gesammt_DINT := (Std_DINT * 3600000) + (Min_DINT * 60000) + (Sek_DINT * 1000);

//Tages Millisekunden in Time of Day wandeln
TOD_DINT := DINT_TO_TOD(IN := Gesammt_DINT);



END_FUNCTION



Wenn ich das Übersetzen wil kommt immer der Fehler: Parameterübertragung nicht korrekt.

Hast du da noch ne ahnung?

Gruß
Mathias
 
Du scheibst:
Code:
IF String_Std >= '24' THEN
       String_Time_von_Pc:=  MID(IN:='00', L:=2,P:=1);
    END_IF;

Das heist, hol aus der String-Konstante '00' zwei Zeichen ab dem 1. Zeichen...

Das Ergebnis sollte immer '00' sein und ist somit sinnfrei. Wieso der Fehler ausgegeben wird kann ich spontan nicht sagen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich würde erstmal den String in seine Einzelteile zerlegen und diese dann Prüfen ob sie syntaktisch korrekt sind.

Dann String in DINT wandeln und die ms berechnen.
 
Ja das mach ich jetzt auch so:
IF String_Std >= '24' THEN
String_Time_von_Pc:= INSERT(IN1:=String_Time_von_Pc ,IN2 := '00', P := 1);
END_IF;
 
Ich dachte an sowas:
Code:
    //Aus Time_String Std/Min/Sek ausschneiden
      String_Std := MID(IN := String_Time_von_Pc, L := 2, P := 1);
    
      String_Min := MID(IN := String_Time_von_Pc, L := 2, P := 4);
    
      String_Sek := MID(IN := String_Time_von_Pc, L := 2, P := 7);
    
    IF String_Std[1] >= '0' and String_Std[1] <= '9' and String_Std[2] >= '0' and String_Std[2] <= '9' and String_Min[1] >= '0' and String_Min[1] <= '9' ... THEN
    Zeit = Dint_to_TOD(STRNG_I(String_Std)*3600000+STRNG_I(String_Min)*60000+STRNG_I(String_Sek)*1000);
ELSE
   Fehlerbehandlung...
END_IF

da fehlen jetzt wahrscheinlich noch ein paar Konvertrierungen aber das schaffst du schon..
 
Zurück
Oben