Ankündigung

Einklappen
Keine Ankündigung bisher.

Aufbau eines KNXnet IP Telegramms

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • pspl
    antwortet
    ack

    hallo all

    sorry to write in English but the alternative is google translate Please feel free to answer in German.
    I found the info in the this thread extremely useful. I'm trying to create a arduino based KNX system using KNXnet/IP. I'm getting to grips with the construction of the cEMI messages.
    I do have some questions with respect to the ACK. Is it necessary to implement this? (e.g. if I want to use a KNX button and an IP gateway to control something on the arduino or if I want a button push on the arduino to control a KNX acctor via a gatewayu). If I need the ACK how do I construct a correct ACK message?

    thx

    Pieter

    Einen Kommentar schreiben:


  • szange
    antwortet
    Hallo Gaston,

    vielen Dank für den Tip. Jetzt funktionieren endlich die Adressen. Bei den Werten sieht es auch nicht schlecht aus. Aktuell habe ich noch ein Problem mit dem Typ:

    Beispiel:
    - Nachricht: 1.1.27 - 1/0/4 - Typ: 0 - Wert: Neuer Wert: 89 - 6 10 5 30 0 11 29 0 BC D0 11 1B 8 4 1 0 89 C 4C 3A 30 31 3A 30 36 20 20 20 20 20 20 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

    Ich hatte gedacht by byte(14) bekomme ich den Typ, aber scheinbar habe ich da auch noch einen Fehler.

    Gruss Sebastian

    Einen Kommentar schreiben:


  • Gaston
    antwortet
    Dafür braucht man nicht mit Hex und Strings zu hantieren:

    Code:
     
    Public Function Byte2GA(ByVal b1 As Byte, ByVal b2 As Byte) As String
    Dim HG As Integer, MG As Integer
      HG = (b1 And 248) \ 8
      MG = (b1 And 7)
      Byte2GA = HG & "/" & MG & "/" & b2
    End Function
    Gruss,
    Gaston

    Einen Kommentar schreiben:


  • szange
    antwortet
    Hallo,

    ich habe mal wieder etwas Zeit gefunden an meiner .Net-Schnittstelle zu basteln.

    Es ist richtig das 6503 = 12/5/3 (=GA), aber ich bekomme im 6/5/3 übersetzt.

    Mit folgendem Code übersetze ich die Byte-Werte:
    PrivateFunction GetZielAdresse(ByVal p_Byte1 AsByte, ByVal p_Byte2 AsByte) AsString
    GetZielAdresse = Conversion.Hex(p_Byte1).PadLeft(2, "0").Substring(0, 1) & "/" & Conversion.Hex(p_Byte1).PadLeft(2, "0").Substring(1, 1) & "/" & p_Byte2
    EndFunction

    Gruß Sebastian

    Einen Kommentar schreiben:


  • Gaston
    antwortet
    Zitat von szange Beitrag anzeigen
    z.B.:
    20:19:28.3429454 Quelladresse: 2.1.53 Zieladresse: 0/6/83 - Nachricht: 1.1.53 - 6/5/3 - 06 10 05 30 00 11 29 00 BC D0 11 35 65 03 01 00 80 0F 7B 3A 30 38 3A 35 33 20 20 20 20 20 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

    Richtig ist: 1.1.53 - 6/5/3

    Gruß Sebastian
    Meine Erklärung bezog sich lediglich auf die 3-stufigen Gruppenadressen.

    1135 is 1.1.53
    BLGG = B=Bereich L=Linie GG=Geräteadresse

    aber

    6503 ist nicht 6/5/3 sondern 12/5/3 (=GA) oder 6.5.3 (=PA)

    Einen Kommentar schreiben:


  • szange
    antwortet
    Hallo,

    vielen Dank für das Beispiel. Sieht soweit auch gut aus.

    Ich habe nur das Problem, das andere Varianten nicht stimmen.

    z.B.:
    20:19:28.3429454 Quelladresse: 2.1.53 Zieladresse: 0/6/83 - Nachricht: 1.1.53 - 6/5/3 - 06 10 05 30 00 11 29 00 BC D0 11 35 65 03 01 00 80 0F 7B 3A 30 38 3A 35 33 20 20 20 20 20 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

    Richtig ist: 1.1.53 - 6/5/3

    Gruß Sebastian

    Einen Kommentar schreiben:


  • Gaston
    antwortet
    Zitat von JNK Beitrag anzeigen
    Hg = int( wert/8)
    Mg = rest( Wert/8)
    Durch 8 teilen ?

    Richtig (in VB):

    Dim b AsString
    Dim d AsInteger
    Dim Hg AsInteger, Mg AsInteger, Sg AsInteger

    b =
    "6B03"
    d = Val("&H" & b)
    Hg = Int(d / 2048)
    d = d
    Mod 2048
    Mg = Int(d / 256)
    Sg = d
    Mod 256


    P.S.: In disem Code ist Int() nur als paranoia anzusehen. Wer weis was er tut kann das auch weglassen.

    Einen Kommentar schreiben:


  • JNK
    antwortet
    Also eigentlich können auch alle Sprachen sowas wie

    Hg = int( wert/8)

    Und

    Mg = rest( Wert/8)

    Gruß,

    Der Jan


    Sent from my iPhone using Tapatalk

    Einen Kommentar schreiben:


  • do13
    antwortet
    Zitat von szange Beitrag anzeigen
    Das heist ich muss aus dem 6B03 erst einen Bit-Code machen und
    dann wieder zurück übersetzen. Leider kommt bei mir in .net VB folgender Bit-Code heraus:

    1000001110011
    Warscheinlich liegt das daran das nicht alles mit 0 aufgefüllt ist.
    BIsher habe ich scheinbar keine brauchbar Routine gefunden die das macht.
    Du brauchst nicht den Bitcode. Mit ein paar Schiebe-und Und Operationen geht das schon.
    In c++ z.Bsp so:
    Code:
    ostringstream temp;
    temp << ((addr>>11)&0xf) << "/" << ((addr>>8)&0x7) << "/" << (addr&0xff);

    Einen Kommentar schreiben:


  • szange
    antwortet
    Hallo,

    vielen Dank erstmal für die Hilfe.

    Das heist ich muss aus dem 6B03 erst einen Bit-Code machen und
    dann wieder zurück übersetzen. Leider kommt bei mir in .net VB folgender Bit-Code heraus:

    1000001110011
    Warscheinlich liegt das daran das nicht alles mit 0 aufgefüllt ist.
    BIsher habe ich scheinbar keine brauchbar Routine gefunden die das macht.

    Gruß Sebastian

    Einen Kommentar schreiben:


  • Gaston
    antwortet
    Zitat von szange Beitrag anzeigen
    Es sollte eigentlich 13/3/3 als Zieladresse übersetz werden.
    Stattdesen bekomme ich 6/B/3.

    Ich hoffe es kann mir jemand weiterhelfen.

    Gruß Sebastian
    Dir Bitmasken der Adressen sind nicht nibble-bündig:

    Code:
     
    6B03 = 0110 1011 0000 0011
           HHHH HMMM SSSS SSSS
           
    H= 01101=13
    M= 011  =3
    S= 00000011=3
    Gruppenadresse: H/M/S= 13/3/3
    Gruss,
    Gaston

    Einen Kommentar schreiben:


  • JNK
    antwortet
    So spontan: 6b = 6x16+11=107 und 13x8+3=107.....


    Sent from my iPhone using Tapatalk

    Einen Kommentar schreiben:


  • szange
    antwortet
    KNX/EIB Aufbau eines KNXnet IP Telegramms

    Hallo zusammen,

    ich bin an dem Zerlegen des IP-Telegramms. Soweit sieht das auch garnicht schlecht aus.

    Funktioniert:
    Quelladresse: 1.1.122 Zieladresse: 0/4/38 - Nachricht: 06 10 05 30 00 1F 11 00 BC E0 11 7A 04 26 0F 00 80 30 30 3A 34 35 3A 32 38 20 20 20 20 20 20 00 00 00 00 00

    Fehler:
    Quelladresse: 1.1.4 Zieladresse: 6/B/3 - Nachricht: 06 10 05 30 00 15 29 00 BC D0 11 04 6B 03 05 00 80 41 B7 57 69 35 3A 32 38 20 20 20 20 20 20 00 00 00 00 00 00

    Es sollte eigentlich 13/3/3 als Zieladresse übersetz werden.
    Stattdesen bekomme ich 6/B/3.

    Ich hoffe es kann mir jemand weiterhelfen.

    Gruß Sebastian

    Einen Kommentar schreiben:


  • shadovv1
    antwortet
    Danke für die erklärungen hilft mir weiter!

    Einen Kommentar schreiben:


  • AurischH
    antwortet
    Zitat von shadovv1 Beitrag anzeigen
    Meine Telegramme sehen folgendermaßen aus:

    2B 07 03 01 00 04 02 14 D0 B4 31 64 51 02 E0 00 XX AD
    2B 07 03 01 00 04 02 9E 77 B4 31 64 51 01 E0 00 XX AE

    [...]

    Kann mir bitte wer den ersten Teil des Telegramms erklären [...]

    Danke im voraus

    shadovv1
    2B ist klar (MessageCode, hier: BusmonitorIndication)
    07: Längenangabe für zusätzliche Infos (AddInfos) (oft 0)

    AddInfo-Aufbau:

    1. Gesamtlänge (hier 7)

    2a. Typ der Info (hier 3 für "busmon info")
    2b. Länge der folgenden Daten (hier 1)
    2c. Daten (hier 0 (status ok))

    3a. Typ der Info (hier 4 für "relative timestamp info")
    3b. Länge der folgenden Daten (hier 2)
    3c. Daten (hier 14D0 bzw. 9E77 timestamp)

    Der Status-Wert
    Der Zeitstempel entspricht einem internen Zähler der Schnittstelle.

    Für meine USB-Schnittstelle (GIRA 1070 00) gilt interessanterweise:
    Anzahl der Zyklen = (13 x 52 + 1) x (L + 1), wobei L der Anzahl der Bytes des Telegrammes entspricht. Für die Übertragung eines Bits werden 52 Zyklen des Zählers benötigt. Ein Byte wird ja durch 13 Bits übertragen (Startbit, 8 Datenbits, Parität, Stopbit und 2 Wartebits). Ein Extrazyklus wird für jedes Byte benötigt (keine Ahnung warum). Mit dieser Formel kann für die GIRA-Schnittstelle exakt der Zeitpunkt der Übertragung eines Telegrammes bestimmt werden.

    Für eine andere Schnittstelle muss zumindest der Wert 52 neu bestimmt werden. Das ist aber leicht, wenn man genügend aufgezeichnete Telegramme hat.

    Einen Kommentar schreiben:

Lädt...
X