SCL -- Datentyp Any -- Rechnen

Dragonfire

Level-2
Beiträge
46
Reaktionspunkte
6
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi,

ich will mir einen FB schreiben mit dem ich mit verschiedene Datentypen skalieren kann. Dazu verwende ich den Datentyp Any. Leider lässt er sich nicht so verwenden, wie ich gerne hätte. Habt ihr einen Tipp für mich???

In der Hilfe steht was von ANY_NUM. Wo benutze ich das???

Danke im Vorraus!!!

Hier der Programmauszug

FUNCTION_BLOCK FB80

VAR_INPUT
I1_I_MIN : ANY;
I1_I_MAX : ANY;
I2_I_MIN : ANY;
I2_I_MAX : ANY;
I1_ACTUAL : ANY;
I_MODE : INT;
END_VAR
VAR_OUTPUT
O_ACT_REAL : REAL;
O_ACT_INT : INT;
END_VAR
VAR_TEMP
TEMP_I_VALUE : ANY;
TEMP1_I_VALUE : ANY;
TEMP2_I_VALUE : ANY;
TEMP3_I_VALUE : ANY;
END_VAR
BEGIN

// I_MODE = 0 ist die Umwandlung von INT nach INT
CASE I_MODE OF
0: TEMP_I_VALUE := INT_TO_REAL (I1_I_MAX - I1_I_MIN);
TEMP1_I_VALUE :=INT_TO_REAL (I2_I_MAX - I2_I_MIN);
TEMP2_I_VALUE := TEMP1_I_VALUE / TEMP_I_VALUE;
O_ACT_INT := REAL_TO_INT (TEMP2_I_VALUE * I1_ACTUAL);
O_ACT_REAL := TEMP2_I_VALUE * I1_ACTUAL;

// I_MODE = 1 ist die Umwandlung von INT nach REAL
1: TEMP_I_VALUE := INT_TO_REAL I1_I_MAX - I1_I_MIN;
TEMP1_I_VALUE :=I2_I_MAX - I2_I_MIN;
TEMP2_I_VALUE := TEMP1_I_VALUE / TEMP_I_VALUE;
O_ACT_INT := REAL_TO_INT (TEMP2_I_VALUE * I1_ACTUAL);
O_ACT_REAL := TEMP2_I_VALUE * I1_ACTUAL;

// I_MODE = 1 ist die Umwandlung von REAL nach REAL
2: TEMP_I_VALUE := I1_I_MAX - I1_I_MIN;
TEMP1_I_VALUE :=I2_I_MAX - I2_I_MIN;
TEMP2_I_VALUE := TEMP1_I_VALUE / TEMP_I_VALUE;
O_ACT_INT := REAL_TO_INT (TEMP2_I_VALUE * I1_ACTUAL);
O_ACT_REAL := TEMP2_I_VALUE * I1_ACTUAL;

// I_MODE = 1 ist die Umwandlung von REAL nach INT
3: TEMP_I_VALUE := I1_I_MAX - I1_I_MIN;
TEMP1_I_VALUE :=INT_TO_REAL (I2_I_MAX - I2_I_MIN);
TEMP2_I_VALUE := TEMP1_I_VALUE / TEMP_I_VALUE;
O_ACT_INT := REAL_TO_INT (TEMP2_I_VALUE * I1_ACTUAL);
O_ACT_REAL := TEMP2_I_VALUE * I1_ACTUAL;
END_CASE;


END_FUNCTION_BLOCK
 
Any-Pointer in SCL

Moin!

Anbei, wie man mit Any-Pointern in SCL umgeht, wenn man sich mal einen selbst bauen muß, oder einen verändern muß.

Der Deklaration eines Any-Pointers, folgt die Deklaration einer Datensicht:

Quelle : ANY;
QuellPointer AT Quelle : STRUCT
SyntaxID : BYTE;
Datentyp : BYTE;
Laenge : INT;
db_Nummer : INT;
BytePointer : DWORD;
END_STRUCT;

Den AnyPointer auf ein Datenelement zeigen lassen:

Quelle := "TP-Daten".Stoerspeicher_1;

Den AnyPointer "von Hand" zusammenbauen:

QuellPointer.SyntaxID := b#16#10;
QuellPointer.Datentyp := b#16#4; //Datentyp WORD
QuellPointer.Laenge := 10; //Zum Beispiel 10 Worte
QuellPointer.db_nummer := 100; //zum Bleistift DB100
QuellPointer.BytePointer := dw#16#84000000 OR
SHL(IN: DINT_TO_DWORD(i),N:=3);

So ist also jede Manipulation des AnyPointers möglich. Manchmal wird's halt krampfig wegen der nötigen Formatwandlungen, aber was soll's.
 
High speed answer :)

Frage vom
09.01.2006, 13:15

Anwort am:
24.10.2007, 10:17


Klasse, besser spät als nie!!!

...
:)
 
XXX: ANY;
YYY AT XXX : STRUCT
a : BYTE;
b : INT;
c: DWORD;
END_STRUCT;

Begin
XXX:= DB2.Bit0; // XXX zeigt auf Bit0 in DB2

YYY.a:=B#16#3;
YYY.b:=B#16#0;

.
.
.
Fragen:
1: ist AT eine Art der Zuweisung?
2: Muss man den Pointer immer initialisieren (XXX:= DB2.Bit0;) wie ich von anderen Progr.Sprachen (Java,C++...) kenne??
3: Jedem Any Pointer soll in der CPU einen Spiecherplatz von 10 Byte reserviert. Kann man jemand sagen laut der Darstellung von
http://www.sps-forum.de/showthread.php?t=12923 und laut dem Beispiel oben wie die Byte von 2 bis 9 belegt werden sollen (laut meinem Beispiel)??

Danke im Voraus
johnij

Danke euch lerne ich täglich was mehr
.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

"AT" ist nur eine sicht auf die Variable.

Wie von derwestermann bereits geschrieben ist der Aufbau folgender:
Quelle : ANY;
QuellPointer AT Quelle : STRUCT
SyntaxID : BYTE;
Datentyp : BYTE;
Laenge : INT;
db_Nummer : INT;
BytePointer : DWORD;
END_STRUCT;

Der Zugriff auf die Einzelnen Variablen erfolgt durch QuellPointer.Datentyp usw.

Anbei der Auszug aus der S7 Hilfe zum Datentyp ANY.
 

Anhänge

  • Datentyp_Any.pdf
    44,9 KB · Aufrufe: 103
Ach ja,

was soll denn angehängt werden?

Bsp.:

XXX: DB2.DBX0.0, DB2.DBW0, DB2.DBD0 o. Mehrere Variablen
z.B. P#DB2.DBX0.0 BYTE 10

MfG
Daniel
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Was heißt initialisieren, du legst die Variable vom Typ Any an und bevor du sie verwendest, mußt du die Variable natürlich mit sinnvollen Daten füttern. Insofern, ja, du mußt sie initialisieren.
 
AT legt eine neue Sicht an, d.h. du kannst z.Bsp eine INT-Variable auf eine Struct mit 16 Boolean abbilden. Um mit einer Any-Variable in SCL vernünftig arbeiten zu können, kann man ihr mit der AT-Zuweisung, eine sinnvolle Structur verpassen, die der tatsächlichen Untergliederung des Typs Any entspicht. Dadurch kannst du später im Programm direkt auf Teile der Any-Variable zugreifen.

PS. Wie die Bezeichnung Sicht schon ausdrückt, es ist nur eine andere Zugriffsmöglichkeit auf die selbe Variable.
 
Zuletzt bearbeitet:
Hallo,

noch ein kleines Beispiel am Datentyp DATE_AND_TIME

Code:
DaTi : DT;
  tDT AT DaTi : STRUCT
      year: BYTE;
      month: BYTE;
      day: BYTE;
      hour: BYTE;
      minute: BYTE;
      second: BYTE;
      ms_wday: WORD;
  END_STRUCT;

DaTi := DT#1990-01-01-0:0:0.0;

Der Inhalt tDT.year ist somit 90, tDT.month = 1 usw...


MfG
Daniel
 
Zuletzt bearbeitet:
AT habe ich jetzt verstanden, danke
Noch mal zu Any:

Quelle : ANY;
QuellPointer AT Quelle : STRUCT
SyntaxID : BYTE;
Datentyp : BYTE;
db_Nummer : INT; // Das entspricht 2 Byte
BytePointer : DWORD;// Das entspricht 4 Byte
END_STRUCT;

// D.h QuellPointer soll 1+1+2+4=8 Byte belegen

Begin
Quelle:= DB2.DBX0.0

...
Ist es richtig in dem Fall zu sagen :
p#DB2.DBx0.0 Byte 8 (AWL-mäßig) und dass:
DB2.DBW0:=SyntaxID, Datentyp (Byte0,Byte1) [grob geschrieben]
DB2.DBW2:= db_Nummer
DB2.DBW4:=BytePointer
oder?
 
Zuletzt bearbeitet:
Zurück
Oben