Step 7 Auf UDT-Elemente in Schleife zugreifen

d Martin

Level-2
Beiträge
68
Reaktionspunkte
22
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

ich habe schon eine weile gesucht bin aber nicht fündig geworden.
Folgendes Probelm: Ich hab mehrere UDT-Variablen (jeweils der gleiche UDT) und möchte im konkreten Fall die einzelnen UDT-Elemente miteinander addieren.
UDT-Element 1 + UDT-Element 1 UDT Element 2 + UDT Element 2 UDT, Element 3 + UDT Element 3 usw.
Kennt da jemand eine elegante Lösung wie ich das machen kann ohne das für jedes UDT-element ausschreiben zu müssen? Mit einem Array statt einem UDT wäre das kein Problem, dass ist mir klar.
Der Hintergrund ist der. Zum einen möchte ich über die Namen darauf zugreifen und nicht über einen Array-Index.
Zum anderen möchte ich zukünftig an einer anderen Anlage nur das UDT verändern müssen (an die andere Anlage anpassen) aber den anderen Programmcode was diesen Teil angeht nicht.

Wie würdet ihr das am besten lösen.
Meine Fallback Lösung wäre über Arrays, dann muss ich aber schauen, dass ich bei der Zuordnung kein Fehler mache.
 
Wenn Du kein Array willst dann bleibt Dir nur das ausschreiben.
In SCL geht das fix wenn Du Excel und Verketten() als Codegenerator nutzt, so würde ich es machen wenn ein Array ausgeschlossen werden soll, in eigenen Anlagen allerdings würde ich immer ein Array nutzen.

Aber: Kann beim Schreiben der Werte nicht bereits ein Sammelwert addiert werden? Vielleicht kann damit das Zählen an einer extra Stelle vermieden werden?
 
@ducati
Das was ich eigentlich will ist folgendes.

1734699036544.png

Das ist die Kurzform.
Weil jetzt eben noch mehr "Namen" dazukommen können oder manche auch wieder rausfallen, hätte ich das gerne automatisiert.
Gern auch eigener FC/FB
Also sinngemäß so.
Werte1 := Werte2 + Werte3;
Wie kann ich das in einem FC lösen, so dass egal ist, wie viele Elemente mit welchen Namen mein UDT hat. (der Datentyp bleibt immer gleich)
 
Zum anderen möchte ich zukünftig an einer anderen Anlage nur das UDT verändern müssen (an die andere Anlage anpassen) aber den anderen Programmcode was diesen Teil angeht nicht.
Weil jetzt eben noch mehr "Namen" dazukommen können oder manche auch wieder rausfallen, hätte ich das gerne automatisiert.
Woran orientiert sich das Hinzufügen oder Wegfallen? Nur bei einer Neuanlage oder auch im Prozess irgendwann?

Kannst Du die Struktur nach Name.Wert{} ändern? (Ich gehe davon aus das Wert1.Name1 und Wert2.Name2 zusammenhängen.)
Da wäre ein Array dann sehr viel einfacher. Wegfallende Namen "mittendrin" sind ein Problem, aber das bekommst Du auch bei nicht optimierten DBs und Pointer. Anfügen bzw. kürzen jedoch wäre einfach. Nur remanente Daten müssten, sofern vorhanden, einmal kopiert werden.
Dazu einen FC welcher das Array variabel übergeben bekommt, er erkennt selbstständig die Grenzen des Arrays und kann alle in einer Schleife bearbeiten, unabhängig der Array-Größe.
Mehrere Aufrufe dieses FCs mit verschiedenen Array-Zuweisungen könnten eine INOUT addieren lassen, wodurch nach Name getrennt werden kann, natürlich auch nach Wert, aber wie ich verstande habe gibt es immer WertX aber NameX ist mal 1..4, mal 1..20.

Die Struktur deines DBs, also wieso er so aufgebaut ist, wäre vielleicht hilfreich.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Sehe ich auch so.Habe das jetzt gerade bei dem LGF FIFO gemacht.
Ein UDT füer die Aussenbeschaltungs-Variabeln und einer fuer den Datensatz.Der Buffer selbst ist dann ein Array aus UDT.
Man kann beliebige Datenstrukturen schieben mit dem Baustein.
Der Vorteil ist auch er nimmt dann Schnittstellenänderungen mit.
 
Zugriff über den Namen ist eingeschränkt möglich, braucht aber einige Klimmzüge und ist ziemlich recheninteinsiv., weil du mit String-Operationen und Vergleichen arbeiten musst.
Wenn du das irgendwie hinkriegst, nimm Array.
Sonst kannst du dir schonmal ne 1517 raussuchen, wenn du getSymbolPath() usw. in Schleifen aufrufen willst...
 
Es handelt sich einfach gesagt um verschiedene Zähler, zu unterschiedlichen Zeitpunkten.

Also mal plakativ und vereinfacht.
ZählerHundeJetzt := ZählerHundeZeitpunkt1 + ZählerHundeZeitpunkt2;
ZählerKatzenJetzt := ZählerKatzenZeitpunkt1 + ZählerKatzenZeitpunkt2;
usw.

Klar gehts hier nicht um Hunde und Katzen, aber so kann ich es sehr anschaulich machen.

Bei einer anderen Maschine habe ich jetzt z.B. keine Katzen, aber Hunde, Fische und Vögel.
Und um im Bild zu bleiben ich habe eben nicht nur 3 Tiere sondern einen ganzen Zoo, bei jeder Maschine mit anderen Tieren.

Im Programm möchte ich aber mit Hunden, Fischen und Vögeln arbeiten und nicht mit 1, 2 und 3. Weil ich mir dann merken muss was was ist.

zu dem Zeitpunkt an dem ich aber alle zusammenzähle, will ich nicht alle möglichen Zähler ausschreiben, was sich für jede Maschine ändert. sondern das am besten in einer FOR-Schleife abgearbeitet wird.

Werd jetzt wohl mit globalen Konstanten arbeiten. Das kommt am nächsten an das ran was ich will, dass ich für eine neue Maschine möglichst wenig ändern muss.
 
Warum machst du dann kein Array of UDT
Array of UDT wurde schon mehrfach vorgeschlagen, warum das nicht funktionieren sollte, hat der TE nicht beantwortet.

also so ungefähr:

Code:
ZählerHundeJetzt := Zeitpunkt[1].ZählerHunde + Zeitpunkt[2].ZählerHunde;
ZählerKatzenJetzt := Zeitpunkt[1].ZählerKatzen + Zeitpunkt[2].ZählerKatzen;
 
Array of UDT wurde schon mehrfach vorgeschlagen, warum das nicht funktionieren sollte, hat der TE nicht beantwortet.
Hab es nicht ausdrücklich beantwortet. Aber ja wird darauf hinauslaufen. Und halt Konstanten verwenden um Namen zu vergeben.
Aber ist nicht das was ich eigentlich wollte.
Aber warum ich das eigentlich nicht wollte war, ist in meinem Post von heute morgen nochmal aufgeführt mit den Tieren als Beispiel.
Ich wollte halt die Hunde als Hunde ansprechen und nicht als 2 usw. deswegen die Konstanten.
Ist noch nicht Ideal, aber glaub das beste, was ich bekommen kann.
Die anderen Optionen die Vorgeschalgen wurden waren entweder zu rechenintensiv wie von xMisterDx
Oder mit nicht optimierten DBs und Pointern, da muss ich dann ja aber auch bei jeder Änderung wieder aufpassen/überprüfen, dass ich mit meinem Pointer nicht über den Bereich hinaus Pointer.
Und das will ich ja genau nicht. Ich will bei einer Änderung (für eine neue Maschine) möglichst wenig anpassen müssen, im Idealfall nur die Namen und gut ists.
Wenn ich jetzt ein UDT-Array und Konstanten verwende muss ich im restlichen Programm immer noch ein bisschen aufpassen, aber das bleibt überschaubar.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wenn ich jetzt ein UDT-Array und Konstanten verwende muss ich im restlichen Programm immer noch ein bisschen aufpassen, aber das bleibt überschaubar.
Warum Konstanten erschliesst sich mir hier nicht - genauso auch nicht warum du im restlichen Programm dafür aufpassen musst.
Ich weiß nun nichts über den Sinn dieser Frage - in meiner Vorstellung handelt es sich hier aber um eine, ggf. in einem FB, gekapselte Funktion. Alles was sonst noch damit zu tun hat könnte genauso in dem FB passieren (also Auswertungen etc.).
Vielleicht wirst du doch noch mal "etwas" konkreter - für mich ist dieses Array of UDT, alleine wegen deines Beispiels, KEIN Kompromiss ...
 
ich möchte die Grundfunktion in verschiedenen Maschinen einsetzen, aber anpassen.
Ich habe aber immer ganz unterschiedlich benannte Zähler, daher das Beispiel mit dem Zoo.
Im restlichen Programm das je nach Maschine sehr unterschiedlich ist möchte ich mit den Namen arbeiten.
Da ich jetzt aber in meinem Baustein alle Zähler durchgehen will ohne sie einzeln mit Name aufzurufen, also einzeln zu schreiben habe ich dafür die einfachste Lösung gesucht.
Und wie schon erwähnt, das Array of UDT ist mit Zuhilfenahmne von globalen Konstanten eine gute und einfache Lösung.
Alles andere wäre mit den vorhanden Möglichkeiten viel zu umständlich. Ist ja immer noch eine SPS die ich hier programmiere.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Das kannst du doch mit suchen/ersetzen machen?
Das würde nur zum Teil helfen. Die Anzahl der Zähler bzw. die größe meines Arrays ändert sich ja auch jedes mal. Teilweise wiederholt es sich teilweise nicht. Und wenn ich immer alles alte mitschleppe hab ich irgendwann mal ne Unmenge an ungebrauchten Zählern.
 
Du kannst doch deine Arraygrenzen mit Lowerbound und Upperbound bestimmen, die Größe deiner Arrays mit Konstanten definieren und auch generell mit Konstanten arbeiten.

Damit hast du alles als multiplex, dynamisiert und gekapselt und kannst das verwenden wo immer du magst
 
Ich wollte halt die Hunde als Hunde ansprechen und nicht als 2 usw. deswegen die Konstanten.
Naja, die Hunde, Katzen usw. sind ja Bestandtteil des UDT, die Zeitpunkte sind des Array... Wenn Du jetzt noch Elefanten hinzufügen musst, kannst das ja im UDT hinzufügen, ohne das sich am restlichen Programm was ändert, aber natürlich mit Aktualdatenverlust und nicht im laufenden Betrieb...
 
Zurück
Oben