WinCC E/A- Felder die sich gegenseitig überschreiben/beeinflussen

Spencer

Level-2
Beiträge
84
Reaktionspunkte
8
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,

ich habe eine allgemeine Frage zur Programmierung und hoffe, ihr könnt mir da weiterhelfen:


Ich möchte 2 E/A-Fehler auf dem HMI anlegen, in denen man Werte z.B. in [cm] und in [m] angeben kann und je nachdem, in welches Feld ich den Wert eingebe, soll der Wert automatisch in dem anderen Feld umgerechnet werden. Soll heißen, gebe ich den Wert in [cm] an, soll er in [m] umgerechnet werden. Ändere ich nun allerdings den Wert in dem E/A-Feld für [m], soll der Wert in dem E/A-Feld für [cm] geändert werden. Die Umrechnung an sich ist kein Problem, jedoch funktioniert es aktuell nur mit einem Feld. Weswegen es nicht funktioniert ist mir soweit klar (Reihenfolge im Programmablauf und Überschreiben der Werte etc.). Meine Frage wäre, ob es eine "einfache" Lösung dazu gibt, oder das ganze nur umständlich zu realisieren ist, bzw. überhaupt nicht? Wäre super, wenn mir dazu jemand einen Lösungsansatz geben könnte :).

Gruß
Spencer
 
Hi,

probier es mal mit Objekeigenschaften->Ereignis->Propertythemen-Ausgabe/Eingabe-Eingabe.

Eingabe in Feld1 -Bild:Fenster.Objekt- Wert im Feld2 ändern

Eingabe in Feld2- Bild:Fenster.Objekt- Wert im Feld1 ändern.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wenn die Umrechnung so einfach ist, daß im Grunde nur das Dezimalkomma woanders sitzt, dann kannst Du 2 HMI-Variablen auf die selbe PLC-Variable anlegen und bei einer HMI-Variable eine lineare Skalierung (oder eine Komma-Verschiebung) einrichten. Und für jede HMI-Variable ein eigenes EA-Feld. Dann gibt es im SPS-Programm nur 1 Variable, wo der Wert immer in der richtigen Größe landet, je nachdem in welchem EA-Feld (über welche HMI-Variable) der Wert eingegeben wird.

Harald
 
musst halt in der SPS schauen welcher Wert sich geändert hat und dann eben entweder die eine Richtung rechnen und im anderen Feld ausgeben oder eben wenn sich das andere Feld geändert hat mit den anderen Feldwerten rechnen und im einen Feld ausgeben.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi,

probier es mal mit Objekeigenschaften->Ereignis->Propertythemen-Ausgabe/Eingabe-Eingabe.

Eingabe in Feld1 -Bild:Fenster.Objekt- Wert im Feld2 ändern

Eingabe in Feld2- Bild:Fenster.Objekt- Wert im Feld1 ändern.

Ich habe vergessen zu erwähnen, dass ich ein KTP 400 benutze und mit TIA arbeite. Habe gerade mal eben kurz nachgesehen und wenn ich mich nicht täusche, habe ich dort diese Funktion gar nicht.

Gruß
Spencer
 
musst halt in der SPS schauen welcher Wert sich geändert hat und dann eben entweder die eine Richtung rechnen und im anderen Feld ausgeben oder eben wenn sich das andere Feld geändert hat mit den anderen Feldwerten rechnen und im einen Feld ausgeben.

ich glaube, dann habe ich das Problem, dass wenn ich in dem Fenster 1 den Wert eingebe und dann der umgewandelte Wert in Fenster 2 ausgegeben wird, sich ja auch der Wert in Fenster 2 geändert hat und im Programm dann wieder etwas anstoßen würde. Oder ich bin mir gerade nicht im klaren über die Umsetzung in der PLC.

Gruß
Spencer
 
Man kann es total kompliziert und umständlich lösen und sich fast zu Tode programmieren ;) oder mal den Tipp von Beitrag #3 ausprobieren, da braucht man in der PLC gar nichts programmieren ... :cool: (oder kann das Basic Panel keine "lineare Skalierung"?)

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Man kann es total kompliziert und umständlich lösen und sich fast zu Tode programmieren ;) oder mal den Tipp von Beitrag #3 ausprobieren, da braucht man in der PLC gar nichts programmieren ... :cool: (oder kann das Basic Panel keine "lineare Skalierung"?)

Harald

Das stimmt. Leider muss ich mehrere Sachen umrechnen, z.B. [bar] in [N] usw. :)
Ansonsten ist der Tipp schon super, wenn sich nur die Kommastelle verschiebt.

Gruß
Spencer
 
Hi Spencer,

da du dein Thema unter WinCC und nicht WinCC Flex gestartet hast bin ich davon ausgegangen, dass du auch entsprechend WinCC verwendest. Dann kannst du meinen, stupser an PN/DP :rolleyes:, sehr sehr aufwendigen und umständlichen Ansatz NICHT verwenden....wobei der garnicht sooo umständlich ist.

Somit solltest du besser den Ansatz von PN/DP annehmen!
 
Ja, ist mir nachher dann auch aufgefallen :D. Habe das morgens zwischen Tür und Angel geschrieben und mich dabei in der Kategorie vertan :).

Kann man den Beitrag auch noch nachträglich in die richtige Sparte verschieben?

Gruß
Spencer
 
Zuviel Werbung?
-> Hier kostenlos registrieren
So, ich melde mich nochmal zurück. Habe es jetzt hinbekommen und das auch auf einem Recht einfachem Weg. Mir stehen unter den Ereignissen der E/A-Feldern die Optionen "Aktivieren" und "Deaktivieren" zur Verfügung. Dort setze ich bei "Aktivieren" ein Bit und unter "Deaktivieren" rücksetze ich dieses Bit einfach und nutze dieses Bit, welches nur Aktiv ist, solange ich in dem Feld arbeite, als Freigabe für die Berechnung (Enable EN). Es ist also immer nur die Berechnung und Zuweisung aktiv, in dessen E/A-Feld ich mich befinde. Finde die Lösung recht einfach, ohne großen Programmieraufwand, falls ich nicht noch einen Haken daran ausfindig mache :).

Gruß
Spencer
 
Gute Frage. Muss ich mal ausprobieren, sobald die Anlage steht. Kann man bei den KTP's (KTP400) einen Watchdog abfragen? Sonst könnte ich das in der PLC unterbringen

Gruß
Spencer
 
Der Tipp von winnman in #4 ist doch eigentlich ganz praktikabel, oder?

Dabei bin ich mir nicht ganz sicher, ob das aufwändiger wird, als über das Freigabebit, welches ich jetzt benutzt habe. Denn wenn ich auf eine Wertänderung schaue in beiden Feldern und ich z.B. in Feld 1 etwas eintrage und somit Feld 2 beschreibe, findet ja auch eine Wertänderung in Feld 2 statt und der Programmteil würde auch abgearbeitet. Da müsste ich vermutlich mehr Programmieraufwand betreiben, vermute ich mal.

Gruß
Spencer
 
Das ist ein guter Einwand. Mit entsprechenden Rundungsfehlern würde das eine Endlosschleife ergeben.

Ich würde es dennoch so versuchen. Einen FB schreiben, der beide Ein-/Ausgabewerte auf Änderungen überwacht. Nach einer Änderung eines Wertes, in einem Zyklus die Berechnung durchführen. Den jeweils anderen Wert UND dessen Kopie mit dem Ergebnis der Berechnung nachführen. Im Prinzip müsste das funktionieren.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Siehe Bilder. Funktioniert ohne eine einzige Zeile Programmcode in der SPS :cool:
In der SPS ist lediglich eine Variable DB1.DBD0 : Temperatur_1 : REAL

Harald

"Kompliziert kann jeder"
 

Anhänge

  • Variable.jpg
    Variable.jpg
    43,1 KB · Aufrufe: 20
  • 2EA.jpg
    2EA.jpg
    28,7 KB · Aufrufe: 22
Wenn das HMI die lineare Skalierung nicht kann oder unbedingt Programmcode geschrieben werden soll, dann könnte der Code etwa so aussehen (x1, x2, Zyklus1 sind BOOL, alle anderen Variablen sind REAL):
Code:
[COLOR="#008000"]//Wert_1 [cm], Wert_2 [m][/COLOR]

[COLOR="#008000"]//Prozessabbild der HMI-Variablen bilden (Zykluskontrollpunkt)[/COLOR]
HMI_Wert_1 := HMI_KommunikationsVar_1; [COLOR="#008000"]// EA-Wert in cm[/COLOR]
HMI_Wert_2 := HMI_Kommunikationsvar_2; [COLOR="#008000"]// EA-Wert in m[/COLOR]

x1 := HMI_Wert_1 <> Alt_Wert_1;
x2 := HMI_Wert_2 <> Alt_Wert_2;

IF x1 THEN
  HMI_Wert_2 := HMI_Wert_1 / 100.0;    [COLOR="#008000"]// cm --> m[/COLOR]
END_IF;
HMI_Wert_1 := HMI_Wert_2 * 100.0;      [COLOR="#008000"]// m --> cm[/COLOR]

Alt_Wert_1 := HMI_Wert_1;
Alt_Wert_2 := HMI_Wert_2;

IF x1 OR x2 OR Zyklus1 THEN
  HMI_KommunikationsVar_1 := HMI_Wert_1;
  HMI_KommunikationsVar_2 := HMI_Wert_2;
END_IF;

Prozess_Wert := HMI_Wert_2; [COLOR="#008000"]//Prozess rechnet mit Wert in m[/COLOR]

Harald
 
Siehe Bilder. Funktioniert ohne eine einzige Zeile Programmcode in der SPS :cool:
In der SPS ist lediglich eine Variable DB1.DBD0 : Temperatur_1 : REAL

Harald

"Kompliziert kann jeder"

Das kannte ich noch gar nicht. Danke :). Linear kann ich das leider nicht programmieren, weil bei der Berechnung noch mehrere physikalische Größen herangezogen werden. Unter anderem wird von [bar] in [N] ein Wert umgerechnet. Aber ansonsten ist das eine super Sache.

Gruß
Spencer
 
Zurück
Oben