TIA Erkennenen ob in Bool-Struct min. eine Variable = true

Staubsauger

Level-2
Beiträge
87
Reaktionspunkte
21
Zuviel Werbung?
-> Hier kostenlos registrieren
Guten Morgen zusammen,

ich habe ein Struct mit Bitmeldungen, welche ich auf der HMI anzeige. Die Handhabung erfolgt eigentlich komplett in der SPS. Heißt, dass die Meldungen im HMI nicht quittiert werden. Sie werden im Struct gesetzt und beim Betätigen einer Quittiertaste wird das gesamte Struct = 0 gesetzt.

Jetzt habe ich allerdings das Problem, dass ich gerne die Information hätte ob eines oder mehrere der Bits im Struct gesetzt sind. Mir fehlt allerdings der Ansatz wie ich das lösen könnte.
Das Struct als Datenformat habe ich gewählt, weil die Variablennamen aussagekräftig sein sollen.

Hat mir hier jemand einen Tipp?


Ich arbeite mit TIA, WinCC V16 und einem TP700 Comfort-Panel.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Jetzt habe ich allerdings das Problem, dass ich gerne die Information hätte ob eines oder mehrere der Bits im Struct gesetzt sind.
Da musst Du jedes einzelne Bit einzeln abfragen ob es gesetzt ist (zumindest solange bis Du ein gesetztes Bit gefunden hast). Wenn Dir das zu aufwändig erscheint, dann mußt Du dafür sorgen, daß Du die Bits indiziert ansprechen kannst, dann kannst Du eine Schleife verwenden. Oder Du legst das Struct auf Speicher, den man auch anders adressieren kann als über den symbolischen Name der enthaltenen Bits.

Harald
 
Mein Struct liegt in einem (nicht optimierten DB) an erster Stelle und enthält einfach 128 Bool-Variablen.
Das Script funktioniert so nicht, weil ich über ein Struct nicht indizieren kann, oder?

Ich müsste also entweder ein Array verwenden oder eben mein Struct in ein Array kopieren?
Kannst du mal einen Screenshot von dem DB machen bitte
 
Du kannst einen Vergleich machen mit einer Kopie (im temp) des Structs wo alle Variablen FLASE sind wenn das ergebnis nicht True ist dann ist wohl eine Variable im Struct True.

Ergbniss := Not(Meldungen = tempMeldungesStruct);

Edit: Sorry das scheinbar geht nur wenn du ein UDT nutzt.
 
Mein Struct liegt in einem (nicht optimierten DB) an erster Stelle und enthält einfach 128 Bool-Variablen.
In einem DB mit Standard-Zugriff liegen die 128 Bits dann auf den Adressen DBX0.0 - DBX15.7, wie Du leicht im DB-Editor sehen kannst. Du könntest in der SPS einfach die DB-Doppelwörter DBD0 .. DBD12 ver-Odern und schauen ob das Ergebnis ungleich 0 ist, und diese Information zusätzlich in einem Bit/einer BOOL-Variable der HMI zur Verfügung stellen, ungefähr so (Pseudocode):
Code:
DB_HMI.minEinBitTrue := (DB_Meldungen.DBD0 OR DB_Meldungen.DBD4 OR DB_Meldungen.DBD8 OR DB_Meldungen.DBD12) <> 0;

Die Handhabung erfolgt eigentlich komplett in der SPS. (...) Sie werden im Struct gesetzt und beim Betätigen einer Quittiertaste wird das gesamte Struct = 0 gesetzt.
Wie wird das Struct auf 0 gesetzt?

Harald
 
struct löschen.png
Das mache ich so.
null ist dabei ein Byte. Das ist das erste NW. Wenn also eine Meldung immer noch gesetzt ist, ist sie im DB am Ende des Zyklus trotz Rücksetzen wieder gesetzt.

Die Lösung mit dem ODER von Doppelwörtern scheint mir eine recht einfache Lösung zu sein. Das werde ich testen. Danke.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Die Lösung mit dem ODER von Doppelwörtern kann man auch in KOP programmieren, fällt dann aber etwas umständlich aus... In KOP ist die Variante von DeltaMikeAir mit den 4 einzelnen Vergleichen auf <>0 viel einfacher zu implementieren.

Harald
 
Lass sich doch das Panel darum kümmern. Erreignisse in Eigenschaften der Bitmeldung
Würde im Prinzip ja gehen aber ich würde das nicht machen. z.b. wenn das Panel mal aus ist bzw. eine Projektierung
übertragen wird, dann bekommt man keine Info mehr und auf der SPS Seite wäre das ein zyklusechter Einzeiler der in jedem
Fall abgearbeitet wird.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
SCL passt als Lösung. Das scheint mir in diesem Fall auch übersichtlicher zu sein.
Ich habe allerdings das Problem, dass er den Zugriff auf das Doppelwort nicht zulassen möchte?

fehler scl.png

Prinzipiell wäre eine Lösung über das HMI auch denkbar. Allerdings muss ich das dann ja bei jeder Bitmeldung setzten.
Ich habe da auch nur die Option eine Operation auszuführen wenn ein Fehler kommt oder geht, oder? Das würde ja auch wieder ein Script erforderlich machen, oder?
 
Ich habe allerdings das Problem, dass er den Zugriff auf das Doppelwort nicht zulassen möchte?
Du müsstest entweder die Variable in deiner Variablentabelle anlegen ( z.B. MeldungsDoppelWort0 DINT DB3.DBD0 ),
dann kannst du sie symbolisch verwenden oder du gibts im SCL CODE %DB3.DBD0 ein.
 
Variante 2 funktioniert. Danke für den Hinweis.

Aus Interesse:
Wie ist Variante 1 gemeint? Ich habe das jetzt in einem SCL-NW realisiert. In der Variablentabelle kann ich zwar ein Doppelwort anlegen aber ja keine Absolute Adresse in einem anderen DB festlegen?
 
Ah, da war ich gedanklich bei der falschen Variablentabelle.

Scheint trotzdem nicht zu funktionieren. 🤷‍♂️

fehler plcvar.png

Aber egal. Der direkte Zugriff funktioniert ja.


Der Nachteil bei der Lösung ist du muss immer ergänzen wenn du deine Striuktur länger machst.
Das ist richtig. Dafür brauche ich keinen UDT.
Ist wohl eine Abwägungssache. Trotzdem danke für die Idee. Evtl. brauche ich diese Lösung ja an einer anderen Stelle.


Eine Frage hätte ich jetzt noch. Mein merkt sicherlich, dass ich noch Anfänger bin.
Wenn man in den Programmierhinweisen von Siemens stöbert, habe ich den Eindruck, dass die Verwendung von absoluten Adressen böse ist. Deswegen habe ich anfangs versucht diese grundsätzlich zu vermeiden. Allerdings gibt es manchmal sehr einfache Lösungen wie bspw. meinen Fill-Befehl.
Vermeidet ihr die Absolute Adressierung auch grundsätzlich?
 
Zurück
Oben