TIA Wie kann ich in TIA etwas vergleichbares wie den ANY-Pointer nutzen?

Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Dagobert,

Du meinst von dem so wie ich es bisher gelöst hab, auch wenn es offensichtlich unglücklich gelöst ist?

Kann ich gerne später machen. Mach ich das am besten mit ein paar Screenshots? Sorry für die blöde
Frage, bin eigentlich nicht so oft in Foren unterwegs...
 
Hallo Dagobert,

hier ein paar Screenshots von meiner Datenverwaltung wie ich sie im Moment noch habe:

Das wäre z.B. der UDT für eine einzelne Schrauboperation

udtOperationSchrauben.JPG

Dann der DB mit dem gesamten Bauplan

BauplanDB.JPG
Hier sind vorne diverse Status und Header. Dann beginnen die einzelnen Stationen ab OP010

Hier der DB mit einer geöffneten Station

BauplanDB_Einzelstation.JPG
Diese Station hätte jetzt zum Beispiel Verschraubungen zu machen und diverse Messungen. Je nachdem wieviele Verschraubungen gemacht
werden müssen so groß ist das Array der Schrauboperationen etc.

Es gibt immer noch einen Header mit IO, NIO Bits etc. für jeder Operationsklasse.

Das wäre der Aufruf für den FB der nun nach Schraubvorgaben suchen soll.

FB_SchrauboperationenDurchsuchen.JPG

Dieser FB bekommt nun ein Array von Schraubvorgaben als Variant vorgegeben, welches er durchsuchen soll. Innerhalb des FB soll dann in Abhängigkeit von einer Position oder Tool-ID oder Operation-ID oder einer Kombination daraus auf eine Schrauboperation aus dem Array
"eingerastet". werden

Wenn ich auf eine Schrauboperation eingerastet bin, wird diese auf eine Visu Struktur (auch Variant) ausgegeben zur Anzeige an einem Panel.

Funktioniert soweit ohne Probleme. Nach diesem Schema hab ich in Klassik schon zig Montagelinien umgesetzt. Da wäre Variant halt der
Any-Pointer. Aber in TIA ist das offensichtlich nicht das Optimum, dies so zu machen wie ich glaube hier gelernt zu haben...

Ich würde auch den FB noch zur Verfügung stellen, der ist aber ein Mix aus KOP und SCL. Ich weiß gerade nicht wie ich den hier zur Verfügung
stellen kann.
 

Anhänge

  • udtOperationSchrauben.JPG
    udtOperationSchrauben.JPG
    72,7 KB · Aufrufe: 9
Zuviel Werbung?
-> Hier kostenlos registrieren
So, jetzt hab ich das Ganze umgeschrieben ohne das ich den Variant benötige. Statt dessen werden die Operationen nun
als Array[*] of UDT SchraubOperation an den Such-FB übergeben. Ich denke ich hab jetzt Verstanden, was damals mit Array
Elemente direkt Adressieren gemeint war. Wahrscheinlich war ich damals noch nicht bereit dafür ;-).

Im Prinzip bleibt der Code im Such-FB fast identisch. Ich muss nun halt immer den "Index" für das gewünschte Bit etc.
angeben.

Vorher mit Variant hab ich einmal das gesamte Element mit dem richtigen Index in eine lokale Struktur kopiert und brauchte
dann keine Index mehr. Am Ende hab ich die lokale Struktur zurück an den richtigen Index kopiert.

Key Takeaway für mich hier:

Hast Du TIA mit optimierten Datenbausteinen, dann brauchst Du den Variant nicht und Du sparst Dir das umkopieren in die
lokale Struktur.

Was bedeutet das für die Wartbarkeit und Lesbarkeit? In meinem Fall nicht sonderlich viel, weil der Code fast identisch geblieben
ist. Es ist halt mehr TIA like... Vielleicht wirkt es sich auf kompliziertere FBs dann mehr aus.

Meine alte Datenstruktur scheint auch damit zu funktionieren. Ich hab jetzt nichts noch mehr in UDTs und Strukturen verschachtelt als
ich vorher hatte. Vielleicht würde es für die weitere Verwendung der Daten noch sinnvoll sein...
 
Zuletzt bearbeitet:
So ähnlich habe ich mir dein System vorgestellt. Interessant wäre der Zugriff auf die ARRAY-Elemente über Variant im FB gewesen. Übergibst du die ARRAY-Größe als Bausteinparameter oder ermittelst du diese irgendwie im FB? Wenn es für dich mit dem ARRAY[*] keinen erkennbaren Vorteil bringt, kannst du natürlich auch bei deiner bisherigen Lösung bleiben. Ich hätte aber erwartet, es würde sich etwas übersichtlicher gestalten. Das mit dem Umkopieren, wie du es vorher hattest, hat übrigens den Vorteil, dass der Datensatz während der Bearbeitung im FB konsistent bleibt. Das ist hier im Forum öfters mal ein Thema, Stichwort "Zykluskontrollpunkt". Das war also u.U. ganz vorteilhaft.

Im UDT könnte man Sollwerte eventuell als "Einstellwerte" deklarieren. Das macht Sinn, wenn man diese später sichern möchte, ohne den kompletten Status mit zu sichern.
 
... Das mit dem Umkopieren, wie du es vorher hattest, hat übrigens den Vorteil, dass der Datensatz während der Bearbeitung im FB konsistent bleibt. Das ist hier im Forum öfters mal ein Thema, Stichwort "Zykluskontrollpunkt". Das war also u.U. ganz vorteilhaft. ...
DatenKonsistenz ist allemal wichtig, aber ich kann mir nicht vorstellen, dass bei dieser Anwendung eine Inkonsistenz lauert.
Die einzelnen Rezepte oder ArbeitsSchritte oder wie auch immer man den Inhalt der Struktur[en] nennt, sollten während ihrer Abarbeitung doch wohl nicht geändert werden?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Bei der Variante mit Variant ermittle ich die Anzahl der Elemente über den CountOfElements Befehl. Damit weiß ich wie oft
ich mich mit der For-Schleife durch die Elemente loopen muss bis ich das ganze Array durch habe.

Wenn ich über die For Schleife auf der richtigen Operation eingerastet bin, kopiere ich mir das entsprechende Array Element mit
dem Move_BLK_Variant Befehl in den lokalen Speicher.

Am Schluss, wenn die Operation fertig ist, werden die Daten aus dem lokalen Speicher wieder mit Move_BLK_Variant zurück
geschrieben.

Ich bekomm es mit TIA leider gerade nicht hin eine Quelle aus dem FB zu machen. Sonst würde ich den FB hier zur Verfügung
stellen.

@Heinileini
Doch für mich könnte die Konsistenz zum Problem werden, weil nämlich im udtSchraubOperationen auch Ergebnisse zurück
geschrieben werden. So ist alles an einer Stelle und ich muss mich nicht an anderer Stelle nochmal zusätzlich durch eine Struktur
von Ergebnisdaten loopen. Wozu, wenn ich in dem Such-FB schon auf dem richtigen Element eingerastet bin.

Aber ich kann mir ja nach wie vor auch mit dem Array[*] of udtSchraubOperation Ansatz die Daten zunächst in den lokalen Speicher
holen und dann irgendwann wenn die Operation beendet ist zurückschreiben.

Das hat den Vorteil, dass ich mir ein vernünftiges Update Flag setzen kann, wenn Daten zurückgeschrieben werden. Dieses Flag hab
ich mir nämlich mit dem neuen Ansatz erstmal unbemerkt wegrationalisiert.

Dann wäre ich den Variant los, damit mehr TIA like, und es würde nahezu identisch wie vorher funktionieren. Nur wie ich mir den Datensatz
in den lokalen Speicher hole wäre anders.
 
Zuletzt bearbeitet:
Zurück
Oben