Du kannst auch die Bitmeldungen als DWORD oder WORD deklarieren (passt dann für den <> 0 Vergleich und zum HMI) und auf die Bits selber direkt per Slice zugreifen:
Code:
MeldeWord_1.%X1 := #Meldung;
LeuchteRot_Maschine1 := (MeldeWord_1 <> 0) OR MeldeWord_2.%X13;
...
PEEK/POKE braucht man eigentlich nur wenn man indirekt adressiert auf Adressen zugreifen will.
Weitere Lösungen: Mit BOOL-Array arbeiten, und/oder die Bits per GATHER zu DWORDS zusammenfassen, oder klassisch maskieren.
Harald
Hallo Harald,
danke für deine Antwort. Prinzipiell können wir das so machen, aber wir generieren die Meldungen leider anders.
Ich beschreibe vielleicht erst einmal den Ist-Stand:
Es gibt eine Master Excel-Liste, in der alle Störungen als eigene Zeile aufgeführt sind. Die Excel hat dann noch weitere Tabellenblätter, das zweite Tabellenblatt ist die Quelle für den TIA-DB, das dritte Tabellenblatt war bisher die DWORD-Adresse der Bits für die TAG Tabelle in WinCC und das nächste Tabellenblatt konnte per copy & paste in die Meldeverwaltung in WinCC eingefügt werden. Weitere Tabellen haben die Meldetextsprachen, Meldeklassen etc. pp. geregelt.
In Bildern:
Die Exceltabelle, in der alles konfiguriert wird, inkl. Übersetzungen:
Der daraus entstehende DB:
Die Verknüpfung des DWORDS-Zugriffs auf den Bool-DB:
Die Meldungen selbst zum kopieren nach WinCC (inkl. Byte-Swap):
Und anschließend noch einmal die Frage nach dem, was auch Larry schon schreibt:
Wir wollen ja Weg vom adressbasiertem System. Weiterhin aber an den Einzelnen Bits für die einzelnen Störmeldungen festhalten. Die Frage war jetzt, ob es eine Funktion gibt, die sinngemäß folgendes macht:
Ich habe einen Eingang (Zeiger, Variant, Referenz, hier bin ich relativ unerfahren in den Datentypen), einmal auf den Quell-DB, einmal einen InOut / Out - Zeiger auf den Ziel DB (der von mir aus wesentlich größer sein kann, um universell einsetzbar zu sein).
Ich möchte jetzt per SCL (oder FUP/KOP, wenn es sein muss) quasi abfragen: Hole mir aus dem Anfang des Zeigerbereichs die ersten 32 Bits und packe die in ein DWORD, führe einen SWAP durch und speichere diese in dem ersten DWORD des Ziel DBs.
Mache das so lange, bis du am Ende des Zeigereingangbereichs angekommen bist und fülle den Rest (falls Quell DB nicht komplett auf 32 Bit auffüllt) mit Konstanten Nullen auf.
Dazu bin ich nicht in der Lage, weil meine Programmierfähigkeiten an der Syntax von TIA Portal scheitern. Denn es ist genau das, was ihr schreibt: Ich möchte weg von dem Adressbasiertem und hinzu einer symbolischen Programmierung.
Der einzige Weg, wie ich dies bisher hinbekommen habe, ist über PEEK/POKE und absolutem Zugriff auf die Bereiche.
Falls es andere Alternativen gibt, bin ich natürlich nicht beratungsresistent - es ist nur schwer in dem Industriezweig etwas komplett neues zu etablieren und vor allem zu validieren / zertifizieren.
Vielen Dank für eure Mühe,
Andreas