SCL und ich Teil II Hilfe gesucht..

KSscl

Level-1
Beiträge
2
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

hab wieder ein Problem in SCL..:(

VAR_INPUT
Wert: INT;
END_VAR

VAR
INDEX: INT;
SPEICHER: ARRAY[0..5] OF INT;
A: BOOL;
END_VAR

BEGIN
FOR INDEX := 1 TO 5 BY 1 DO;
A := WERT = SPEICHER[INDEX];
END_FOR;


Wieso krieg ich auf meinem A kein TRUE wenn WERT und SPEICHER gleich sind??
 
Ich hab glaub ich SCL noch nicht richtig verstanden.
Ich nehme an der Code ist für eine Funktion gedacht.


müsste das A ja die Ausgabevariable sein.
Dann wird sie ja aber schon im Header deklariert

Code:
FUNCTION A: Bool
(*Umwandlungsoperation*)
TITLE = 'Beispiel'
VERSION : '1.0'
KNOW_HOW_PROTECT
AUTHOR  : vor
NAME    : A
FAMILY  : data

VAR_INPUT
Wert: INT;
END_VAR

VAR
INDEX: INT;
SPEICHER: ARRAY[0..5] OF INT;
END_VAR

BEGIN
FOR INDEX := 1 TO 5 BY 1 DO;
IF WERT = SPEICHER[INDEX]
THEN
A:= TRUE;
ELSE
A:= FALSE;
END_IF;
END_FOR;
END_FUNCTION
Aber wie greift man jetzt auf Speicher zu? Es ist ja hier keine Variable als VAR_INPUT deklariert.

übersehe ich jetzt was? SCL ist eigendlich nicht mein gebiet Da ich bis jetzt alles mit AWL lösen konnte. Aber mich würds schon interessieren, vor allem scheint es bei Mathematischen Funktionen nützlich zu sein. Hab mir da mal ne Funktion für X zu Y gebastelt. Ist mein erstes, für verbesserungstips bin ich immer dankbar.

Code:
FUNCTION X_Y: REAL
(*Umwandlungsoperation*)
TITLE = 'REAL scalierung von X nach Y'
VERSION : '1.0'
KNOW_HOW_PROTECT
AUTHOR  : vor
NAME    : X_Y
FAMILY  : data

(*X umskalieren nach Y*)
(*X1 nach Y1, X2 nach X2, X wird in Bereichen X1 und X2 begrenzt*)
(*Negative sowie Positive Lineare und Werte sind erlaubt*)
{S7_tasklist:='false';
 S7_blockview:='small'}

VAR_INPUT
   X: REAL; 
  X1: REAL;
  X2: REAL;
  Y1: REAL;
  Y2: REAL;
END_VAR

VAR_TEMP
 LIM_X_UG: REAL;
 LIM_X_OG: REAL;
 LIMIT_R: REAL;
 END_VAR

(*Eingang X wird Limitiert*)
 BEGIN
  IF X1 < X2 THEN
     LIM_X_UG:= X1;
     LIM_X_OG:= X2;
  ELSIF X2 < X1 THEN 
     LIM_X_UG:= X2;
     LIM_X_OG:= X1;
  END_IF;   

(*Eingang X wird Limitiert*)
LIMIT_R:=LIMIT(Mn:=LIM_X_UG, IN:=X, Mx:=LIM_X_OG); 

(*Umrechnung des limitierten X Wertes*)
X_Y:=((Y2-Y1)/(X2-X1)*LIMIT_R+(Y2-(Y2-Y1)/(X2-X1)*X2));
END_FUNCTION

Ich muss aber jetzt immer erst einen FC im Projektmanager erstellen und dem das Symbol X_Y geben damit das übersetzen mit Ctrl + B klappt.
Das Handbuch ist etwas umständlich geschrieben oder ich bin zu doof :/
 
Hallo,

wenn wir gerade beim Thema SCL sind hätte ich auch noch eine Frage:

Wie kann ich 2 INT Werte Bitweise & verknüpfen?
100011 & 010000 soll false ergeben.
100011 & 000010 sol true ergeben.
In C geht das mit &.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

wenn wir gerade beim Thema SCL sind hätte ich auch noch eine Frage:

Wie kann ich 2 INT Werte Bitweise & verknüpfen?
100011 & 010000 soll false ergeben.
100011 & 000010 sol true ergeben.
In C geht das mit &.

Und in SCL geht das mit AND

mfG René
 
Hallo,

wenn wir gerade beim Thema SCL sind hätte ich auch noch eine Frage:

Wie kann ich 2 INT Werte Bitweise & verknüpfen?
100011 & 010000 soll false ergeben.
100011 & 000010 sol true ergeben.
In C geht das mit &.

Also Dein Beispiel macht für mich keinen Sinn da beides FALSE ergeben müsste.
 
Zuletzt bearbeitet:
Das zweite soll true sein, weil das zweitniedrigste Bit bei beiden true ist.

Also für mich macht das immer noch keinen Sinn. Was willst Du genau machen? Ich dachte Du wolltest einen Vergleich machen oder so was weil Ergebnis auf TRUE oder FALSE eigentlich Bool ist.

Man kann Bitvergleiche machen:

z.B. (mal anhand von einem Byte)
myByteErg := myByte1 AND myByte2;

00000110
AND
00100010
=
00000010
 
Also für mich macht das immer noch keinen Sinn. Was willst Du genau machen? Ich dachte Du wolltest einen Vergleich machen oder so was weil Ergebnis auf TRUE oder FALSE eigentlich Bool ist.

Man kann Bitvergleiche machen:

z.B. (mal anhand von einem Byte)
myByteErg := myByte1 AND myByte2;

00000110
AND
00100010
=
00000010

für sein Ergebniss wärs wohl
Z = X AND Y
If Z >= 0 then
A = True
Else
A = False
EndIF

so würden auf jedenfall seine Oberen beispiele diese Ergebnisse liefern.

mfG René
 
Zuviel Werbung?
-> Hier kostenlos registrieren
z.B. (mal anhand von einem Byte)
myByteErg := myByte1 AND myByte2;

00000110
AND
00100010
=
00000010

genau genommen ist 00000010 ja true, weil >0. (zumindest bei einem INT-Wert in C ist das so.

Meine C Quelle sieht so aus:

if (i&j)
{
Ist=Ist+Werte[x];
}

i und j sind INT und Ist=Ist+Werte[x]; wird ausgeführt wenn ein Bit an der gleichen Stelle bei i und j true ist.

Das gleiche hätte ich gerne in SCL.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Genau genommen ist sowas nie true. C macht einen impliziten type-cast und aus allem, was >0 ein boolean mit dem Wert true.
In ST muss du alles explizit casten! Sogar Int nach DINT.

100% Ack

in ST sind Typecast obligatorisch und das ist auch gut so.

myBool := WORD_TO_BOOL(myWord1 AND myWord2);
 
Danke für eure Hilfe. Ich habs glaub verstanden.

if (i&j)
{
Ist=Ist+Werte[x];
}

wäre dann wenn i und j INT sind:

i := INT_TO_WORD(i);
j := INT_TO_WORD(j);
erg := WORD_TO_BOOL(i AND j);
IF erg THEN
Ist=Ist+Werte[x];
END_IF;
 
Danke für eure Hilfe. Ich habs glaub verstanden.

if (i&j)
{
Ist=Ist+Werte[x];
}

wäre dann wenn i und j INT sind:

i := INT_TO_WORD(i);
j := INT_TO_WORD(j);

erg := WORD_TO_BOOL(i AND j);
IF erg THEN
Ist=Ist+Werte[x];
END_IF;


Nee geht so nicht da i und j INT sind kannst Du die nicht so benutzen sondern eher so:

Unübersichtlich:

IF (WORD_TO_BOOL(INT_TO_WORD(i) AND INT_TO_WORD(j))) THEN
Ist=Ist+Werte[x];
END_IF;

Mann kann auch noch zwei WORD Variablen nehmen und das Typecast INT_TO_BOOL vor verlagern.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ja klar, dummer Fehler von mir. Hab ja i und j als INT deklariert.

Könnte mir allerdings auch zwei Hilfsvariablen (wordi und wordj) vom Typ WORD deklarieren und das so schreiben:

wordi := INT_TO_WORD(i);
wordj := INT_TO_WORD(j);

erg := WORD_TO_BOOL(wordi AND wordj);
IF erg THEN
Ist=Ist+Werte[x];
END_IF;
 
Ja klar, dummer Fehler von mir. Hab ja i und j als INT deklariert.

Könnte mir allerdings auch zwei Hilfsvariablen (wordi und wordj) vom Typ WORD deklarieren und das so schreiben:

wordi := INT_TO_WORD(i);
wordj := INT_TO_WORD(j);

erg := WORD_TO_BOOL(wordi AND wordj);
IF erg THEN
Ist=Ist+Werte[x];
END_IF;

Ja das habe ich hier mit:
...
Mann kann auch noch zwei WORD Variablen nehmen und das Typecast INT_TO_BOOL vor verlagern.

gemeint ;o)
 
Zurück
Oben