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

Ergebnis 1 bis 9 von 9

Thema: Dynamische Datenstrukturen in S7-SCL

  1. #1
    Registriert seit
    01.02.2008
    Beiträge
    28
    Danke
    2
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo,
    ist es irgendwie möglich dynamische Datenstrukturen in SCL anzulegen? Speziell möchte ich in Abhängigkeit eines Parameters ein UDT (oder auch DB) mit Verschiedenem Inhalt erzeugen.

    Prinzipiell stelle ich mir solch eine Struktur vor:

    Code:
    TYPE
      myType: STRUCT
        myVar :ANY; // ich weiss ANY geht leider nicht in Strukt
      END_STRUCT;
    END_TYPE
     
    ...
     
    VAR
      aStruct : STRUCT
        iInt1 : INT;
        iInt2 : INT;
      END_STRUCT;
      
      bStuct: STRUCT
        iInt1 : INT;
      END_STRUCT;
     
      variable : myType;
     
    END_VAR
     
     
    ...
     
    if ... THEN
      variable.myVar := aStruct
    ELSE
      variable.myVar := bStruct
    END_ELSE;

    Geht sowas? Oder hat jemand eine Idee wie man sowas in der Art realisieren kann?

    Grüsse
    Jens
    Geändert von jck0815 (18.11.2008 um 15:10 Uhr)
    Zitieren Zitieren Dynamische Datenstrukturen in S7-SCL  

  2. #2
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.708
    Danke
    398
    Erhielt 2.397 Danke für 1.997 Beiträge

    Standard

    Hallo Jens,
    SCL kann nur mit Strukturen arbeiten, die dem Compiler zum Zeitpunkt der Compilierung bekannt sind. Dynamisch oder Variabel im Sinne deiner Vorgabe geht so ohne Weiteres also nicht ...

    Was willst du denn konkret machen ? Vielleicht gibt es ja trotzdem eine Alternative ...

    Gruß
    LL

  3. #3
    jck0815 ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    01.02.2008
    Beiträge
    28
    Danke
    2
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Hallo,
    also ich möchte konkret eine UDP-Kommunikation zwischen einer
    Dezentrale Peripherie ET 200S Interfacemodul IM151-8 PN/DP CPU
    und einer WinAC bewerkstelligen.

    Der Datenteil kann abhängig einer ID im Header verschieden aufgebaut sein. Es sind 17 verschiedene Typen möglich.

    Ich dachte mir, ich bilde die einzelnen Strukturen nach und je nach ID im Header packe ich den passenden UDT mit in ein Struct (Datenbaustein), den ich dann per TUSend verschicke. Alternativ kann ich auch einfach alle Möglichkeiten abbilden, einfügen und nur den relevanten Teil mit Daten füllen, danach wegschicken / lesen. Also sowas wie:
    Code:
    type 
      packet : STRUCT
     
        headerVar1: INT;
        headerPacketType : INT;
        headerDataLenght : INT;
     
        data : STRUCT
          intData : INT;
          sData : String;
          // je nach PacketType evtl. noch ein paar Variablen oder andere... 
        END_STRUCT;
     
    -------- bis hier wäre schön -------------
        data2 : STRUCT
          shortData : SHORT;
          wData : WORD;
          // je nach PacketType evtl. noch ein paar Variablen oder andere... 
        END_STRUCT;
    ....
     
        data17 : STRUCT
          intData : INT;
          dwData : DWORD;
          // je nach PacketType evtl. noch ein paar Variablen oder andere... 
        END_STRUCT;
     
    -------- wäre halt die unschöne Lösung --------
     
      END_STRUCT;
    END_TYPE;

    Aber da ich aus der Informatik-Ecke komme wiederstrebt mir noch solch eine Lösung

    Grüsse
    Jens
    Geändert von jck0815 (18.11.2008 um 16:30 Uhr)

  4. #4
    Registriert seit
    06.10.2004
    Ort
    Kopenhagen.
    Beiträge
    4.616
    Danke
    377
    Erhielt 799 Danke für 642 Beiträge

    Standard

    Ich habe mich versucht. Aber keine ahnung ob es geht. Es kompiliert aber ist nicht getestet.

    Das trick ist mit AT dieselbe Speicheraddressen mit verschiedene Strukturen anzusprechen.

    Code:
    TYPE DefaultStructure
        STRUCT
        byteArray : ARRAY[0..99] OF BYTE ; // Platz reservieren so das es ausreicht für jeden Fall!
        END_STRUCT 
    END_TYPE
     
    TYPE Specifictype1
        STRUCT
        bi1, bi2 : BOOL ;
        r1 : REAL ;
        END_STRUCT 
    END_TYPE
     
    TYPE Specifictype2
        STRUCT
        bi1, bi2, bi3, bi4 : BOOL ;
        r1, r2, r3 : REAL ;
        END_STRUCT 
    END_TYPE
     
    FUNCTION FC20 : VOID
    VAR_INPUT
        inData : DefaultStructure ;
        inType1 AT inData : SpecificType1 ;
        inType2 AT inData : SpecificType2 ;
        inDataTyp : INT ;
    END_VAR
    VAR_output
       outData : DefaultStructure ;
       outType1 AT outData : SpecificType1 ;
       outType2 AT outData : SpecificType2 ;
    END_VAR
     
    BEGIN
     
    IF inDataTyp = 1 THEN 
      OutType1.bi1 := TRUE ;
      OutType1.r1 := 12.34 ;
      OutType1.bi2 := InType1.bi2 ;
    END_IF ;
     
    IF inDataTyp = 2 THEN 
      OutType2.bi4 := TRUE ;
      OutType2.r3 := 34.56 ;
      OutType2.bi1 := InType2.bi1 ;
    END_IF ;
    
     
    END_FUNCTION
    geändert: Jetzt passiert etwas verschieden wenn inDataTyp ist 1 oder 2 !
    Geändert von JesperMP (18.11.2008 um 16:59 Uhr)
    Jesper M. Pedersen

  5. Folgender Benutzer sagt Danke zu JesperMP für den nützlichen Beitrag:

    Ralle (20.11.2008)

  6. #5
    jck0815 ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    01.02.2008
    Beiträge
    28
    Danke
    2
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Guten Morgen allerseits!
    Danke schon mal für Eure Hilfe! Gestern hatte ich keine Lust mehr, aber nun, mit einem frischen Café mache ich mich sofort ans Werk und teste... Ich werde auf jdene Fall von meinen Ergebnissen berichten.

    Grüsse
    Jens

  7. #6
    jck0815 ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    01.02.2008
    Beiträge
    28
    Danke
    2
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Guten Morgen,

    ES FUNKTIONIERT!

    Herzlichen Dank an alle.


    Grüsse
    Jens

  8. #7
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.708
    Danke
    398
    Erhielt 2.397 Danke für 1.997 Beiträge

    Standard

    @Jesper:
    Das finde ich interessant ... allerdings nach mienem Verständnis kannst du doch jetzt an "inData" als Struktur nur Daten von Typ "DefaultStructure" übergeben ...!? Das der AT intern eine andere Interpretation zuläßt ist klar ... Aber wenn du an "inData" z.B. Daten vom Typ "Specifictype1" übergeben willst - was macht der Baustein dann aussen ? Ich kann das gerade nicht testen, aber m.E, läßt er das nicht zu - oder ?

    Gruß
    LL

  9. #8
    Registriert seit
    06.10.2004
    Ort
    Kopenhagen.
    Beiträge
    4.616
    Danke
    377
    Erhielt 799 Danke für 642 Beiträge

    Standard

    @LL

    Die Daten das man an den Baustein versorgt als Quelle, kann nur "DefaultStructure" haben.
    Alles was man flexibel machen will kann nur innerhalb von den SCL Baustein passieren.

    Es gibt weitere Möglicheiten.
    Man kann Quellen DBs direkt zugreifen innerhalb von SCL den code.
    Z.b: myData.InData1 ist ein SpecificType1, und myData.InData2 ist ein SpecificType2.
    Dann kan man so schreiben:
    TYPE DefaultStructure
    STRUCT
    byteArray : ARRAY[0..99] OF BYTE ;
    END_STRUCT
    END_TYPE

    TYPE Specifictype1
    STRUCT
    bi1, bi2 : BOOL ;
    r1 : REAL ;
    END_STRUCT
    END_TYPE

    TYPE Specifictype2
    STRUCT
    bi1, bi2, bi3, bi4 : BOOL ;
    r1, r2, r3 : REAL ;
    END_STRUCT
    END_TYPE

    DATA_BLOCK MyData
    STRUCT
    DataType1 : SpecificType1 ;
    DataType2 : SpecificType2 ;
    END_STRUCT
    BEGIN
    END_DATA_BLOCK

    FUNCTION FC20 : VOID

    VAR_INPUT
    inDataTyp : INT ;
    END_VAR

    VAR_output
    outData : DefaultStructure ;
    outType1 AT outData : SpecificType1 ;
    outType2 AT outData : SpecificType2 ;
    END_VAR

    BEGIN

    IF inDataTyp = 1 THEN
    outType1 := myData.DataType1 ; // Direkten Zugriff auf DB Daten.
    END_IF ;

    IF inDataTyp = 2 THEN
    outType2 := myData.DataType2 ; // Direkten Zugriff auf DB Daten.
    END_IF ;

    END_FUNCTION
    edit: Kompiliert aber nicht getestet !
    Jesper M. Pedersen

  10. #9
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.708
    Danke
    398
    Erhielt 2.397 Danke für 1.997 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    @Jesper:
    OK ... das entspricht meiner Vermutung ...
    Dein Beispiel deckt sich im Wesentlichen mit einem Vorschlag, den ich auch letzten mal jemandem gemacht habe ...

Ähnliche Themen

  1. Datenstrukturen GX IEC Developer (Mitsubishi)
    Von MarkusP210 im Forum CODESYS und IEC61131
    Antworten: 1
    Letzter Beitrag: 22.07.2010, 15:09
  2. FUP Kopieren von Datenstrukturen
    Von dinner4one im Forum Simatic
    Antworten: 1
    Letzter Beitrag: 10.06.2008, 17:29
  3. Fehler in den internen Datenstrukturen
    Von seeba im Forum Simatic
    Antworten: 5
    Letzter Beitrag: 24.03.2007, 15:12
  4. Fehler in den internen Datenstrukturen...
    Von charlie im Forum Simatic
    Antworten: 7
    Letzter Beitrag: 05.07.2006, 20:23
  5. Fehler in internen Datenstrukturen
    Von Cornel im Forum Simatic
    Antworten: 3
    Letzter Beitrag: 21.04.2004, 16:21

Lesezeichen

Berechtigungen

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