- Beiträge
- 21.965
- Reaktionspunkte
- 6.836
-> Hier kostenlos registrieren
... oder in TEMP eine AT-Sicht auf nur einen Datensatz legen, den Datensatz in TEMP zusammenbasteln und dann in den DB kopieren.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 ...
@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