Mit Zeiten "S5T#0MS" rechnen

kussji

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

Ich schreibe von einem OP3-Panel Zeiten im "S5T#2S"-Format in einen DB.
Zeit A und Zeit B im DB abgelegt. Soweit so gut.

Nun brauche ich eine Differenz zwischen den beiden Zeiten A und B.
Zeit C = Zeit A - Zeit B

Wie, bzw. mit was für Funktionen kann ich das tun?
Geht das überhaupt.

Ich arbeite mit Simatic-Manager Step7

Danke schon mal.

Gruss
kussji
 
Zuletzt bearbeitet:
Zeit A in INT umwandeln Basis Millisekunden
Zeit B in INT umwandeln Basis Millisekunden
A - B
Ergebnis bei Bedarf wieder in S5-Time-Format konvertieren

Gruss KS
 
Zuviel Werbung?
-> Hier kostenlos registrieren
das Problem bei der Berechnung besteht darin, dass die S5Time aus 4 BCD Ziffern besteht. In der Linken Ziffer befindet sich der Faktor. Anders gesagt um die Zeiten zu addieren bzw Subtrahieren müssen die erst mal die Gleiche Basis haben, dann kann mann sich mit schieben so ein wenig weiterhelfen
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo kussji,
dein Problem ist nicht so ganz einfach, aber natürlich lösbar. Hier mein fertiges Programm:
1. Das aufrufende Programm
Im aufrufenden Programm wird der FC10 (meine Vorgabe) 2 mal verwendet:
(DB12.DBW0 (Zeit A) und DB12.DBW2 (Zeit B) sind auch nur meine Vorgaben)
// Aufruf FC10 mit Zeit A
CALL FC 10
Zeitwert:=DB12.DBW0
Zeit_ms:=MD110 // Rückgabe im DINT-Format in ms nach MD 110
// Aufruf FC10 mit Zeit B
CALL FC 10
Zeitwert:=DB12.DBW2
Zeit_ms:=MD114 // Rückgabe im DINT-Format in ms nach MD114
// Differenzbildung Zeit A - Zeit B
L MD 110
L MD 114
-D
T MD 118 // Ergebnis nach MD118
Das bedeutet, der FC10 hat eine IN-Variable vom Typ S5TIME (Zeitwert) und eine OUT-Variable vom Typ DINT (Zeit_ms). Dazu hat er eine temp. WORD-Variable "Zeit_BCD" und eine temp. INT-Variable "Faktor".
2. Der FC10
Das "Innenleben" des FC10 sieht folgendermaßen aus:
L #Zeitwert // Zeitwert im BCD-Format speichern
SLD 20
SRD 20
T #Zeit_BCD
L #Zeitwert // Zeitfaktor im INT-Format speichern
SLD 18
SRD 30
T #Faktor
L #Faktor // Umrechnen in ms, falls Faktor=0
L 0
==I // Zeitfaktor=0 ?
SPBN FA1 // <-- nein
L #Zeit_BCD
SLD 4
BTD
T #Zeit_ms
FA1 :L #Faktor // Umrechnen in ms, falls Faktor=1
L 1
==I // Zeitfaktor=1
SPBN FA2 // <-- nein
L #Zeit_BCD
SLD 8
BTD
T #Zeit_ms
FA2 :L #Faktor // Umrechnen in ms, falls Faktor=2
L 2
==I // Zeitfaktor=2 =
SPBN FA3 // <-- nein
L #Zeit_BCD
SLD 12
BTD
T #Zeit_ms
FA3 :L #Faktor // Umrechnen in ms, falls Faktor=3
L 3
==I // Zeitfaktor=3 ?
SPBN ENDE // <-- nein
L #Zeit_BCD
SLD 16
BTD
T #Zeit_ms
ENDE :NOP 0
Lass dich von der Genauigkeit des Ergebnisses in ms nicht blenden. Das Format S5TIME kann bestenfalls im Raster 10ms vorgegeben werden. Das sollte bei der Weiterverarbeitung des Ergebnisses berücksichtigt werden. Auch möchte ich drauf hinweisen, dass die Differenz auch negativ sein kann. Aber du wirst ja wissen, was das eventuell zu bedeuten hat.
Gruß eNDe
 
Wauw das geht ja schnell hier bei euch!!!

Hallo zusammen,

ich Danke euch vielmal für eure raschen und teilweise sehr ausführlichen Antworten, super!

Bin neu hier und ab eurer schnelligkeit regelrecht erschrocken :p

Kann das ganze leider erst am Montag probieren. Vielleicht gibts dann noch Fragen.

Schönes Wochenende (ich hab schon :cool: )

Gruss
kussji
 
Hallo kussji und alle Interessierten,
ich kann nicht anders und stelle den folgenden Code hier in's Forum. Er ersetzt den in meinem obigen Beitrag dargestellten Code des FC10, also identische Funktion!
Kleine Knobelaufgabe, wie das wohl funktioniert.
Und hier der Code :
L 4
L #Zeitwert
UW W#16#3000
SRD 12
*I
+I
L #Zeitwert
UW W#16#0FFF
SLD
BTD
T #Zeit_ms
Das ist wirklich schon Alles !
Ebenfalls schönes Wochenende :p
 
@kpeter

+I kannst du weglassen, bzw. du mußt was ändern.
Eigenartigerweise ist nach der Multiplikation der Akku2 = 0, obwohl in der Hilfe von Step7 folgendes steht:

Bei CPUs mit zwei Akkus bleibt der Inhalt von AKKU 2 unverändert.

Bei CPUs mit vier Akkus werden die Inhalte von AKKU 3 in AKKU 2, und von AKKU 4 in AKKU 3 kopiert. Der Inhalt von AKKU 4 bleibt unverändert.
Ich hab eine 314C-2DP im Simulator laufen lassen, da ist das so und widerspricht eigentlich der Aussage in der Hilfedatei.
Deshalb kommen auch nicht ms sondern ms/10 heraus.

Um das zu ändern, muß man folgendes schreiben:

Code:
      L     4
      L     #Zeitwert
      UW    W#16#3000
      SRD   12
      *I    
      [COLOR=Red]L     4[/COLOR]
      +I    
      L     #Zeitwert
      UW    W#16#FFF
      SLD   
      BTD   
      T     #Zeit_ms
Hat jemand dafür eine plausible Erklärung?

@eNDe

Ist schon tricky, geht der Code bei dir so, mit welcher CPU hast du das getestet?
 
Zuletzt bearbeitet:
Mit S7-PCLSIM, das im Simatic-Manager integriert ist (bei der Prof.-Version). Ich werde das am WE mal in einer 317PN probieren, interessiert mich doch mal.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Verstümmelter Befehl SLD

Hallo,

ich habs ausprobiert mit einer 318: Der Befehl SLD ohne Parameter holt sich selbigen von irgendwoher, anscheinend von "L 4". Das ist genau die Art von Code, der meine Kollegen zur Verzweiflung treibt: Wort- und Doppelwortbefehle durcheinander, mit und ohne Parameter und das ohne Doku mitten in der Nacht...
NACHTRAG: nicht zu Hause nachmachen, Code ergibt BCD-Wandlungsfehler (OB121)!
 
Zuletzt bearbeitet:
@Werner54

In Prinzip hast du recht, ist aber ein interessantes Beispiel.
SLD ist aber nicht verstümmelt!
Code:
      L     4
      +I    
      L     #Zeitwert
      UW    W#16#FFF
      SLD
nach L4 +I steht das Ergebnis im Akku 1
nach L #Zeitwert UW W#16#FFF
steht dieses Ergebnis in Akku 1; das, was vorher in Akku 1 stand, steht nun in Akku 2

SLD ohne Parameter ohlt sich die Anzahl für das Schieben aus:
SLD (Schiebe links Doppelwort) schiebt den gesamten Inhalt von AKKU 1 bitweise nach links. In die Bitstellen, die durch das Schieben frei werden, werden Nullen geschrieben. Das zuletzt geschobene Bit wird in das Statusbit A1 geladen. Die Anzahl an Bitstellen, um die geschoben werden soll, wird entweder von dem Operanden <Anzahl> oder von einem Wert in AKKU2-L-L angegeben.
 
AWL-Code

@Ralle,

das kommt davon, weil ich so oft KOP-lesbaren Code schreibe. Dabei kann das mit dem Wert in AKKU2-L-L nicht passieren.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo nochmal,
beim FC10 können nochmals 2 Befehle eingespart werden. Wahrscheinlich bester Code:
Code:
[SIZE=1]L #Zeitwert[/SIZE]
[SIZE=1]UW W#16#3000[/SIZE]
[SIZE=1]SRD 10[/SIZE]
[SIZE=1]L #Zeitwert[/SIZE]
[SIZE=1]UW W#16#0FFF[/SIZE]
[SIZE=1]SLD[/SIZE]
[SIZE=1]SLD 4[/SIZE]
[SIZE=1]BTD[/SIZE]
[SIZE=1]T #Zeit_ms[/SIZE]
1. Natürlich soll ein Code auch für die Nachtschichtler verständlich sein. Wo aber liegen hier die Grenzen?
2. Ich entwickle und teste meine Programme mit WinSPS-S7, Version 3.57. Die Fa. mhj-Software arbeitet meines Wissens eng mit Siemens zusammen. Habe bisher noch keinen Fehler hinsichtlich der "offiziellen" Siemens-Befehlsliste feststellen können.
3. Der Befehl SLD (ohne Parameter) holt sich seinen Parameter aus Akku 2. Wenn man in meinen Programmvorschlägen genau die Inhalte der Akkus 1 und 2 verfolgt, kommt man eigentlich dahinter was passiert.
4. Schiebt man eine BCD-Zahl um 4 Stellen nach links, bedeutet das Multiplikation mit 10. Schiebt man dagegen eine pos. INT-Zahl um 1 Stelle nach links, bedeutet das Multiplikation mit 2.
5. Bevor ein Ladebefehl ausgeführt wird, wird der Inhalt von Akku1 (alle 32 Bit) unverändert nach Akku2 kopiert. "Alter" Inhalt von Akku2 geht dabei verloren.
6. Arithmetikbefehle verknüpfen immer Akku2 mit Akku1. Ergebnis wird in Akku1 geschrieben, Inhalt von Akku2 wird dabei nicht verändert.
7. Nichts für Ungut, aber ich denke mal, dass solche Codebeispiele gut zum Üben taugen. Wer nicht will, kann es ja lassen.
Gruß eNDe
 
6. Arithmetikbefehle verknüpfen immer Akku2 mit Akku1. Ergebnis wird in Akku1 geschrieben, Inhalt von Akku2 wird dabei nicht verändert.

Leider muss ich dich erneut auf einen Fehler in deinen Ausführungen hinweisen.

Wie auch Ralle schon erwähnte gilt:

Bei CPUs mit zwei Akkus bleibt der Inhalt von AKKU 2 unverändert.

Bei CPUs mit vier Akkus werden die Inhalte von AKKU 3 in AKKU 2, und von AKKU 4 in AKKU 3 kopiert. Der Inhalt von AKKU 4 bleibt unverändert.


Alle 400er und die 318 haben 4 Akkus.

Bei diesen CPUen wird also der Inhalt von Akku 2 bei arithmetischen Operationen mit dem Inhalt von Akku 3 überschrieben.

Habe ich eben ausprobiert, dass ist so.
 
Hallo,
was UG schreibt, wird wahrscheinlich stimmen. Eine Befehlsliste für CPU's mit 4 Akkus habe ich leider nicht. Also muss ich der Vollständigkeit wegen schreiben, dass der Code nur für die 2-Akku-Varianten der CPU's gilt, wobei ich hier davon ausgehe, dass diese dann alle nach den gleichen Befehlslisten arbeiten.
mfG eNDe
 
Zurück
Oben