c++ RS485 Modbus Programmierung

  • Hallo,

    Ich könnte ein bischen Hilfe von den Entwicklern hier brauchen.

    Ich arbeite gerade an einem projekt, das meinen Solar Laderegler im Schrebergarten ausliest. Normalerweise wird an dem RJ45 Modbus anschluss ein Display angeschlossen, das die Daten dann Live Darstellt. Mit dem Programm ist es mir jetzt möglich, das Display zubetreiben (auch an einem anderen Standort), und zusätzlich noch die Daten anders zu verwerten.

    Habe für die Kommunikation zum Laderregler und Display die LibModbus verwendet. Musste dann aber feststellen dass alle Befehle von LibModbus verarbeitet werden, und im Falle von User Befehlen(So wie sie von meinem Display kommen) nicht Funktioniert. Musste LibModbus patchen um mit meinen Geräten reden zukönnen. Funktioniert zwar jetzt ganz gut, aber würde jetzt doch gern die kommunikation über Modbus selber übernehmen.

    Ich weiß jetzt aber nicht wie man die Befehle richtig separiert. In der Spezifikation ist die Rede von 1,5T bzw. 3T Timeout. Also wenn 1,5 Zeichen lang kein Zeichen kommt sollte man es ignorieren, und wenn 3 Zeichen lang kein Zeichen kommt ist die Übertragung beendet(genau diese Zeit sollte man auch warten bevor man Befehle annimmt).

    Habe jetzt aber von div. Libs den quellcode angeschaut, und keine hatte diese Timeouts implementiert, sondern hatte an Hand des Befehls gewusst wieviel sie empfangen müssen, und haben dann den Befehl mit CRC16 überprüft.

    wie aber setzt man jetzt diese Timeouts um?

    Sollte ich immer 1 Byte lesen und dann mit Select() einen Timeout definieren. oder soviel mit read() lesen bis die Funktion zurückkehrt und dann einen Timeout mit select()? oder wartet read() eine gewisse Zeit auf Daten? Oder evt. sogar Funktionen im RS485 Treiber?

    Ich habe dieses Konzept leider noch nicht verstanden und würde mich sehr freuen wenn jemand Licht ins Dunkel bringen könnte.


    mfg Thomas

    VDR:
    Hardware: Thermaltake DH102, Zotac ION ITX-F-E, 2Gig Ram, TechnoTrend
    dual DVB-S2 6400, TechnoTrend Connect CT-3650,


    Software: EasyVDR 1.0

  • ist der Tracer BN 3215 von EPEVER. Habe den source aber noch nicht hochgeladen.


    mfg Thomas

    VDR:
    Hardware: Thermaltake DH102, Zotac ION ITX-F-E, 2Gig Ram, TechnoTrend
    dual DVB-S2 6400, TechnoTrend Connect CT-3650,


    Software: EasyVDR 1.0