awl schleife und pointer

Iserlohner

Level-1
Beiträge
75
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo erstmal,
also nachdem ich jetzt vieles hier im forum über pointer und schleifen gelesen habe muss ich doch mal nachfragen....
Ich habe diesen Beitrag zwar verstanden: http://www.sps-forum.de/showthread.php?t=8887

aber da ich noch nie mit pointern in s7 gearbeitet habe blick ich nicht durch....

mein problem bzw vorhaben.....

ich habe einen Datenbaustein siehe bild "db"
in diesem db sind Zeitwert_soll und Zeitwert_rest bereits beschrieben...
nun möchte ich Zeitwert_ist einfach mit ist=soll-rest ausrechnen..
damit ich nun aber nicht 256 mal diese rechnung ausführen muss dachte ich an eine schleife von 1-256 mit pointern die jeweils auf soll, rest und ist zeigen.....

ich verzweifel grad an der syntax..... danke im vorraus
 

Anhänge

  • db.JPG
    db.JPG
    128,1 KB · Aufrufe: 250
Hallo Christian,

so einfach wie du es beschreibst ist es aber gar nicht.
Da solltest du schon mehr Info geben.
Vor allem auch die Zeitwert-Variablen-Deklaration.

Gruß wolder

P.S.: Ich kann die Info nicht geben, da ich das selber nicht weiß. Hab das zwar mal mit SCL probiert, aber kläglich gescheitert.
 
Code:
     L  P#0.0                           //Anfangswert des Pointers
     LAR1                                //in das Adressregister schreiben
     L 256                               //Schleifenzähler auf 256
anf:T MW30                           //vorbelegen und im MW30 zwischenspeichern
     AUF DB121
     L DBW[AR1,P#0.0]             //hole aus dem DB das DBW0 (erster Durchgang)
     BTI                                 //Umwandeln in Integer
     L DBW[AR1,P#1024.0]        //hole aus dem DB das DBW1024 (erster Durchgang)
     -I                                   //Subtraktion
     T DBW[AR1,P#512.0]         //schreibe ins DBW512 (erster Durchgang)
     +AR1 P#2.0                     //addiere zu dem Adressregister den Pointerwert 2.0
     L MW30                          //Lade den Schleifenzähler
     LOOP anf                        //subtrahiere mit 1 und springe nach anf, wenn das Ergebnis > 0 ist.
Absolut ungetestet und bestimmt noch mit Fehlern.
Gruß wolder

Edit: Ich hoffe die Kommentierung reicht aus
 
Zuletzt bearbeitet:
@christian...

ich hab noch nie mit scl gearbeitet,
dier schleife ist ja verständlich für mich, aber der rest drum rum, wir schreib ich dann "ist" in den db bzw lese "soll" und "rest" aus dem db
 
@christian...

ich hab noch nie mit scl gearbeitet,
dier schleife ist ja verständlich für mich, aber der rest drum rum, wir schreib ich dann "ist" in den db bzw lese "soll" und "rest" aus dem db

Ich würde dir den Hinweis geben, denk bitte zuerst nach wie du Programmieren willst.
AWL oder SCL, womit hast du mehr Erfahrung und/oder Wissen.
Beides auf einmal für das selbe Programm ist doof.

bike
 
Zuviel Werbung?
-> Hier kostenlos registrieren
hab mich für die awl lösung entschieden...

der vorschlag von wolder klappt soweit....

L P#0.0
LAR1
L 256
anf: T MW 30
AUF "DB_Zeiten"
L DBW [AR1,P#0.0]
L DBW [AR1,P#512.0]
-I
T DBW [AR1,P#1024.0]
+AR1 P#2.0
L MW 30
LOOP anf






zur info, ich zeige mir die werte alle an nem op77 an...
dbw0 bis dbw510 sind ja s5time werte, und dbw512 bis dbw1022 sind integer werte, aber nun steht der wert in dbw1024 bis 1534 aber als hex was muss ich tun um die zeit als s anzuzeigen????
ich hampel grad mit der linearen skalierung rum, die kapier ich wohl nicht richtig....
für "soll" und "rest" hab ich die Skalierung auf 0-6000 und 0-6 eingestellt, bin ich aber ehrlich gesagt nur durch langes probieren dran gekommen....
für "ist" also den errechneten wert der nun als hex vorliegt komm ich an keine sinnvolle richtige anzeige,,,,,,
 
S5TIME ist eine BCD-codierte Darstellung von Zeitwerten mit Hilfe einer ebenfalls in diesem Datentyp codierten Zeitbasis...

einfach mal den Aufbau angucken und eine Umrechnung schreiben
 
Oh stimmt.
Die Zeiten waren ja einmal in S5-Time und dann als WORD.

Wo kommen die WORD-Werte denn her?
Ich nehme an, dass das der DUAL-Ausgang vom Timer ist oder ist das der DEZ-Ausgang des Timers?

Der DEZ-Ausgang ist ja bereits eine S5-Time.
Dann könntest du deine Einstellung in dem DB auf S5Time ändern. Dann sollte der Code wieder passen.

Bei dem OP bin ich gerade überfragt. Kannst du da bei der Anzeige nicht S5-Time als Einstellung vorgeben?

Dann bräuchtest du keine Umrechnung mehr.
Edit: Ist natürlich quatsch! Umrechnen musst du trotzdem.

Gruß wolder
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
@wolder:
also die werte "rest" kommen von dem DEZ Ausgang des Timers...
und weil ich keine s5time am OP77 anzeigen kann deshalb als word, dann bekomme ich am display über die lineare skalierung den wert richtig angezeigt...

@vierlagig:
Habe das format des datentypes s5time hier vorliegen und auch kapiert....
BIT 14&15 ohne funktion,bit 12&13 für die Zeitbasis und 0bis11 der zahlenwert...
aber wo soll ich nun was machen?
 
die Formate anpassen!
bzw. stimmen die ja bei Dir, es handelt sich beides mal um S5TIME, aber womöglich mit unterschiedlicher Zeitbasis. und aber auch bleibt es eine BCD-codierte Zahl, die kann man nicht so einfach mit der Festpunkt-Arithmetik erschlagen, da muß man schon mal umwandeln...

also: erster Schritt, Zeitbasis überprüfen -> ggf. anpassen und merken
zweiter Schritt, Zeitbasis eliminieren
dritter Schritt, BCD -> INT
vierter Schritt, Differenz bilden
fünfter Schritt, INT -> BCD
sechster und finaler Schritt, Zeitbasis setzen
 
@wolder:

habe jetzt im db alle datentypen auf s5time geändert und die Anzeige des DEZ Ausgang des Timer "rest" dbw 512 bis 1022, klappt am display immer noch.....


jetzt bleibt nur das problem mit dem richtigen errechnetem wert...
der steht an der richtigen stelle im db also die pointer und schleife und so klappt prima...danke.....
aber der errechnete oder geschriebene wert wie auch immer passt nicht...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Was sind das denn für Zeitwerte (Soll)?
Sind die immer mit dem Faktor sekunden?

Der Dual-Ausgang gibt dir ja die "reinen" Zahlen aus, ohne Multiplikator.
Wenn der Zeitwert_soll immer im Sekundenbereich liegt, dann kannst du das relativ einfach umwandeln.

Aber sag uns erstmal wie der TW-Eingang des Timers beschaltet ist.

Stell vielleicht mal ein Bild zu Verfügung wie dein Programm aussieht, dann wirds wahrscheinlich einfacher.

Gruß wolder

Edit: zu langsam, 4L war schneller. Darauf wollte ich hinaus.
 
Zuletzt bearbeitet:
also ich nehme einfach nen timer:

U E 124.6
L "DB_Zeiten".Zeitwert_soll[50]
SE T 333
NOP 0
NOP 0
LC T 333
T "DB_Zeiten".Zeitwert_rest[50]
NOP 0



jetzt kommt der sollwert durch ne eingabe vom display in sekunden
und der restzeit und istzeit sollen angezeigt werden...
siehe bild über skalierung..
 

Anhänge

  • 1.JPG
    1.JPG
    168,2 KB · Aufrufe: 28
  • 2.JPG
    2.JPG
    165,8 KB · Aufrufe: 21
Das hab ich mir gedacht.
Durch das Format Timer in WinCC Flexible gibst du die Zahl in Form von ms an.
Durch die Skalierung bekommst du die Zahl als sec.
So weit, so gut.
Allerdings vergibt die CPU den Multiplikator selbst. Das heißt, dass du gar nicht weiß welchen Multiplikator du wirklich hast.

Wie wäre es denn, wenn du die Zahl im OP als WORD-Größe ohne Skalierung in die CPU schreibst (als Hex). Somit hast du schon den Hex bzw. BCD-Wert richtig.
Was du jetzt noch vor dem Timer-Starten machen musst, ist den Multiplikator von Hand erzeugen.
Code:
L     "DB_Zeiten".Zeitwert_soll[50]
L 2#0010000000000000             //Multiplikator von Hand erzeugen
OW
SE T333
Dann kannst du den DUAL-Ausgang des Timers nehmen und ihn im DB ablegen.
Beim Rechnen musst du dann den Zeitwert_soll noch in einem Integer umwandeln und Subtrahieren. Dann kannst du den Restwert als Integer im OP anzeigen.

Ich ändere das mal im Beispiel.

Gruß wolder
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
So, ich mach Feierabend.
Ich hoffe, dir geholfen zu haben.
Ansonsten sind ja auch noch andere hier.
Ich schau morgen wieder rein.

Schönen Feierabend euch allen.

Gruß wolder
 
guten morgen....

so ich hab mal deine tips weiter befolgt, wolder.....

dabei geht mir die sps in störung, wenn ich für "soll" werte eingebe am display...
komischewrweise nicht bei jedem wert....
siehe Bild "OK" bei zB "55" oder "5" oder "87" nimmt er den wert an,
Gebe ich eine "10" oder "15" ein geht die sps auf störung siehe Bild...

was dann noch komisch ist, "rest" + "ist" ergibt immer den selben rechnerichen wert, aber nicht den sollwert....
siehe bild, soll=55 aber er zählt runter von 37....
 

Anhänge

  • OK.JPG
    OK.JPG
    226,6 KB · Aufrufe: 13
  • fehler.JPG
    fehler.JPG
    80,5 KB · Aufrufe: 12
Zurück
Oben