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

Seite 5 von 5 ErsteErste ... 345
Ergebnis 41 bis 45 von 45

Thema: Probleme mit SFC14 und 15 in SCL

  1. #41
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.191
    Danke
    923
    Erhielt 3.292 Danke für 2.661 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Zitat Zitat von Larry Laffer Beitrag anzeigen
    Ansonsten mußt du dir auf einen der DB's eine AT-Sicht erstellen, die das wieder passend macht - die AT-Sicht dann aber für den kompletten DB ...
    ... oder in TEMP eine AT-Sicht auf nur einen Datensatz legen, den Datensatz in TEMP zusammenbasteln und dann in den DB kopieren.

    @b.weyand85
    Achtung: ein Struct beginnt immer an einer geraden Adresse. Dein Struct "Flags" beginnt also nicht direkt nach dem Byte "Kommando3", sondern es wird erst noch ein Füllbyte eingeschoben. Dadurch sind die Structs "Send" in DB1 und "Send" in DB6 unterschiedlich lang.
    Außerdem geht die Zuweisung eines Struct auf ein anderes Struct in SCL nur, wenn die Structs auch exakt den gleichen Aufbau haben. (wie Larry schon sagte)

    In SCL ist es aber angenehmerweise möglich, auf dem selben Speicherplatz unterschiedlich strukturierte Variablen zu überlagern - mit dem Schlüsselwort AT. Damit kann man unterschiedliche Sichten auf den Speicherplatz deklarieren. Dann kann man z.B. auf deklarierte Bits schreiben und das ganze als zweite Deklaration z.B. Array of Word auslesen.

    Da Du offensichtlich verschieden aufgebaute aber gleich lange Datensätze mit den gleichen Methoden versenden willst, würde ich die Datensätze (in DB1 und DB6) einfach nur als Array[0..3] of Word oder als 4 Words deklarieren und den Fein-Aufbau bei Bedarf mittels AT überlagern. Die Überlagerung macht sich am besten in TEMP, da schreibst Du in Deine Bits und kopierst nacher den Bit-Struct als Word-Struct in den DB.
    Code:
    FUNCTION FCxxx : VOID
    VAR_TEMP
      tmpSend : STRUCT  //der gleiche Struct (oder UDT) wie in DB1 und DB6
        Kommando0 : WORD;
        Kommando1 : WORD;
        Kommando2 : WORD;
        Kommando3 : WORD;
      END_STRUCT;
    
      CMD1 AT tmpSend : STRUCT  //ein im Detail anders aufgebauter Struct an der Adresse von tmpSend
        Kommando0 : WORD;
        Kommando1 : WORD;
        Kommando2 : WORD;
        Flags : STRUCT    //liegt auf dem Word tmpSend.Kommando3
          Kommando3 : BYTE;
          KSR : BOOL;
          NOCOMP : BOOL;
          EXTSOLL : BOOL;
          NAHT : BOOL;
          EXTANALOG : BOOL;
          NC : BOOL;
          NC2: BOOL;
          MULTIWELD : BOOL;
        END_STRUCT;
      END_STRUCT;
    
      CMD2 AT tmpSend : STRUCT  //ein weiterer anders aufgebauter Struct an der Adresse von tmpSend
        Kommando0 : WORD;
        Kommando1 : WORD;
        TeilCmd : STRUCT
          Kommando2_1 : BYTE;
          Kommando2_2 : BYTE;
        END_STRUCT;
        Kommando3 : WORD;
      END_STRUCT;
    
    END_VAR
    
        tmpSend.Kommando3 := 0 ;  //gesamte Struktur "Flags" auf 0 vorbelegen
        CMD1.Flags.KSR := TRUE ;  //einzelne Bits auf 1 setzen
        CMD1.Flags.NOCOMP := TRUE ;
    
        DB6.Segment[1].Send := tmpSend ;  //den gesamten Datensatz aus TEMP in DB6 kopieren
        DB1.SPS_an_Sinius.Send := DB6.Segment[1].Send ;
    
    END_FUNCTION
    Harald
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  2. #42
    Registriert seit
    20.07.2012
    Beiträge
    33
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Danke für die Tipps. Ich habe das jetzt mal folgendermaßen aufgebaut:

    Code:
    DATA_BLOCK DB6
      STRUCT  
        Segment : ARRAY [0 .. 9] OF STRUCT  //ein Array mit 10 Datensätzen
            Send : STRUCT                   //zu sendender Datensatz
                Kommando0: WORD;
                Kommando1: WORD;
                Kommando2: WORD;
                Kommando3: WORD;
                Kommando4: WORD;
                Kommando5: WORD;
                Kommando6: WORD;
                Kommando7: WORD;
                Kommando8: WORD;
                Kommando9: WORD;
                Kommando10: BYTE;
            END_STRUCT;
            I1_T : WORD ;                      //Anfangsstrom I1 - HIGH- und LOW-Byte müssen noch getauscht werden
            I2_T : WORD ;                      //Endstrom I1 - HIGH- und LOW-Byte müssen noch getauscht werden
            Dauer : WORD ;                     //Schweißdauer - HIGH- und LOW-Byte müssen noch getauscht werden
            TP_T : WORD;
            MAZ_T : WORD;
            MZ_T : WORD;
    END_STRUCT;
    END_STRUCT;
    BEGIN
    END_DATA_BLOCK
    Code:
    FUNCTION FC100 : VOID
    VAR_TEMP
        tmpSend : STRUCT  //der gleiche Struct (oder UDT) wie in DB1 und DB6
            Kommando0: WORD;
            Kommando1: WORD;
            Kommando2: WORD;
            Kommando3: WORD;
            Kommando4: WORD;
            Kommando5: WORD;
            Kommando6: WORD;
            Kommando7: WORD;
            Kommando8: WORD;
            Kommando9: WORD;
            Kommando10: BYTE;
        END_STRUCT;
    
      CMD6 AT tmpSend : STRUCT  //ein im Detail anders aufgebauter Struct an der Adresse von Send
        Kommando0 : WORD;
        Kommando1 : WORD;
        Kommando2 : WORD;
        Flags : STRUCT    //liegt auf dem Word Send.Kommando3
          Kommando3: BYTE;
          KSR : BOOL;
          NOCOMP : BOOL;
          EXTSOLL : BOOL;
          NAHT : BOOL;
          EXTANALOG : BOOL;
          NC : BOOL;
          NC2: BOOL;
          MULTIWELD : BOOL;
        END_STRUCT;
        Kommando4: WORD;
        Kommando5: WORD;
        Kommando6: WORD;
        Kommando7: WORD;
        Kommando8: WORD;
        Kommando9: WORD;
        Kommando10: BYTE;
      END_STRUCT;
    
    
    END_VAR
    BEGIN
    CMD6.Flags.NAHT := TRUE;
    DB6.Segment[0].Send := tmpSend;
    END_FUNCTION
    Im Segment[0] von DB6 werden mir aber irgendwelche Werte angezeigt (siehe Bild). Dabei habe ich aber keine Ahnung wo die her kommen. Ich habe es auch mal mit einem FB anstatt einer FC versucht, aber das brachte keinen Erfolg. Habe ich noch irgendetwas falsch gemacht?

    DB6.jpg

  3. #43
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.726
    Danke
    398
    Erhielt 2.401 Danke für 2.001 Beiträge

    Standard

    An welcher Stelle wird tmpSend mit irgend etwas zugewiesen ...?

    Gruß
    Larry

  4. #44
    Registriert seit
    20.07.2012
    Beiträge
    33
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Hat sich scheinbar erledigt. Ich hatte dies in eine eigene Funktion geschrieben und dort nach BEGIN den kompletten Datensatz tmpSend zugewiesen. Jetzt habe ich das Ganze in den bereits vorhandenen FB geschrieben und auch das ANY-Gebastel, was von vorher noch drin war, komplett raus gelöscht. Und nun scheint es zu funktionieren - warum auch immer.

    Nun stört mich aber, dass ich die Modi nicht für jedes Segment einzeln auswählen kann. Ich habe zuvor direkt, wenn ich in der Visualisierung die Schaltfläche für einen Modus gedrückt habe, eine 1 an die entsprechende Bitstelle im Wort geschrieben und via Multiplexen dann zwischen den einzelnen Segmentnummern hin- und her geschaltet. Das kann ich hierbei nun nicht mehr machen. Vielleicht wäre es einfacher, die Struktur in DB6 so bestehen zu lassen und weiterhin die 1 an die richtige Stelle zu schieben und dann mittels Zuweisung die Wörter zu übertragen...

  5. #45
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.726
    Danke
    398
    Erhielt 2.401 Danke für 2.001 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Sorry ... das habe ich komplett nicht verstanden ... was genau funktioniert nicht ?

    Übrigens ... was verwendest du für eine CPU ?

Ähnliche Themen

  1. TIA Probleme mit s71200 und scl
    Von RMLIF im Forum Simatic
    Antworten: 13
    Letzter Beitrag: 09.10.2013, 15:25
  2. Korrekter Aufruf von DPWR_DAT (SFC14) in SCL?
    Von iga-graz im Forum Simatic
    Antworten: 7
    Letzter Beitrag: 25.03.2009, 15:24
  3. Probleme mit SCL
    Von Kubi im Forum CODESYS und IEC61131
    Antworten: 12
    Letzter Beitrag: 20.03.2009, 19:30
  4. Probleme mit DBs in SCL
    Von chrissi im Forum Simatic
    Antworten: 22
    Letzter Beitrag: 09.08.2007, 13:06
  5. Probleme mit 2 For Next Schleifen in SCL
    Von Gerold im Forum Simatic
    Antworten: 4
    Letzter Beitrag: 07.10.2005, 11:01

Lesezeichen

Berechtigungen

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