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

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 11

Thema: SCL: Pointer auf Struct in DB

  1. #1
    Registriert seit
    02.08.2010
    Beiträge
    17
    Danke
    6
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo,

    ich würde gerne einen Zeiger auf eine Struktur in einem DB an einen FB übergeben, um die werte innerhalb der Struktur mit lokalen werten (innerhalb des FB) zu vergleichen.


    // UDT:
    Code:
    TYPE 
    sDataStr : STRUCT
                iNumAvailEntr : INT ; //[ ] number of available errer field entries 
                adiErrNumArr : ARRAY[1..100] OF DINT ; //local error numer array
            END_STRUCT;             
    END_TYPE
    // Global DB:
    Code:
    DATA_BLOCK g
        STRUCT
            sGlobStr      :   sDataStr;
        END_STRUCT
        BEGIN 
    END_DATA_BLOCK
    // FB, Beispiel
    Code:
    VAR_INPUT
        pGlobDataStr    : POINTER; //[] Pt auf g.sGlobStr
        sGlobDataStr AT pGlobDataStr : sDataStr; //für besseren zugriff
    END_VAR
    
        //Bsp.:
        // Arbeiten mit den Werten aus der globalen Struktur
        IF ( sGlobDataStr.iNumAvailEntr > 0 ) THEN
            ...
        END_IF;

    Die Frage ist nun, wie muss ich den FB aufrufen und wie müssen die Variablen/Pointer deklariert werden. Damit ich mit diesen vernünftig arbeiten kann.
    Ich möchte auf die Werte in der globalen Struktur nur lesend zugreifen. Daher möchte ich nicht unbedingt eine lokale kopie im FB anlegen, wenn dies nicht unbeding nötig ist.

    Vielen Dank schon mal, fürs Durchlesen und ggf. für eine hilfreiche Antwort.

    MFG
    DunderHEAD
    Zitieren Zitieren SCL: Pointer auf Struct in DB  

  2. #2
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.728
    Danke
    398
    Erhielt 2.406 Danke für 2.002 Beiträge

    Standard

    Hallo,
    der IN-Parameter deines FB muß dann auch vom Typ "sDataStr" sein - dann kann dein FB und SCL mit den eingelagerten Einzel-Variablen arbeiten (weil es sie dann kennt ...!).

    Gruß
    Larry

  3. #3
    DunderHEAD ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    02.08.2010
    Beiträge
    17
    Danke
    6
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Hallo,

    aber dann würden die Daten ja quasi doppelt vorliegen.
    - Zum Ersten im DB g
    - Zum Zweiten im instanz DB von FB

    Aber gerade das Anlegen der Daten (belegen von Platz) im instanz DB des FB würde ich gerne umgehen.
    Da im original die Struktur doch sehr groß ist, und auch das kopieren/übergeben an den FB Zeit benötigt.
    Daher ev. einen Zeiger auf die Struktur übergeben und diesen dann mit dem "AT" an eine Variable diesen Typs heften.

  4. #4
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.728
    Danke
    398
    Erhielt 2.406 Danke für 2.002 Beiträge

    Standard

    Naja ...
    Das mit dem Zeiger (Pointer) geht schon mal gar nicht. Wenn du den Datenbereich an sich übergeben möchtest, dann ginge das natürlich auch per ANY-Pointer - das würde die Sache dann auch nicht besser machen, da du dir dann die Daten wirklich erst "lokal" noch einmal abbilden müßtest.

    Da mein Vorschlag der einzige (im Rahmen deines Wunsches) machbare Weg ist - was spricht denn dagegen - außer dass du den UDT "sDataStr" auch dem FB bekannt machen mußt ? Du übergibst übrigens auch in dem Fall nicht den Datenbereich, sondern eine Referenz darauf ...

    Gruß
    Larry

  5. #5
    DunderHEAD ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    02.08.2010
    Beiträge
    17
    Danke
    6
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Hallo,

    nunja wirklich dagegen spricht nichts.. nur das ich dann in beiden DB etliche kB Speicher belege.

    Nach deinem Vorschlag müsste es dann so aussehen ja?

    // UDT:
    Code:
    TYPE 
    sDataStr : STRUCT
                iNumAvailEntr : INT ; //[ ] number of available errer field entries 
                adiErrNumArr : ARRAY[1..100] OF DINT ; //local error numer array
            END_STRUCT;             
    END_TYPE
    // Global DB:
    Code:
    DATA_BLOCK g
        STRUCT
            sGlobStr      :   sDataStr;
        END_STRUCT
        BEGIN 
    END_DATA_BLOCK
    // FB, +iDB als instanz DatenBaustein
    Code:
    VAR_INPUT
        sGlobDataStr : sDataStr; //für besseren zugriff
    END_VAR
    
        //Bsp.:
        // Arbeiten mit den Werten aus der globalen Struktur
        IF ( sGlobDataStr.iNumAvailEntr > 0 ) THEN
            ...
        END_IF;
    //PRG_CALL
    Code:
    FB.iDB( sGlobDataStr := g.sGlobStr);
    Das würde dann doch aber auch bedeuten, dass wenn ich im FB Daten in sGlobDataStr verändere sich diese automatisch/gleichzeitig auch im DB ändern. Oder?
    Zitieren Zitieren So?  

  6. #6
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.728
    Danke
    398
    Erhielt 2.406 Danke für 2.002 Beiträge

    Standard

    ... bei einem IN-Parameter bin ich mir da nicht so sicher (habe ich noch nie versucht). Wenn du das haben willst, dann wäre deine Struktur am IN_OUT (also Durchgang) richtig aufgehoben ...

    Gruß
    Larry

  7. Folgender Benutzer sagt Danke zu Larry Laffer für den nützlichen Beitrag:

    DunderHEAD (12.08.2010)

  8. #7
    DunderHEAD ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    02.08.2010
    Beiträge
    17
    Danke
    6
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Dachte, dass man mit etwas weniger Speicherverbrauch auskommt... aber so ist es dann auch ok.

    Dann kann ich dies jetzt ja so in mein Prog einpflegen!

    Vielen Dank für die Hilfe.
    Zitieren Zitieren Danke...  

  9. #8
    DunderHEAD ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    02.08.2010
    Beiträge
    17
    Danke
    6
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Entschuldigung für den doppel Post...

    Jetzt habe ich es im instanz DB von FB gesehen. Wenn ich die Struktur, sDataStr, in
    - Input oder
    - Output
    anlege, dann braucht sie den viel Speicher (Speicher für alle beinhalteten Variablen) im instanz DB.
    Wenn ich die Struktur aber im Bereich
    - In_Out
    anlege belegt diese "nur" 6 Byte (entspricht einem Zeiger?!).

    Dann lasse ich sie jetzt im IN_Out und dann habe ich ja was ich will...
    Zitieren Zitieren Ich glaube jetzt hab ich's...  

  10. #9
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.728
    Danke
    398
    Erhielt 2.406 Danke für 2.002 Beiträge

    Standard

    Das ist schön ...
    Ich muß dir aber auch gestehen, dass ich die UDT's bislang auch immer "nur" als IN_OUT übergeben habe. Deshalb war mir deine Abneigung dagegen auch nicht wirklich klar ...

    Gruß
    Larry

  11. #10
    Registriert seit
    18.03.2008
    Beiträge
    267
    Danke
    3
    Erhielt 26 Danke für 26 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Zitat Zitat von DunderHEAD Beitrag anzeigen
    Wenn ich die Struktur aber im Bereich
    - In_Out
    anlege belegt diese "nur" 6 Byte (entspricht einem Zeiger?!).
    Genau.
    Boolsche IN_OUT belegen nur ein Bit, alle anderen Datentypen werden beim IN_OUT als Pointer (6 Byte) übergeben.

  12. Folgender Benutzer sagt Danke zu Chefmech für den nützlichen Beitrag:

    DunderHEAD (13.08.2010)

Ähnliche Themen

  1. Antworten: 5
    Letzter Beitrag: 08.04.2011, 14:36
  2. Struct vergleich mit pointer und sizeof
    Von hago10 im Forum CODESYS und IEC61131
    Antworten: 17
    Letzter Beitrag: 31.01.2011, 18:22
  3. ANY-Pointer auf temporären Struct im FB
    Von ChristianPaier im Forum Simatic
    Antworten: 28
    Letzter Beitrag: 21.03.2010, 12:39
  4. Twincat POINTER STRUCT
    Von Basstarono im Forum CODESYS und IEC61131
    Antworten: 3
    Letzter Beitrag: 21.07.2008, 11:30
  5. pointer über temp struct...
    Von Jochen Kühner im Forum Simatic
    Antworten: 5
    Letzter Beitrag: 24.09.2006, 10:23

Lesezeichen

Berechtigungen

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