TIA Bereich kopieren - verschiedene Datentypen

Zuviel Werbung?
-> Hier kostenlos registrieren
In anderen Sprachen (C, PASCAL...) gibt es das Konstrukt UNION, da kann mann den gleichen Speicherbereich beliebig interpretieren.
Bei SCL gibt es ebenfalls UNION - heißt da "AT-View". Weil aber selbst STRUCTs bunt verwürfelt "optimiert" im Speicher verteilt angeordnet werden, kann AT nicht auf "optimiertem" Speicher verwendet werden. Siemens läßt da noch nichtmal eine INT-Variable "AT" eine Word-Variable zu.

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Man könnte ja die einzelnen Array Bytes seiner struktur zuweisen .... das ist aber mit viel aufwand verbunden. Man müsste dann auch noch die Byte reihenfolge beachten:sad:
in etwa so :
Code:
#dwtmp := #arrIN[x];
#dwtmp := SHL(IN := #dwtmp, N := 8 + #arrIN[x];
#dwtmp := SHL(IN := #dwtmp, N := 8 + #arrIN[x];
#dwtmp := SHL(IN := #dwtmp, N := 8 + #arrIN[x];
#strucOUT.dw := #dwtmp;

#strucOUT.bool_1 := #arrIN[x].%X0
 
Wenn der FC nur die FOR-Schleife enthält, dann meckert der Compiler, daß die Variable i nicht initialisiert würde?
Sind die Compiler-Programmierer bekloppt? Wer weiß, was für eine "Optimierung" denen da wieder eingefallen ist...
Welche TIA-Version hast Du?

Code:
FUNCTION "FCxxx" : Void
{ S7_Optimized_Access := 'TRUE' }
VERSION : 0.1
   VAR_INPUT 
      Menge : Int;
   END_VAR

   VAR_TEMP 
      i : Int;
   END_VAR

BEGIN
   // [COLOR="#FF0000"]#i:=0;[/COLOR] //wird zum initialisieren gebraucht, sonst meckert Compiler

   // Schleife
   For [COLOR="#FF0000"]#i := 0[/COLOR] To (#Menge - 1) Do
      ;
   End_For;
END_FUNCTION

Harald
 
Laut der Hilfe für die Funktionen Peek und Poke:

Wenn Sie am Parameter AREA den Bereich 16#84 für einen Datenbaustein angeben, dann können Sie nur auf Datenbausteine mit der Bausteineigenschaft "Standard" zugreifen.

Der Kompiler gibt keine fehlermeldung ... aber die Funktion arbeitet auch nicht solange bausteine "Optimiert" sind
 
Zuviel Werbung?
-> Hier kostenlos registrieren
So in der Art sollte es doch auch in TIA gehen.

Code:
TYPE UDT_Serial
    STRUCT
    // Typbeschreibung
eins,zwei,drei,vier,fuenf:INT;
blubb:ARRAY[0..94] OF char;
    END_STRUCT
END_TYPE

DATA_BLOCK DB_Serial
    STRUCT
    blubb:UDT_Serial;
    END_STRUCT
BEGIN

END_DATA_BLOCK


DATA_BLOCK DB_Array
    STRUCT
    input:ARRAY[0..99] OF BYTE;
    END_STRUCT
BEGIN

END_DATA_BLOCK


FUNCTION FC_Serial : void

VAR_TEMP
    _tempserial:UDT_Serial;
    _sicht AT _tempserial:ARRAY[0..99] OF BYTE;
i:INT;
END_VAR

FOR i:=0 TO 99 BY 1 DO
    _sicht[i]:="DB_Array".input[i];
END_FOR;

"DB_Serial".blubb := _tempserial;

END_FUNCTION
 
Ich habe TIA V13 SP1.
Meine aktuelle Lösung ist READ_LITTLE. Ich muss zwar jedes Element einzeln rausholen, aber somit ist die Weiterverarbeitung wesentlich einfacher.
 
Zurück
Oben