loake UDT - Werte über Pointer in DB kopieren

Pico1184

Level-2
Beiträge
332
Reaktionspunkte
9
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,

ich habe ein komplexeres Problem und hoffe jemand von euch kann mir dabei helfen. Hoffe das ich es euch verständlich erklären kann!

Und zwar geht es darum für ein Visualisierungssystem Daten von Anlagenkomponenten in einem DB "aufzubereiten". Bei mir heißt dieser "DB_Status".

Desweiteren habe ich eine "UDT_Status" (WORD) angelegt, welche alle möglichen Zustände für Komponenten der Anlage enthält.

Nun enthält mein "DB_Status" für jede Anlagenkomponente einen Eintrag vom Typ UDT_Status z.B.:

0.0-------Komponente 1 -------- UDT_Status
2.0-------Komponente 2 -------- UDT_Status

Soweit so gut. Nun habe ich in meinen FBs, welche die Anlagenkomponenten steuern z.B. "FB_Komponente_1" eine temporäre Variable / Struktur vom Typ "UDT_Status" welche je nach Zustand der Komponente im FB über z.B. "UDT_Status.Enable" oder "UDT_Status.Error" gesetzt werden. Dies aber alles über die lokale Variable.

Ich hätte nun gerne einen "FB_Copy_Status" (soll die lokale UDT in den DB_Status kopieren), welcher als Input Parameter einen Pointer auf den Datenbereich im DB_Status und einen Parameter auf die lokale UDT des Komponenten FBs enthält.

Nun habe ich schon alles mögliche probiert und bekomms leider mit dem pointer nicht hin.

Ist das so überhaupt die richtige Vorgehensweise?

Vielleicht hat jemand eine Idee oder ein kleines Beispiel wie man eine lokal definierte UDT in einen DB Bereich kopieren kann!

Grüße Pico
 
Warum legst du nicht einfach bei deinen FBs einen IN_OUT Parameter von Typ des UDTs an, und schreibst dann die Werte direkt da rein? Dann brauchst du nichts umzukopieren.
An der Schnittstelle des FB schaltest du dann außen symbolisch den Eintrag des Schnittstellen DB an, z.B. "DB_Status".Komponente_1
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Weil ich gelesen hatte, dass so ein Zugriff....

"Zitat: Es ist gleichsam möglich eine Variable des globalen DB auf den der DB-Zeiger zeigt direkt anzusprechen, z.B.
[FONT=&quot]
[/FONT]
[FONT=&quot]U IO_UDT_Status.D_BO_Enable[/FONT]

Dieser Zugriff kostet jedoch nicht nachvollziehbar exorbitant hohe Zykluszeit weshalb von dieser Programmiertechnik abzuraten ist."

Was meinst du dazu??


Grüße Pico
 
Dieser Zugriff kostet jedoch nicht nachvollziehbar exorbitant hohe Zykluszeit weshalb von dieser Programmiertechnik abzuraten ist."

Was meinst du dazu??

Ich meine dazu, wenn einer schreibt dass es "nicht nachvollziehbar ist" er keine Ahnung davon hat was er da schreibt ;-)

Das ist sehr wohl nachvollziehbar warum das a) langsamer ist und b) mehr Speicher verbraucht.
Weil dann bei jedem Zugriff auf die UDT Variable der Datenbaustein der UDT-Variable geöffnet werden muss, Adressregister sichern etc.
Bei den aktuellen CPUs ist mir das aber relativ egal dass es mehr Speicher braucht. Ich lege mehr Wert auf eine vernünftige Programmstruktur.

Wenn du die UDT als IN_OUT Parameter übergibst, wird das auch als Pointer (6 Byte) übergeben. Nur hast du hier zusätzlich die Typpüberprüfung am Operanden. Somit kann keiner fälschlicherweise einen falschen UDT als Parameter anschalten.

Wenn der UDT nur ein Wort groß ist, kannst du ihn auch einfach als OUT-Variable anlegen. Dann wird der UDT nicht per Pointer sondert per Value übergeben, und du kannst z.B. mit Blockmove symbolisch eine Temp-UDT auf die OUT-UDT kopieren.
 
Okay das hört sich alles plausibel an!

Wollte das gerade mal ausprobieren, habe im FB eine In_Out Variable vom Typ des UDTs angelegt.

Wie muss ich allerding beim Aufruf des FBs vorgehen?

Hätte es so gedacht:

CALL "FB_Komponente_1" , "DB_Komponente_1"
Status_Komponente_1 :="DB_Status.Komponente_1"

Leider geht das nicht der Fehler lautet immer "Symbol Komponente_1 ist keine Komponente von DB_Status"?????????

Mit DB10.DBW0 funktioniert es auch nicht?!?!?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hätte es so gedacht:

CALL "FB_Komponente_1" , "DB_Komponente_1"
Status_Komponente_1 :="DB_Status.Komponente_1"

Leider geht das nicht der Fehler lautet immer "Symbol Komponente_1 ist keine Komponente von DB_Status"?????????

Mit DB10.DBW0 funktioniert es auch nicht?!?!?

UDTs gehen nur symbolisch zu beschalten. Die Anführunszeichen sind bei dir falsch gesetzt, es muss nur der DB in Anführungszeichen, also:
"DB_Status".Komponente_1
sollte funktionieren.
 
Leider kommt der gleiche Fehler!
Hatte die Anführungszeichen nur hier falsch gesetzt, im Programm war es richtig!

Mein "DB_Status" sieht so aus wie im angehängten Screenshot

Danke für dein Hilfe!

Grüße Pico
 

Anhänge

  • DB_Status.JPG
    DB_Status.JPG
    128 KB · Aufrufe: 30
hm komisch hab jetzt ein paar mal rumprobiert und nun gehts :confused:

Na ja danke dir auf jedenfall für deine Hilfe!

Grüße Pico
 
Zurück
Oben