KNX-Kommunkation über KNXnet/IP mit Siemens S7-1500/S7-1200; TIA-Portal

Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
wenn sich das Projekt übersetzen lässt, sollte es funktionieren.
Ein Bekannter von mir verwendet das Programm auf einer S7-1200.
Ältere 1200ter Steuerungen unterstützen teilweise nicht alle Funktionen die ich verwendet habe:-?... Aber dies stellt man beim Übersetzen fest.
Gruß
Kürbis85

Ich bin ebenso ziemlich günstig an eine 1211 mit FW V3 gekommen. Nachdem ich gemerkt habe, was dort alles nicht geht gegenüber der FW4.x (z.B. Serialize / Deserialize), wäre es interessant zu wissen, ob dein Bekannter eine 1200er mit FW 4.x oder höher verwendet oder ob er das Programm so anpassen konnte, damit es dort ebenfalls funktionsfähig ist.
Dann würde mich sehr interessieren, was er am Baustein "KNX_Kommunikation" angepasst hat.
Mit einer 1500er Steuerung der neueren Generation habe ich das Programm ebenfalls schon zu laufen gebracht. Sehr schöne Funktionen auf jeden Fall, danke dafür.
 
Hallo, an kürbis85.
Wollte noch mal auf meine Frage zurückkommen, währe es möglich das ich das Projekt als Muster von ihrem bekannten bekommen könnte. Was verwendet er für eine Firmware auf die S7? Wenn es nicht möglich ist das Projekt zu bekommen, bitte bescheid geben. Vielen Dank im Voraus.
Waldemar1
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo kürbis85,

erstmal vielen Dank und "Hut-Ab" für das Bereitstellen der Software!

Ich habe seit längerem nach so etwas gesucht. Momentan habe ich eine CMK2000 mit einer LOGO verbaut das aber leider nicht alle Datentypen von KNX beherrscht.
Deine Software habe ich auf V15.1 hochgezogen und mit einer 1511F getestet. mit der Änderung von Daniel


Code:
#GruppenAddr := SHL (IN := #HauptGruppe, N := 12);
Funktioniert das auch schon sehr gut. Leider habe ich jetzt noch ein paar Proble bei denen ich Starthilfe benötige.
Temperaturen werden ohne Probleme übertragen genau so den Aktuellen Strom Wert meines KNX Netzteils 7.012.

Bei der Spannung z.b. kommt was falsches an lt. ETS ist die Bus-Spannug 9.020 ein 2Byte Real Wert.
Die S7 liest aber (anstatt von ca.30V) 204.8 mit dem CMK von LOGO bekomme ich einen plausiblen Wert von 30,38V.

Desweitern möchte ich einen Dimmwert und einen Stellwert eines Heizungsaktors in die S7 übertragen beides % 0-100 5.001 hier wird dauerhaft 0 angezeigt.

Könntest Du mir, uns auch erklären wie man den FB erweitern kann um noch andere Datentypen zu lesen/schreiben z.B. Szenennummern!

Vielen Dank für die Hilfe!!
 
Danke für das Programm läuft super.
Habe den Baustein noch erweitert um Temperaturen bzw. Gleitpunkt Zahlen (DPT 9.x) und Strings (DPT 16.x) zu senden.
Mit der S7-1212 habe ich jetzt eine super Schnittstelle zwischen meiner ETA Hackschnitzelheizung mit Modbus TCP und KNX (nutze den GIRA X1 als Tunnel)

@SPS-Andy
Bei Prozentwerten musste ich wenn ich sie senden will skalieren:
VARIABLE_FÜR_KNX := REAL_TO_USINT(VARIABLE_0-100% * 2.55);
 
Hallo Matthias92, ich habe versucht die Funktionen, die du integriert hast selber zu integrieren.
Leider hat das nicht geklappt. Könntest du das Programm hochladen ?
Viele Grüße
Simon
 
Hallo Matthias,
erst einmal vielen vielen Dank für deine wirklich tolle Arbeit.
Hab das ganze bei mir jetzt im Einsatz und muss sagen ist schon echt gut.
Jedoch ist mir jetzt aufgefallen, wenn ich eine REAL-Zahl schicken möchte die größer als 327 ist kommt was falsches an. Scheint als würde hier die Wandlung nicht passen.
Weiß schon grob wo das gemacht wird, jedoch nicht genau wie es gemacht wird und somit komm ich hier nicht weiter. ;)

Könnte sich das jemand mal anschauen?

ELSIF TypeOf(#Wert) = Real THEN
VariantGet(SRC := #Wert,
DST => #tmp_Real);
#KNX_Dat.Send_Dat.GruppenAddr := #GruppenAddr;
#KNX_Dat.Send_Dat.Laenge := 16#03;
#KNX_Dat.Send_Dat.NPDU_ABCI := 16#00;

#tmp_Int := REAL_TO_DINT(#tmp_Real * 100.0) / 2; //Nach INT wandeln
#tmp_e1 := DINT_TO_INT(#tmp_Int / 2048) + 1; //Exponent bestimmen
#tmp_Word2 := INT_TO_WORD(SHL(IN := #tmp_e1, N := 11)); //Exponent verschieben
#tmp_Word1 := INT_TO_WORD(#tmp_Int / (2 **(#tmp_e1-1)));//Mantisse bestimmen
#tmp_Word1 := #tmp_Word1 & 16#87FF; //Mantisse + Vorzeichen behalten
#tmp_Word1 := #tmp_Word1 OR #tmp_Word2; //Zusammenfügen

#KNX_Dat.Send_Dat.Daten[1] := 16#80;
#KNX_Dat.Send_Dat.Daten[2] := #tmp_Word1.%B1;
#KNX_Dat.Send_Dat.Daten[3] := #tmp_Word1.%B0;

#KNX_Dat.Senden := true;
#SendeAnf := false;
#Gesendet := true;
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Code:
DPT 9.xxx is defined for transmitting floating point values. Various datapoint types have
been defined for different physical variables. Not all datapoint types use the maximum value range. Devices shall ignore invalid or
undefined values.  The value to be transferred shall be coded in the mantissa. If the value multiplied by 100
(because of the resolution of 0,01) does not fit in the range of –2048 and +2047, the
mantissa shall be divided by a factor, which constitutes the exponent. The sign bit
indicates whether the value is a negative (S bit = 1) or a positive value (S bit =0). In case
of negative values, the mantissa shall moreover be the two’s complement of the
corresponding positive value.

4.10.3  Example
A temperature value of - 30 degrees C can be calculated according DPT 9.001 as follows:  Step 1: Calculate the mantissa Due to the resolution of 0.01, the value to be coded must be multiplied by 100: 30 x 100 =
3000  Step 2: Check if exponent is required  Mantissa is 11 bits, range is from + 2047 to -2048. 3000 is larger, therefore exponent is required. Which exponent? 2^1 = 2 is sufficient as 3000 : 2 = 1500, and this number can be coded in
the mantissa.  Step 3: Code the mantissa: 
Value: 1024 512 256 128 64 32 16 8 4 2 1
Number: 1 0 1 1 1 0 1 1 1 0 0  If the number is negative, then create a two’s complement! 

Output value:  101 1101 1100  Invert:   010 0010 0011 +1                        1 -------------------------------------------------   010 0010 0100  Step 4: Code sign and exponent Number is negative, therefore the S bit = 1 Exponent = 1, coded in four bits = 0001  Step 5: Final result 
-30 = 1   0001   010 0010 0100
 
den Datentyp der Variable tmp_int auf DINT ändern dann sollte es gehen.
allerdings lässt die Genauigkeit bei höheren Zahlen nach.
War froh das es soweit mal funktioniert hat.
Übertrage damit aktuell nur Temperaturen und zwischen -20.0 und +100.0 passt es
 
den Datentyp der Variable tmp_int auf DINT ändern dann sollte es gehen.
Falsch.

So ungefähr könnte das aussehen (In Codesys, Siemens kann ich gerade nicht testen, sollte aber nicht schwer sein, das umzusetzen:

Code:
tmpExp := 0;    (*    Exponent initialisieren    *)

tmpIntValIn := REAL_TO_INT(tmp_Real * 100.0);

IF  tmpIntValIn > 2047 OR tmpIntValIn < -2048 THEN

    WHILE tmpIntValIn / EXPT(2,tmpExp) > 2047 DO
        tmpExp := tmpExp +1;
    END_WHILE;

ELSIF tmpIntValIn < -2048 THEN

    WHILE tmpIntValIn / EXPT(2,tmpExp) < -2048 DO
        tmpExp := tmpExp +1;
    END_WHILE;

ELSE            (*    Kein Exponent erforderlich    *)

    ;

END_IF;

tmp_Int := tmpIntValIn / REAL_TO_INT(EXPT(2,INT_TO_WORD(tmpExp) ));         (*    Mantisse roh                *)

tmp_Int := WORD_TO_INT(INT_TO_WORD(tmp_Int) AND 16#7FF);
tmpOut := SHL(tmpExp,11);                (*    Exponent positionieren        *)
IF tmpIntValIn < 0 THEN                    (*    negativ?    -> Vorzeichen setzen    *)
    tmpOut := tmpOut OR 16#8000;
END_IF;
tmpOut := tmpOut OR INT_TO_WORD(tmp_Int);
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Falsch.

So ungefähr könnte das aussehen (In Codesys, Siemens kann ich gerade nicht testen, sollte aber nicht schwer sein, das umzusetzen:

Habs mal in TIA umgesetzt
Musste ein paar Int durch Dint ersetzen
Und bei negativen Zahlen gabs einen Fehler in der If


Code:
FUNCTION "knx-real-to-DPT9" : Void
{ S7_Optimized_Access := 'TRUE' }
VERSION : 0.1
   VAR_INPUT
      inReal : Real;
   END_VAR

   VAR_OUTPUT
      outDPT9 : Word;
   END_VAR

   VAR_TEMP
      tmpExp : Int;
      tmpDIntValIn : DInt;
      tmp_dInt : DInt;
      tmpOut : Int;
   END_VAR


BEGIN
    
    (*
    
    Wandelt eine Real Zahl in den DPT9.xxx (2 Byte Gleitkommawert)
    
    Quelle:
    https://www.sps-forum.de/threads/knx-kommunkation-%C3%BCber-knxnet-ip-mit-siemens-s7-1500-s7-1200-tia-portal.93641/post-804342
    
    Weitere Infos:
    03_07_02 Datapoint Types v01.08.02 AS.pdf
    3.10 Datapoint Types “2-Octet Float Value”
    
    Range: [-671 088,64 … 670 760,96]
    
    *)
    
    #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 := #tmpExp, N:=11);                (*    Exponent positionieren        *)
    
    
    IF #tmpDIntValIn < 0 THEN                    (*    negativ?    -> Vorzeichen setzen    *)
        #tmpOut := #tmpOut OR 16#8000;
    END_IF;
    
    
    #outDPT9 := #tmpOut OR DINT_TO_WORD(#tmp_dInt);
    
    
    
    
    
    
END_FUNCTION
 
Habe das Projekt mal erweitert

Leseanfrage (GroupValueRead) vom Bus an die SPS, und an von der SPS an den Bus
SendByChange
Init Scan
Weitere DPTs
Strukturierte Parametrierung der KO/GAs
 

Anhänge

  • KNX_SPS_Forum_Van_20211017_2046.zip
    1,4 MB · Aufrufe: 64
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,
im Anhang das aktuelle Projekt von mir.
Das Projekt beinhaltet das gesamte SPS-Programm, wozu auch eine Fußbedenheizung (Mischer-Regelung) gehört.
Die KNX-Kommunikation sollte erkenntlich sein.

In der Version wurde einige Fehler beseitigt, dazugehört auch das Wandeln von Dpt 9.xxx nach Real.
Zusätzlich wurde das "GroupValueRead" mit implmentiert und einige DPTs erweitert.

Da es eine ständige Erweiterung war und ist, weiß ich garnicht mehr so genau was ich mittlerweile alles ergänzt habe.
Unterstützte DPTs werden in den Baustein-Kommentar angegeben.

Im großen und ganzen läuft das ganze in meinen Augen sehr stabil... hatte zumindest bis jetzt noch keine Ausfälle.

Bei Rückfragen einfach melden.

Gruß
Kürbis
 

Anhänge

  • KNX_Client_2.zip
    1,1 MB · Aufrufe: 115
Hi Kürbis85,

auch von mit vielen Dank für die tolle Arbeit. Funktioniert sehr gut.

Ich habe ab und an noch Verbindungsabbrüche im Netzwerk aber das liegt wohl bei mir im Netz. Allerdings hat der Baustein danach Schwierigkeiten wieder mit dem KNX Gateway zu kommunizieren.
Kann leider noch nicht sagen in welchem Zustand er hängt aber der Ausgang Timeout kommt.

Im Zustand 270 (Ethernet-Verbindung freigeben) hast Du zwei mal If RueckState=0 Then State := 0 drin. Der State 0 ist aber nicht definiert.

Danke Dir schon mal!
 
Hallo Leute,
bin gerade zufällig auf diesen Eintrag gestossen und habe gleich angefangen das ganze bei mir zu testen.
Hat jemand das ganze schon mal mit knxd ausprobiert? Ich kann zwar eine Verbindung aufbauen, jedoch komme ich über diesen Status nicht weiter.

1673549989882.png

1673550008906.png

1673550033788.png

Bin mit KNX ein totaler Anfänger, wenn ich über knxtools eine Gruppe anspreche funktioniert das sofort. Heist an den Deamon kann es nicht liegen.

Funktioniert das überhaupt mit den Deamon oder brauche ich ein KNX/IP Gateway? Weiß das jemand von euch?
 
Zurück
Oben