Step 7 SCL Quelle von TIA in Simatic Manager

Alexus26

New member
Beiträge
2
Punkte Reaktionen
0
Zuviel Werbung?
->Hier kostenlos registrieren
Hallo,
ich benötige mal eure Hilfe zum Thema SCL Quelle.
Ich habe eine S7-300 für meine Haustechnik in der ein Gateway EIB 300 von Helmholz verbaut ist um KNX Teilnehmer mit der S7 zu koppeln.
Das läuft auch alles wunderbar, habe nun aber einen Taster Smart von MDT mit Display verbaut und möchte da gerne die aktuelle Aussentemperatur
die in der S7 vorhanden ist auf den KNX Bus senden und anzeigen. Die Temperatur ist im Format DPT9 und wenn ich richtig Informiert bin ist das
eine 2 Byte Gleitkommazahl, in der S7 habe ich eine 4 Byte Gleitkommazahl. Ich habe nun in disem Forum eine SCL Quelle gefunden wo sich einer die
Mühe gemacht hat dieses Format entsprechend umzuwandeln. Diese Quelle ist für TIA und da ich mein Projekt noch im Simatic Manager habe passen da
ein paar DInge nicht ganz. Ich habe versucht es entsprechend anzupassen was mir von über 20 Fehlern bis auf 3 auch gelungen ist.
Habe noch die Meldungen ungültiger Datentyp und unzulässiger Operant in den Zeilen 46, 50 und 54. Im Anhang ist ein TXT File in dem die betroffenen
Zeilen mit Nummern versehen sind. Bin jetzt leider nicht der SCL Profi und hoffe mir kann da einer weiterhelfen, ist bestimmt nur eine Kleinigkeit.
Vielen Dank.
 

Anhänge

  • SCL_Real_to_DPT9.txt
    1,4 KB · Aufrufe: 15

codemonkey

Well-known member
Beiträge
53
Punkte Reaktionen
16
Habe es nicht im Detail geprüft, aber eigentlich sagt der Compiler, Du sollst die Datentypen konvertieren.

In etwa so:
Code:
tmpOut := DWORD_TO_DINT(SHL(IN := DINT_TO_DWORD(tmpExp), N:=11));        //Zeile 46 ungültiger Datentyp           (*    Exponent positionieren        *)


IF tmpDIntValIn < 0 THEN                                        (*    negativ?    -> Vorzeichen setzen    *)
    tmpOut := DWORD_TO_DINT(DINT_TO_DWORD(tmpOut) OR 16#8000);   //Zeile 50 unzulässige Operantentypen
END_IF;


 outDPT9 := DINT_TO_WORD(tmpOut) OR DINT_TO_WORD(tmp_dInt);    //Zeile 54 unzulässige Operantentypen
 

funkey

Well-known member
Beiträge
288
Punkte Reaktionen
72
Zuviel Werbung?
->Hier kostenlos registrieren
Ebenfalls ungetestet, lässt sich aber fehlerfrei übersetzen.
Perl:
FUNCTION FC80 : VOID

 VAR_INPUT
      inReal : Real;
   END_VAR

   VAR_OUTPUT
      outDPT9 : Word;
   END_VAR

   VAR_TEMP
      tmpExp : Int;
      tmpDIntValIn : DInt;
      tmp_dInt : DInt;
      tmpOut : DWord;
   END_VAR
     
BEGIN
    tmpExp := 0;    (*    Exponent initialisieren    *)
   
    tmpDIntValIn := REAL_TO_DINT(inReal * 100.0);
   
    IF tmpDIntValIn > 2047  THEN   // OR #tmpDIntValIn < -2048
       
        WHILE tmpDIntValIn / (2**tmpExp) > 2047 DO     //EXPT(2, #tmpExp)
            tmpExp := tmpExp + 1;
        END_WHILE;
       
    ELSIF tmpDIntValIn < -2048 THEN
       
        WHILE tmpDIntValIn / (2**tmpExp) < -2048 DO    // EXPT(2, #tmpExp)
            tmpExp := tmpExp + 1;
        END_WHILE;
       
    ELSE            (*    Kein Exponent erforderlich    *)
       
        ;
       
    END_IF;
   
   
    tmp_dInt := tmpDIntValIn / REAL_TO_DINT((2**(tmpExp)));         (*    Mantisse roh   *)  //(EXPT(2, INT_TO_WORD(#tmpExp))
   
    tmp_dInt := WORD_TO_DINT(DINT_TO_WORD(tmp_dInt) AND 16#7FF);
    tmpOut := SHL(IN := INT_TO_WORD(tmpExp), N:=11);        //Zeile 46 ungültiger Datentyp           (*    Exponent positionieren        *)
   
   
    IF tmpDIntValIn < 0 THEN                                        (*    negativ?    -> Vorzeichen setzen    *)
        tmpOut := tmpOut OR 16#8000;   //Zeile 50 unzulässige Operantentypen
    END_IF;
   
   
     outDPT9 := DWORD_TO_WORD(tmpOut OR DINT_TO_DWORD(tmp_dInt));    //Zeile 54 unzulässige Operantentypen

END_FUNCTION
 
OP
A

Alexus26

New member
Beiträge
2
Punkte Reaktionen
0
Hallo,
vielen Dank für eure Hilfe.
Habe meinen Code korrigiert und siehe da es lässt sich fehlerfrei übersetzen.
Den baustein ins S7 Programm eingebaut und schon kommt die richtige Temperatur am Display an.
...Perfekt! (y)
 
Oben