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

shaggy0815

Member
Beiträge
18
Punkte Reaktionen
1
Zuviel Werbung?
->Hier kostenlos registrieren
Hallo an das Forum,

ich möchte eigentlich etwas, in der Klassik Welt, sehr einfaches machen und fühle mich gerade in TIA wie ein Anfänger.

Folgendes Problem:

Ich möchte mir in eine(n) FC/FB einen Datensatz aus einem DB einlesen, befummeln und wieder zurück schreiben in den DB. Der DB enthält ein Datensatz Array [1..x] vom Typ UDT.

In der Klassik Welt würde ich nun einfach eine(n) FC/FB schreiben der als IN-Parameter den Parameter Typ ANY aufnehmen kann. An diesen Parameter gebe ich nun das erste Datensatz
Array-Element aus meinem DB. Damit ist in der FC oder dem FB bekannt, wie lange der Datensatz ist, aus welchem DB er kommt und an welcher Adresse der Datensatz beginnt.

Nun lege ich im Temp-Bereich eine Datensatz Variable vom selben Typ UDT an. Ich kopiere den Übergabe Parameter ANY in einen lokalen ANY-Pointer. Nun kann ich mir per Blockmove den
ersten Datensatz in meinen lokalen Datensatz im Temp-Bereich kopieren, befummeln und per Blockmove zurück in den DB schreiben. In einer Loop-Schleife befummle ich den lokalen
ANY-Pointer und hole mir so nacheinender alle Datensätze zum befummeln in meinen lokalen Datensatz zum befummeln und zurück schreiben.

Easy Peasy...

Wie bekomm ich etwas vergleichbares mit TIA und einem optimiertem DB hin? Da muss es doch auch Möglichkeiten geben sich nacheinander Datensätze in eine FC einzulesen, zu befummeln
und dann wieder zurück zu schreiben?

Wahrscheinlich wäre der ANY-Pointer als Übergabeparameter aus der Klassik Welt dann ein Typ-Variant? Aber dann ist mir noch immer nicht klar wie ich mich mit TIA durch die einzeln Datensätze
"durchloopen" kann, wenn nichts mehr über Adressen adressiert wird.

Vielleicht kann mich jemand auf die richtige Spur bringen...

Beste Grüße
 

Blockmove

Supermoderator und User des Jahres 2019
Teammitglied
Beiträge
8.955
Punkte Reaktionen
2.311
In TIA kannst du doch direkt auf die Array-Elemente zugreifen. Selbst in KOP / FUP.
 
OP
S

shaggy0815

Member
Beiträge
18
Punkte Reaktionen
1
Hallo Loefflfab,

dass könnte sowas ähnlich sein was ich brauche. Das werde ich mir morgen mal anschauen.

Real habe ich ganz viele DBs mit der gleichen Datensatz Struktur. Ich möchte die FC oder den
FB nur einmal schreiben. Dieser muss dann halt in der Lage sich aus jedem DB zu bedienen.
Auch die Position an der die Datensätze beginnen kann immer unterschiedlich sein.

Deshalb würde ich das in der Klassik Welt immer über einen ANY-Pointer machen. Damit übergebe
ich der FC oder dem FB alle benötigen Informationen um universell zu funktionieren.

Danke schon mal für deinen Lösungsansatz.
 

eldon

Well-known member
Beiträge
69
Punkte Reaktionen
17
Zuviel Werbung?
->Hier kostenlos registrieren
Hallo shaggy

Wenn deine Datenstruktu aus udt Arrays im DB besteht gebe es noch die Möglichkeit das ganze Array unbestimmt zu übergeben.
Array[*] am InOut und Dan mittels lowerbound und upperbound die Grösse bestimmen.
Gruss
 
OP
S

shaggy0815

Member
Beiträge
18
Punkte Reaktionen
1
Also die Nummer mit dem Datentyp Variant hab ich schon mal zum laufen gebracht. Offensichtlich ist in TIA der Datentyp Variant das, was
in der Klassik Welt der Any-Pointer war.

Damit konnte ich meine Klassik Bausteine mit etwas Anpassung ganz gut auf TIA portieren.

Die Nummer mit dem Motorenpendel schau ich mir über das Wochenende näher an.

Vielen Dank schon mal für alle hilfreichen Kommentare. :)
 

Ralle

Supermoderator
Teammitglied
Beiträge
14.410
Punkte Reaktionen
3.378
Zuviel Werbung?
->Hier kostenlos registrieren
Also die Nummer mit dem Datentyp Variant hab ich schon mal zum laufen gebracht. Offensichtlich ist in TIA der Datentyp Variant das, was
in der Klassik Welt der Any-Pointer war.

Damit konnte ich meine Klassik Bausteine mit etwas Anpassung ganz gut auf TIA portieren.

Die Nummer mit dem Motorenpendel schau ich mir über das Wochenende näher an.

Vielen Dank schon mal für alle hilfreichen Kommentare. :)

Mach das nicht, bau dein System auf Array um, du wirst sehen, irgendwann machst du das ohnehin, denn es behindert in der 1500-er nur und entspricht so gar nicht dem Konzept der Software für die 1500-er. Du wirst sehen, es lohnt sich, auch mal slte Zöpfe abzuschneiden. Ich hab auch zuerst auf dem "alten" System mit indirekter Adressierung weitergemacht, aber irgendwann merkt man, dass man damit nicht ewig weiterkommt.
 

Onkel Dagobert

Well-known member
Beiträge
4.998
Punkte Reaktionen
960
.. An diesen Parameter gebe ich nun das erste Datensatz ..
Zudem macht es überhaupt keinen Sinn, weder in Classic mit Anypointer, noch in TIA mit Variant zu hantieren, wenn nur ein einziger Datensatz übergeben wird. Diesen kann man einfachst als UDT übergeben.

Wiese werden eigentlich die kurzen und präzisen Antworten (#2) immer wieder ignoriert? Wahrscheinlich zu simpel?
 
OP
S

shaggy0815

Member
Beiträge
18
Punkte Reaktionen
1
Zuviel Werbung?
->Hier kostenlos registrieren
Jetzt muss ich diesen älteren Threat doch noch mal aufgreifen.

Ich hab dieses damalige Problem dann ja über den Variant Parameter zum laufen gebracht, so das es ungefähr genauso
funktioniert wie es damals in Klassik funktioniert hat.

Ich möchte ja schon gerne so programmieren wie es am sinnvollsten ist und gerne auch was neues lernen. Ich verstehe
nur gerade nicht was mit "bau dein System auf Arrays um" gemeint ist.

Ich will noch mal versuchen zu erklären was genau meine Problemstellung war.

Also ich habe einen großen Globalen DB. In diesem steht quasi der gesamte "Bauplan" eines zu bauenden Teils. Das Teil
wird über mehrere Stationen hinweg aufgebaut. Der DB ist dann in etwa wie folgt aufgebaut

Station01 (Struct)
Array[1..10] of UDT Schraubvorgänge
Array[1..5] of UDT Fügevorgänge
Array[1.3] of UDT Scanvorgänge
Station02 (Struct)
Array[1..5] of UDT Schraubvorgänge
Array[1..3] of UDT Fügevorgänge
Station03 (Struct)
usw.

Station muss bei mir ein Struct sein, weil nicht jede Station z.B. Scanvorgänge hat. Ebenso hat nicht jede Station die gleiche
Anzahl von Schraubvorgängen etc.

Jetzt gibt es z.B. einen einzigen FB_Such_Schraubvorgang. Dieser soll mehrfach aufgerufen, pro Station, dass ganze Array mit Schraubvorgängen, die zu seiner Station gehören, durchsuchen und auf ein Array Element daraus "einrasten" wenn eine bestimmte
Bedingung erfüllt ist.

Am Beispiel der Schraubvorgänge gebe ich nun über den Variant Parameter das komplette Array der Schraubvorgänge an den
FB_Such_Schraubvorgang. Dieser holt sich jetzt nacheinander ein einzelnes Array Element in den lokalen Speicher und sucht
nach der Bedingung zum "einrasten".

Ist diese Bedingung gefunden bleibt dieses Array Element im lokalen Speicher bis die Bedingung nicht mehr gegeben ist. Solange
kann ich dieses Array Element befummeln und wieder zurückschreiben in den Globalen DB.

Was ist den daran so falsch im TIA Konzept? Und wie ginge es viel besser? Mir ist nicht ganz klar wie ich unter diesen Gegebenheiten
direkt auf ein Array Element zugreifen soll. Ich weiß ja nur anhand einer Bedingung welches Element ich gerade brauche...
 

Ralle

Supermoderator
Teammitglied
Beiträge
14.410
Punkte Reaktionen
3.378
Wenn du in Station01 struct nochmal ja eine Struct für jedes Array (Schraubvorgänge, Fügevorgänge etc.) einbaust (am Einfachsten als UDT), mußt du kein Variant übergeben, sonden kannst diese neuen Struct (am Einfachsten als UDT) als Inputparameter für den Such-FB anlegen und dann direkt dieses Struct übergeben.
 
OP
S

shaggy0815

Member
Beiträge
18
Punkte Reaktionen
1
Hallo Ralle,

also würde ich dann quasi für jede Station einen eigenen UDT Station01, Station02, etc haben.

Der UDT Station01 würde dann so aussehen:
Schraubvorgänge (Struct)
Array[1..10] of UDT Schraubvorgänge
Fügevorgänge (Struct)
Array[1..5] of UDT Fügevorgänge
Scanvorgänge (Struct)
Array[1.3] of UDT Scanvorgänge

Und in dem Globalen DB wäre die Stuktur dann:

Station01 (Struct)
Station01 (UDT)
Station02 (Struct)
Station02 (UDT)
etc…

Richtig?
 

Ralle

Supermoderator
Teammitglied
Beiträge
14.410
Punkte Reaktionen
3.378
Zuviel Werbung?
->Hier kostenlos registrieren
Ich würde schon das Array in eine UDT stecken.

Dann hast du nur

Station01
Schraubvorgänge UDT Schraubvorgänge als Array[1..10] of UDT Schraubvorgänge)
Fügevorgänge UDT Fügevorgänge als Array[1..5] of UDT Fügevorgänge
usw.

Dann kannst du im FB als INOUT das UDT Schraubvorgänge definieren und außen dieses UDT aus dem DB anlegen.
 

Blockmove

Supermoderator und User des Jahres 2019
Teammitglied
Beiträge
8.955
Punkte Reaktionen
2.311
Manchmal muss ich schmunzeln.
Da gibt es wildeste Datenstrukturen und Zugriffe über Variant und was weiß sich noch sonst.
Wenn man sich ein paar Stunden hinsetzt und seine Daten ordentlich entwirft, dann hat man es nachher im Programm und in der Visu einfach und simpel. Sauberes für jeden nachvollziehbares Datenhandling, lesbaren, nahezu selbsterklärenden Code, weniger Fehler, schnellere Inbetriebnahme…
Alles kann im Vorfeld mit Plcsim getestet werden.

Aber manche mögen wohl gerne leiden :p
 
OP
S

shaggy0815

Member
Beiträge
18
Punkte Reaktionen
1
Hallo Blockmove,

danke für Deine Anmerkungen. Ich bin ja hier weil ich lernen möchte wie es besser zu machen ist.

Nun weiß ich das mein Ansatz offensichtlich Deiner Meinung nach ganz schlecht ist. Das ist ok.

Nur warum ist den die Unterteilung nach Stationen und dann nach Operationen in den Station so eine wilde Datenstruktur deiner Meinung nach? Was ist denn daran nicht nachvollziehbar und wie würdest Du die Sache angehen?
 

Onkel Dagobert

Well-known member
Beiträge
4.998
Punkte Reaktionen
960
Zuviel Werbung?
->Hier kostenlos registrieren
Hallo shaggy,

sich ein paar Standardfunktionen zu schreiben, welche sehr effektiv bestimmte Routinefunktionen bearbeiten, ist genau der richtige Weg. Und der beginnt bei einer gut durchdachten Datenablage. So weit hast du m.E. alles richtig gemacht.

Ich gehe jetzt von deinem Beitrag #12 aus, in dem du noch einmal dein Vorhaben recht genau erläutert hast, einschließlich der dort genannten Datenstrukturen. In #1 kann man nachlesen, dass du mit "optimierten" Bausteinen arbeitest. Was hat dich denn dann daran gehindert, den Vorschlag mit dem "Array[*] am InOut" aus #6 um zu setzen? Das würde die ganze Sache erheblich vereinfachen. Mit welcher TIA-Version arbeitest du? Ältere Versionen unterstützen das vielleicht noch nicht? Den Weg über "Variant" muss man eigentlich nur gehen, wenn man "nichtoptimiert" programmiert.
 
OP
S

shaggy0815

Member
Beiträge
18
Punkte Reaktionen
1
Hallo Dagobert,

ich hatte damals #6 ehrlich gesagt nicht mehr so richtig verfolgt weil ich dann dachte mit Variant den richtigen Weg gefunden zu haben. War halt ähnlich zu Klassik Welt und damit vertraut.

Nachdem ich gestern nochmal über diesen Threat gestolpert bin und mir dann nochmal alle weiteren Gedankenanstösse durch den Kopf gehen lassen habe, hab ich versucht das Ganze nochmal im Kopf durchzuspielen.

Dabei bin ich dann quasi auch auf den Trichter gekommen das es so wohl besser wäre wie in #6 schon vorgeschlagen.

Ich werde versuchen das so umzubauen um den Variant loszuwerden…
 
Oben