TIA Jedes UDT-Element in DB bedingt bearbeiten

Januar

Level-2
Beiträge
644
Reaktionspunkte
266
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Gemeinde,

ich suche gerade nach einer eleganten (sprich: faulen) Lösung, um eine große Menge an Bits zu setzen. Folgendes sind die Rahmenbedingungen: S7-1515; TIA V18.

Ich habe einen (nicht-optimierten) DB, in dem 175 Elemente liegen. Dabei handelt es sich um verschiedene UDTs (4 UDTs werden verwendet). Die vier UDTs sind prinzipiell ähnlich aufgebaut, sie unterscheiden sich aber in Details. Sie verfügen aber alle über das Bit, um das es hier gehen soll ("CMD_05")

Wenn jetzt ein bestimmter Zustand eintritt (gespeichert in einem Bit an anderer Stelle in der CPU), möchte ich bei allen Elementen in dem DB das obige Bit setzen.

Natürlich könnte ich eine große Tipp-Arbeit leisten und von jedem Element mit einem richtigen UDT das Bit einzeln ansteuern. Aber dann hätte ich natürlich wieder Aufwand, wenn später weitere Elemente hinzukommen.

Aus dem Grund kommt auch keine Schleife mit POKE in Betracht, zudem die UDTs unterschiedlich groß sind, weswegen keine gleichmäßige Distanz zwischen den entsprechenden Bits liegen.

Ich suche nach einer Möglichkeit, automatisiert jedes Element des DBs zu bearbeiten (idealerweise noch mit Unterscheidung, welcher UDT definiert ist), und dann das entsprechende Bit zu setzen. Ähnlich wie "For each" in einer Hochsprache.

Gruß, Januar
 
... Dabei handelt es sich um verschiedene UDTs (4 UDTs werden verwendet). Die vier UDTs sind prinzipiell ähnlich aufgebaut, sie unterscheiden sich aber in Details...

Warum macht man sich das Programmieren nur so schwer? Wurde dir das so vorgegeben und du kannst daran auch nichts ändern, oder ist das auf deinem Mist gewachsen?

Plan A:
Ich würde noch einmal von vorne anfangen und die Datensätze sortenrein in ARRAYs ablegen. Die ganzen "höheren" Funktionen des TIA-Portals sind auf ARRAYs ausgerichtet. Bezeichnen kannst du deine Datensätze dann im jeweiligen Kommentar. Vielleicht findest du auch einen Kompromiss und kannst deine vier ähnlichen UDTs vereinheitlichen?

Plan B :D :
Jeder soll sich soviel Arbeit machen, wie er will.🤷‍♂️
 
Zuletzt bearbeitet:
Ich suche nach einer Möglichkeit, automatisiert jedes Element des DBs zu bearbeiten (idealerweise noch mit Unterscheidung, welcher UDT definiert ist), und dann das entsprechende Bit zu setzen. Ähnlich wie "For each" in einer Hochsprache.
na dann nimm Variant und Type_OF
dann kannst auch schön symbolisch Programmieren (wegen späterer Erweiterung )

das kannst du dir ja mal anschauen
 
Warum macht man sich das Programmieren nur so schwer? Wurde dir das so vorgegeben und du kannst daran auch nichts ändern, oder ist das auf deinem Mist gewachsen?
Ist ein "historisch gewachsener" Standard.

na dann nimm Variant und Type_OF
dann kannst auch schön symbolisch Programmieren (wegen späterer Erweiterung )
Dann hab ich einen FC, der mir unterscheidet, welcher UDT aktuell da ist. Dann könnte ich darüber die Größe des Elements bestimmen und darüber die Adresse des nächsten Elements?
Um wieviele Zuweisungen gehts da?
Aktuell ~130
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich hab jetzt doch den einfachen Weg genommen. Für die drei UDTs, die mich interessieren, gibt es jetzt jeweils einen FC, der bei erfüllter Bedingung die entsprechenden Bits setzt. Um mir die Klick-Arbeit zu sparen, hab ich Excel und SCL verwendet.

Für die, die es nicht wissen: Zellen aus Excel-Tabellen lassen sich über Strg-C + Strg-V in SCL einfügen. Ebenso lassen sich die Bezeichner in DBs aus TIA kopieren und im Excel einfügen. Darüber hab ich dann die FC-Aufrufe generiert.
 
Die Lösung wäre ja noch voll symbolisch, also was meinst du mit Adresse des nächsten Elements?
Du kein Array machen kannst/willst hilft dir das aber auch nur bedingt. (aus meinem Verständnis heraus)
Du könntest eben einen FC für alle verschiedenen UDT-Typen haben. Must aber für jeden EINZELENEN UDTs deins DBs diesen FC Aufrufen und parametrieren.
 
Genau, und ich hatte gehofft, dass es da eine Möglichkeit gibt, das Ganze automatisiert zu lösen.

Anstatt jetzt für jedes Element einen eigenen Aufruf zu programmieren, hatte ich gehofft, dass es funktionieren könnte, das Ganze folgendermaßen zu programmieren:

Code:
For each Element in DB:

Case TypeOf(Element)
UDT1: Call FC1(IN: Element)
UDT2: Call FC2(IN: Element)
UDT3: Call FC3(IN: Element)
Else: Do nothing

Repeat

Und der DB ist nicht als Array definiert und muss aus Standard-Gründen auch nicht-optimiert bleiben.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
"nicht-optimiert" ist kein Problem.
Aber indirekte symbolische Adressierung ohne Array-Definition (Siehe Post#2 Plan A ...)

"For each Element in DB" wäre wirklich ein interessanter Befehl... Aber da gäbe wahrscheinlich schnell andere Probleme.
 
.. aus Step7-Classic Zeiten? Wohl dem, der Bewährtes in seinen neuen Standard übernehmen kann. Für alle Anderen bleibt es ein ewiges Gewichse.
Jap, mit allem drum und dran. Nicht-optimierte DBs, AWL, Merker-Zugriffe. Alles, was ich mir in den Jahren an gutem Programmierstil für 1x00er antrainiert hab, musste ich hier über Board werfen...
 
Jap, mit allem drum und dran. Nicht-optimierte DBs, AWL, Merker-Zugriffe. Alles, was ich mir in den Jahren an gutem Programmierstil für 1x00er antrainiert hab, musste ich hier über Board werfen...
Nichtoptimiert ist überhaupt kein Problem, Merkerzugriff auch nicht. AWL sollte man weitestgehend vermeiden. Das hat aber alles nichts mit deinem Problem mit der verkorksten Datenablage zu tun. Wie willst du es lösen?
 
Ich lass es, wie es ist, damit die restlichen Standard-Werkzeuge (Excel-Makros und Skripte) weiterhin funktionieren und die Visu gut anbinden.

Das bedingte Bearbeiten hab ich "intelligent faul" gelöst, wie mein alter Mathe-Lehrer sagen würde. Siehe Beitrag #6.
 
Zurück
Oben