TIA DI-Register in KOP

ck.poorboy1

Level-1
Beiträge
4
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo liebe Gemeinde,

ich benutze eine CPU 1511-1 PN um meine Gartenbewässerung zu automatisieren.
Als Software setze ich TIA V17 ein.

Das Programm ist fertig und läuft.
Nun sollen noch einige Fehlermeldungen programmiert werden.
Dazu habe ich einen DB (ohne "Optimierten Bausteinzugriff") angelegt.
Der DB heisst "Störungs_DB" und ist DB12.
Darin habe ich ein "Array[0..10] of Word" erzeugt für meine Fehlermeldungen.
Die Meldungen werden in einem FC erzeugt.
Und als Bitmeldung in einer RunTime angezeigt.
Soweit sogut.

Nun muss ich ja im FC die Adresse der Meldung als Bit angeben, z.B. %DB12.DBX1.0
Jetzt bemängelt TIA aber (was ja auch eigentlich richtig ist) "Die Adresse wird nicht durch eine Variable belegt" und markiert den Eintrag "gelb".
Nun habe ich mal geschaut wie unser Anlagenbauer das macht.

Der erzeugt die Meldungen in einem AWL-Baustein.
(AWL kann und mag ich nicht)

Dazu öffnet der zuerst den DB in einem DI-Register mit AUFDI "Störungs_DB".
Dann wird die Meldung wiefolgt erzeugt:

U "m_Anf_Pool_Auffüllen"
U "Sensor"
= %DIX1.0

Nun meine Frage/mein Problem:

Wieso kann man in KOP nicht genauso adressieren?

Wenn ich einer Spule in KOP die Adresse %DIX1.0 zuweise, kommt folgende Fehlermaldung:

"Die Angabe der Adressen für "S71500" ist unvollständig".

Ich habe einen Screenshot von den drei Netzwerken angehängt:

Netzwerk1: AWL (geht)
Netzwerk2: KOP (geht nicht --> Fehlermeldung)
Netzwerk3: KOP (geht, gefällt mir aber nicht, weil Warnung)

DI-Register.png

Vielen Dank schonmal für eure Hilfe.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ansich kannst du es so machen wie Netzwerk 3. Tia bemängelt dies nur als Warnung da du absolut auf einen DB Bereich als bool schreibst der als Word deklariert ist. Aber funktionieren tut es so.
Wenn du die Warnung weg haben möchtest kannst du das Array an den Baustein als INOUT oder OUT Parameter übergeben und per slice befehl auf die bits zugreifen.
 
Zuletzt bearbeitet:
Hallo Poorboy,

so wie ich das lese bist du ja eher noch am Lernen, als ersten Step im dein Problem hier zu lösen dürfte das beste wohl Slice sein. ( einfach mal googeln) hier gibt du dann das Wort bei deiner Spule an und machst dahinter einen .x1 so adressiert du dann das Bit 1 in deinem Wort.

Deutlich SchLeber wäre es natürlich zuerst in einem DB mit einzeln Bool Variablen die Störungen zu generiere hier kannst du dann jede Meldung sauber Bezeichnen und dann alle auf den andere DB umschreibe.


Gruß Tia
 
Ich vermute TP_Inc meint eine Array von BOOL.
Ich glaube du hast ein Array von WORD.
Die Fehlermeldungen in HMI Programm kannst du auf ein einzelne Array von BOOL verknüpfen.
Dann hast du in SPS und HMI Programme BOOL Addressen ohne Slice Zugriff.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Und und, wenn du die einzelne Meldungen programmiert wie in Beitrag 5, wo du einfach die Bedingungen für die Meldung verknüpft, inklusiv die Sensor, dann triggerst du die Meldung jeden mal die Sensor eine positiven Flanke bekommt. Ist das so gewollt ? Es kann die Meldeanzeige mit Fehlermeldungen überfluten wenn das Sensorsignal wackelt.

Ich habe für jeden Fehler in ein 'rohen' Fehler bit und ein gespeicherte Fehler bit, ein quittier-bit und ein gespeicherte quittier-bit.
Die rohen Fehler bit setzt die gespeicherte Fehler bit.
Die steigende Flanke von die quittier-bit von die HMI setzt die gespeicherte quittier-bit.
Wenn die rohen Fehler bit negativ geht und die gespeicherte quittier-bit gesetzt ist, werden die gespeicherte Fehler und quittier bits zurückgesetzt.
Es ist der gespeicherte Fehler bit der die Fehlermeldung auf die HMI triggert.
Scheint aufwendig zu sein, aber es ist notwendig.
 
@JesperMP bei der von dir beschriebenen Methode könnte man den Fehler ja bereits Quittieren bevor er behoben ist, oder täusche ich mich?

Ich setzt einfach die Bits im Störungs-DB mit der Fehlerbedingung und Quittiere alle Störungen immer per globalem Quittierbit. Für was braucht man ein Quittierbit für jede einzelne Meldung?
 
Also mit einem "Array[0..16] of Bool" hatte ich es ganz am Anfang probiert.
Allerdings akzeptiert er das in der HMI als Triggervariable nicht.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
@JesperMP bei der von dir beschriebenen Methode könnte man den Fehler ja bereits Quittieren bevor er behoben ist, oder täusche ich mich?
Man kann es quittieren, aber die Fehler steht noch an bis die rohen Fehler bit aus False wechselt. Deswegen gibt es die gespeicherte quittier bits.
In die HMI Meldanzeige sind unquittierte Fehler rot.
Quittierte Fehler die noch anstehen sind gelb.
Quitteirte und behobene Fehler sind grau..

Ich setzt einfach die Bits im Störungs-DB mit der Fehlerbedingung und Quittiere alle Störungen immer per globalem Quittierbit. Für was braucht man ein Quittierbit für jede einzelne Meldung?
Wenn ein Fehler quittiert und behoben ist, dann kann z.B. ein Zequenz automatisch weiterfahren (*).
Dafür muss man die Anwender die Möglichkeit geben jeden einzelne Fehler zu quittieren.
Ich habe auch ein Global-Quittier Funktion.
Für kleine Anlagen genügt es eventuell mit die Global-Quittier Funktion. Aber abgesehen davon ist die Funktionalität dieselbe.

*: Dies hängt von die Sequenz ab. Ob die Fehler so schwehr is dass die Sequenz gestoppt werden muss, oder es kann weiterfahren aber ein Teil der von die Fehler beeinflusst ist ist gesperrt.
Z.B. bei die Befüllung von Silos, wenn die Füllstandsensor für 1 Silo ein Fehler hat, dann wird die Befüllung von diese Silo gestoppt, aber die Befüllung von die andere Silos fahren weiter. Wenn die Fehler behoben ist fangen die Befülling von die besagte Silo wieder an.
 
Zuletzt bearbeitet:
Also Störungen als Word im DB finde ich Megahässlich.
Wenn du Dutzende oder gar Hunderte Störungen hast blickt man da schnell nicht mehr durch.
Schreibe deine Störungen ganz normal als Bit in den DB (kein array)

Im HMI musst du dann ein Array of Word für die Störungen anlegen.
Das ist dann zwar nicht Symbolisch an die CPU gekoppelt, aber der Kompromiss ist leichter zu ertragen als andersrum
1654252443666.png

1654255005957.png
Ich mache es so, dass ich die Störungen im HMI anlege. Anschließend exportiere ich diese und lasse ein VB-Script darüber laufen welches mir eine AWL-Quelle erzeugt die ich dann importieren kann. Dabei werden den Bits dann als Name der Störmeldetext zugeordnet.

Das Script liegt auf meiner Homepage
TIA_M_to_DB
 
Zuletzt bearbeitet:
Ich mache es so, dass ich die Störungen im HMI anlege. Anschließend exportiere ich diese und lasse ein VB-Script darüber laufen welches mir eine AWL-Quelle erzeugt die ich dann importieren kann. Dabei werden den Bits dann als Name der Störmeldetext zugeordnet.
Habe etwas ähnliches. Ich habe aber einen BOOL Array für sämtliche Störungen.
In die Störmeldetxt steht ein Alarm-Nummer der mit die Array Index übereinstimmt.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Beisammen,

wie ich für den Te oben angedeutet habe lösen wir das immer mit 2 DBs in einem einen Array of Bool [0…200,0..15] wo die Array Elemente beschriftet sind diese werden dann in array of Byte per Serlizese ( bin mir grad nicht 100% sicher)umkopiert. In in der Visu haben wir dann auch den Aufbau bei jeder Störung soweit gleich das immer als erstes das Array Element vom BoolArray dort steht dann ein “|“ kommt dann der Text kommt soweit bei allen recht gut an.


Gruß Tia
 
Zurück
Oben