# WinCC Flexible 2005 Indirekte Adressierung



## pylades (8 Juni 2007)

Hallo

ich habe in WinCCFlex folgende Variable deklariert:

Name:                Wagen Nummer Index
Adressierung:       DB [Index_DB] DBW [Index_DW_Nummer]
DatenTyp:           INT
Erfassungsart:      Zyklisch fortlaufend
Erfassungszyklus: 100 ms

Bei Klick auf einen Button wird eine Funktion aufgerufen und dieser 2 Parameter übergeben: Function Get_Data( Datenbaustein , Start )

Auszug aus der Funktion:
....
offset=(Start-1)*22
SetValue SmartTags("Index_DB"), Datenbaustein
SetValue SmartTags("Index_DW_Nummer"), offset
....

Anschließend wird per SQL über die oben genannte Variable ein Datensatz aus einer Access-DB gelesen.

Nun mein Problem:
Nach Runtime Start und klick auf einen Button (es sind 150) wird der richtige Datensatz gelesen. Beim 1. klick auf einen anderen Button wird wieder der letzte Datensatz gelesen und erst beim 2. klick kommt der richtige.
Mit "HmiRuntime.Trace Wagen Nummer Index" in der Funktion, ist mir nun aufgefallen das die Variable nach dem 1. klick auf den anderen Button noch nicht aktualisiert wurde. Baue ich nun vor der SQL Abfrage eine Schleife:

For temp = 1 To 10000000
Next

in die Funktion ein, dann klappt alles

Hat jemand von euch eine Idee wie ich sicherstellen kann das die Variable nach Änderung von "Index_DB" und "Index_DW_Nummer" den zugehörigen Wert aus der SPS gelesen hat?

Ich hoffe mich einigermaßen verständlich ausgedrückt zu haben 

pylades


----------



## Larry Laffer (8 Juni 2007)

Hallo,
werden die gennanten Variablen während der Änderung angezeigt ?
Welche Zeit hast du für den Erfassungszyklus in Wcc-f hinterlegt ?
Welche Erfassungsart hast du für die Variable ? "Zyklisch fortlaufend" oder "Zyklisch bei Verwendung" ?


----------



## pylades (8 Juni 2007)

Hallo Larry Laffer



> werden die gennanten Variablen während der Änderung angezeigt ?


Die Variablen Index_DB und Index_DW_Nummer werden ausschliesslich im Script verwendet und nirgendwo angezeigt (interne Variablen)

Die Variable:
 Name:                Wagen Nummer Index
Adressierung:       DB [Index_DB] DBW [Index_DW_Nummer]
DatenTyp:           INT
Erfassungsart:      Zyklisch fortlaufend
Erfassungszyklus: 100 ms

wird nach Ausführung der SQL Abfrage in einem EA-Feld angezeigt.

Die anderen beiden Fragen sollten hiermit beantwortet sein.

pylades


----------



## Larry Laffer (8 Juni 2007)

Du must berücksichtigen, dass deine Variablen nicht im 100ms Zyklus zur SPS geschrieben werden, sondern Kommunikationszeit + 100ms = warscheinlich ca. 1,1 s. Die sicherste Variante, die mit im Moment so einfällt ist, dass du dieselbe SPS-Variable nochmal unter einem anderen Namen anlegst. Sicher übertragen ist deine Variable wenn :
Index_DW_Nummer = Index_DW_Nummer_2
bzw.
Index_DB = Index_DB_2

Eine bessere Idee habe ich nicht ... , aber die funktioniert auf jeden Fall ...:???:


----------



## pylades (9 Juni 2007)

Kannste mir das mal etwas genauer erklären? 

Welche variable nochmal anlegen? Ich hab ja nur eine Variable die mit der s7 kommuniziert.

Irgendwie steh ich da auf dem Schlauch 

pylades


----------



## Larry Laffer (9 Juni 2007)

Klar, kein Problem ...
Nehmen wir Index_DW_Nummer. Die verweisst z.B. auf DB10.dbw10.
Jetzt legst du eine 2. Variable an (Index_DW_Nummer_2) die auf die gleiche Speicherstelle verweisst. Diese Variable liesst du auch "Zyklisch fortlaufend" ein, aber du beschreibst sie nicht. Geschrieben wir nur in die erste Variable. Wenn nun die 2. Variable in deiner Applikation der gleichen Wert hat, wie die erste, dann ist der Wert auf jeden Fall in der SPS angekommen, da die 2. Variable den Wert ja nur von dort erhält ...


----------



## Kai (9 Juni 2007)

pylades schrieb:


> Anschließend wird per SQL über die oben genannte Variable ein Datensatz aus einer Access-DB gelesen.
> 
> Hat jemand von euch eine Idee wie ich sicherstellen kann das die Variable nach Änderung von "Index_DB" und "Index_DW_Nummer" den zugehörigen Wert aus der SPS gelesen hat?


 
Das habe ich noch nicht so richtig verstanden:  

Einmal wird über die Variable Wagen_Nummer_Index ein Wert per SQL aus einem Access-DB gelesen und einmal ein Wert aus der SPS? Wird also zweimal ein Wert gelesen, einmal aus dem Access-DB und einmal aus der SPS?

Gruß Kai


----------



## Larry Laffer (9 Juni 2007)

Hallo Kai,
so wie ich es verstanden habe kommt hier das Problem zum tragen, dass eine Variable der Visu, wenn in der Visu geändert, noch lange nicht zur SPS übertragen wurde. Pylades möchte aber genau das sicherstellen ...


----------



## pylades (9 Juni 2007)

Also irgendwie reden wir aneinander vorbei 

Ich habe nur eine Variable die aus der SPS gelesen wird:

Name:                Wagen Nummer Index
Adressierung:       DB [Index_DB] DBW [Index_DW_Nummer]
DatenTyp:           INT
Erfassungsart:      Zyklisch fortlaufend
Erfassungszyklus: 100 ms

Wenn ich nun auf einen der 150 Buttons klicke wird meine Funktion aufgerufen:








bei diesem Button also Datenbaustein 100 und Start 10

...
offset=(Start-1)*22
SetValue SmartTags("Index_DB"), Datenbaustein
SetValue SmartTags("Index_DW_Nummer"), offset
...


Daraus ergibt sich dann:
Index_DB= 100
Index_DW_Nummer= (Start-1)*22 = (10-1)*22 = 198

Das heißt dann für die Variable "Wagen Nummer Index":
Adressierung:       DB [Index_DB] DBW [Index_DW_Nummer]

DB100.DBW198

Ich hoffe das es nun etwas verständlicher ist 

pylades


----------



## Larry Laffer (9 Juni 2007)

... und was sind Index_DB und Index_DW_Nummer ?
So wie ich das verstehe sind das Variablen, die du an die SPS schickst. Die SPS schickt dir daraufhin den Speicherinhalt, der sich aus dieser Adressierung ergibt ...?


----------



## Kai (9 Juni 2007)

Bis hierhin habe ich alles verstanden. Du liest in Deinem Beispiel also den Wert aus dem DB100.DBW198.  

Doch was passiert dann, was machst Du dann mit dem Wert? Wird der Wert einfach nur in WinCC angezeigt, oder passiert noch etwas anderes?  

Und was hat das nun mit dem Auslesen per SQL und dem Access-DB zu tun? 

Gruß Kai


----------



## Larry Laffer (9 Juni 2007)

Upps,
gleichzeitig mit Kai ...


----------



## Kai (9 Juni 2007)

Larry Laffer schrieb:


> ... und was sind Index_DB und Index_DW_Nummer ?


 
Ich verstehe das so, dass es sich bei der Variablen Wagen_Nummer_Index um eine Multiplex-Variable handelt, die aus den internen Variablen Index_DB und Index_DW_Nummer gebildet wird.

Gruß Kai


----------



## pylades (9 Juni 2007)

Larry Laffer schrieb:


> ... und was sind Index_DB und Index_DW_Nummer ?
> So wie ich das verstehe sind das Variablen, die du an die SPS schickst. Die SPS schickt dir daraufhin den Speicherinhalt, der sich aus dieser Adressierung ergibt ...?



Genau das eben nicht!

über die 2 internen variablen wird der externen Variablen
Name:                Wagen Nummer Index
Adressierung:       DB [Index_DB] DBW [Index_DW_Nummer]

mitgeteilt welches DW aus welchem DB gelesen werden soll

pylades


----------



## Larry Laffer (9 Juni 2007)

... gut mittlerweile verstanden.
Das lösst das Problem allerdings nicht. Ich kenne die Funktion "Get_Data" nicht. Entscheidend ist aber, dass die SPS eine Zeit "x" benötigt, um zu verstehen, was du haben willst und eine weitere Zeit "x" um dir das gewünschte zu übergeben. Die Daten sind nicht unmittelbar nach deiner Anforderung präsent. 
Deswegen mein Vorschlag - für deine Funktion habe ich keine Idee. Oder handelt es sich dabei um eine selbstgeschriebene Funktion ...?


----------



## pylades (9 Juni 2007)

Genau Kai

DB100.DBW198 wäre dann die Startadresse einer 22Byte grossen Struct die dann aus der SPS gelesen werden soll
Die Struct besteht aus mehren Werten, u.a. Wagen_Nummer_Index

Über die Variable Wagen_Nummer_Index werden dann per SQL noch einige Infos aus der Access DB gehölt.

Alle diese Werte werden dann auf einem WinCC Bild dargestellt.

Die Funktion ist selbstgestrickt Larry

pylades


----------



## Larry Laffer (9 Juni 2007)

pylades schrieb:


> Die Funktion ist selbstgestrickt Larry


 
Dann zeige doch mal, wie sie aussieht. Vielleicht läßt sich da doch noch was machen (wenn du Lust hast ...)


----------



## Kai (9 Juni 2007)

Kai schrieb:


> Ich verstehe das so, dass es sich bei der Variablen Wagen_Nummer_Index um eine Multiplex-Variable handelt, die aus den internen Variablen Index_DB und Index_DW_Nummer gebildet wird.


 
Hier noch einmal ein Bild, wie ich die Adressierung der Variablen verstanden habe. Ist das so richtig?  

Gruß Kai


----------



## Larry Laffer (9 Juni 2007)

Ich denke, du hast es Kai ...
Aber das lösst m.E. nicht das Problem ... oder hast du eine Idee ?


----------



## Kai (9 Juni 2007)

pylades schrieb:


> DB100.DBW198 wäre dann die Startadresse einer 22Byte grossen Struct die dann aus der SPS gelesen werden soll
> Die Struct besteht aus mehren Werten, u.a. Wagen_Nummer_Index
> 
> Über die Variable Wagen_Nummer_Index werden dann per SQL noch einige Infos aus der Access DB gehölt.
> ...


 
Wie wäre es, wenn Du die Variable Wagen_Nummer_Index auf eine Wertänderung überwachst und bei einer Wertänderung ein Script (hier Werte_lesen) aufrufst, dass dann die ganzen Daten aus der SPS und dem Access-DB liest?

Gruß Kai


----------



## pylades (9 Juni 2007)

Hier mal die 2 benutzten Funktionen:



> Function Get_Data( Datenbaustein , Start )
> 
> Dim offset,temp, bahn
> 
> ...



Das werde ich mal testen Kai

pylades


----------



## Larry Laffer (9 Juni 2007)

@Kai :
Damit weißt du dann aber immer noch nicht, wann die Daten aus der SPS in der Visu sind ...


----------



## Larry Laffer (9 Juni 2007)

Also, ich würde meinen ursprünglichen Vorschlag noch einmal anbieten wollen - falls keine neuen Erkenntnisse vorliegen.

Schreib doch deinen errechneten Index irgendwo in die SPS und lies ihn über eine andere Variable wieder aus. Wenn du den Wert zurück hast, dann sind für deine anderen Daten die Chancen auch nicht so schlecht.

An deinem Script würde mir im Augenblick keine Option einfallen. Es nutzt ja lediglich den Weg, auf den Kai allerdings erst gekommen ist. Auf die Idee mit der ind. Adressierung bin ich nicht gekommen ...


----------



## Kai (9 Juni 2007)

Hier noch einmal zur Verdeutlichung, was ich machen würde:

1. Beim Anklicken der Schaltfläche Wagen_1 wird ein Script Wagen_1 aufgerufen.

2. In dem Script Wagen_1 werden den Variablen Index_DB und Index_DW_Nummer entsprechende Werte zugewiesen.

3. Die Variable Wagen_Nummer_Index holt sich aus der SPS den entsprechenden Wert. 

4. Die Variable Wagen_Nummer_Index wird auf eine Wertänderung überwacht. Wenn sich die Variablen Index_DB und Index_DW_Nummer ändern, bekommt die Variable Wagen_Nummer_Index einen neuen Wert. 

5. Bei einer Wertänderung der Variablen Wagen_Nummer_Index wird das Script Wagen_Werte_lesen aufgerufen.

6. In dem Script Wagen_Werte_lesen holt sich WinCC flexible alle Werte aus der SPS (Struktur) und über SQL aus dem Access-DB.

Gruß Kai


----------



## pylades (9 Juni 2007)

Ich werde eure Vorschläge morgen mal testen.

Und Danke euch beiden 

pylades


----------



## xhasx (9 Juni 2007)

Hallo.

Wie ist dein DB aufgebaut? Wenn es eine Struktur ist mit lauter gleichen Variablen kannst du dir den kompletten DB in einem Rutsch holen (ist dann auch nur ein SmartTag). Dann kannst du in der Hmi damit weiterarbeiten...


----------



## Larry Laffer (9 Juni 2007)

xhasx schrieb:


> Hallo.
> 
> Wie ist dein DB aufgebaut? Wenn es eine Struktur ist mit lauter gleichen Variablen kannst du dir den kompletten DB in einem Rutsch holen (ist dann auch nur ein SmartTag). Dann kannst du in der Hmi damit weiterarbeiten...


 
Ich glaube, das ist nicht Sinn der Übung ...
Außerdem lösst das auch nicht das Problem ...:twisted:


----------



## xhasx (11 Juni 2007)

Wieso nicht? Das Array holst du dir auf Anforderung. Das Entlastet schon mal deinen Hauptprozess. Und dann weisst du dass deine Daten konsistent sind. Ich hab damit gute Erfahrungen gemacht.


----------



## pylades (11 Juni 2007)

So,

gestern kein Bock gehabt zum testen (zu warm) 

Heute mal den Vorschlag von Kai getestet und es sieht bis dato gut aus *freu*

Schönen Dank euch beiden nochmal 

pylades


----------



## Kai (11 Juni 2007)

pylades schrieb:


> Heute mal den Vorschlag von Kai getestet und es sieht bis dato gut aus *freu*
> 
> Schönen Dank euch beiden nochmal


 
Danke für die Rückmeldung.  

Gruß Kai


----------

