Ankündigung

Einklappen
Keine Ankündigung bisher.

Knx-rs485

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

    #16
    Ungetestet und unvollständig, sollte aber gute Basis sein

    Code:
    #define RS485 Serial
    
    
    bool relayStates[15][8];
    byte response[10];
    byte byteCounter = 0;
    bool responceReceived = false;
    
    void setup() {
    memset(response, 0x00, sizeof(response)); //set all values to "0x00"
    memset(relayStates, false, sizeof(relayStates)); //set all values to "false", all relays are off
    }
    
    void loop() {
    
    if(RS485.available()){
    response[byteCounter] = RS485.read();
    byteCounter++;
    if(byteCounter >= 9){
    //array is full => reception is complete
    byteCounter = 0;
    responceReceived = true;
    //ToDo: add timeout: reset counter and response array after xx ms
    }
    }
    if(responceReceived){
    //0. byte is always 0xFF
    //1. byte is (id + 1)
    //2.-9. bytes are relays 0..7 states
    
    byte id = response[1] - 1;
    for (byte r = 0; r < 8; r++){
    byte state = response[r + 2];
    if(relayStates[id][r] != state){
    relayStates[id][r] = state;
    // Knx.write(id * 2 + 1, relayStates[id][r]); //send new state
    }
    }
    responceReceived = false;
    memset(response, 0x00, sizeof(response)); //set all values to "0x00"
    }
    }
    
    //ID 0..14
    bool sendStateRequest(byte id){
    byte tmp = 0xA1 + id;
    RS485.write(0xFF);
    RS485.write(tmp);
    RS485.write(0x00);
    }
    
    //ID 0..14
    //rel 0..7
    //state 0/1
    void setState(byte id, byte rel, bool state){
    byte tmp = (id + 1) * (rel + 1);
    RS485.write(0xFF);
    RS485.write(tmp);
    RS485.write((byte)state);
    sendStateRequest(id);
    }
    
    /*
    ComObj numbers:
    0 input ID1(id=0) R1(rel=0)
    1 state ID1(id=0) R1(rel=0)
    2 input ID2(id=1) R2(rel=1)
    3 state ID2(id=1) R2(rel=1)
    ...
    8 relays per id
    16 com.objects per id
    
    */
    void knxEvents (byte index){
    byte id = 0;
    byte rel = 0;
    
    if(index % 2){
    //status (odd), do we need this?
    id = (index - 1) / 16;
    rel = (index - 1) % 16;
    Knx.write(relayStates[id][rel]);
    }else{
    //input (even)
    id = index / 16;
    rel = index / 16;
    setState(id, rel, Knx.read(index); //set relay to new state
    }
    }

    Kommentar


      #17
      Wow, ihr seit ja schneller als ich lesen kann ;-).
      Vielen Dank für die Unterstützung. Ich werd mal anfangen die Komponenten zusammen zu kaufen.
      Eine MicroBCU hab ich hier noch liegen. Ich mach mir mal ne Liste und dann komm ich ggf wieder mit Fragen zurück.

      Kommentar


        #18
        Sorry, finde erst jetzt Zeit mich zu Wort zu melden.

        Ein RS485-Gateway im wörtlichen Sinne eines "Gateways" halte ich nicht für sinnvoll. Warum?
        Was macht ein Gateway: Er transportiert in diesem Fall Daten vom einen Medium ins andere. Also vom RS485 "Bus" auf den KNX Bus.
        RS485 definiert aber nur die elektrische Seite der Einsen und Nullen. Und die 1 und 0 von RS485 machen alleine für sich auf dem KNX Bus einfach keinen Sinn.

        Es braucht in jedem Fall eine Art Interpretation der Daten, sprich: Man muss das Protokoll kennen.
        Kleines Abstecher in die RS485 Gateway-Welt: In der Bucht gibt es RS485-Ethernet/Wifi Gateways. Die setzen RS485 nur elektrisch auf TCP bzw. UDP um. Das sind tatsächlich Gateways. Aber auch hier braucht es noch eine Anwendung die die Daten versteht.

        Ich habe bei mir aktuell drei RS485 taugliche Geräte im Haus:

        * Dimplex-Wärmepumpe (RS485, Modbus-Protokoll)
        * Helios KWL (RS485, proprietäres Protokoll)
        * Ekey Fingerscanner an der Haustüre (RS485, proprietäres Protokoll)

        Alle drei haben komplett unterschiedliche Anforderungen an die Datenverarbeitung.

        Was ich selbst auf meiner ToDo Liste habe ist eine Applikationsplatine für meinen M0dularis+ Controller um mit einem MAX485 IC und etwas galvanischer Trennung den Controller mit RS485 zu verbinden.
        Für alle drei RS485-Geräte werde ich unterschiedliche Firmware brauchen. Das einzige das "vielleicht" Sinn macht "universell" zu gestalten ist das Thema Modbus. Hier ist der Zugriff auf Register und der gleichen weitgehend standardisiert. Aber wenn man da jetzt keine Dimplex-Wärmepumpen-Firmware sondern eine allgemeingültige Modbus-Firmware bastelt, verliert man ggf. Details. Muss man abwägen... Und vor allem Modbus kennen und verstanden haben (bin da auch noch ncith 100% drin).

        Mir ist kein Gerät bekannt das durch eine "einfache Byte-Folge" per RS485 steuerbar ist. D.h. eine Firmware in der man per Parameter einstellt welche Bytes gesendet werden wenn man ein spezielles KO triggert wird nur bei einem verschwindend kleinen Prozentsatz der Geräte Sinn ergeben.

        Kurzum:
        Eine RS485 taugliche Hardware für Konnekting zu basteln:
        Ein universelles RS485 Gateway mit universeller Firmware zu bauen: Halte ich für Zeitverschwendung. Eine Basis-Firmware für einen speziellen RS485 Zweck anzupassen ist recht easy.

        Kommentar


          #19
          Vielleicht sollten wir im Wiki mal sammeln um was für RS485 Geräte es geht und welche Protokolle/Nachrichten es da braucht?

          Bei mir geht es z.B. um einen Omnitronic MCS 1250 Verstärker mit einem trivial Protokoll.

          Eine „Standardhardware“ macht sicher Sinn, bei der Software sehe ich auch nix universelles. Man könnte/sollte aber eine Basis Firmware bauen auf der dann der gerätespezifische Code für RS485 nur dazu kommt. (Ich weiss, ich hab leicht reden aber wenig Zeit derzeit)

          ich habe übrigens noch mal im SAMD51 Datenblatt gelesen: USART auf RS485 stellen und der SAMD kümmert sich um das enable des line drivers inklusive guard time und meldet dann per interrupt wenn er fertig ist mit dem senden. Infos im Datenblatt unter
          34.6.3.6. Würde m.E. gut zum oben vorgeschlagenen ISO1452 passen. Ich muss mir mal Komponenten zum testen besorgen...

          Kommentar


            #20
            Vielleicht sollten wir im Wiki mal sammeln um was für RS485 Geräte es geht und welche Protokolle/Nachrichten es da braucht?
            Da mal eine Ideensammlung anzufangen klingt nach einer guten Idee. Aber auch hier denke ich nicht dass wir einen gemeinsamen Nenner finden. Ich finde es macht wirklich am meisten Sinn individuelle Firmwares zu bauen. Der einzige Haken: Der SAMD hat ja mehrere Sercoms. Da wäre es fast Schade nur eine Funktion pro Controller abzubilden. Mehrere Protokolle in der Firmware mixen: Das wollt ihr im Code nicht wirklich administrieren und verwalten...

            USART auf RS485 umstellen klingt toll. Aber wirklich sparen tut man damit nix. Du brauchst in jedem Fall eine galvanische Trennung wenn du es sauber implementieren willst. Und ob da dann noch ein MAX485 oder dergleichen dazu kommt macht den Bock nicht fett. Den bekommt man im Dutzend hinterher geworfen (z.b. https://www.ebay.de/itm/50PCS-MAX485...cAAOSwMmBVxICe). Hab mir da schon vor nem Jahr mal 10 oder 20 ins Lager gelegt. Galvanische Trennung für die Spannungsversorgung hab ich auch schon da liegen. Bin nur noch nicht dazu gekommen zu basteln. Beta5 und so...
            Zuletzt geändert von tuxedo; 15.05.2020, 15:15.

            Kommentar

            Lädt...
            X