Step 7 Probleme mit SFC14 und 15 in SCL

Zuviel Werbung?
-> Hier kostenlos registrieren
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
 
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
 
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...
 
Sorry ... das habe ich komplett nicht verstanden ... was genau funktioniert nicht ?

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