Messwerte in einen DB schreiben

Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

da ihr mir vor paar Jahren hier schon mal helfen konntet, hoffe ich, dass mir jemand für eine ähnliche Anwendung auch den entscheidenden Tipp geben kann.
Ich möchte eine Berechnung für Positionen durchführen. Die Anzahl der benötigten Positionen kann variieren, je nach Auftrag mal 10, 20, 35, usw...
Ich dachte mir dies am besten in einem Array lösen zu können, solange berechnen bis ich die Anzahl der benötigten Positionen habe, dann die Berechnung stoppen.

Da ich diese mehrmals in der Steuerung benötige, wollte ich mir einen FB schreiben welchen ich dann als Multiistanz mehrmals aufrufen kann.
Nun habe ich das Problem, das ich nicht genau weiß, wie ich einen "internen" Bereich bei so etwas aufrufe.

L L#10000
AUF DB1
T DBD [MD 0]
L MD 0
L P#4.0
+D
T MD 0

Den zweiten Befehl, sprich einen sep. DB aufrufen, möchte ich ja nicht, sondern er soll den DB verwenden welchen ich angebe, wenn ich den FB in einem anderen FB aufrufe.

Funktioniert das, oder bin ich auf dem Holzweg?

Danke und Gruß
 
Hallo,
ich bin mir nicht sicher, ob ich deine Anfrage korrekt verstanden habe ...

Du möchtest die im STAT-Bereich deines FB's deklarierten Variablen indirekt adressiert aufrufen ?
Und du möchtest hier mit einem Array arbeiten ?
Meine erste Wahl für so etwas wäre hier immer SCL ...!
Wenn du es aber in AWL (unbedingt) machen möchtest dann würde ich mir den Pointer auf das interne Symbol bilden - also etwa so :
Code:
LAR1 p##MeinArray
TAR2
+AR1
Das AR2 mußt du deshalb aufaddieren, da du ja Multi-Instanzfähig sein möchtest - das AR2 beinhaltet hier das Offset der Instanz. Du mußt nur mit den Befehl +AR1 aufpassen. Der addiert nur im 16-Bit-Bereich auf. Wenn deine Daten sehr hoch in der Instanz liegen dann mußt du hier ggf. noch händisch arbeiten.
Nun kannst du dein Index-Offset noch aufaddieren und du kommst an die Adresse des Array-Elementes.

Gruß
Larry
 
Hallo,

vielen Dank für die schnelle Antwort!
Ja genau, ich möchte meinen Array im STAT-Bereich des FB's verwenden und dort die Werte reinschreiben.

Hab leider noch nicht soviel Erfahrung in SCL gemacht, wie sehe das denn dort aus?
In AWL hört sich schon recht kompliziert an, dachte das ginge da quasi ähnlich wie wenn ich dies über einen externen DB aufrufe.
Aber das ist ja dann leider nicht so. :-(

Gruß
 
Zuviel Werbung?
-> Hier kostenlos registrieren
... wenn SCL für dich eine Option ist dann sollten wir über AWL & Co. hier nicht mehr weiter nachdenken ...

Beschreib doch mal etwas konkreter was du so zu tun beabsichtigst ...
 
Ich muss für eine Anwendung ausrechnen wie viele Artikel in einen Karton rein passen. Dies lässt sich je relativ einfach ermitteln. Je nach Auftrag unterscheiden sich die Kartongröße, also Länge x breite kann variieren, auch die Artikel können variieren, rund oder rechteckig in verschiedenen Abmaßen. Es wird aber immer Sortenrein gepackt.
Wie viele Artikel in eine Reihe in X und Y passt, weiß ich. Nun möchte ich für jede Reihe die Position in X und Y errechnen. Wenn es 24 Reihen in Y und 20 Reihen in X gibt, dann entsprechend viele Positionen, es können aber auch 50 und 100 Reihen sein, dann soll mir der Baustein 150 Positionen in den STAT reinschreiben.
Dort hole ich mir dann die Positionen heraus und der Bediener kann sich das Packmuster anschauen und die Werte können nach bestätigen des Bedieners übergeben werden.
Bei runden Artikel sollen diese zusätzliche noch nebeneinander oder versetzt ineinander gesetzt werden um ggf. Platz zu sparen.
Die Formeln hierzu habe ich, das ist kein Problem, hab ich auch schon in AWL alles gerechnet. Nur möchte ich diese Formeln mit den Auswahlen, ob eckig oder rund, wenn rund welches Muster in einen FB packen, und dieser soll dann die Positionen für die benötigte Anzahl von Reihen in X und Y ausgeben.
 
OK ... das macht ja auch Sinn so ...
Und wie soll es nun weiter gehen ?
AWL und Pointer ? Oder SCL ?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
In SCL habe ich leider bisher noch nicht so viel gemacht, was aber nicht heißt dass ich es net gerne versuchen würde.
In AWL mit den Pointer hattest du ja geschrieben dass dort einiges zu beachten sei...

Die Formeln habe ich halt bisher in AWL, versuch das gerne aber auch in SCL umzuschreiben.

Was ginge denn deiner Meinung nach schneller bzw. ist Sinnvoller?
 
Ich würde es gar nicht erst in AWL versuchen wollen - auch wenn ich es vielleicht könnte.
IN SCL ergibt das m.E. einen ziemlich gut überschaubaren Code in einer Schleife.
Ich vermute, dass dein aktueller AWL-Baustein ziemlich lang ist, bei dem, was es so machen kann.
Ansonsten poste ihn doch einfach mal - dann sehen wir mal, wie eine Umsetzung zu SCL gehen könnte ...

Gruß
Larry
 
Hallo Leute,
ich klinke mich da einfach mal rein da es zu meinem Problem passt.

Ich will auch Werte in einem Datenbaustein abspeichern.
Der DB ist bis dw60700 geöffnet.
Ich will über indizierte Adressierung auf (z.B.)DBxx.DD60620 schreiben.
Jetzt hab ich das Problem wenn ich diese 60620 mit einer Variable übergebe muss diese ja eine INT - variable sein. ERGO: fehler weil INT -32000 / +32000 (ungefähr).
Kann ich auf 60620 überhaupt adressieren ?
Falls ja - wie ?

danke für eure Hilfe
Gruß Tom
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hmm, ich mag jetzt nicht 30 Beiträge lesen und dann raten, wozu Dein Beitrag passen könnte ;)
Also: wo musst Du den Wert übergeben? Warum muß es INT sein?
Du könntest auch als WORD oder DINT übergeben oder einfach vorzeichenlos rechnen - die Adressberechnung muß ja eigentlich sowieso in DINT durchgeführt werden.

Harald
 
Hallo Harald,
Danke für deine Antwort.
Ich sehe ich muss dann doch präziser werden.
Ich schreibe einen SCL Baustein der mir von einen angeschlossenen Sensor Messwerte ich einen Datenbaustein speichert.
Mein System:
Code:
[TABLE="width: 623"]
[TR]
[TD]S7 Distributed Safety Programming[/TD]
[TD] V5.4 + SP5[/TD]
[TD] K5.4.5.0_3.5.0.2[/TD]
[TD] K5.4.5.0[/TD]
[/TR]
[TR]
[TD]Automation License Manager[/TD]
[TD] V5.1 + SP1[/TD]
[TD] K05.01.01.00_01.10.00.06[/TD]
[TD] K5.1.1.0[/TD]
[/TR]
[TR]
[TD]S7-PLCSIM[/TD]
[TD] V5.4 + SP5 + Upd1[/TD]
[TD] K05.04.05.01_01.02.00.01[/TD]
[TD] K5.4.5.1[/TD]
[/TR]
[TR]
[TD]S7-PDIAG[/TD]
[TD] V5.3 + SP6[/TD]
[TD] K05.03.06.00_01.01.00.09[/TD]
[TD] K5.3.6.0[/TD]
[/TR]
[TR]
[TD]S7 F ConfigurationPack[/TD]
[TD] V5.5 + SP6[/TD]
[TD] K5.5.6.0_9.1.0.1[/TD]
[TD] K5.5.6.0[/TD]
[/TR]
[TR]
[TD]S7-GRAPH[/TD]
[TD] V5.3 + SP7[/TD]
[TD] K5.3.7.0_1.2.0.1[/TD]
[TD] K5.3.7.0[/TD]
[/TR]
[TR]
[TD]S7-PCT[/TD]
[TD] V2.3[/TD]
[TD] V02.03.00.00_01.18.00.01[/TD]
[TD] V2.3.0.0[/TD]
[/TR]
[TR]
[TD]S7-SCL[/TD]
[TD] V5.3 + SP6[/TD]
[TD] K05.03.06.00_01.05.00.01[/TD]
[TD] K5.3.6.0[/TD]
[/TR]
[TR]
[TD]STEP 7[/TD]
[TD] V5.5 + SP2 + HF1[/TD]
[TD] K5.5.2.1_8.1.0.1[/TD]
[TD] K5.5.2.1[/TD]
[/TR]
[/TABLE]

Mein Code:
Code:
        Aktuell_Adresse := (BYTE_TO_INT(STATUS.BYTE_3_BYTE_JOB_Number)-1)*2400;      // Wert 1 speichern
        t_real := DWORD_TO_DINT(DATA.BYTE_02_MESSWERT_01)*korr_fact/100;
        daten_db.dd[Aktuell_Adresse] := REAL_TO_DWORD(t_real) ; // 1. Wert
Wenn jetzt meine "Job_nummer" die 15 erreicht macht es "puff" und die sps (416-F) stoppt.
Das Problem ist das laut Anleitung die indize als INT übergeben werden muss.
Bei mir die variable "Aktuell_Adresse".
Sobald der Wert von "Aktuell_Adresse" die 32767 überschreitet passt die Adressierung des Datenbausteins nicht mehr.

Ich hoffe jetzt ist es ein bisschen verständlicher.

Hier noch das Dokument von Siemens:
SCL_d.jpg

Gruß Tom
 
Zuletzt bearbeitet:
Hallo,
2 Fragen dazu :
- kann/darf der Datenbaustein bei einer 400er so groß werden ?
- warum arbeitest du nicht mit einem Array (of REAL) an Stelle dieser Indiziererei ?

Gruß
Larry
 
Wenn jetzt meine "Job_nummer" die 15 erreicht macht es "puff" und die sps (416-F) stoppt.
Das Problem ist das laut Anleitung die indize als INT übergeben werden muss.
Wenn es denn tatsächlich mit dieser vorsintflutlichen Indiziererei sein muß:

Die SCL-Hilfe zum indizierten Zugriff auf Datenbausteine bzw. Speicherbereiche ist veraltet. Der Index darf auch DINT sein - dann kann man auch auf Adressen > DBD32767 zugreifen.

Deklariere Aktuell_Adresse als DINT und berechne in DINT, dann crasht es nicht mehr:
Code:
        Aktuell_Adresse := (BYTE_TO_INT(STATUS.BYTE_3_BYTE_JOB_Number)-1) * [COLOR="#FF0000"]DINT#[/COLOR]2400;      // Wert 1 speichern
        t_real := DWORD_TO_DINT(DATA.BYTE_02_MESSWERT_01)*korr_fact/100[COLOR="#0000FF"][B].0[/B][/COLOR]; [COLOR="#0000FF"]//REAL-Berechnung explizit/deutlicher angeben![/COLOR]
        daten_db.dd[Aktuell_Adresse] := REAL_TO_DWORD(t_real) ; // 1. Wert

Harald
 
Zurück
Oben