Indizierter Zugriff auf Datenbaustein im SCL

tarzipan7

Level-2
Beiträge
105
Reaktionspunkte
0
Hallo
Ich muss einen Analogwert einlesen und den Rohwert ins Format Real wandeln und indiziert im DB ablegen.

Die Adresse des Analogeingangs ist als INT (z.b 40) im DB vorhanden. ICh krieg das Schreiben des Wertes in den DB nicht hin.
Ist es überhaupt möglich?

VAR_INPUT
DB_NR : BLOCK_DB ; //Number database
DB_ADR_II : INT ; //Startadress
AI_COUNT_II : INT ; //Count of analog inputs
END_VAR

VAR_TEMP
mIW_Raw_RL : REAL ;
mDB_ADR_IL : INT ; //Startadress
mLoopCnt_IL : INT ;
mIW_IL : INT ;
END_VAR

mDB_ADR_IL := DB_ADR_II + 32;

FOR mLoopCnt_IL := 1 TO AI_COUNT_II DO
// Input active?
IF NOT DB_NR.DX[mDB_ADR_IL + 26, 3] THEN
GOTO mark1;
END_IF;
// Init
DB_NR.DX[mDB_ADR_IL + 26, 0] := TRUE;
DB_NR.DX[mDB_ADR_IL + 26, 1] := TRUE;
DB_NR.DX[mDB_ADR_IL + 26, 2] := TRUE;

// Input value convert to real
mIW_IL := WORD_TO_INT(DB_NR.DW[mDB_ADR_IL]);
mIW_Raw_RL := INT_TO_REAL(WORD_TO_INT(EW[mIW_IL]));
DB_NR.DD[mDB_ADR_IL] := mIW_Raw_RL; --> "Kommt immer Meldung; ungültiger Datentyp"

mark1 :;
mDB_ADR_IL := mDB_ADR_IL + 32;

Kann mir jemand einen Typ geben?
gruss
 
Da Du ja ein Real in ein Doppelword schreiben willst, besteht das Problem darin die Typprüfung auszutricksen.

Wie wäre es mit einem "AT"?
Eine Variable vom Typ DWORD mit AT auf den Speicherbereich von dem Realwert legen.

So in etwa:
Code:
VAR_TEMP
...
  mIW_Raw_RL : REAL;
  mIW_Raw_DD AT mIW_Raw_RL : DWORD;
...
END_VAR

...
DB_NR.DD[mDB_ADR_IL] := mIW_Raw_DD; 
...

//Edit:
Übrigens ist die GOTO Anweisung in dem Code nicht nur unschön sondern auch sehr leicht zu ersetzen.
 
Zuletzt bearbeitet:
... oder alternativ :
Code:
DB_NR.DD [mDB_ADR_IL] := REAL_to_DWORD(mIW_Raw_RL) ;

Gruß
LL
 
... oder alternativ :
Code:
DB_NR.DD [mDB_ADR_IL] := REAL_to_DWORD(mIW_Raw_RL) ;
Gruß
LL

Ich habe Deine alternative gerade getestet und sie funktioniert. Was mich allerdings ehrlich verwundert. Ich hätte jetzt erwartet das Step7 da ein vorzeichenlose Ganzzahl daraus macht. Da die S7 je kein UDINT kennt und dafür ein DWORD nimmt.
 
Ich habe Deine alternative gerade getestet und sie funktioniert. Was mich allerdings ehrlich verwundert. Ich hätte jetzt erwartet das Step7 da ein vorzeichenlose Ganzzahl daraus macht. Da die S7 je kein UDINT kennt und dafür ein DWORD nimmt.

Bin auch gerade am Testen. Und dieser Typ ist echt hilfreich für weitere Manipulationen mit Realwerten.

Danke
 
Bin auch gerade am Testen. Und dieser Typ ist echt hilfreich für weitere Manipulationen mit Realwerten.

Danke

Ich und auch Zottel hätten erwartet das REAL_TO_DWORD aus einem Real eine Ganzzahl macht (also die Kommastellen weg rundet).
Ich habe es gerade noch mit CoDeSys getestet und auch da wird bei REAL_TO_DWORD eine Ganzzahl daraus (wie ich es auch erwartet habe).


Step7 verwundert mich immer wieder.
 
Hallo,
ich habe mit den Typ-Umwandlern (in BYTE,WORD oder DWORD) bei SCL (bisher) die Erfahrung gemacht, dass sie im Grunde nur die Sicht auf die Variable ändern. Ich habe die Befehle bislang bei ähnlichen Transfer-Geschichten verwendet ...
Was ich allerdings nicht verstehe ist, warum diese Wandlung überhaupt notwendig ist, denn Sinn macht sie keinen ...

Gruß
LL
 
Nee, es rundet wirklich. Ich arbeite nicht oft mit SCL, deshalb habe ich es gerade mal probiert. Die SCL-Anweisungen:

a:=1.0;
b:=REAL_TO_DWORD

ergibt AWL:

L 1.000000e+000
T #TEMP1
L #TEMP1
RND
T #TEMP2

und das DWORD ist dann 1 (statt #L 3f800000)
 
Mir kam die Alternative gleich komisch vor. Darum hatte ich sie ja auch getestet.

Also mein Test (Kurzform):
SCL:
Code:
FUNCTION FC3 : VOID

VAR_TEMP
  myReal :REAL;
  myDWORD:DWORD;
END_VAR

myReal := 1.0;
myDWORD := REAL_TO_DWORD(myREAL);

END_FUNCTION
ergibt in AWL:
Code:
      SET   
      SAVE  
      =     L      8.1
      L     1.000000e+000
      T     #myReal
      T     #myDWORD
      SAVE  
      BE
IMHO ist das ein Bug und wahrscheinlich hast Du eine neuere Version von Step7 als ich (SCL V5.1+SP4) in der dieser Bug beseitigt wurde.

@Larry: Welche Version hast Du?
 
Zuletzt bearbeitet:
Ich habe V5.4, Release 5.4.0.0 benutzt
 
Hallo Zottel und Zotos,
ich benutze SCL 5.3.SP4.
Die Routinen, die ich benutze und die diese Variablen-Wandlung machen sind allerdinngs mit SP1 erstellt und noch nicht wieder neu "compiliert". Somit danke ich euch beiden für diesen Hinweis, denn damit laufe ich ja Gefahr, dass einer meiner "Standard"-Bausteine nach einer neuen "Compilierung" nicht mehr funktioniert.

Ich werde das auf jeden Fall einmal testen.

Es ist also anscheinend auf jeden Fall wichtig, hin und wieder mal über die Dinge zu sprechen. Manche Sachen bekommt man nicht immer so direkt mit ...

Gruß
LL
 

100% Ack

Es ist also anscheinend auf jeden Fall wichtig, hin und wieder mal über die Dinge zu sprechen. Manche Sachen bekommt man nicht immer so direkt mit ...

Jo, sag das mal auch meiner Frau !
 
Für die Nutzung dieser Website sind Cookies erforderlich. Du musst diese akzeptieren, um die Website weiter nutzen zu können. Erfahre mehr…