indirekte Adressierung

Linowitch

Level-1
Beiträge
17
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
ich habe folgenden Aufbau, einen Baustein in SCL der DB's dynamisch generiert, da er das dynamisch macht weiß ich vorher also nicht welcher DB das sein wird und wie groß der wird, bekomme nach dem erzeugen aber die Nummer und die größe des DB's.
Ist es möglich in WinCC flex über vbScript dynamisch auf diesen DB zuzugreifen und ihn auszulesen?
so in dieser Art:
Code:
 WORD_TO_BLOCK_DB(dbNr).DW[Adresse]

hab bis jetzt nur Multiplexen gefunden, was inderekte Adressierung betrifft, aber das hilft mir hier nicht weiter.

Danke
 
Hallo,
das geht meines Wissens nicht.
Du könntest aber nach dem Erzeugen in das Wort 0 des jeweiligen DB's seine tatsächliche Länge schreiben - dann hätte der DB diese Info auch für die Visu ...

Gruß
LL
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Larry,
die länge ist nicht das Problem.
Ich hab mal ein Bild hochgeladen, das deutlich machen soll was ich vor hab.
Der Inhalt soll aus dem dynamisch erstellten DB kommen, somit müsste ich auf Grund der DB Nummer die ich ja erst zum Zeitpunkt der erstellung weiß auf die Daten im DB zugreifen.
 

Anhänge

  • TouchPanel.JPG
    TouchPanel.JPG
    27,1 KB · Aufrufe: 60
Hallo,
so richtig hilft mir dein Bild nicht weiter ...
Spontan fällt mir aber trotzdem dazu etwas ein : "Direktory"
Mein Vorschlag also :
Du baust dir einen DB, der als eine Art Inhaltsverzeichnis fungiert. Dort kannst du dann zu deinem Index die DB-Nummer und ggf. weitere Rand-Daten ablegen und dann mit der Visu auf diesen Punkt zugreifen und dann weiter agieren ...

Gruß
LL
 
Danke für deine Hilfestellung,
wenn ich dich jetzt richtig Verstanden habe, habe ich das vom Prinzip her schon so.
Ich beschreib mal genauer.
Ich habe einen FB1 mit InstanzDB DB1, von den Bausteinen hab ich die Nummer. Nun erstellt aber der FB1 einen weiteren DB dessen Nummer, Länge, usw. im DB1 ablegt wird, somit hab ich nicht das Problem, dass die Visu die Daten des dynamisch erstellten DB's nicht bekommt.
Da aber der dynamisch erstellte DB immer eine andere Nummer bekommen kann (und auch soll), und diese auch noch zur laufzeit ändert, kann ich in der Visu nicht statisch auf z.B. DB2.DW0 zugreifen.
Hier brauch ich jetzt einen befehl wie "WORD_TO_BLOCK_DB(dbNr).DW0"
um immer auf den DB zugreifen zu können der im DB1 gespeichert wurde.
Jetzt kann ich eine Variable in flex erstellen, die die dbNr erhält,
Code:
dbNr    INT    DB 1 DW0
aber nicht um auf die Daten zu zu greifen
Code:
data    INT    DB [dbNr] DW[index]
deshalb hoffe ich das man irgendwie im vbScript in flex so auf DB's zugreifen kann wie in SCL.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Du könntest für die Verbindung mit der Visu doch auch einen festen DB nutzen. Deine Daten werden in den dynamischen DB geschrieben und für die Visu in den festen DB. Will man einen anderen DB in der Visu anzeigen, kopiert man die Daten mit Block_Move um. ODer man spart ich das zweimalige schreiben und kopiert die Daten um, wenn man sie in der Visu sehen will.
 
... mit der Indexierung ist es m.E. noch einfacher ...
Entsprechend deines Bildes könntest du ja auch das erste Auswahlfeld auf Index 1 zugreifen lassen, das 2. auf Zwei usw.

Innerhalb von Flex gibt es die Möglichkeit zu Multiplexen (das ist im Grunde das was du willst). Du legst dir dort die Variablen so an, dass du nicht mehr auf (z.B.) DB11 und im DB11 auf DBD 16 zugreifst, sondern du trägst an der Stelle deine Pointer-Variablen aus dem Direktory-DB ein.
Probier das doch bitte mal - ich vermute, dass es das ist, was du haben willst ... Ansosnsten kannst du auch via Script die Pointer-Variablen berechnen und sie dann genauso an den "echten" Variablen antragen ...

Gruß
LL
 
@Ralle, ja das wäre eine Möglichkeit, wenn ich es anders nicht hin bekomme werde ich mit sicherheit diese Variante benutzen. Was mich hier nur stört ist der zusäzliche DB nur wegen der Visu, obwohl die Daten ja schon schön sortiert in einem DB liegen.

@Larry, das mit dem Multiplexen hab ich schon Probiert, aber so wie ich das verstanden habe, kann ich dann zwar dynamisch auf DBXX zugreifen, aber ich müsste immer noch wissen wieviel Daten in dem DB liegen, oder hab ich das falsch verstanden?
Könntest du mir das mit den Pointer in vbScript noch genauer erklären, oder hast du einen Link?

Danke
 
Zuviel Werbung?
-> Hier kostenlos registrieren
@Larry, das mit dem Multiplexen hab ich schon Probiert, aber so wie ich das verstanden habe, kann ich dann zwar dynamisch auf DBXX zugreifen, aber ich müsste immer noch wissen wieviel Daten in dem DB liegen, oder hab ich das falsch verstanden?
Könntest du mir das mit den Pointer in vbScript noch genauer erklären, oder hast du einen Link?

Hallo,
einen Link oder ein konkretes Beispiel kann ich dir im Augenblick nicht liefern, da ich noch nicht wirklich verstanden habe, was du da vorhast. Vielleicht hilfst du mir da mal weiter ...

Ansonsten ... bitte denk noch einmal genau über den "Direktory"-DB nach ... Du könntest in ihm (hatte ich auch schon mal angedeutet) z.B. auch die Datenlänge und die Anzahl der Einträge ablegen.

Gruß
LL
 
So,
auf Bild1 siehst du wie der erzeugte DB aussieht.
auf Bild2 dann die Visu wenn der erzeugte DB die Nummer 2 hat und 3 Einträge enthält.
auf Bild3 wäre es dann der DB5 mit 20 Einträgen wobei ich aber nur auf die ersten 10 zugreifen möchte, erst mit dem klick auf Weiter will ich dann auf die weiteren 10 Einträge zugreifen.

Und der wechsel von DB2 auf DB5, oder die Änderung der Einträge kann wärend der laufzeit passieren.
 

Anhänge

  • Bild1.JPG
    Bild1.JPG
    67,7 KB · Aufrufe: 24
  • Bild2.JPG
    Bild2.JPG
    21,2 KB · Aufrufe: 20
  • Bild3.JPG
    Bild3.JPG
    38,1 KB · Aufrufe: 20
  • Bild4.JPG
    Bild4.JPG
    38,9 KB · Aufrufe: 17
Hallo,
das was ich da bis jetzt gesehen habe (auch wenn ich den Sinn davon immer noch nicht kenne) wäre vollständig etwas, dass sich mit Multiplex-Variablen machen lässt.
Brauchen würdest du hierbei natürlich für jedes Element des DB's einen eigenen MUX-Pointer (das kann eine interne INT-Variable deiner Visu sein) und für die ganze Struktur einen DB-Pointer (das wäre dann auch ein interner INT).
Die von dir dargestellten BOOL's würde ich mir nicht einzelnen laden, sondern in einem Byte oder ggf. Word (je nach Anzahl) zusammenfassen.

Vom Ablauf passiert nun folgendes :
Du würdest in deinem Direktory-DB nachsehen, welche Quell-Struktur sich an dem gewünschten Platz befindet. Der würde dir nun zurückgeben, dass deine Datenquelle "5" (für DB5) ist. Dieser Wert sollte dann im DB-Pointer landen. Dann würde er dir mitteilen, dass es 20 Elemente gibt (eventuell auch noch mit Angabe der String-Länge). Nun würdest du für die Anzahl der vorhandenen Elemente die Pointer berechnen :
String_1_Pointer = 0
Byte_1_Pointer = 52
String_1_Pointer = 54
Byte_1_Pointer = 106
usw.
Das ginge dann auch mit einer Schleife ...

Für die Darstellung auf der Bildschirmseite musst du natürlich den Aufbau mit den entsprechenden MUX-Variablen entsprechend der max. darstellbaren Anzahl machen (also gemäß deines 2. Beispiels z.B. 10 Spalten). Nicht benötigte Spalten können über die Anzahl-Variable ausgeblendet werden.
In der Spalte 1 steht dann als String natürlich dann deine MUX-Variable (vom Typ STRING), die sich aus dem DB-Pointer und den String_1_Pointer generiert. Genauso verfährst du mit den BOOL-Einträgen, die sich dann aus dem DB-Pointer und dem Byte_1_Pointer und der in dem Fall fest vergebenen Bit-Nummer (0..2), ergeben.
Das Gleiche für Spalte 2 usw.

Die benötigten Pointer berechnest du beim Aufrufen der Bildschirmseite über ein Script, dass vorher die Basis-Info (eventuell per absoluter Vorgabe) erhalten hat. Die Basis-Info ist in dem Fall die Eintrags-Nummer des Dir-DB's und eventuell bei mehr als 10 Einträgen die Offset-Verschiebung (0 für die Einträge 1..10 , 10 für die Einträge 11..20 , usw.).

Hilft dir das weiter ?
Wenn nicht, dann frag bitte, wo es unklar ist / war ...

Gruß
LL
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Danke nochmal für deine Hilfestellung.
So in der Art hatte ich das auch vor, nur das mit den MUX-Variablen verstehe ich nicht.
Wäre es viel verlangt wenn du mir ein kleines Beispiel machst, nur wie du dynamisch daten aus dem DB holst?
Sorry für diese dreiste Frage, aber ich glaub anders schnall ich das nicht.
 
... ein direktes Beispiel für dein Vorhaben habe ich nicht und im Augenblick habe ich auch keine Programmiermöglichkeit ... ist m.E. aber auch nicht wirklich notwendig ...

Wenn du in Flex eine Variable anlegst (wir nenn sie mal Test_1), dann gibt es in der variablen-Tabelle eine Spalte, in der die Adresse der variablen in der SPS angegeben ist/wird. Wenn du diese Zelle anklickst dann öffnet sich ein Popup in dem die einzelnen Adresse-Bestandteile noch einmal dargestellt sind. Bei jedem Eintrag ist ein zusätzliches Feld (ein meine da steht "123" drauf). Wenn du dieses anklickst, dann kannst du bei jedem Feld anstelle des absoluten Wertes auch den Namen (Verweis) einer anderen Variable eintragen. Das wäre dann deine Pointer-Variable, die dort hinein käme und das ganze macht dann aus "Test_1" eine MUX-Variable.

Ich hoffe das war jetzt ("blind" beschrieben) trotzdem hilfreich.
Vielleicht kann ja auch noch jemand, der gerade "Flex" am Start hat, hier noch einen Screenshot einfügen, der das verdeutlicht ...

Gruß (und viel Erfolg)
LL
 
Beispiel ist nicht mehr nötig.
Das war jetzt der Schlag auf den Hinterkopf.
Ich dachte immer man kann hier nur statische Adressen vergeben.

Danke für die Hilfe und vor allem für deine Geduld.
 
Zurück
Oben