TIA Symbolisches Lesen/Schreiben von dynamisch adressierten Global-DBs

pxZ

Level-2
Beiträge
17
Reaktionspunkte
3
Zuviel Werbung?
-> 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:

1690308703326.png



Referenz-DB:
1690308715521.png

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


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

1690308758667.png

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:
1690308147859.png

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


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

  • 1690308134381.png
    1690308134381.png
    5,6 KB · Aufrufe: 7
Zuletzt bearbeitet:
Darf ich mal fragen warum es ausgerechnet für jede Station ein DB sein muss ?
Du könntest das alles (bei gleichem Daten-UDT für jede Station) in einem DB ablegen und dann hättest du doch schon das, was du haben willst :
- ein Array of Station_UDT
- symbolischen Zugriff
- du kannst das einzelne Array-Element (also die Station komplett) komfortabel nach irgendwohin übergeben
- uvm.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Klingt vermutlich "blöd", aber wenn man nun zB hunderte Stationen mit einem wesentlich umfangreicheren UDT hat => bei der IBS kann man sich dann durch den Riesen DB durchscrollen oder eben bei Einzel-DBs per F7 und der Eingabe von "Station_1" direkt den gewünschten Bereich bzw. DB öffnen

Diese "Monolith"-Struktur kam mir auch schon in den Sinn, wurde aber vom IBS Personal aus dem zuvor genannten Grund abgelehnt.
 
Dann mußt du es so machen (der Kunde ist König) - aber dann brauchst du auch keinen DB_ANY sondern halt die vielen DB's vom Typ UDT_Station. Ob das beim Durchscrollen im Projekt dann weniger Aufwand ist ... :unsure:
 
=> gibt es auch eine Möglichkeit, um auf einzelne Variablen innerhalb des DBs symbolisch zuzugreifen?

Versuchs mal mit REF_TO, ist vergleichbar mit einem Pointer aus C/C++ und (laut Big S) performanter als Variant.
Das könnte (mal schnell hingeschmiert) so aussehen:
DBx1: ein DB vom Typ demoType
DBx2: ein Global DB mit data als Typ demoType Variable
und je nach dem wo "pointer" steht wird halt der Wert in einen (oder keinen) der DBs geschrieben.
1690312623902.png


Wenn du natürlich symbolisch arbeitest, kommst du nicht drumhin, alle DB Namen in irgendeiner Art Liste zu halten. Wenn du den Sums öfter brauchst als in einem Baustein, könnte ich mir vorstellen, da statt dem DB_Reference einen "FC_REF" zu bauen, der vorne die Stationsnummer nimmt und mittels case() ein REF_TO "stationsUDT" returnt.
1690318153990.png
Das skaliert auch wunderbar für viele Stationen und viele UDT Einträge.

Damit kannst du dann eine Referenz zuweisen, mit der du im Nachgang hantierst. So würde
Code:
L value
AUF DB[statNo]
L DBW2
zu
Code:
_ref := FC_REF(statNo);
if _ref <> null then // kann auch weg bleiben, wenn du 100% immer eine Referenz übergibst die nicht NULL ist
   _ref^.intWert := value;
end_if;
werden.

So genutzt habe ich das (mehr als in PLCSIM gerade) auch nicht, aber berichte gerne wenn du dich dafür entscheidest.
Ansonsten Siemens SCL II, aber ich denke den Inhalt von dem Kurs kann man sich mit einem Grundlegenden Verständnis für Speicher und Zeiger und der TIA Hilfe auch selbst aneignen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Klingt vermutlich "blöd", aber wenn man nun zB hunderte Stationen mit einem wesentlich umfangreicheren UDT hat => bei der IBS kann man sich dann durch den Riesen DB durchscrollen oder eben bei Einzel-DBs per F7 und der Eingabe von "Station_1" direkt den gewünschten Bereich bzw. DB öffnen

Diese "Monolith"-Struktur kam mir auch schon in den Sinn, wurde aber vom IBS Personal aus dem zuvor genannten Grund abgelehnt.
Da würde ich mit dem IBS-Personal noch mal sprechen.

Ob ich mich nun durch einen DB scrollen muss oder im Programmbaum den entsprechenen DB suchen ist meiner Meinung nach egal. Scrollen musst du sowieso. Aber wenn du merkst das du dich um eine Station vertan hast bist du mit einem DB schneller.

Ich hatte "früher" auch für jede Station (bei mir Förderbänder) einen eigenen DB mit Fördergutdaten. Das ist jetzt in einem DB und ich möchte es nicht mehr anders machen.
 
Danke für eure Antworten.

Ich habe dann schließlich auch das REF_TO Beispiel weiterverfolgt, siehe auch zB:

oder im TIA V15.1 Handbuch auf Seite 5050:

Das ist genau die Lösung, die ich brauche - habe ich auch so umgesetzt und funktioniert wunderbar, sowohl lesend als auch schreibend. Einzig die etwas umständliche Lösung mit den 2 nicht aufgerufenen FCs die man für das DB_ANY_TO_VARIANT benötigt um Fehlercode #8155 zu eliminieren ist etwas seltsam:

1690354114326.png
 
Zurück
Oben