-> Hier kostenlos registrieren
Hallo,
beim Thema dreht es sich grundsätzlich um TIA Portal V18, jedoch mMn auch um eine Programmierstrategie.
Ich möchte anstatt wie zuvor in der "guten alten" AWL-Welt Global-DBs indirekt absolut nun "dynamisch" und symbolisch beschreiben/auslesen.
Zum Beispiel:
Es gibt zB 5 Stationen (statnr 1 bis 5), und jede dieser Stationen hat einen eigenen Global-DB (DB1 bis DB5) mit demselben UDT. Wenn nun beispielsweise mit einem übergeordneten System kommuniziert wird und dieses ein Telegramm für eine bestimmte Station schickt, zB Station 2, wusste man früher durch die fix zugeordneten DB-Nummern in welchen Global-DB man diese Daten nun transferieren muss.
Vereinfachtes AWL Beispiel:
L Telegramm.Target
AUF DB[statnr]
T DBD2
Nun möchte ich jedoch wegkommen von dieser absoluten Arbeitsweise hin zum symbolischen Programmieren. Auch die DB-Nummern sollen keine Rolle mehr spielen.
Mein Ansatz war zum Beispiel eine Art Referenz-DB anzulegen mit einem Array[1..x] of DB_ANY, wobei der Array-Index der Stationsnummer entspricht und beim DB_ANY der DB symbolisch angegeben wird. Durch Konvertierung in einen Variante und dem MOVE_BLK_VARIANT ist es wahrscheinlich möglich, jeweils eine komplette Struktur zB eines UDTs auszulesen bzw. in ein Temp innerhalb eines FBs zu übergeben, dort mit dem Temp-UDT zu arbeiten und diesen Temp-UDT dann wieder per MOVE_BLK_VARIANT zurückzuschreiben. Jedoch wird hier ja immer der gesamte UDT/Speicherbereich gelesen => gibt es auch eine Möglichkeit, um auf einzelne Variablen innerhalb des DBs symbolisch zuzugreifen?
Nachfolgend ein paar Screenshots meines Ansatzes:
Stations-DB mit UDT:

Referenz-DB:

Zuweisen des Stations-DBs per FC, da Deklaration direkt im Referenz-DB nicht möglich:

Und nun der Versuch, die Telegrammdaten in das temporäre UDT zu übergeben, und dies dann "dynamisch" in den richtigen Stations-DB zu transferieren:

Wie man sieht braucht man hier "absolute" Angaben für COUNT, SRC_ und DEST_INDEX => somit nicht wirklich praktikabel, falls sich die Variablen später verschieben sollten durch Erweiterung des UDTs..
bei SRC kann auch eine einzelne Variable übergeben werden, jedoch kann bei DEST klarerweise kein "tmp_variant.ActualData.Target" angegeben werden:

bzw. ist es auch nicht möglich, dem DB_ANY diesen Pfad anzugeben:

Ich hoffe, man versteht in etwa welche Problemstellung ich lösen möchte... Habt ihr für die gleiche/ähnliche Aufgabenstellung bereits bessere/funktionierende Ansätze entdeckt? Wenn ja, wie sehen diese aus..?
Vielen Dank im Voraus.
beim Thema dreht es sich grundsätzlich um TIA Portal V18, jedoch mMn auch um eine Programmierstrategie.
Ich möchte anstatt wie zuvor in der "guten alten" AWL-Welt Global-DBs indirekt absolut nun "dynamisch" und symbolisch beschreiben/auslesen.
Zum Beispiel:
Es gibt zB 5 Stationen (statnr 1 bis 5), und jede dieser Stationen hat einen eigenen Global-DB (DB1 bis DB5) mit demselben UDT. Wenn nun beispielsweise mit einem übergeordneten System kommuniziert wird und dieses ein Telegramm für eine bestimmte Station schickt, zB Station 2, wusste man früher durch die fix zugeordneten DB-Nummern in welchen Global-DB man diese Daten nun transferieren muss.
Vereinfachtes AWL Beispiel:
L Telegramm.Target
AUF DB[statnr]
T DBD2
Nun möchte ich jedoch wegkommen von dieser absoluten Arbeitsweise hin zum symbolischen Programmieren. Auch die DB-Nummern sollen keine Rolle mehr spielen.
Mein Ansatz war zum Beispiel eine Art Referenz-DB anzulegen mit einem Array[1..x] of DB_ANY, wobei der Array-Index der Stationsnummer entspricht und beim DB_ANY der DB symbolisch angegeben wird. Durch Konvertierung in einen Variante und dem MOVE_BLK_VARIANT ist es wahrscheinlich möglich, jeweils eine komplette Struktur zB eines UDTs auszulesen bzw. in ein Temp innerhalb eines FBs zu übergeben, dort mit dem Temp-UDT zu arbeiten und diesen Temp-UDT dann wieder per MOVE_BLK_VARIANT zurückzuschreiben. Jedoch wird hier ja immer der gesamte UDT/Speicherbereich gelesen => gibt es auch eine Möglichkeit, um auf einzelne Variablen innerhalb des DBs symbolisch zuzugreifen?
Nachfolgend ein paar Screenshots meines Ansatzes:
Stations-DB mit UDT:

Referenz-DB:

Zuweisen des Stations-DBs per FC, da Deklaration direkt im Referenz-DB nicht möglich:

Und nun der Versuch, die Telegrammdaten in das temporäre UDT zu übergeben, und dies dann "dynamisch" in den richtigen Stations-DB zu transferieren:

Wie man sieht braucht man hier "absolute" Angaben für COUNT, SRC_ und DEST_INDEX => somit nicht wirklich praktikabel, falls sich die Variablen später verschieben sollten durch Erweiterung des UDTs..
bei SRC kann auch eine einzelne Variable übergeben werden, jedoch kann bei DEST klarerweise kein "tmp_variant.ActualData.Target" angegeben werden:

bzw. ist es auch nicht möglich, dem DB_ANY diesen Pfad anzugeben:

Ich hoffe, man versteht in etwa welche Problemstellung ich lösen möchte... Habt ihr für die gleiche/ähnliche Aufgabenstellung bereits bessere/funktionierende Ansätze entdeckt? Wenn ja, wie sehen diese aus..?
Vielen Dank im Voraus.
Anhänge
Zuletzt bearbeitet: