Ankündigung

Einklappen
Keine Ankündigung bisher.

Chromoflex ansteuerung

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

    Chromoflex ansteuerung

    hi Community,

    habe mir ein Chromoflex besorgt und will das Gerät über den PC ansteuern um mir meine Farbwechsel mit VB zu Programmieren.
    Nachdem ich alles mögliche veranstaltet habe um auf das Gerät mittels PC zuzugreifen, habe ich es endlich geschafft, den Comport auszulesen um zu sehen welche Datenpakete von der Software (Cf_Edit) losgeschickt werden. Habe mir dann die Daten abgespeichert (verschiedene Farben, Effekte) die ich nun direkt aus VB an den Chromoflex schicken kann.
    Klappt einwandfrei

    Jetzt aber zu meinem Eigentlichen Problem:
    Da das Protokoll vom Chromoflex immer eine CRC16-Modbus Checksumme an die zu sendenen Daten dranhängt, kann ich nur fertige Datenpakete senden, die ich am Comport mitgelesen habe.
    Das ist LÄSTIG , weil ich 100erte Einstellungen mitlesen müßte, die ich gerne verwenden will.

    Da in der Beschreibung "Chromoflex Usp3_com.pdf" der CRC16 in C++
    beschrieben wird -> ich aber kein C++ kann wollte ich doch hier mal anfragen, wer dieser Sprache mächtig ist und mir den Rechenvorgang mal erläutern kann, damit ich ihn in VB reinkriege.
    Barthelme scheint ja nicht in der Lage oder Willens zu sein auf Fragen diesbezüglich zu antworten
    Es könnte aber auch gleich ein CRC16-Programm in VB sein, vieleicht hat ja jemand eines auf seinem Rechner rumliegen!?
    Die Berrechnung muß als Ausgabe einen HEX-Wert und keinen ASCII-Wert haben. Gebe mal ein Beispiel:
    Wenn ich den Hexwert 0xCA berechne, muß als Lösung: 0x173F rauskommen und nicht 0xB0F0.
    Wenn ich das nämlich noch hinbekomme, dann kann ich mittels PC das Gerät komplett steuern.

    Also interessierte Chromoflex Benutzer, bitte helft mir, damit ich mich von den eingebetteten Effekten vom Chromoflex verabschieden kann.

    Gruß vom Chromoflex-User
    Lobo

    #2
    Ich habe ein Programm in VB6 gemacht. Sehr quick und sehr dirty. Aber es ist eine CRC16 drin und somit kann stufenlos geregelt werden. Auch reagiert das Proggi auf UDP Telegramme vom HS

    Meines geht auch nicht auf die RS232 (was allerdings auch eingebaut ist) sondern sendet das als UDP auf einen MOXA der das dan wieder auf RS232 ausgibt...

    Wir könnten ja in kleines Projekt daraus machen

    Code:
    Function CRC16(txt As String) As String
       crc = -1
        For ff = 1 To Len(txt)
            j = Asc(Mid(txt, ff, 1))
            crc = crc Xor j
            For x = 1 To 8
                mask = 0
                If crc / 2 <> Int(crc / 2) Then mask = &HA001
                crc = Int(crc / 2) And &H7FFF: crc = crc Xor mask
            Next x
        Next ff
      [COLOR=Green]       CRC16 = Hex(crc) '   eingefügt....[/COLOR]
        If Len(CRC16) > 4 Then
            CRC16 = Mid$(CRC16, 5)
        End If
        CRC16 = Chr$(CInt("&h" & Left$(CRC16, 2))) & Chr$(CInt("&h" & Right$(CRC16, 2)))
    
    End Function

    Kommentar


      #3
      hmmm, habe mir den Code mal gezogen und ausprobiert, funktioniert bei mir nicht, da nach durchlaufen der zwei for...next schleifen CRC16="" ist.
      Was übergibst du denn für Werte an die Funktion?
      Hab ich da was verpeilt?

      Ich benutze aber fast den gleichen Code wie du, bis auf
      Code:
      j = Val("&H" + Mid(txt, nC, 1))
      , damit in Hex gerechnet wird
      und den unteren Teil
      Code:
      If Len(CRC16) > 4 Then
              CRC16 = Mid$(CRC16, 5)
          End If
          CRC16 = Chr(CInt("&h" & Left$(CRC16, 2))) & Chr(CInt("&h" & Right$(CRC16, 2)))
      was macht dieser eigentlich wenn er funktioniert?

      Gruß Lobo

      Kommentar


        #4
        Zitat von Lobo2210 Beitrag anzeigen
        was macht dieser eigentlich wenn er funktioniert?
        er erzeugt Dir den CRC16 für den benötigten String

        Iss nicht Dein Ernst - oder?


        Ok, mal am Beispiel Reset....

        Code:
        'Reset senden
        
        sende "0000FE"
        
        Sub sende(c As String)
        h = Chr$(&HCA) & Chr$(0) & Chr$(0) & Chr$(0)
            For t = 1 To Len(c) Step 2
                ts = Trim$(Mid$(c, t, 2))
                wert = CInt("&h" & ts)
                h = h & Chr$(wert)
            Next t
         comm.Output = h & CRC16(h)
         Do
             DoEvents
         Loop While comm.OutBufferCount > 0
        End Sub

        Kommentar


          #5
          also ich muß sagen, ich verstehe das nicht ganz ...
          in deinem ersten Beispiel, übergibst du der Funktion CRC16 den Inhalt von txt -> das ist doch richtig, oder?
          Dann rechnet er schön die zwei For...Next-Schleifen durch und kommt an den Punkt, wo die Länge von CRC16 abgefragt wird. "If Len(CRC16) > 4..."
          CRC16 ist aber doch der Rückgabewert der Funktion und muß erst mal einen Rückgabewert irgendwoher erhalten --> und das tut er an dieser Stelle ja nicht sondern erst am Schluß --> CRC16 = Chr(CInt("&h" & Left$(CRC16, 2))) & Chr...
          da aber CRC16 immer noch keinen Inhalt bekommen hat und er ...Left$(CRC16, 2))) & Chr... berechnen will gibt es bei mir immer eine Fehlermeldung!!

          Sag mir doch mal bitte wie CRC16 zu seinem Inhalt kommt, nach deinem ersten Beispiel

          Thx

          Kommentar


            #6
            eine Zeile ist wohl untergegangen...

            Code:
            ....
                Next ff
                CRC16 = Hex(crc)
                If Len(CRC16) > 4 Then
            ...
            ich andere das auch oben mal ab...

            Kommentar


              #7
              mann, jetzt hast du mich aber verunsichert
              hatte schon daran gedacht mich lieber Kreuzworträtsel zu widmen !

              Kommentar


                #8
                Zitat von Lobo2210 Beitrag anzeigen
                mann, jetzt hast du mich aber verunsichert
                naaa, hättest du aber auch selber drauf kommen können

                Kommentar


                  #9
                  Zitat von Lobo2210
                  So, habe mal dein Code getestet --> Chromoflex reagiert nicht drauf!?
                  Ich weiss zwar nicht was Du da machst, aber mein Programm läuft, ich kann es Dir gerne als Source zur Verfügung stellen. Der Sende-String über UDP ist zu dem RS232 identisch.

                  Kommentar


                    #10
                    So, ich hab's jetzt endlich raus wie er mir die Richtige Checksumme berechnet mit der ich weiterarbeiten kann !

                    Ich danke Dir für deine Bemühungen und deine Geduld

                    Gruß Lobo

                    Kommentar


                      #11
                      Zitat von Lobo2210 Beitrag anzeigen
                      So, ich hab's jetzt endlich raus wie er mir die Richtige Checksumme berechnet mit der ich weiterarbeiten kann !
                      Na, wenn Du den Stein der Weisen gefunden hast, können wir den hier mal sehen? Auch um zu schauen, warum mein Programm trotzdem läuft

                      Kommentar


                        #12
                        Nun, das ist nicht der Stein der Weisen, sondern löst nur mein Problem wie ich es gewollt habe !
                        Warum bei mir die Übermittlung an das Chromoflex im ASCII-Format nicht funktioniert weiß ich nicht --> habe es mehrmals getestet, aber das Gerät hat nichts gemacht!?

                        Und manchmal ist es ja auch so, das man die Lösung vor lauter Bäumen nicht sieht, obwohl man ja mit der Nase schon genau davor steht.

                        Hier die banalen zwei Veränderungen:
                        Code:
                        For nC = 1 To Len(txt) Step [B][U]2[/U][/B]
                            j = Val("&H" + Mid(txt, nC, [B][U]2[/U][/B]))
                        Die --> 2 <-- war das ganze Problem, um die Berechnung in Hex auszugeben

                        Kommentar


                          #13
                          Zitat von Lobo2210 Beitrag anzeigen
                          Warum bei mir die Übermittlung an das Chromoflex im ASCII-Format nicht funktioniert weiß ich nicht --> habe es mehrmals getestet, aber das Gerät hat nichts gemacht!?
                          Chromoflex will Binärdaten...

                          Wenn Du Dir meine Sende Routine ansiehst https://knx-user-forum.de/showpost.p...14&postcount=4

                          Ich übergebe HexCode Beispiel: (0000FE)

                          Daraus wird in der sende ein String gemacht also 3 Zeichen, (Step 2)

                          und von diesem binären String wird dann der CRC16 berechnet und angehangen...

                          Wobei in der sende auch noch die Adresse des Controllers vorangestellt wird.

                          Aber gut, wenn es nun bei Dir geht, ist das Thema ja erledigt

                          Kommentar


                            #14
                            Ach so, das wollte ich noch zu deinem letzen Beitrag sagen,
                            daß das Chromoflex Binärdaten haben will, war ja das Problem !

                            Mein Code hat die Checksumme aber immer in ASCII berechnet und das ist natürlich dann immer der falsche CRC mit dem das Chromoflex nichts anzufangen wußte
                            --> die Daten habe ich ihm nämlich immer im Binärformat geschickt.

                            Kommentar

                            Lädt...
                            X