Eine bestimmte Zeit von einer Tageszeit abziehen

jürgen g

Active member
Beiträge
31
Punkte Reaktionen
1
Zuviel Werbung?
->Hier kostenlos registrieren
Hallo zusammen,

ich ( SPS Beginner) suche nach einen Lösungsweg.
Ich möchte von einer Tageszeit (Sollzeit) einen bestimmten Zeitwert( z.B.10 Std) abziehen.
Bis hierher kein Problem.
Habe ich aber eine Tageszeit von 5Uhr, möchte ich dann keinen -Wert erhalten sondern natürlich
einen Wert der von 24 Uhr abgezogen wurde, habe ja dann den Vortag.
Habe den Siemensbaustein gefunden der eine Zeit von DT abzieht. Da ich aber nur eine Zeitvorgabe machen möchte und kein Datum vorgeben möchte,
hilft er mir nur indirekt.

Mein Lösungsweg wäre: meine Sollzeit zu nehmen, ein Datum zu erfinden, dies dann mit einen Siemensbaustein zu DT zusammen zufügen, meinen Zeitwert abziehen,
dann wieder Tageszeit (Sollzeit) von DT trennen.
Ich müsste jetzt noch schauen, dass ich nun meinen Wochentag zurück gerrechnet bekomme, denn den möchte ich auch vorgeben.
Würde ich nach dem gleichen Prinzip machen.



Vielleich könnt ihr mir einen Tipp geben, wie richtige SPSler so etwas lösen.
Oder gibt es da doch einen fertigen Baustein


Beispiel: sollzeit: Freitag 5:00Uhr, errechnete Zeit: Donnerstag 19:00 Uhr


Vielen Dank im voraus

Gruß

Jürgen

PS: Bisher habe ich alles in FUB gemacht, bin aber offen für AWL. SCL habe ich nicht!
 

hucki

User des Jahres 2014
Beiträge
5.561
Punkte Reaktionen
1.658
In welchem Format liegt denn Deine Tageszeit vor?
Welche Hardware benutzt Du, damit man weiß, welche Programmmöglichkeiten Du hast?


Prinzipiell: Warum ziehst Du Deinen Zeitwert nicht ab, prüfst ob kleiner Null und rechnest ggf. 24h dazu?
Oder wenn negative Werte nicht gehen - andersrum: erst 24h dazu, minus Zeitwert, noch größer 24 - dann 24h wieder weg.



PS: Schau mal, was die Suche z.B. ergibt: TIME of DAY subtrahieren etc.

Damit dürfte sowas hier als FC mit Zeiten als TIME_of_DAY funktionieren (ungetestet):
Code:
[FONT=courier new]      L     #Sollzeit
[/FONT][FONT=courier new]      L     #Zeitwert[/FONT]
[FONT=courier new]      <D                                //Vergleich[/FONT]
[FONT=courier new]      SPBN  _001                        //wenn #Sollzeit nicht kleiner als #Zeitwert, dann springe[/FONT]
[FONT=courier new]      TAK                               //Zeiten tauschen[/FONT]
[FONT=courier new]      -D                                //Differenz[/FONT]
[FONT=courier new]      L     TOD#0:0:0.1                 //Zeitversatz zw.  TOD#23:59:59.999 und  TOD#24:0:0.0[/FONT]
[FONT=courier new]      -D                                //Zeitversatz abziehen[/FONT]
[FONT=courier new]      L     TOD#23:59:59.999            //letzte Millisekunde des Tages[/FONT]
[FONT=courier new]      TAK                               //Zeiten tauschen[/FONT]
[FONT=courier new]_001: -D                                //Differenz[/FONT]
[FONT=courier new]      T     #RET_VAL                    //Ergebnis[/FONT]
 
Zuletzt bearbeitet:

SoftMachine

Well-known member
Beiträge
2.307
Punkte Reaktionen
368
Zuviel Werbung?
->Hier kostenlos registrieren
.

Im OB 1 läuft die aktuelle Tageszeit bereits mit,
du musst sie dort nur noch aus den Variablen auslesen.

HIER findest du auch noch ein Beispiel-Code zum Umgang mit
den einzelnen Teilen des DATE_AND_TIME (Datum und Uhrzeit)
über registerindirekte Ladebefehle auf die einzelnen Bytes für
Jahr, Monat, Tag, Stunde, usw.
 
Zuletzt bearbeitet:
OP
J

jürgen g

Active member
Beiträge
31
Punkte Reaktionen
1
Hallo hucki,

meine Zeitvorgabe(Sollzeit) ist in TOD und der Zeitwert habe ich in Time gewählt.
Deine Idee mit den 24 Std dazu rechnen funktioniert perfekt, wenn ich wie du vorgeschlagen, auf kleiner verkleiche.
Ich kann dann auch zur gleichen Bedingung meinen Wochentag um 1 verringern.

Leider bin ich nicht selbst auf diese Idee gekommen.
Ich hoffe wenn ich regelmäßig programmiere, kommen mir auch solche Ideen.

Auf jeden Fall vielen Dank für deinen Tipp



PS: Deinen Code habe ich auch probiert, funktioniert bei mir leider nicht.
Kann ihn leider auch noch nicht nachvollziehen, da ich mit TAK und AWL noch nicht wirklich vertraut bin, da ich bisher hauptsächlich in FUB arbeite, und das auch erst seit kurzem.
Möchte ich aber auch mal ändern, die erste Buch ist bestellt.
Ich möchte mich aber in den nächsten Tagen mit deinem Code auseinandersetzen.



Auch an Softmachine vielen Dank.
Das Auslesen der Zeit war eigentlich kein Problem.
Wusste allerdings nicht, dass sie auch im OB1 schon mitläuft.
Habe sie bisher immer mit SFC 1 ausgelesen



Mit besten Dank an Euch beide

Gruß

Jürgen
 

SoftMachine

Well-known member
Beiträge
2.307
Punkte Reaktionen
368
.
Gern geschehen !

Ich selbst rechne mir die Tageszeit stets in Millisekunden um und rechne
dann mit dieser DINT-Zahl (24h=86400ms) .

Ist um einiges leichter als diese ganzen Wandlungen mit DT und TOD usw.
Du musst nur beachten, bei Tageswechsel um 00:00 Uhr beginnt dann
(nach Umrechnung) alles wieder bei Null.

Noch ein Tipp zu deinem bestellten Buch:
HIER bietet Siemens kostenlose Ausbildungsunterlagen an ! ;)

Ich denke, die helfen dir auch weiter.
(Durchhangeln musst du dich aber schon selbst :ROFLMAO: )


Viel Erfolg !
 

wolder

Well-known member
Beiträge
549
Punkte Reaktionen
78
.
Ich selbst rechne mir die Tageszeit stets in Millisekunden um und rechne
dann mit dieser DINT-Zahl (24h=86400ms) .

Das macht doch der FC8 aus der Standard Library -> IEC-Function Blocks auch.
Der holt aus dem kompletten Date_and_Time den TOD (Anzahl an ms ab Mitternacht) raus.
Das ist doch ein Dint, indem die ms ab Mitternacht drin stehen.

Warum selber rechnen?

Gruß wolder
 

Larry Laffer

Supermoderator
Teammitglied
Beiträge
13.096
Punkte Reaktionen
2.721
... es sind nicht immer alle schon vorhandenen Sachen wirklich die Lösung - vor allem dann, wenn man etwas erstmal verstehen möchte oder wenn das vorhandene nicht so richtig auf die Aufgabenstellung passt.
 

hucki

User des Jahres 2014
Beiträge
5.561
Punkte Reaktionen
1.658
Zuviel Werbung?
->Hier kostenlos registrieren
...
PS: Deinen Code habe ich auch probiert, funktioniert bei mir leider nicht.
Kann ihn leider auch noch nicht nachvollziehen, da ich mit TAK und AWL noch nicht wirklich vertraut bin, da ich bisher hauptsächlich in FUB arbeite, und das auch erst seit kurzem.
Möchte ich aber auch mal ändern, die erste Buch ist bestellt.
Ich möchte mich aber in den nächsten Tagen mit deinem Code auseinandersetzen.
...
Hab's gerade mal simuliert - also bei mir läuft's.

Beide Zeitwerte und Ret_Val hab' ich bei den lokalen Variablen als ToD eingestellt.
TAK tauscht Akku1 und Akku2, so daß ich immer den kleineren Wert vom größeren abziehe.
Hinter den // steht immer der Kommentar, was die Zeile macht.

Hier nochmal die komplette Funktion als Quelle:
Code:
[FONT=courier new]FUNCTION "TOD_Subtraktion" : TIME_OF_DAY
[/FONT][FONT=courier new]TITLE =[/FONT]
[FONT=courier new]//#Zeitwert wird von #Sollwert abgezogen.[/FONT]
[FONT=courier new]//Ist #Sollwert größer als #Zeitwert wird der ToD des Vortages berechnet[/FONT]
[FONT=courier new]VERSION : 0.1[/FONT]

[FONT=courier new]VAR_INPUT[/FONT]
[FONT=courier new]  Sollzeit : TIME_OF_DAY ;    [/FONT]
[FONT=courier new]  Zeitwert : TIME_OF_DAY ;    [/FONT]
[FONT=courier new]END_VAR[/FONT]
[FONT=courier new]
[/FONT]
[FONT=courier new]BEGIN[/FONT]
[FONT=courier new]
[/FONT][FONT=courier new]NETWORK[/FONT]
[FONT=courier new]TITLE =TOD_Subtraktion[/FONT]
[FONT=courier new]      L     #Sollzeit;            //Lade #Sollzeit in Akku1[/FONT]
[FONT=courier new]      L     #Zeitwert;            //Lade #Zeitwert in Akku1 (verschiebt #Sollzeit in Akku2)[/FONT]
[FONT=courier new]      <D    ;                     //Vergleich Akku2 kleiner Akku1?[/FONT]
[FONT=courier new]      SPBN  _001;                 //wenn #Sollzeit nicht kleiner als #Zeitwert springe zu _001[/FONT]
[FONT=courier new]      TAK   ;                     //Zeiten (Akkus) tauschen[/FONT]
[FONT=courier new]      -D    ;                     //Differenz  Akku2-Akku1 (#Zeitwert-#Sollzeit)[/FONT]
[FONT=courier new]      L     TOD#0:0:0.1;          //Zeitversatz zw.  TOD#23:59:59.999 und  TOD#24:0:0.0 (Wert über [/FONT]oberem Grenzwert[FONT=courier new])[/FONT]
[FONT=courier new]      -D    ;                     //Zeitversatz abziehen[/FONT]
[FONT=courier new]      L     TOD#23:59:59.999;     //letzte Millisekunde des Tages in Akku1[/FONT]
[FONT=courier new]      TAK   ;                     //Zeiten (Akkus) tauschen[/FONT]
[FONT=courier new]_001: -D    ;                     //Differenz Akku2-Akku1[/FONT]
[FONT=courier new]      T     #RET_VAL;             //Ergebnis[/FONT]

[FONT=courier new]END_FUNCTION[/FONT]
PS: geht sicher auch etwas einfacher, da ToD ja einen Wert in ms darstellt. Hab' aber mal nur mit ToD-Werten arbeiten wollen. ;-)
 
Zuletzt bearbeitet:
OP
J

jürgen g

Active member
Beiträge
31
Punkte Reaktionen
1
Hallo Hucki,
sorry, hab es nochmal probiert, es funktioniert auch bei mir.
Weiß nicht was beim ersten Mal falsch gemacht habe. Aber es läuft.:D

Mit dem Code komme ich jetzt auch gut klar. :eek::D:D

Nochmals vielen Dank für deine Hilfe.

Werde mich als nächstes mit der indirekten Adressierung beschäftigen.


Bis zum nächsten Mal Gruß

Jürgen
 
Oben