Sonstiges SCL- Warum meckert der Compiler den Datentyp an

borromeus

Level-1
Beiträge
2.271
Reaktionspunkte
329
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi,
ich habe auf meinen alten Tagen versucht ein SCL- Programm zu schreiben, quasi fast das "Getting Started" Beispiel nur eben für CFC importierbar geeignet (im CFC kann man kein S7_array verwenden). Darum habe ich statt dem Array einen DB verwenden wollen.

Er mecker aber alle DB_VAR.DD [ ] an.

Irgendwer mit Hinweisen?


FUNCTION_BLOCK FB1450

VAR_TEMP
// temporäre Variablen
index : INT;
tauschen : BOOL;
hilf : REAL;
END_VAR
VAR
// statische Variablen

END_VAR

VAR_INPUT
wert1 : REAL;
wert2 : REAL;
wert3 : REAL;
wert4 : REAL;
wert5 : REAL;
wert6 : REAL;
wert7 : REAL;
wert8 : REAL;
DB_VAR : BLOCK_DB ;
END_VAR

VAR_OUTPUT
Qwert1 : REAL;
Qwert2 : REAL;
Qwert3 : REAL;
Qwert4 : REAL;
Qwert5 : REAL;
Qwert6 : REAL;
Qwert7 : REAL;
Qwert8 : REAL;

END_VAR

CONST
GRENZE := 28;
END_CONST

VAR_IN_OUT

END_VAR
// Sortierung vorbelegen

DB_VAR.DD[0] := Wert1;
DB_VAR.DD[4] := Wert2;
DB_VAR.DD[8] := Wert3;
DB_VAR.DD[12] := Wert4;
DB_VAR.DD[16] := Wert5;
DB_VAR.DD[20] := Wert6;
DB_VAR.DD[24] := Wert7;
DB_VAR.DD[28] := Wert8;




REPEAT
tauschen := FALSE;
FOR index := GRENZE TO 4 BY -4 DO
IF DB_VAR.DD[index-4] > DB_VAR.DD[index]
THEN hilf:=DB_VAR.DD[index];
DB_VAR.DD[index] :=DB_VAR.DD[index-4];
DB_VAR.DD[index-4] := hilf;
tauschen := TRUE;
END_IF;
END_FOR;
UNTIL NOT tauschen
END_REPEAT;


Qwert1 := DB_VAR.DD [0];
Qwert2 := DB_VAR.DD [4];
Qwert3 := DB_VAR.DD [8];
Qwert4 := DB_VAR.DD [12];
Qwert5 := DB_VAR.DD [16];
Qwert6 := DB_VAR.DD [20];
Qwert7 := DB_VAR.DD [24];
Qwert8 := DB_VAR.DD [28];




;
END_FUNCTION_BLOCK


Gruß
Karl
 
Der Zugriff mit der Absoluadressierung .DD hat den Datentyp DWord.
Wenn du dieser eine Variable vom Datentyp Real zuweisen willst, benötigst du eine oder mehrere Typkonvertierungen wie REAL_TO_DWORD oder DWORD_TO_REAL.
 
OK Thomas,

Danke!

Gibt es eine andere Methode dem SCL klarzumachen was ich will?
Ich will einen Real-Wert (ist ja so deklariert) einem "DBD" zuweisen (und nach der Sortierung umgekehrt).
Muss man was anderes als ".DD" schreiben?

Der Befehl REAL_TO_DWORD wandelt der auch den Inhalt (also von Real in 32bit Word) oder ist das nur rein datenmäßig zu sehen?

Gruß
Karl
 
Zuviel Werbung?
-> Hier kostenlos registrieren
REAL_TO_DWORD und DWORD_TO_REAL machen nichts, außer den Compiler zu beschwichtigen.
Es ist nur eine Warnung für den Programmierer, dass dort evtl. ein Programmierfehler vorliegen könnte. Wenn du es explizit nochmal hinschreibst, hast du dir wahrscheinlich darüber Gedanken gemacht dass es so schon seine Richtigkeit hat.

Wozu dient bei dir überhaupt der externe DB?
Wenn es dir darum geht die 8 Eingangswerte zu sortieren, kannst du auch im Stat- oder Temp-Bereich ein REAL-Array anlegen.
Dann kopierst du die Parameter in dieses Real-Array, sortierst es, und schreibst den Array-Inhalt auf die Ausgänge zurück.
Dann benötigst du keinen externen DB und keine Typkonvertierungen, weil diese schon zusammenpassen.
 
Wie oben beschrieben kann ich den erzeugten FB nicht in den CFC Plan schieben weil der CFC dann meckert, dass er S7_Array nicht unterstützt.
Darum bin ich auf den DB ausgewichen.
 
2 Fehler habe ich noch, was passt hier nicht?
SCL1.JPG

hilf = REAL

Was meint er mit "Der Ausdruck muss vom Datentyp BOOL sein"?



Gruß
Karl
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Arrays als Parameter sind in CFC nicht möglich. Aber du kannst ein Array im VAR oder VAR_TEMP Bereich anlegen.

Code:
VAR_TEMP
  werte : ARRAY[0..7] OF REAL;
END_VAR

werte[0] := wert1;
werte[1] := wert2;
...
// Hier dein Sortiercode

Qwert1 := werte[0];
Qwert2 := werte[1];
...
 
2 Fehler habe ich noch, was passt hier nicht?
Der Hauptfehler ist der erste.
Du kannst Variablen mit dem Datentyp DWord nicht auf größer oder kleiner vergleichen. Und wie schon festgestellt, hat DD den Datentyp DWord.
Vergleiche wie größer, kleiner, etc. sind nur mit numerischen Datentypen (INT, DINT, REAL) erlaubt.

Du müsstest also überall wieder eine Typkonvertierung hinschreiben, oder nimmst mein Vorschlag mit dem Array eines passenden Datentyps.
 
Zurück
Oben