Zuviel Werbung? - > Hier kostenlos beim SPS-Forum registrieren

Ergebnis 1 bis 9 von 9

Thema: loake UDT - Werte über Pointer in DB kopieren

  1. #1
    Registriert seit
    05.10.2006
    Beiträge
    324
    Danke
    11
    Erhielt 8 Danke für 7 Beiträge

    Standard


    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
    Zitieren Zitieren loake UDT - Werte über Pointer in DB kopieren  

  2. #2
    Registriert seit
    29.03.2004
    Beiträge
    5.735
    Danke
    143
    Erhielt 1.685 Danke für 1.225 Beiträge

    Standard

    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

  3. #3
    Pico1184 ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    05.10.2006
    Beiträge
    324
    Danke
    11
    Erhielt 8 Danke für 7 Beiträge

    Standard

    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.


    U IO_UDT_Status.D_BO_Enable

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

    Was meinst du dazu??


    Grüße Pico

  4. #4
    Registriert seit
    29.03.2004
    Beiträge
    5.735
    Danke
    143
    Erhielt 1.685 Danke für 1.225 Beiträge

    Standard

    Zitat Zitat von Pico1184 Beitrag anzeigen
    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.

  5. #5
    Pico1184 ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    05.10.2006
    Beiträge
    324
    Danke
    11
    Erhielt 8 Danke für 7 Beiträge

    Standard

    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?!?!?

  6. #6
    Registriert seit
    29.03.2004
    Beiträge
    5.735
    Danke
    143
    Erhielt 1.685 Danke für 1.225 Beiträge

    Standard

    Zitat Zitat von Pico1184 Beitrag anzeigen
    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.

  7. Folgender Benutzer sagt Danke zu Thomas_v2.1 für den nützlichen Beitrag:

    Pico1184 (24.08.2011)

  8. #7
    Pico1184 ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    05.10.2006
    Beiträge
    324
    Danke
    11
    Erhielt 8 Danke für 7 Beiträge

    Standard

    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
    Angehängte Grafiken Angehängte Grafiken

  9. #8
    Pico1184 ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    05.10.2006
    Beiträge
    324
    Danke
    11
    Erhielt 8 Danke für 7 Beiträge

    Standard

    hm komisch hab jetzt ein paar mal rumprobiert und nun gehts

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

    Grüße Pico

  10. #9
    Registriert seit
    29.03.2004
    Beiträge
    5.735
    Danke
    143
    Erhielt 1.685 Danke für 1.225 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Achso, dann natürlich
    "DB_Status".Status_Komponente_1

    Dein Parameter ist aber auch vom Typ "UDT_Status"?

Ähnliche Themen

  1. Speichrzugriff über Adresse aus ANY-Pointer
    Von MarkusP210 im Forum Simatic
    Antworten: 2
    Letzter Beitrag: 24.09.2009, 11:26
  2. Datenbaustein Werte kopieren
    Von doretan im Forum Simatic
    Antworten: 10
    Letzter Beitrag: 08.06.2009, 22:00
  3. Werte über Bedienpanel schreiben
    Von breno im Forum Simatic
    Antworten: 5
    Letzter Beitrag: 01.03.2009, 21:10
  4. Zugriff auf DB(String) über Pointer
    Von Thomas R im Forum Simatic
    Antworten: 2
    Letzter Beitrag: 14.03.2007, 21:04
  5. adressierung DB über Pointer
    Von TonyMono im Forum Simatic
    Antworten: 7
    Letzter Beitrag: 13.06.2006, 22:24

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •