WinCC 7.2 - Variablenadresse per VBS Skript ermitteln

Medium

Level-1
Beiträge
66
Reaktionspunkte
1
Zuviel Werbung?
-> Hier kostenlos registrieren
Aloah mal wieder,

für meine dynamische Versorgung einiger meiner Faceplates würde ich gerne die Adresse (DB.Startbyte) einer Variablen ermitteln.

Die Variable wird derzeit noch als String an das Faceplate weitergegeben, weil hier noch eine Unter-Frage zu existiert; Konkret geht um folgendes:

Ich habe ein Anwenderobjekt für meine Ventile. Die Variablenanbindung mache ich, indem ich in dem AO ein EA-Feld habe, dessen OutputValue ich als Property für die Anbindung in der Typ-Konfiguration nach außen reiche.
In dem AO ist ein VBS Script an die OutputValue des EA-Felds anhängig, in der abhängig von diesem Wert meine Polygone umgefärbt werden.

Bei der Benutzung des AOs in meinen Prozessbildern soll auf Mausklick hin ein Faceplate (bzw. genauer: Bildfenster) zur Handbedienung aufpoppen. Das ist so weit bereits auch fertig. Problem ist: Ich brauche in diesem Hand-Bild dann 2 Dinge:
- Die Variable selbst (um in dem Hand-Bild diese in einem periodischen Skript nutzen zu können)
- Die Adresse der Variablen, um unseren Bedien-DB bei Klick auf Öffnen/Schließen mit dieser versorgen zu können. (Dies ist vom S7-Programm so vorgegeben.)

Am Ende muss ich also meinen Ventil-AOs 3 Mal im Prinzip dasselbe mitgeben:
- Variablenanbindung für die Farbumschläge im AO
- Variablenname als String zur Weitergabe an das Hand-Bild bei Klick
- Variablenadresse zur Weitergabe an das Hand-Bild bei Klick

Also im Grunde 3 Mal Infos, die ich an und für sich aus der Variablenanbindung selbst schon ermitteln können müsste. Aber genau dafür habe ich bisher keine Mittel und Wege gefunden.
Ich kann zwar eine Variable anhand ihres Namens finden, aber wie an den Namen einer angebundenen Variablen zu kommen ist finde ich nicht. (Nichtmals einen Weg um überhaupt via Script an eine angebundene Variable zu kommen, nur den Wert der angebundenen Property.)
Und selbst wenn ich meine Variable aus einem String ermittelt habe, finde ich hier keine Möglichkeiten aus diesem Objekt eine Adresse herauszukitzeln.

Vermutlich bin ich nur wieder zu blöd die Doku richtig zu lesen. Ich würde mich über einen Stupps in die grobe Richtung sehr freuen!

Viele Grüße
 
Arbeitset du mit Bildfenstern? ich habe noch ein altes WinCC.ich weiss nicht ob das aktuell ist und bin jetzt auch kein Spezialist.
Aber geht das nicht über Sturkturvariablen und deren Tagprefix?.
So was habe ich zumindest mal gemacht.

Sub OnClick(Byval Item)

Dim objBildfenster

'Bildfenster mit verschiedenen Datensätzen
'Hier Datensatz Analogwert 1

Set objBildfenster= ScreenItems("Bildfenster1") 'Zugriff auf Bildfenster1(Schablone)

objBildfenster.Visible="true" 'Bildfenster sichtbar machen(kann getoggelt werden sichtbar und unsichtbar)

objBildfenster.TagPrefix="Analog1." 'Zuordnung Bildfenster aktueller Variablenname
objBildfenster.CaptionText="Analogwert1" 'hier kann ein beliebiger String zugeordnet werden,wegen mir aus der Variablenname.

Du müsstest quasi eine Strukturvariable vom Typ Ventile anlegen.
Die hat dann verschiedene Untervariabelen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Das Auslesen der Adresse einer Variable ist mit den WinCC-Bordmitteln erstmal nicht vorgesehen.

Am sinnvollsten wäre es, wenn die Tagnamen die Hierarchie wiederspiegeln, dann lässt sich das meiste wie von silverfreaky beschrieben mit dem Tagprefix erledigen. D.h. Objekt.Signalname.Untersignal usw., mit beliebigem Trennzeichen. Es ist dafür nicht zwingend eine Strukturvariable notwendig.

Wenn du in dem Bedienfenster zusätzliche Informationen benötigst, könntest du beispielsweise ein weiteres (unsichtbares) EA-Feld in deinem Anwenderobjekt anlegen, und dort den Variablennamen ablegen. Entweder als String, oder was auch möglich ist, mit der Funktion GetLink() die verschaltete Variable herauszufinden.
Viele Wege führen nach Rom...
 
Das mit den Tag-Namen wird so erstmal leider nichts. Ich habe >300 Ventile und gut 60 Antriebe vor der Brust, da alle Tagnamen anpassen wäre glatt aufwändiger als meine jetzige Vorgehensweise (die gleich deinem 2. Vorschlag ist). Insbesondere wegen der Wartbarkeit, auch durch andere Unternehmen und in ein paar Jahren, will ich eigentlich keine automatisch generierte logikrelevante Semantik in die Tagnamen einwurschteln. Würde ich so ein Programm von jemandem anderes vorgesetzt bekommen und müsste Änderungen daran machen, wäre ich auch recht gebügelt. Das entspricht nicht meinem Verständnis von sauberer Arbeitsweise. (Ohne dich damit angreifen zu wollen!)

Zumal die Variablennamen selbst mir ja nichts bringen. Die Bedienschnittstelle ist im S7-Programm von jemandem anderes vorgegeben, und der Teil ist bereits fertig. Wenn ich jetzt da mit größeren Änderungswünschen antanze - die Gesichter will ich mir nichtmals vorstellen müssen :D

Aaaaaaaber GetLink() riecht mir nach einem Weg zumindest das doppelte hinschreiben meiner Variablennamen als String (zusätzlich zur Anbindung) loswerden zu können! Das schaue ich mir mal genauer an. Danke!

Schade aber um die Adressen. Das wird der weit üblere Teil. Dann muss ich für jedes der hunderten aktive Elemente in meinen Bildern von Hand die Adresse vom Ausdruck meiner DBs eintragen. Dass man die nicht aus einem Link lesen kann ist schon wieder so richtig "Siemensisch". Wären mit Sicherheit 15 Zeilen Code in den WinCC Quellen, und unendlich Hilfreich :?
Auch mit einem C-Script nix zu machen?

Schönes Wochenende allerseits!
 
Das soll doch hoffentlich nicht heißen, dass du die komplette Datenbasis für 400 Antriebe angelegt hast, ohne dir vorher ein Konzept zu überlegen wie das mit der Bedienung usw. zusammenpasst.

Das Prinzip mit den Tagprefixen spiegelt genau das Antriebs/Objekt-Konzept wieder. D.h. es gibt einen Antriebs-FB und die zugehörigen Instanz-DBs mit den Variablen, oder wenn man mit Global-DBs arbeitet, gibt es dort zu jedem Antrieb ein UDT/Struktur. Egal welches Prinzip man verfolgt, es gibt immer eine Struktur oder Objekt mit Objektname.Signalname. Daran ist absolut nichts unsauber. Ich habe schon viele WinCC-Projekte von anderen Firmen gesehen, und außer bei welchen man gleich an den Bildern ansieht dass es Murx ist, wird das sehr oft so gemacht.

Ich habe auch noch nicht verstanden, wie dir der Zugriff auf die Absolutadressen weiterhelfen würde. Wenn dein Prinzip was du verfolgst in den Absolutadressen besteht, hättest du deine Variablen auch einfach wie die Adressen bezeichnen können. D.h. Variable an Adresse DB10.DBW50 hat das Symbol "DB10.DBW50".
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich mag mir garnicht vorstellen, wie der Code der "Bedienschnittstelle" im SPS-Programm aussieht, wenn die Visu dafür nicht mit Variablen sondern mit absoluten Adressen hantieren muß... und wie das ganze mit den hehren Vorstellungen des TE bzgl. sauberer Arbeitsweise und Fremd-Wartbarkeit harmoniert... irgendwas läuft da imho ziemlich schief

Harald
 
Das soll doch hoffentlich nicht heißen, dass du die komplette Datenbasis für 400 Antriebe angelegt hast, ohne dir vorher ein Konzept zu überlegen wie das mit der Bedienung usw. zusammenpasst.
Die von uns verwendete Methode setzt mein Arbeitgeber seit >20 Jahren (also auch schon unter S5) völlig problemlos ein. Die Visualisierungen sind dabei bisher fast immer eine Eigenentwicklung aus unserem Hause, und da spielt alles ganz wunderbar zusammen.

Es gibt einen Bedien-DB für verschiedene Funktionen. Jede Funktion (Hand-Bedienungen, Dosierungen, Heizen etc.) ist über einen UDT abgebildet, der einen Befehl und einen Satz numerischer Parameter entgegen nimmt.

Alle Antriebe und Ventile werden ebenfalls durch einen UDT beschrieben, indem in einem Word sämtliche Stati zu einem Antrieb abgebildet werden. Es gibt einen DB, in dem für jedes Ventil und jeden Antrieb solch ein UDT liegt, und die dortigen Einträge sind mit den symbolischen Namen versehen, die der Kunde in seinen Plänen auch benutzt. (Die Vorteile davon sollten hoffe ich klar sein.)

Die Hand-Bedienung wird von der Visualisierung in den entsprechenden Teil des Bedien-DBs geschrieben, wobei als ein Parameter die Byte-Adresse des zu schaltenden Antriebs in dem Antriebs-DB übergeben wird, damit die SPS weiss was zu tun ist. Dies eröffnet mit unserer hauseigenen Visu die wundervolle Möglichkeit 99% des zugehörigen Codes wiederzuverwenden, und lediglich für unterschiedliche Projekte aus aus DBs generierten Quellen entsprechende Verknüpfungstabellen automatisch zu generieren. Zudem legt es die ultimative Verantwortlichkeit über Bedienungen in die Hand der SPS, so dass z.B. was Verriegelungsbedingungen usw. angeht die Visu komplett "blöd" bleiben kann, und man solche Sachen nicht 2x programmieren muss.

Soll heissen: Ich habe nirgends geschrieben, dass ich von der Visu aus über absolute Adressen zugreifen will. Das habt ihr reininterpretiert. Ich will einfach nur die Adresse haben, um sie in den Bedien-DB zu schreiben. Wir hätten auch einen Index oder was auch immer nehmen können, die Adresse war halt für alle beteiligten Systeme das was am wenigsten Aufwand bedeutete, und sich als robust erwiesen hat.

Können wir jetzt bitte zu der eigentlichen Frage zurück kehren, die da wäre: Bekomme ich irgendwie die Adresse aus einem Tag - ja oder nein?
 
Zurück
Oben