Skript struktur auslesen

S7_is_confusing

Level-1
Beiträge
30
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo erstmal,
Ich bin ziemlich neu was S7 und Win CC flex angeht und stehe deshalt vor einem (für mich sehr großen) Problem:
Ich habe eine Variable die auf einen DB weißt in dem meine Daten gespeichert sind (48 mal eine UDT mit je 8 Paramtern). Diese will (oder vielmehr habe) ich nun auf eine Struktur intern übertragen um später dann daraus die Daten dynamisch, je nach gewähltem "Datensatz" in Textfelder schreiben zu können. Jedoch finde ich immer nur den Hinweis, dass man mit scripten keine Strukturen auslesen kann. Gibt es da vielleicht doch noch eine möglichkeit? Ich wäre auch mit einer generellen Umstrukturierung einverstanden, solange diese zu erfolg führt.

Entschuldigt wenn es ein bisschen wirr und unverständlcihklingt, wie gesagt, ich bin neu was das alles angeht.

lg
 
Hallo,
tut mir leid, nicht nur S7 ist confusing - manche Fragen (Formulierungen) sind es auch ... ;)

Du kannst in Flex nicht eine Variable auf eine Struktur legen und dann damit automatisch alle Unterelemente der Struktur ansprechen. Du kannst aber für jedes Element der Struktur eine eigene Variable anlegen.

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Und genau DAS wil ich ja vermeiden. ansonsten müsste ich ja 48*8 = 384 Variablen anlegen. Gibt es da keine andere Möglichkeit, z.B. irgendwie über den Offset der Variable, oder gar über einen Direkten zugriff auf den DB?
 
Wie darf ich das verstehen? Ich muss doch immer einen Datentyp mit angeben, da die benannten 8 Parameter jedoch unterschiedlichen Typs sind funktioniert das nicht. Es würde ja gehen, wen ich in der DB z.B. alle Paramter einzeln als Array mit einer anzahl von 48 elementen speichern würde ( z.B. Param1[0..47], Param2[0..47]) Dann ist für mich der Zugriff ja kein Problem, sieht aber nciht wirklich schön aus und ist nicht sonderlich förderlich für dei funktion. Wenn es eine Möglichkeit gäbe auf ein Array of Struct zuzugreifen wäre mien Problem ja auch gelöst. dann würde ich einfach ein Array mit 48 mal meiner UDT anlegen. Nun kann man darauf aber (angeblcih) nicht mittels script zugreifen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Du müsstet Deine Strukturvariablen einmal vollständig anlegen, allerdings nicht mit einer absoluten Adressangabe, sondern nur den DB absolut, die Adresse im DB gibst Du durch eine andere Variable vor. So hättest Du wenigstens einen Teil der Arbeit gespart.
 
Meine Variable ist dohc bereits so angelegt: name, Dateityp: Struktur_name Adresse: DBXXX DBW 0. Könnte ich dann via offsets darauf zugreifen ? Das wäre doch genauso wie die Adresse per variable angeben ?!
 
Du kannst aber nicht den gesamten Strukturnamen über andere Variable vorgeben, sondern nur die Adresse. Offsets funktionieren auch nicht, Du brauchst für die Adesse im DB eine vollständige Variable, nicht nur einen Offset, diesen müsstest Du für alles 48 Variablen berechnen. Eine (etwas) einfachere Möglichkeit wäre, die Struktur jeweils in einen eigenen DB zu legen. Du müsstest dann zwar immer noch jede Variable separat in WCCf anlegen, Du könntest aber statt der Adresse im DB die DB-Nummer über eine Variable angeben, so dass Du mit der Änderung einer Variablen den DB und somit Deinen Strukturaufruf ändern könntest.
 
Weil du 48 Variablen eschreiben hast: Ich glaube ich habe mich etwas missverständlcih ausgedrückt:
DB XXX UDT_mess
+--------------------+ +-----------+-----+
|Name | Typ | | Name | Typ |
+--------+---------- + +-----------+-----+
|mess0 | UDT_mess | ---> |param1 |REAL |
| mess1 | UDT_mess | |param2 |DaT |
| .... | UDT_mess | |.... | ......|
| mess48|UDT_mess | |param8 | .... -| Meine Struktur ist komplett genause aufgebaut
+-------+-----------+ +-----------+---- + =48.0 byte


in Win cc:
Variable var, Datentyp: Strukturname, Adresse DB XXX DBW 0

Gibt es keine Möglichkeit, einigermapen "direkt" darauf zuzugreifen?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Du kannst relativ direkt darauf zugreifen:
Du legst Deine Variablen an:
Code:
Variablenname                 Adresse

Karlheinz                     DB 0 DBW [Datensatznummer_0]
Hannes                        DB 0 DBW [Datensatznummer_1]
Fritz                         DB 0 DBW [Datensatznummer_2]
Franz                         DB 0 DBW [Datensatznummer_3]
Hans                          DB 0 DBW [Datensatznummer_4]
Dann brauchst Du noch die Variablen, die in den eckigen Klammern stehen. Diese musst Du auf die jeweils auf die passende Adresse im Baustein ändern, wenn Du einen anderen Datensatz wählst.
Auf die Variablen kannst Du dann unter ihrem WCCf Namen zugreifen
 
Ok, um zu sehen ob ichs verstanden hab: Ich gebe den DB mit relativer Adresse an, in Abhängigkeit von der variable in Klammern. Da ich die Datensätze nur lesen und gleich in Textfelder speichern will, brauch ich davon ja nur eine, die ich dann für jegliche Zugriffe "missbrauchen" kann. Diese, nennen wir sie Zuugriffsvariable, kann ich ja mittels script incrementieren, um nacheinander auf die einzelnen enthaltenen Datensätze zugrifen zu können.
Nur würde dann in der Variable nicht nur die Anfangsadresse des UDT drinstehen? Kann ich dort dann auf meine gewünschten Werte zugreifen?

PS: danke für dei info mit den
Code:
Code
tags ;)
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Es gibt ja immer viele Lösungswege.

Ich löse solche Sachen immerso:

In einem Global-DB wird das UDT in einem Array angelegt. Also 48x mal das UDT für die Datenhaltung.

Für die Kommunikation mit dem HMI habe ich einen eigenen Global-DB.

In dem HMI-DB lege ich die Struktur dann 1x ab. Deklararion meinetwegen als "Anzeige"

Die 8 Strukturelemente von "HMI-DB".Anzeige.irgendwas müssen natürlich einmalig als Ausgabefeld angelegt werden.

Der Pointer wird dann im HMI entweder per Direkteingabe oder Pfeiltasten beeinflusst. (INT-Variable -> Grenzen überwachen!)

Gemäß Pointer kopiere ich dann mit BLK_MOVE die entsprechende Struktur aus dem Array des Daten-DB in den HMI-DB rüber.
 
Ok, um zu sehen ob ichs verstanden hab: Ich gebe den DB mit relativer Adresse an, in Abhängigkeit von der variable in Klammern.
Entweder das, dann müsstest Du aber je Datensatz einen eigenen DB anlegen, oder Du lässt alle in einem DB und müsstest dann auf die Variable indirekt zugreifen, so wie in meinem Beispiel, und entsprechend auch für jede Variable der Struktur eine Variable für die Adresse ablegen und entsprechend ändern.
Da ich die Datensätze nur lesen und gleich in Textfelder speichern will, brauch ich davon ja nur eine, die ich dann für jegliche Zugriffe "missbrauchen" kann.
Im Prinzip erfolgt jeder Zugriff auf die Adresse, die durch die Variablen in Klammern vorgegeben wird.
Diese, nennen wir sie Zuugriffsvariable, kann ich ja mittels script incrementieren, um nacheinander auf die einzelnen enthaltenen Datensätze zugrifen zu können.
Ja, klar, geht aber auch z.B. über Schaltflächen.
Nur würde dann in der Variable nicht nur die Anfangsadresse des UDT drinstehen? Kann ich dort dann auf meine gewünschten Werte zugreifen?
Habe ich - denke ich - oben schon beantwortet.
PS: danke für dei info mit den
Code:
Code
tags ;)
Bitte schön!
 
OK, werde mich dann mal dranmachen das auszuprobieren, kann aber nix versprechen.

@Tigerente1974: So wie deine Motivation geht auch mein Verständnis was S7 anbelangt seine eigenen, nicht sonderlich nachvollziehbaren Wege. (Hat sich wohl an Die Siemens Funktionsweise bereits angepasst..) Werde mich erstmal der "Version" von M-Ott widmen, aber trotzdem danke für den Vorschlag :)
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ähmm.. noch schnell ne Frage hinterher.. Welchen Datentyp hat denn nun meine "DB_variable" ? oO

Ok, um zu sehen ob ichs verstanden hab: Ich gebe den DB mit relativer Adresse an, in Abhängigkeit von der variable in Klammern.
Ja, ich hab schon verstanden was du damit meintest, beim zweiten mal durchlesen ist mir dann auch aufgefallen, dass etwas anderes dasteht als gemeint war ;)
 
... müsste ich ja 48*8 = 384 Variablen anlegen. Gibt es da keine andere Möglichkeit, z.B. irgendwie über den Offset der Variable ?

Hallo,
das hört sich für mich ein bißchen nach Multiplex-Variable an.
Da in deinem Bild die Formatierung nicht so funktioniert hat - sieht dein DB etwa so aus ?
Code:
Datenblock_1
 - Wert_1
 - Wert_2
 ...
 - Wert_8
Datenblock_2

usw. - alle Datenblocks sind gleich aufgebaut ?
Gruß
Larry
 
Code:
DB XXX                                      UDT_mess
+--------------------+                    +-----------+-----+
|Name----| Typ-------|                    | Name----- | Typ-|
+--------+-----------+                    +-----------+-----+
|mess0---| UDT_mess  |    --->            |param1     |REAL |
| mess1--| UDT_mess  |                    |param2     |DaT  |
| .......| UDT_mess  |                    |....       | ....|
| mess48 | UDT_mess  |                    |param8     | ....|             Meine Struktur ist komplett genause aufgebaut
+--------+-----------+                    +-----------+---- +    =48.0 byte

So sollte sie aussehen. Wie gesagt, die Variable vom typ "meine struktur" greift auf DB XXX DW 0 zu.
 
Zurück
Oben