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

Seite 3 von 3 ErsteErste 123
Ergebnis 21 bis 27 von 27

Thema: Pointer auf Struktur (SCL)?

  1. #21
    Registriert seit
    06.10.2004
    Ort
    Kopenhagen.
    Beiträge
    4.639
    Danke
    377
    Erhielt 803 Danke für 644 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Jetzt glaube ich das ich habe es verstanden.
    Es gibt viele Wege nach Rom. Hier ist ein Beispiel mit ein Global-DB:
    (warnung: nicht getestet)

    Code:
     
    TYPE UDT_dataset_pro_byte
        STRUCT
        bi0, bi1, bi2, bi3, b4, b5, bi6, b7 : BOOL ;
        by0, by2 : BYTE ; // warum 2 bytes ?
        in0 : INT ; // byte-wert interpretiert als INT ?
        END_STRUCT
    END_TYPE
     
    DATA_BLOCK PLC_data  
        STRUCT 
            vals  : ARRAY[0..99] OF UDT_dataset_pro_byte ; // es soll einfach gross genug sein !
        END_STRUCT
    BEGIN
    END_DATA_BLOCK
     
    FUNCTION Copy_via_db : VOID
     
    VAR_input
        structStartAddress : INT ;
        iInputStartByte : INT ;
        iOutputStartByte : INT ;
        iNoOfBytes : INT ;
    END_VAR
     
    VAR_TEMP
        structCurrentAddress : INT ;
        iInputCurrentByte : INT ;
        iOutputCurrentByte : INT ;
        iCurrentByteNo : INT ;
        tempBYTE : BYTE ;
        tempINT : INT ;
    END_VAR
     
    FOR iCurrentByteNo := 1 TO iNoOfBytes BY 1 DO
        iInputCurrentByte := iInputStartByte + iCurrentByteNo - 1 ;
        iOutputCurrentByte := iOutputStartByte + iCurrentByteNo - 1 ;
        structCurrentAddress := structStartAddress + iCurrentByteNo - 1 ; // Zufällig zählt Struct nummer und E/A Bytenummer gleich.
        tempBYTE := IB[iInputCurrentByte] ;
        PLC_data.vals[structCurrentAddress].by0 := tempBYTE ; // tu etwas mit der DB abhängig von die Eingänge
        tempINT := BYTE_TO_INT(tempBYTE) ;
        PLC_data.vals[structCurrentAddress].in0 := tempINT ; // tu etwas mehr
        IF tempInt > 0 THEN  // tu etwas mit die Ausgänge abhängig von der DB wert.
            QB[iOutputCurrentByte] :=  PLC_data.vals[structCurrentAddress].by0 ;
        END_IF ; 
    END_FOR ;
     
    END_FUNCTION
     
     
     
    FUNCTION Sample_Call : VOID
     
    Copy_via_db(structStartAddress := 0
                ,iInputStartByte :=  2
                ,iOutputStartByte := 2 
                ,iNoOfBytes :=  6
                );
     
    Copy_via_db(structStartAddress := 10
                ,iInputStartByte :=  12
                ,iOutputStartByte := 14 
                ,iNoOfBytes :=  4
                );
    END_FUNCTION
    Jesper M. Pedersen

  2. #22
    momo99 ist offline Benutzer
    Themenstarter
    Registriert seit
    05.11.2008
    Beiträge
    54
    Danke
    9
    Erhielt 3 Danke für 3 Beiträge

    Standard

    @ LL
    Das wäre dann wohl die Lösung!
    Ich kann mir nur nicht Recht vorstellen wie da die Syntax aussehen soll...
    (Aufruf von z.B. OB1 und auch Bearbeitung innerhalb des FB_NEU)
    Kannst du mir ein Beispiel geben?

    Hab gedacht, daß innerhalb der eckigen Klammern von ARRAY nur ganze Zahlen möglich sind, keine Variablen.


    @ Jesper
    Danke für deinen Lösungsvorschlag. Schaut ja bei weitem komplizierter aus als ich mir das gedacht hätte!
    Ich werde das später mal testen, für jetzt brauch ich mal eine Pause...

    Gruss
    momo

  3. #23
    Registriert seit
    06.10.2004
    Ort
    Kopenhagen.
    Beiträge
    4.639
    Danke
    377
    Erhielt 803 Danke für 644 Beiträge

    Standard

    @momo99
    Nein es ist gar nicht kompliziert.
    Auf nur eine A4-Seite hast Du folgenes:
    • Der Typendeklaration von deiner Standard daten.
    • Der Global-DB.
    • Der Daten-behandlungs-FC mit beispiele wie man die Daten manipulieren kann.
    • Beispiele von wie du die Daten-behandlungs-FC aufrufe kann, genau wie DU es willst mit verschiedene anzahl von Bytes.
    Jesper M. Pedersen

  4. #24
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.792
    Danke
    398
    Erhielt 2.416 Danke für 2.012 Beiträge

    Standard

    Zitat Zitat von momo99 Beitrag anzeigen
    Hab gedacht, daß innerhalb der eckigen Klammern von ARRAY nur ganze Zahlen möglich sind, keine Variablen.
    Bei AWL stimmt das so - bei SCL kannst du hier auch eine Variable (vom Typ INT) einsetzen. Das ist ja gerade der Clou bei SCL.

    Zitat Zitat von momo99 Beitrag anzeigen
    Ich kann mir nur nicht Recht vorstellen wie da die Syntax aussehen soll...
    Aufruf von z.B. OB1 und auch Bearbeitung innerhalb des FB_NEU)
    Kannst du mir ein Beispiel geben?
    Da müßtest du mir erstmal noch ein bißchen auf die Sprünge helfen.

    Du kannst auf jeden Fall aus einem ARRAY of UDT einen einzelnen UDT-Bereich an einen anderen Baustein weiterreichen (vorausgesetzt dieser kennt den UDT und dessen Aufbau auch).

    Ich setze dies gerne ein um aus dem Instanz-Bereich meines "Master-FB" einen Sektions-Bereich auf die IN_OUT-Schnittstelle desselben FB's auszugeben. Ich habe dann ein ARRAY [1..x] of UDT11 und eine IN_OUT-Variable vom Typ UDT11 und dieser weise ich dann den entsprechenden Teilbereich zu. In etwa so :
    Code:
    VAR
       Station : ARRAY[1..50] of UDT11 ;
     
    VAR_IN_OUT
       Stations_Daten : UDT11 ;
     
    und dann im Code :
       Stations_Daten  := Station[i] ;
     
    bzw. beim Zurückschreiben :
       Station[i]  := Stations_Daten ;
    Gruß
    LL

  5. #25
    momo99 ist offline Benutzer
    Themenstarter
    Registriert seit
    05.11.2008
    Beiträge
    54
    Danke
    9
    Erhielt 3 Danke für 3 Beiträge

    Standard

    @ LL

    Im Ansatz ist das genau was ich suche, ich habe nur folgende Probleme damit:

    Code:
    VAR
    Station: Array[1..50] OF UDT 11
    Wenn ich das richtig verstehe würde das für mein Beispiel bedeuten, daß ich innerhalb des FB_NEU ein Array erstellen muß, das alle möglichen Eingabebereiche abdeckt, z.B. [0..255]. Egal wie viele Bytes dann im Programm bearbeitet werden müssen hätte ich einen relativ grossen IDB.
    (Als Bibl-Baustein könnte das bei kleineren CPU´s problematisch sein.)

    Mein zweites Problem ist die Syntax (Struct-Parameter). Ich habe mir den FB laut deinen Angaben gebastelt
    Code:
    FUNCTION_BLOCK FB1001
    
    VAR
        STG:    ARRAY[1..255] OF UDT_SPS;
    END_VAR
    
    VAR_IN_OUT
        STG_Daten: UDT_SPS;
    END_VAR
    
    RETURN;
    END_FUNCTION_BLOCK
    und will ihn aufrufen. Was muss ich jetzt als Parameter bei "STG_Daten" hinschreiben (ausgehend von den jpg.´s im 1.Post) ?
    Code:
          CALL  FB  1001 , DB1001
           STG_Daten:=
    Ich hab ja den ganzen DB_SPS als Struktur, nur - wie sage ich das der SPS daß sie mich auch versteht?

    Und die Sache mit Array[1..x] verstehe ich nicht
    Bei der Variablendefinition kann ich das nicht so angeben, ist imho ja auch logisch, das würde ja den IDB dynamisch verändern...

    Gruss
    momo

  6. #26
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.792
    Danke
    398
    Erhielt 2.416 Danke für 2.012 Beiträge

    Standard

    Zitat Zitat von momo99 Beitrag anzeigen
    Wenn ich das richtig verstehe würde das für mein Beispiel bedeuten, daß ich innerhalb des FB_NEU ein Array erstellen muß, das alle möglichen Eingabebereiche abdeckt, z.B. [0..255]. Egal wie viele Bytes dann im Programm bearbeitet werden müssen hätte ich einen relativ grossen IDB.
    (Als Bibl-Baustein könnte das bei kleineren CPU´s problematisch sein.)
    Stimmt ... das ist so und liesse sich auch hier nicht umgehen ...

    Zitat Zitat von momo99 Beitrag anzeigen
    Mein zweites Problem ist die Syntax (Struct-Parameter). Ich habe mir den FB laut deinen Angaben gebastelt ...
    und will ihn aufrufen. Was muss ich jetzt als Parameter bei "STG_Daten" hinschreiben (ausgehend von den jpg.´s im 1.Post) ?
    Ich hab ja den ganzen DB_SPS als Struktur, nur - wie sage ich das der SPS daß sie mich auch versteht?
    Wo es in der Haupt-Struktur landet bestimmst du über deinen Index (Eingangsbyte).
    Um die Struktur im aufrufenden Baustein verwenden zu können muß sie dort natürlich auch angelegt sein - z.B. im TEMP-Bereich ...

    Zitat Zitat von momo99 Beitrag anzeigen
    Und die Sache mit Array[1..x] verstehe ich nicht
    Bei der Variablendefinition kann ich das nicht so angeben, ist imho ja auch logisch, das würde ja den IDB dynamisch verändern...
    Das schreibe ich immer gerne so hin, weil ich ja nicht weiß, wie groß der Andere sein ARRAY dimensionieren will. Für "x" mußt du natürlich deinen Endwert als Konstante eingeben ...

    Gruß
    LL

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

    momo99 (25.03.2009)

  8. #27
    momo99 ist offline Benutzer
    Themenstarter
    Registriert seit
    05.11.2008
    Beiträge
    54
    Danke
    9
    Erhielt 3 Danke für 3 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    @ LL

    Ich denke jetzt habe ich es endlich behirnt!

    Was ich als Ergebnis haben will kann ich mir jetzt Dank eurer Hilfe basteln.

    Wie ich die Sache mit dem (grossen) IDB löse muss ich noch sehen. Ich habe ja meinen Global-DB der vom Anwender in der richtigen Grösse angelegt ist.
    Dahin müsste ich doch meine Daten direkt nach Auswertung hinschreiben können, sodaß ich nur einen Temp-Datenbereich brauche.

    Mal sehen...

Ähnliche Themen

  1. Date_Time Struktur
    Von Nerowinger84 im Forum HMI
    Antworten: 0
    Letzter Beitrag: 15.03.2010, 16:56
  2. Zeiger/Pointer auf eine Struktur
    Von logo78 im Forum Simatic
    Antworten: 2
    Letzter Beitrag: 29.03.2009, 17:09
  3. Struktur am Bildbaustein
    Von Neesen im Forum HMI
    Antworten: 4
    Letzter Beitrag: 21.09.2007, 22:06
  4. Schrittketten Struktur
    Von MatMer im Forum Programmierstrategien
    Antworten: 25
    Letzter Beitrag: 18.09.2007, 15:13
  5. DB-struktur
    Von Pimsti im Forum Simatic
    Antworten: 4
    Letzter Beitrag: 13.06.2006, 12:48

Lesezeichen

Berechtigungen

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