WinCCflexible 2007 skaliert ungenau

Earny

Level-1
Beiträge
422
Reaktionspunkte
38
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
ich will den Wert 0 bis 100 eines Schiebereglers ins MD108 im Real-Format schreiben.
Da ein Schieberegler direkt keinen Realwert ausgeben kann (nehme ich mal an), habe ich ein interne Variable StellTemp mit Integer angelegt. Der Schieberegler schreibt jetzt in StellTemp und ich habe in Ereignisse - Ändern der variable eine lineare Skalierung eingestellt:
X = StellTemp
a = 1
Y = MD108

Die Skalierung funktioniert nicht genau genug. Stelle ich am Schieberegler z.B. 60 ein, so erscheint im MD108 der Wert 5.9e1 also 59.

Außerdem funktioniert die Rückwärtsdarstellung nicht richtig. Wenn die Runtime gestartet wird, geht der Schiebereglerknopf nicht auf den Steuerungswert, der z.B. noch auf 59 steht.

Gruß
Earny
 
Ich könnte mir vorstellen, dass du hier mir den Rundungs-Ungenauigkeit REAL <-> INT zu kämpfen hast.

Aus INT 2 wird ggf. 1.997 REAL und daraus dann bei entsprechender Wandlung INT 1.

Mein Vorschlag hier wäre, beim Schieberegler mit INT (oder DINT)-Variablen zu arbeiten und diese dann falls nötig in der Steuerung umzuwandeln.

Ich denke, dass ist auch bei deiner anderen Sache das gleiche Grund-Problem gewesen ...

Gruß
LL
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Larry L.,
ja, das Problem geht wohl auf die gleiche Ursache zurück.
Ich weiß jetzt aber wie die Umrechnung genau wird.
Ich habe einen kleinen Skript angelegt und der besteht nur aus einer Zeile:

MD_108 = CSng(StellTemp)

und das funktioniert exakt, weil VB natürlich eine Integerzahl exakt in eine Singlezahl (Real) umwandeln muss.
Den Skript rufe ich bei Wertänderung am Schaltknopf des Schiebereglers auf. Da ich üblicherweise nur mit der Runtime für PC arbeite, geht das problemlos. Mein TP177B mag wohl keine Skripte.

Jetzt fehlt mir noch die Rückdarstellung des Wertes aus dem MD_108 (MD108) wenn die Visualisierung startet.
Gibt es in Flex eine Funktion, die beim Start der Visualisierung 1-malig ausgeführt wird?
Ich kenn das von VB6.0. Da macht das die Prozedur Form_Load ( ).

Gruß
Earny
 
Ich schlag auch noch einmal in die gleiche Kerbe wie Larry, warum willst du das unbedingt in der Visu machen? Wenn du die Umrechnung in der SPS machst, hast du auch kein Problem mit der Rückdarstellung, weil nur die DINT-Verknüpfung zwischen Schieberegler und SPS besteht. Die Umrechnung hin und her macht sich in diesem Falle doch wirklich viel einfacher in der SPS.

Zu deiner Frage:

Denke, du mußt ein zweites Script machen, daß auf Wertänderung des von der Steuerung übergebenen Wertes reagiert und diesen in die DINT für den Schieberegler wandelt. Aber Vorsicht, der Wert ändert sich ja auch, wenn du vom Schieberegler die DINT in die Real wandelst, nicht daß dabei ein Deathlock entsteht? Aber versuchen kann man es ja einmal.
 
Zuletzt bearbeitet:
und noch als Ergänzung zu Ralle's Beitrag :

Das TP177B kann, soweit mir bekannt ist, keine Scripte. Wenn du umrechnen mußt, dann gibt es da die internen Funktionen "Linear Umrechnen", die du bei der Ursprungs-Variable "bei Wert-Änderung" aufrufen kannst.
Ich bleibe aber bei meinem Statement vom Beitrag davor ...

Gruß
LL
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Ralle,
ich habe schon öfter festgestellt, dass VB-Skripts bei den Flex-Projektierern nicht hoch im Kurs steht. Ich glaube das kommt daher, weil viele OPs und TPs von Siemens keine Skripte unterstützen.
Ich hatte bisher schon etwas mit VB6.0 und VB2005 programmiert, sogar einfache Prozessvisualisierungen. Daher sehe ich im Einsatz von VB-Skript auch einige Vorteile, zumal ich zur Zeit fast ausschließlich mit der Runtime für PC arbeite und die unterstützt Skripte.

Ich könnte natürlich auch den reinen Integerwert 0 bis 100 des Schiebereglers in den Speicher MW106 der S7-CPU schreiben und dann nach Real wandeln mit

L MW106
ITD
DTR
T MD108

Das Problem mit der Rückdarstellung bleibt doch wohl bestehen. Wenn die Runtime startet, steht der Schieberegler bei mir immer auf 0, obwohl in der Steuerung irgendein Wert von 0 bis 100.0 (Real) im MD108 liegen kann.
Ich müsste dann beim Start der Flex-Runtime das MD108 lesen und auf den Schieberegler geben. Damit das nicht mit dem von Dir erwähnten Deadlock passiert, darf dieser Skript nur ein einziges Mal, beim Start der Runtime ausgeführt werden. So wird dieses Problem bei VB6.0 gelöst, wie bereits erwähnt, in der Form_Load ( ) Prozedur.
Der zweite VB-Skript, der den Realwert aus der Steuerung liest und dann nach Integer gewandelt auf den Schieberegler gibt, ist nicht das Problem, sondern die Aufrufbedingung.
Wie ruft man einen Skript 1-malig beim Start der Runtime auf?

Gruß
Earny
 
Ich weiß nicht, ob es bei WinCCFlex auch ein immer auszuführendes Script gibt. Wenn WinCCFlex startet, dann sind die internen, nicht verknüpften Variablen ja anscheinend auf Null. Also könnte man nach dem einmaligen Ausführen des Scriptes einen interne Variable auf 1 setzen und damit später die Abarbeitungen verhindern bzw. umspringen. Kann man den Schieberegler nicht mit einer SPS-DINT direkt verbinden? Dann sollte der Schieberegler beim Neustart eigentlich nicht auf 0 stehen. Aber WinCCFlex hat ja so seine Eigenheiten.

PS: Ich mag zu viel Scripte noch aus einem weiteren Grund nicht. Andere Programmierer haben manchmal damit Probleme und die Portierbarkeit auf andere Panels leidet darunter sehr. Oft werden nur eile aus einem Projekt in ein anderes übernommen. Entweder, dort funktioniert dann nichts mehr oder der Bearbeiter weiß nichts von den Scripten und sucht dann ewig herum. Außerdem nervt mich die fehlende Debugmöglichkeit bei den Panels, die Fehlersuche ist wirklich nervend. Hinzu kommen die Unterschiede zwischen WinCE und der PC-Runtime. Also mache ich in der Steuerung, was nur geht, aber das ist wirklich meine persönliche Auffassung und hat nicht mit muß oder soll zu tun!
 
Es wäre mal zu probieren. Was passiert, wenn eine SPS-Variable 1 ist und WinCCFlex startet. Gibt es dann einmalig einen Event "bei Wertänderung"? Dann wäre es ja kein Problem, da man diese Variable ja immer auf 1 beläßt. Aber das geht wahrscheinlich so nicht.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
... ich habe das mit dem "OB100" in der Visu bei meinen Runtimes (!!!) so gelößt, dass ich zunächst eine Init-Seite auf der Visu als Start-Seite habe. Diese Seiote hat als einziges Animations-Element ein Feld, dass den 0,5 Hz Blinktakt der CPU abfragt. Diese Variable, auf diese Weise abgefragt, für "bei Wert-Änderung" das Init-Script der Visu aus, das mit ggf. Parameter lädt, Variablen vor-einstellt und am Ende die eigentliche Start-Seite der Visu aufruft.
Damit sehe ich aber bei dem genannten TP Probleme. Vielleicht geht aber ein Teil davon trotzdem ... so als Anregung ...

Gruß
LL
 
Hallo Larry L.,
hallo Ralle,
es scheint so, als gäbe es die Form-Load ( ) -Prozedur bei Flexible nicht. Ich habe zwar noch bei den Ereignissen eines Bildes die Methode "aufgebaut" entdeckt, die arbeitet aber auch nicht wie gehofft.
Ich habe das Ganze gemäß Euren Ratschlägen folgendermaßen gelöst:
Der Schieberegler schreibt in den Speicher MD108 der CPU im DINT-Format und das S7-Programm wandelt den Wert in ein Real-Format, da ich dieses am INV-Eingang des FB43 benötige.
Das elegante bei dieser Lösung ist außerdem, dass beim Aufschalten der Runtime auf die laufende Steuerung, der aktuelle Wert aus dem MD108 (DINT) von der Runtime übernommen und als Rückmeldung auf den Schieberegler geschaltet wird, wodurch dieser, die dem Wert entsprechende Stellung annimmt.
Weshalb es dabei nicht zu dem von Ralle genannten Deadlock kommt, ist mir allerdings nicht ganz klar.
Es muss wohl was mit der "Erfassungsart" der Variable MD118 zu tun haben. Die steht bei mir auf "Zyklisch bei Verwendung". Damit funktioniert die Sache - ganz ohne Skripte.

Es gibt offensichtlich doch viele gute Gründe, auf den Einsatz von Skripten zu verzichten. Ralle hat einige genannt. Das ist für mich nachvollziehbar.

Die Lösung von Larry mit dem 0,5 Hz Blinktakt habe ich verstanden, ist aber etwas aufwändig. Damit hast Du quasi die Form_Load ( )-Prozedur nachgebildet, nur das der Anstoß von außen, nämlich von der CPU kommt.

Gruß
Earny
 
Die Lösung von Larry mit dem 0,5 Hz Blinktakt habe ich verstanden, ist aber etwas aufwändig. Damit hast Du quasi die Form_Load ( )-Prozedur nachgebildet, nur das der Anstoß von außen, nämlich von der CPU kommt.

Das hat einfach den Grund, dass die Visu nur auf Ereignisse reagiert. Da für mich und diverse von meinen Anwendung ein Start-Script notwendig war, habe ich mir halt für diesen Anwendungsfall ein Ereignis gebaut. Das hatte auch einen netten Nebeneffekt : bei unseren Anlagen fingen die Bediener sehr häufig schon an die Anlage zu Bedienen, obwohl die Visu noch gar nicht Online war. Das ist so nun nicht mehr möglich ...

Gruß
LL
 
Zurück
Oben