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

Seite 1 von 3 123 LetzteLetzte
Ergebnis 1 bis 10 von 25

Thema: SCL indirekte Adressierung von Strukturen

  1. #1
    Anonymous Gast

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo

    Ich habe einen DB mit mehreren Datensätze. Diese haben alle die gleiche Struktur. Diese will ich in einer FOR-Schlaufe bearbeiten. Wie muss ich die Strukturen indirekte Adressieren damit ich auf die Daten zugreifen kann.

    Ich habe ein Beispiel geschrieben um die indirekte Adressierung zu testen. Leider funktioniert es nicht. Was habe ich falsch gemacht?

    Code:
    TYPE ParameterDefinition    
        STRUCT
            DBNumber    : WORD;     // DB-Nummer der Daten
            WordNumber  : INT;      // Startword erster Datentrecord
            Number      : INT;      // Anzahl Datenrecord
            Length      : INT;      // Datenlänge
            Spare       : INT;      // Reserve, da es ein Compelierfehler gibt, wenn die Struktur nur 4 Word lange ist
        END_STRUCT
    END_TYPE
    
    TYPE DataDefinition
        STRUCT
            TimeSet     : INT;      // Vorgabezeit
            TimeActual  : INT;      // Aktuelle zeit
            Length      : INT;      // Längemessung
            Spare1      : INT;      // Reserve, da es ein Compelierfehler gibt, wenn die Struktur nur 4 Word lange ist
            Spare2      : INT;
        END_STRUCT
    END_TYPE
    
    DATA_BLOCK ParameterDB
      STRUCT
        Parameter : ParameterDefinition;      // Parameter
      END_STRUCT;
    BEGIN
    END_DATA_BLOCK
    
    DATA_BLOCK DataDB
      STRUCT
        Data_1 : DataDefinition;    // Daten Element 1
        Data_2 : DataDefinition;    // Daten Element 2
        Data_3 : DataDefinition;    // Daten Element 3
        Data_4 : DataDefinition;    // Daten Element 4
        Data_5 : DataDefinition;    // Daten Element 5 
      END_STRUCT;
    
    BEGIN
    END_DATA_BLOCK
    
    FUNCTION "TestDaten" : VOID 
    TITLE = 'Daten von 5 Elementen bearbeiten'
    VERSION : '1.0'
    AUTHOR  : KLE
    NAME    : Test1
    FAMILY  : Exor
    //KNOW_HOW_PROTECT
    
    VAR_TEMP 
        Daten               : DataDefinition;
        pDaten AT Daten     : ANY;                          // Pointer Daten
        index               : INT;                          // Schleifenzähler
    END_VAR 
    BEGIN
        pDaten   := WORD_TO_BLOCK_DB(ParameterDB.Parameter.DBNumber).DW[ParameterDB.Parameter.WordNumber];   // Pointerzuweisung erster Datensatz
    
        FOR index:=1 TO ParameterDB.Parameter.Number DO     // In der Schlaufe werden alle Datensätzte bearbeitet.
            Daten.TimeSet    := 345        ;                // Hier habe ich einfach einige Zuweisungen gemacht, dass ich testen kann.
            Daten.TimeActual := Daten.TimeActual + 1;       // Leider funktionieren die Pointer nicht.
            IF Daten.TimeSet > Daten.TimeActual THEN
                Daten.Length := 123;
            END_IF;
            pDaten := WORD_TO_BLOCK_DB(ParameterDB.Parameter.DBNumber).DW[ParameterDB.Parameter.WordNumber + (ParameterDB.Parameter.Length * index)];    // Pointerzuweisung nächster Datensatz
        END_FOR;
    END_FUNCTION
    
    ORGANIZATION_BLOCK OB1
    TITLE = 'Main Program (Cycle)'
    VERSION : '0.0'
    
    VAR_TEMP
        OB1_EV_CLASS   : BYTE ;   //Ereignisklasse und Kennung
        OB1_SCAN_1     : BYTE ;   //B#16#01: Abschluss des Neustarts, B#16#02: Abschluß des Wiederanlaufes
        OB1_PRIORITY   : BYTE ;   //Prioritätsklasse: 1
        OB1_OB_NUMBR   : BYTE ;   //OB-Nummer, OB1
        OB1_RESERVED_1 : BYTE ;   //Reserviert
        OB1_RESERVED_2 : BYTE ;   //Reserviert
        OB1_PREV_CYCLE : INT ;    //Laufzeit des vorheriegen Zyklus
        OB1_MIN_CYCLE  : INT ;    //Minimale Zykluszeit seit dem letzten Anlauf
        OB1_MAX_CYCLE  : INT ;    //Maximale Zykluszeit seit dem letzten Anlauf
        OB1_DATE_TIME  : DATE_AND_TIME ;    //Datum und Uhrzeit, zu dem der OB angefordert wurde  
    END_VAR
    
    BEGIN
        TestDaten();                     // Aufruf FC
    END_ORGANIZATION_BLOCK

    MfG und zum Voraus vielen Dank

    Leo Künzle
    Zitieren Zitieren Gelöst: SCL indirekte Adressierung von Strukturen  

  2. "so können wir damit nichts anfangen. damit der korrekt übersetzt werden kann brauchen wir die zuordnungliste."


  3. #2
    Registriert seit
    27.05.2004
    Ort
    Thüringen/Berlin
    Beiträge
    12.218
    Danke
    533
    Erhielt 2.696 Danke für 1.948 Beiträge

    Standard

    Speicher die Quelle mal bitte absolut und stell den Code nochmal ein, durch die Symbolik ist der Code nicht zu übersetzen (bei mit jedenfalls) und von Hand ist mir das ehrlich zu mühselig. (Oder fehlt ein Code-Stück?)
    Gruß
    Ralle

    ... there\'re 10 kinds of people ... those who understand binaries and those who don\'t …
    and the third kinds of people … those who love TIA-Portal

  4. #3
    Anonymous Gast

    Standard

    Ich habe das Programm nun angepasst. Es wird der FC100 und der DB20 erstellt.

    Code:
    TYPE ParameterDefinition    
        STRUCT 
            DBNumber    : WORD;     // DB-Nummer der Daten 
            WordNumber  : INT;      // Startword erster Datentrecord 
            Number      : INT;      // Anzahl Datenrecord 
            Length      : INT;      // Datenlänge 
            Spare       : INT;      // Reserve 
        END_STRUCT 
    END_TYPE 
    
    TYPE DataDefinition 
        STRUCT 
            TimeSet     : INT;      // Vorgabezeit 
            TimeActual  : INT;      // Aktuelle zeit 
            Length      : INT;      // Längemessung 
            Spare1      : INT;      // Reserve 
            Spare2      : INT;      // Reserve
        END_STRUCT 
    END_TYPE 
    
    DATA_BLOCK DB20 
      STRUCT 
        Parameter : ParameterDefinition;      // Parameter 
      END_STRUCT; 
    BEGIN 
    END_DATA_BLOCK 
    
    DATA_BLOCK DataDB 
      STRUCT 
        Data_1 : DataDefinition;    // Daten Element 1 
        Data_2 : DataDefinition;    // Daten Element 2 
        Data_3 : DataDefinition;    // Daten Element 3 
        Data_4 : DataDefinition;    // Daten Element 4 
        Data_5 : DataDefinition;    // Daten Element 5 
      END_STRUCT; 
    
    BEGIN 
    END_DATA_BLOCK 
    
    FUNCTION FC100 : VOID 
    TITLE = 'Daten von 5 Elementen bearbeiten' 
    VERSION : '1.0' 
    AUTHOR  : KLE 
    NAME    : Test1 
    FAMILY  : Exor 
    //KNOW_HOW_PROTECT 
    
    VAR_TEMP 
        Daten               : DataDefinition; 
        pDaten AT Daten     : ANY;                          // Pointer Daten 
        index               : INT;                          // Schleifenzähler 
    END_VAR 
    BEGIN 
        pDaten   := WORD_TO_BLOCK_DB(DB20.Parameter.DBNumber).DW[DB20.Parameter.WordNumber];   // Pointerzuweisung erster Datensatz 
    
        FOR index:=1 TO DB20.Parameter.Number DO     // In der Schlaufe werden alle Datensätzte bearbeitet. 
            Daten.TimeSet    := 345        ;                // Hier habe ich einfach einige Zuweisungen gemacht, dass ich testen kann. 
            Daten.TimeActual := Daten.TimeActual + 1;       // Leider funktionieren die Pointer nicht. 
            IF Daten.TimeSet > Daten.TimeActual THEN 
                Daten.Length := 123; 
            END_IF; 
            pDaten := WORD_TO_BLOCK_DB(DB20.Parameter.DBNumber).DW[DB20.Parameter.WordNumber + (DB20.Parameter.Length * index)];    // Pointerzuweisung nächster Datensatz 
        END_FOR; 
    END_FUNCTION 
    
    ORGANIZATION_BLOCK OB1 
    TITLE = 'Main Program (Cycle)' 
    VERSION : '0.0' 
    
    VAR_TEMP 
        OB1_EV_CLASS   : BYTE ;   //Ereignisklasse und Kennung 
        OB1_SCAN_1     : BYTE ;   //B#16#01: Abschluss des Neustarts, B#16#02: Abschluß des Wiederanlaufes 
        OB1_PRIORITY   : BYTE ;   //Prioritätsklasse: 1 
        OB1_OB_NUMBR   : BYTE ;   //OB-Nummer, OB1 
        OB1_RESERVED_1 : BYTE ;   //Reserviert 
        OB1_RESERVED_2 : BYTE ;   //Reserviert 
        OB1_PREV_CYCLE : INT ;    //Laufzeit des vorheriegen Zyklus 
        OB1_MIN_CYCLE  : INT ;    //Minimale Zykluszeit seit dem letzten Anlauf 
        OB1_MAX_CYCLE  : INT ;    //Maximale Zykluszeit seit dem letzten Anlauf 
        OB1_DATE_TIME  : DATE_AND_TIME ;    //Datum und Uhrzeit, zu dem der OB angefordert wurde  
    END_VAR 
    
    BEGIN 
        FC100();                     // Aufruf FC 
    END_ORGANIZATION_BLOCK
    Gruss Leo

  5. #4
    Registriert seit
    20.06.2003
    Ort
    Sauerland.NRW.Deutschland
    Beiträge
    4.850
    Danke
    78
    Erhielt 800 Danke für 543 Beiträge

    Standard

    so können wir damit nichts anfangen. damit der korrekt übersetzt werden kann brauchen wir die zuordnungliste.
    .
    mfg Volker .......... .. alles wird gut ..

    =>Meine Homepage .. direkt zum Download

    Meine Definition von TIA: Total Inakzeptable Applikation

  6. #5
    Anonymous Gast

    Standard

    Ich habe einen DB vergessen zu ersetzten. Eine Zuordnungliste habe ich nicht erstellt.

    Code:
    TYPE ParameterDefinition    
        STRUCT 
            DBNumber    : WORD;     // DB-Nummer der Daten 
            WordNumber  : INT;      // Startword erster Datentrecord 
            Number      : INT;      // Anzahl Datenrecord 
            Length      : INT;      // Datenlänge 
            Spare       : INT;      // Reserve 
        END_STRUCT 
    END_TYPE 
    
    TYPE DataDefinition 
        STRUCT 
            TimeSet     : INT;      // Vorgabezeit 
            TimeActual  : INT;      // Aktuelle zeit 
            Length      : INT;      // Längemessung 
            Spare1      : INT;      // Reserve 
            Spare2      : INT;      // Reserve
        END_STRUCT 
    END_TYPE 
    
    DATA_BLOCK DB20 
      STRUCT 
        Parameter : ParameterDefinition;      // Parameter 
      END_STRUCT; 
    BEGIN 
    END_DATA_BLOCK 
    
    DATA_BLOCK DB21 
      STRUCT 
        Data_1 : DataDefinition;    // Daten Element 1 
        Data_2 : DataDefinition;    // Daten Element 2 
        Data_3 : DataDefinition;    // Daten Element 3 
        Data_4 : DataDefinition;    // Daten Element 4 
        Data_5 : DataDefinition;    // Daten Element 5 
      END_STRUCT; 
    
    BEGIN 
    END_DATA_BLOCK 
    
    FUNCTION FC100 : VOID 
    TITLE = 'Daten von 5 Elementen bearbeiten' 
    VERSION : '1.0' 
    AUTHOR  : KLE 
    NAME    : Test1 
    FAMILY  : Exor 
    //KNOW_HOW_PROTECT 
    
    VAR_TEMP 
        Daten               : DataDefinition; 
        pDaten AT Daten     : ANY;                          // Pointer Daten 
        index               : INT;                          // Schleifenzähler 
    END_VAR 
    BEGIN 
        pDaten   := WORD_TO_BLOCK_DB(DB20.Parameter.DBNumber).DW[DB20.Parameter.WordNumber];   // Pointerzuweisung erster Datensatz 
    
        FOR index:=1 TO DB20.Parameter.Number DO     // In der Schlaufe werden alle Datensätzte bearbeitet. 
            Daten.TimeSet    := 345        ;                // Hier habe ich einfach einige Zuweisungen gemacht, dass ich testen kann. 
            Daten.TimeActual := Daten.TimeActual + 1;       // Leider funktionieren die Pointer nicht. 
            IF Daten.TimeSet > Daten.TimeActual THEN 
                Daten.Length := 123; 
            END_IF; 
            pDaten := WORD_TO_BLOCK_DB(DB20.Parameter.DBNumber).DW[DB20.Parameter.WordNumber + (DB20.Parameter.Length * index)];    // Pointerzuweisung nächster Datensatz 
        END_FOR; 
    END_FUNCTION 
    
    ORGANIZATION_BLOCK OB1 
    TITLE = 'Main Program (Cycle)' 
    VERSION : '0.0' 
    
    VAR_TEMP 
        OB1_EV_CLASS   : BYTE ;   //Ereignisklasse und Kennung 
        OB1_SCAN_1     : BYTE ;   //B#16#01: Abschluss des Neustarts, B#16#02: Abschluß des Wiederanlaufes 
        OB1_PRIORITY   : BYTE ;   //Prioritätsklasse: 1 
        OB1_OB_NUMBR   : BYTE ;   //OB-Nummer, OB1 
        OB1_RESERVED_1 : BYTE ;   //Reserviert 
        OB1_RESERVED_2 : BYTE ;   //Reserviert 
        OB1_PREV_CYCLE : INT ;    //Laufzeit des vorheriegen Zyklus 
        OB1_MIN_CYCLE  : INT ;    //Minimale Zykluszeit seit dem letzten Anlauf 
        OB1_MAX_CYCLE  : INT ;    //Maximale Zykluszeit seit dem letzten Anlauf 
        OB1_DATE_TIME  : DATE_AND_TIME ;    //Datum und Uhrzeit, zu dem der OB angefordert wurde  
    END_VAR 
    
    BEGIN 
        FC100();                     // Aufruf FC 
    END_ORGANIZATION_BLOCK
    mfg Leo

    E-Mail leo.kuenzle@exor.ch

  7. #6
    Registriert seit
    20.06.2003
    Ort
    Sauerland.NRW.Deutschland
    Beiträge
    4.850
    Danke
    78
    Erhielt 800 Danke für 543 Beiträge

    Standard

    kann gar nicht sein.
    also ich bekomme beim übersetzen 11 fehler und über 20 warnungen weil die variablen als symbol vorliegen.
    .
    mfg Volker .......... .. alles wird gut ..

    =>Meine Homepage .. direkt zum Download

    Meine Definition von TIA: Total Inakzeptable Applikation

  8. #7
    Anonymous Gast

    Standard

    Bei welchen Symbolen gibt es eine Fehlermeldung? Ich kann bei mir den Code in ein neues Projket ohne Problem einlesen.


    mfg

    Leo Künzle

  9. #8
    Anonymous Gast

    Standard

    So jetzt habe ich den Fehler bei mir gefunden. Das Programm sollte jetzt compilierbar sein.


    Code:
    TYPE UDT1    
        STRUCT 
            DBNumber    : WORD;     // DB-Nummer der Daten 
            WordNumber  : INT;      // Startword erster Datentrecord 
            Number      : INT;      // Anzahl Datenrecord 
            Length      : INT;      // Datenlänge 
            Spare       : INT;      // Reserve 
        END_STRUCT 
    END_TYPE 
    
    TYPE UDT2 
        STRUCT 
            TimeSet     : INT;      // Vorgabezeit 
            TimeActual  : INT;      // Aktuelle zeit 
            Length      : INT;      // Längemessung 
            Spare1      : INT;      // Reserve 
            Spare2      : INT;      // Reserve
        END_STRUCT 
    END_TYPE 
    
    DATA_BLOCK DB20 
      STRUCT 
        Parameter : UDT1;      // Parameter 
      END_STRUCT; 
    BEGIN 
    END_DATA_BLOCK 
    
    DATA_BLOCK DB21 
      STRUCT 
        Data_1 : UDT2;    // Daten Element 1 
        Data_2 : UDT2;    // Daten Element 2 
        Data_3 : UDT2;    // Daten Element 3 
        Data_4 : UDT2;    // Daten Element 4 
        Data_5 : UDT2;    // Daten Element 5 
      END_STRUCT; 
    
    BEGIN 
    END_DATA_BLOCK 
    
    FUNCTION FC100 : VOID 
    TITLE = 'Daten von 5 Elementen bearbeiten' 
    VERSION : '1.0' 
    AUTHOR  : KLE 
    NAME    : Test1 
    FAMILY  : Exor 
    //KNOW_HOW_PROTECT 
    
    VAR_TEMP 
        Daten               : UDT2; 
        pDaten AT Daten     : ANY;                          // Pointer Daten 
        index               : INT;                          // Schleifenzähler 
    END_VAR 
    BEGIN 
        pDaten   := WORD_TO_BLOCK_DB(DB20.Parameter.DBNumber).DW[DB20.Parameter.WordNumber];   // Pointerzuweisung erster Datensatz 
    
        FOR index:=1 TO DB20.Parameter.Number DO     // In der Schlaufe werden alle Datensätzte bearbeitet. 
            Daten.TimeSet    := 345        ;                // Hier habe ich einfach einige Zuweisungen gemacht, dass ich testen kann. 
            Daten.TimeActual := Daten.TimeActual + 1;       // Leider funktionieren die Pointer nicht. 
            IF Daten.TimeSet > Daten.TimeActual THEN 
                Daten.Length := 123; 
            END_IF; 
            pDaten := WORD_TO_BLOCK_DB(DB20.Parameter.DBNumber).DW[DB20.Parameter.WordNumber + (DB20.Parameter.Length * index)];    // Pointerzuweisung nächster Datensatz 
        END_FOR; 
    END_FUNCTION 
    
    ORGANIZATION_BLOCK OB1 
    TITLE = 'Main Program (Cycle)' 
    VERSION : '0.0' 
    
    VAR_TEMP 
        OB1_EV_CLASS   : BYTE ;   //Ereignisklasse und Kennung 
        OB1_SCAN_1     : BYTE ;   //B#16#01: Abschluss des Neustarts, B#16#02: Abschluß des Wiederanlaufes 
        OB1_PRIORITY   : BYTE ;   //Prioritätsklasse: 1 
        OB1_OB_NUMBR   : BYTE ;   //OB-Nummer, OB1 
        OB1_RESERVED_1 : BYTE ;   //Reserviert 
        OB1_RESERVED_2 : BYTE ;   //Reserviert 
        OB1_PREV_CYCLE : INT ;    //Laufzeit des vorheriegen Zyklus 
        OB1_MIN_CYCLE  : INT ;    //Minimale Zykluszeit seit dem letzten Anlauf 
        OB1_MAX_CYCLE  : INT ;    //Maximale Zykluszeit seit dem letzten Anlauf 
        OB1_DATE_TIME  : DATE_AND_TIME ;    //Datum und Uhrzeit, zu dem der OB angefordert wurde  
    END_VAR 
    
    BEGIN 
        FC100();                     // Aufruf FC 
    END_ORGANIZATION_BLOCK
    mfg

    Leo

  10. #9
    Registriert seit
    06.10.2003
    Beiträge
    3.405
    Danke
    447
    Erhielt 502 Danke für 406 Beiträge

    Standard

    Hallo,

    ich habe unter SCL noch nie einen ANY-Pointer verwendet, dachte das geht garnicht. Ich möchte das heute auch nicht mehr nachvollziehen.
    Aber die "Fehler" beim Compilieren liegen wahrscheinlich an der Option unter Extras-Einstellungen "Bausteinnummer automatisch erzeugen".

    SCL V5.3 SP1

    Gruß, Onkel
    Es gibt viel mehr Leute, die freiwillig aufgeben, als solche, die echt scheitern.
    Henry Ford

  11. #10
    Registriert seit
    20.06.2003
    Ort
    Sauerland.NRW.Deutschland
    Beiträge
    4.850
    Danke
    78
    Erhielt 800 Danke für 543 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    den letzten code konnte ich übersetzen.

    aber das schau ich mir in 1 woche mal genauer an , wenns denn noch aktuell ist.

    ----
    schönen urlaub
    .
    mfg Volker .......... .. alles wird gut ..

    =>Meine Homepage .. direkt zum Download

    Meine Definition von TIA: Total Inakzeptable Applikation

Ähnliche Themen

  1. S7 Indirekte Adressierung
    Von Rommani im Forum Simatic
    Antworten: 18
    Letzter Beitrag: 02.05.2014, 22:05
  2. Indirekte Adressierung
    Von Kuddel30 im Forum Simatic
    Antworten: 4
    Letzter Beitrag: 20.11.2009, 12:52
  3. indirekte Adressierung
    Von Christian84 im Forum CODESYS und IEC61131
    Antworten: 9
    Letzter Beitrag: 21.02.2009, 09:09
  4. Indirekte Adressierung von Bit's in SCL
    Von tarzipan7 im Forum Simatic
    Antworten: 7
    Letzter Beitrag: 23.01.2009, 12:37
  5. Indirekte adressierung DB
    Von elko im Forum Simatic
    Antworten: 2
    Letzter Beitrag: 25.04.2006, 22:00

Lesezeichen

Berechtigungen

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