Quest goes MODBUS (Arduino Slave für Artisan)

Diskutiere Quest goes MODBUS (Arduino Slave für Artisan) im Vom Rohkaffee zum Selbströster Forum im Bereich Rund um die Bohne; Hallo, ich hatte es ja hier schon angedroht: mein Quest wird MODBUS-fähig!;) Eigentlich ist es ja nicht der Quest, sondern die...

  1. #1 Andreas!, 17.10.2018
    Andreas!

    Andreas! Mitglied

    Dabei seit:
    12.05.2018
    Beiträge:
    26
    Zustimmungen:
    29
    Hallo,

    ich hatte es ja hier schon angedroht: mein Quest wird MODBUS-fähig!;) Eigentlich ist es ja nicht der Quest, sondern die Arduino-Steuerung, so ist die MODBUS-Lösung ev. eine Alternative für Anwender, die über Artisan einen beliebigen Röster steuern wollen.
    Mein Setup: 2 Thermoelemente Typ K (ET, BT) werden ausgelesen, Werte für die Heizungssteuerung und die Lüftersteuerung (jeweils 0-100% Leistung) werden zurückgeschrieben.
    Für die Heizungssteuerung gibt es eine Steuerung mit einem SSR, es wird in einem Intervall von 2 Sekunden je nach Leistungswert anteilig ein- und ausgeschaltet. Abtastintervall für Artisan ist auch 2s.
    Die Lüftersteuerung geschieht über einen Dimmer von Kemo, der mittels PWM angesteuert wird.
    An Hardware wird benötigt:
    • Arduino (hier: Nano) + Netzteil (altes Handyladegerät reicht)
    • 2 MAX6675-Module zum Auslesen der Temperaturen
    • Umsetzer von RS232 auf RS485 für den Arduino (MAX485)
    • Umsetzer von USB auf RS485 für das Notebook
    • Dimmer
    • SSR
    Die programmtechnische Umsetzung habe ich mit der Bibliothek ModbusSlave.h gemacht. Anspruch war nicht, einen vollständigen MODBUS-Slave zu implementieren, sondern nur genau die für Artisan benötigten Funktionen. Dazu habe ich ein mitgeliefertes Beispielprogramm abgestrippt.
    Anbei der Code für die besprochenen Funktionen:
    [​IMG]

    Und dazu die nötigen Einstellungen in Artisan:
    [​IMG]

    Funktioniert soweit gut:), für den Einbau werde ich noch ein lokales Display vorsehen und ein Relais, das von lokaler Steuerung des Quest auf Remote Modus durch Artisan umstellt.

    Gruß, Andreas
     
    DB00201 und Piezo gefällt das.
  2. uwe12

    uwe12 Mitglied

    Dabei seit:
    13.03.2015
    Beiträge:
    70
    Zustimmungen:
    40
    Hallo Andreas,
    ich habe eine ähnliche Lösung von lukeinator42/coffee-roaster , mit zwei Sensoren, um BT und ET zu messen. Der große Nachteil dieser Lösung ist, dass nur ganze Gradzahlen ausgegeben werden, was zu einem Fehler bei den ROR Kurven von min. +-2 °C führt. MAKOMO schrieb in seinem Blog oder in einem Forum mal dazu, dass fehlende Dezimalstellen den ROR killen, womit er leider recht hat:
    [​IMG]
    Das Bild zeigt einfach den Betrieb mit Tonkugeln, Heizung auf konstant bei 100%, nach ca. 9 Minuten Heizung abgestellt.
    Hier die Vergrößerung der BT Kurve, der Auschlag ist genau ein Grad:
    [​IMG]
    Daher meine Frage an Dich: Hättest Du eine Idee, wie man eine genauere Temperatur mit mindestens einer Dezimalstelle ausgeben könnte? Oder gibt Deine Lösung bereits Dezimalstellen aus? Das wäre super...
    Ich mag diese günstige Arduino Modbus Lösung und würde gerne dabei bleiben...

    Viele Grüße
    Uwe
     
  3. #3 Andreas!, 24.10.2018
    Andreas!

    Andreas! Mitglied

    Dabei seit:
    12.05.2018
    Beiträge:
    26
    Zustimmungen:
    29
    Hallo Uwe,

    die gezeigte Lösung arbeitet schon mit einer Nachkommastelle! ;) Im Programm in Zeile 25 und 26 sieht man, dass die Temperaturen vor der Umwandlung in Integer mit 10 multipliziert werden. Der entsprechende (Rück-)Teiler von 1/10 steht in den Anschlusseinstellungen in Artisan bei den Eingängen - so bekomme ich eine Nachkommastelle. Man könnte auch 2 einstellen (es gibt auch den Teiler 1/100 in Artisan), aber mit einer Stelle sieht das bei mir ganz gut aus. Die Genauigkeit der Temperaturmessung gibt ja schon die erste Nachkommastelle kaum her, ist mehr für die Optik.

    Gruß, Andreas
     
    uwe12 gefällt das.
  4. uwe12

    uwe12 Mitglied

    Dabei seit:
    13.03.2015
    Beiträge:
    70
    Zustimmungen:
    40
    Das klingt sehr gut :), würde Deine Lösung gerne ausprobieren, hätte aber noch ein paar Fragen:

    - die Umsetzer: wozu dienen sie? Geht das nicht auch ohne, wenn man den Röster immer per PC/Artisan steuert?
    - könntest Du den Sketch und die Artisan Konfiguration hochladen?

    Danke und viele Grüße
    Uwe
     
  5. #5 Andreas!, 25.10.2018
    Andreas!

    Andreas! Mitglied

    Dabei seit:
    12.05.2018
    Beiträge:
    26
    Zustimmungen:
    29
    Hallo Uwe,

    die beiden Umsetzer etablieren eine RS485-Schnittstelle zwischen PC und Arduino. Prinzipiell müsste es auch über die normale serielle Schnittstelle funktionieren, aber die RS485 ist die 'native' MODBUS-Schnittstelle und während meiner Tests mit verschiedenen Bibliotheken hatte ich Stabilitätsprobleme mit der normalen.
    Ein kurzer Test ergab: mein Programm läuft auch über die normale serielle Schnittstelle via USB, allerdings mit Einschränkungen:
    - Bei jeden Einschalten des Röstoskops wird die Schnittstelle (und damit auch der Nano) resetted.
    - Bei Kommunikationsproblemen wird auch resetted (Timeout, etc.).
    Da beim Reset durch die Kopplung mit der Spannungsversorgung die aktuellen Stellwerte verloren gehen, ist das keine Alternative für mich. Ev. gibt es da besser geeignete Bibliotheken (die hier verwendete erwartet RS485!)?
    Die Artisan Konfiguration kannst Du aus meinem zweiten Bild ablesen, den Sketch zum rauskopieren hänge ich mal unten an...

    Gruß, Andreas

    #include <ModbusSlave.h>
    #include <max6675.h>

    #define CTRL_PIN 2
    #define LueftPin 3
    #define ktcCS1Pin 5
    #define ktcCS2Pin 6
    #define ktcSOPin 8
    #define ktcCLKPin 10
    #define HeizPin 11

    Modbus slave(1, CTRL_PIN); //MODBUS Slave #1, ControlPin ist 2

    MAX6675 ktcET(ktcCLKPin, ktcCS1Pin, ktcSOPin); //Thermoelement ET
    MAX6675 ktcBT(ktcCLKPin, ktcCS2Pin, ktcSOPin); //Thermoelement BT

    float BT = -1.0; //Bohnentemperatur
    float ET = -1.0; //Trommeltemperatur oberhalb der Bohnen
    uint8_t heiz = 0; //Stellgröße für Heizung (0-100%)
    uint8_t lueft = 0; //Stellgröße für Lüfter (0-100%)

    long StellInt = 2000; //Intervall für Wellenpaketsteuerung Heizungs-SSR
    long UHighInt = 0; //Zeit(-anteil) HIGH für Heizung
    long StellMillis = 0; //Basis für Wellenpaketsteuerung

    uint8_t readMemory(uint8_t fc, uint16_t address, uint16_t length) { // Handler Read (FC=03)
    if (address == 1) slave.writeRegisterToBuffer(0, (uint16_t)(BT*10.0));
    if (address == 2) slave.writeRegisterToBuffer(0, (uint16_t)(ET*10.0));
    return STATUS_OK;
    }

    uint8_t writeMemory(uint8_t fc, uint16_t address, uint16_t length) {// Handler Write (FC=06, FC=16)
    if (address == 1) heiz = slave.readRegisterFromBuffer(0);
    UHighInt = heiz*StellInt/100;
    if (address == 2) lueft = slave.readRegisterFromBuffer(0);
    return STATUS_OK;
    }

    void setup() {
    pinMode(CTRL_PIN, OUTPUT); // RS485 control Pin
    pinMode(LueftPin, OUTPUT); // Ausgang für Lüftersteuerung mit PWM -> Kemo
    pinMode(HeizPin, OUTPUT); // Ausgang Wellenpaketsteuerung für Heizung

    // register handler functions into the modbus slave callback vector.
    slave.cbVector[CB_READ_REGISTERS] = readMemory;
    slave.cbVector[CB_WRITE_REGISTERS] = writeMemory;

    Serial.begin(57600); // Initialisierung Serial mit 57600 Baud
    slave.begin(57600); // Initialisierung slave mit 57600 Baud
    }

    void loop() {
    long aktMillis = millis(); //aktueller Clocktick

    ET = ktcET.readCelsius(); //ET auslesen
    BT = ktcBT.readCelsius(); //BT auslesen

    slave.poll(); //Abfrage und Behandlung von MODBUS-Kommandos

    //Stellgrößen ausgeben
    if (aktMillis - StellMillis <= UHighInt) digitalWrite(HeizPin,HIGH); else digitalWrite(HeizPin,LOW);
    if (aktMillis - StellMillis >= StellInt) StellMillis = aktMillis;
    analogWrite(LueftPin,lueft*2.55);
    }
     
    DB00201 und uwe12 gefällt das.
  6. uwe12

    uwe12 Mitglied

    Dabei seit:
    13.03.2015
    Beiträge:
    70
    Zustimmungen:
    40
    Vielen Dank, so ist mir natürlich auch geholfen :)
    Werde Deinen Sketch dann mal nach dem Urlaub testen...
    Ich hätte aber vorher noch eine Frage: Wenn Du die Temperaturanzeige unter Konfiguration->Kurven->UI bei Nachkommastellen einen Haken setzt,
    zeigt Dir Artisan dann auch tatsächlich eine Dezimalstelle an?
    Bei dem Sketch, den ich zur Zeit verwende, wird die Temperatur so übergeben:
    au16data[2] = ((uint16_t) thermocouple.readCelsius()*100);
    d.h. es sollten eigentlich sogar zwei Nachkommastellen da sein. Darstellen tut er aber immer nur ganze Zahlen bzw. 0 als Dezimalstelle. Aber mein Sketch nützt auch eine andere Modbus Library.

    Vielen Grüße
    Uwe
     
  7. #7 Andreas!, 25.10.2018
    Zuletzt bearbeitet: 26.10.2018
    Andreas!

    Andreas! Mitglied

    Dabei seit:
    12.05.2018
    Beiträge:
    26
    Zustimmungen:
    29
    Hallo Uwe,

    der Haken ist bei mir (und wohl auch standardmässig) gesetzt und die Nachkommastellen werden korrekt angezeigt.

    Gruß, Andreas

    Edit: Ich sehe gerade, dass Dein Problem wohl im Arduino-Sketch liegt: Die Integer-Umwandlung muss nach der Multiplikation erfolgen, da steht eine Klammer falsch! Probier mal das:

    au16data[2] = (uint16_t) (thermocouple.readCelsius()*100);
     
    uwe12 gefällt das.
  8. MAKOMO

    MAKOMO Mitglied

    Dabei seit:
    02.02.2009
    Beiträge:
    285
    Zustimmungen:
    135
    Der Reset bei Etablierung einer USB Verbindung zum Ardruino (hier Nano) ist der Arduino Platform geschuldet um ein einfaches Programmieren der Boards zu ermöglichen. Das ist kein Software Problem (und schon gar nicht auf der PC Seite) und lässt sich noch nicht mal mit einem anderen Bootloader auf dem Arduino vermeiden.
     
  9. uwe12

    uwe12 Mitglied

    Dabei seit:
    13.03.2015
    Beiträge:
    70
    Zustimmungen:
    40
    Hallo Andreas,
    Danke für den Hinweis! Das war genau die Lösung meines Problems. Jetzt habe ich auch eine vernünftige ROR Kurve :)
     
    Andreas! gefällt das.
  10. #10 Andreas!, 10.11.2018
    Andreas!

    Andreas! Mitglied

    Dabei seit:
    12.05.2018
    Beiträge:
    26
    Zustimmungen:
    29
    Hallo,

    merke gerade, dass der oben gezeigte Sketch zu eingefrorenen Temperaturen führt...:eek: Grund ist, dass die MAX6675 einfrieren, wenn man sie schneller als alle ~ 220ms abfragt (der Sketch oben enthält nicht meinen Debug-Code mit seriellen Ausgaben, der eine entsprechende Verzögerung zwischen den Temperaturabfragen erzeugt hatte :rolleyes:). Wer den Sketch also nachempfinden möchte: Sicherstellen, dass mindestens 220ms zwischend den readCelsius() - Aufrufen liegen (z.B. mit delay(250) oder Verschieben in die Handler-Funktion readMermory()).

    Gruß, Andreas
     
  11. #11 Kaffeeluli, 12.11.2020
    Kaffeeluli

    Kaffeeluli Mitglied

    Dabei seit:
    24.09.2020
    Beiträge:
    97
    Zustimmungen:
    242
    Moin Andreas,

    welche ModbusSlave.h hast du verwendet? Bei allen, die ich bislang gefunden habe, war mindestens ein Begriff nicht definiert...
     
  12. nomind

    nomind Mitglied

    Dabei seit:
    19.05.2019
    Beiträge:
    66
    Zustimmungen:
    29
    Allerdings kann ich nicht nachvollziehen, warum die Modbus Verbindung beendet wird, wenn man bei Artisan auf den Button AUS klickt.
     
  13. MAKOMO

    MAKOMO Mitglied

    Dabei seit:
    02.02.2009
    Beiträge:
    285
    Zustimmungen:
    135
    Artisan beendet alle Kommunikationsverbindungen bei Beendigung des Loggings.
     
  14. nomind

    nomind Mitglied

    Dabei seit:
    19.05.2019
    Beiträge:
    66
    Zustimmungen:
    29
    Vielen Dank für die schnelle Antwort. Ich habe lange nach Möglichkeiten und "Tricks" gesucht die Modbus-Verbindung zu erhalten.
    Irgendwie fehlt mit vor dem Ereignis "AUS" das Ereignis "Röstung beenden" bzw. "Aufzeichnung beenden".

    Es ist so, wie den Stecker bzw. das USB-Kabel zu entfernen, um die Röstung zu beenden.

    Ich arbeite daran, mit den Alarmen vollautomatische Röstungen zu machen bzw. sogar mehrere hintereinander.
    Ich hätte gerne die Röstung beendet, einige Modbus Nachrichten an den Slave(Röstmaschine) gesendet und dann erst "AUS" aktiviert.
    Nach dem Befehl "Ende" ist es leider nicht mehr möglich Modbus Befehle an den Slave zu senden.

    PS: Wenn man NICHT die automatische Speicherung aktiviert hat, ist das automatische "AUS" (der Alarmregeln ausgelöst) ohnehin wirkungslos, weil Artisan auf die Quittierung der Speicheraufforderung wartet.
     
  15. MAKOMO

    MAKOMO Mitglied

    Dabei seit:
    02.02.2009
    Beiträge:
    285
    Zustimmungen:
    135

    Dann mach das doch so
    Warum? Die Verbindung wird erst bei AUS getrennt.

    Wie auch immer. Artisan ist ja ein Open-Source Projekt. Wir freuen uns jederzeit über Verbesserungsvorschläge per GitHub PullRequest.
     
  16. nomind

    nomind Mitglied

    Dabei seit:
    19.05.2019
    Beiträge:
    66
    Zustimmungen:
    29
    Ich habe gemeint: "Nach dem Befehl "AUS" ist es leider nicht mehr möglich Modbus Befehle an den Slave zu senden."
    Leider gibt es (noch) keinen Befehl "ENDE" vor dem Befehl "AUS".
    Im übrigen bin ich begeistert vom Artisan Open Source Projekt, was daraus geworden ist und dem üppigen Funktionsumfang den es bietet. Ich werde mich sicher noch mit dem einen oder anderen Vorschlag einbringen.
     
  17. MAKOMO

    MAKOMO Mitglied

    Dabei seit:
    02.02.2009
    Beiträge:
    285
    Zustimmungen:
    135
    Also die Röstung wird doch mit "LEEREN" beendet. Dannach kannst Du noch MODBUS Kommandos absetzen.

    Beim Einbringen, bitte nicht vergessen die Änderungen in Deinem Programmcode gut zu dokumentieren und auch alle vorgesehenen automatisierten Tests zu durchlaufen.
     
  18. nomind

    nomind Mitglied

    Dabei seit:
    19.05.2019
    Beiträge:
    66
    Zustimmungen:
    29
    Mache ich auch so. Eigentlich suche ich nach einer Schleife. Zum Beispiel: Nach Ende der Liste Alarme folgt ein erneuter Start und die Alarmliste wird erneut abgearbeitet.
    Mein Aufbau:
    Bohneneinwurf (10x 1Kg Rohbohnen auf einem Zuführungsband) und auch der Auswurf und Abtransport der abgekühlten Bohnen kann automatisch erfolgen. Eigentlich könnte ich ohne Eingriff 10 idente Röstungen ( Alarmliste) hintereinander machen, wenn ich nach dem Befehl "ENDE" wieder den Befehl "START" auslösen könnte.
    Aber möglicherweise übertreibe ich es mit meiner Automation.
     
  19. MAKOMO

    MAKOMO Mitglied

    Dabei seit:
    02.02.2009
    Beiträge:
    285
    Zustimmungen:
    135
    Das geht doch. Unter Menu Konfiguration >> Abtastung kannst Du bei "Immer AN" einen Haken setzen. Dann startet Artisan automatisch mit AN, nach einem AUS. Dann kannst Du mit einen Alarm wieder per START die nächste Aufnahme starten.
     
  20. nomind

    nomind Mitglied

    Dabei seit:
    19.05.2019
    Beiträge:
    66
    Zustimmungen:
    29
    Ja, das habe ich auch so irgendwo gelesen und auch den Haken gesetzt.
    Die Alarmliste wird auch wie gewünscht abgearbeitet. Eine sehr mächtige und tolle Sache, diese Alarmlisten.
    Neben der Alarmliste erfolgt der Event Klappe (Drum) schließen, Mixer und Kühlung stop etc. mit seriellen Modbus Befehlen ("s" delay) des Eventbutton.

    In der Alarmliste habe als vorletztes Event "AUS" gesetzt. Damit wird die Röstung und das PDF automatisiert abgelegt. TOP!!!
    Gebunden an das vorletzte Event "AUS" (Die Modbus Verbindung bleibt bestehen) habe ich als letztes Event "START".
    Leiter wird das letzte Event nicht mehr ausgelöst.
    Habe ich einen Denkfehler in der Alarmliste, oder liegt es an der noch nicht freigegebenen Pre-Version 2.10.1
     

    Anhänge:

Thema:

Quest goes MODBUS (Arduino Slave für Artisan)

Die Seite wird geladen...

Quest goes MODBUS (Arduino Slave für Artisan) - Ähnliche Themen

  1. My new setup and a question

    My new setup and a question: Hi everyone I wanted to say thanks for all the help, I finally got my Eureka Mignon Specialita and the Profitec Go and I'm super happy. (See...
  2. Quest Röstmeister Raum Nürnberg

    Quest Röstmeister Raum Nürnberg: Hallo zusammen, gibt es hier Leute aus dem Großraum Nürnberg, die erfolgreich mit dem Quest rösten. Würde mich gerne persönlich ein bisschen mit...
  3. [Verkauft] Quest M3 mit komplettem Zubehör (reserviert)

    Quest M3 mit komplettem Zubehör (reserviert): Nachdem der Kaffelogic Nano 7 für meine Bedürfnisse als Röster besser geeignet ist, darf nun mein Quest M3 gehen, wenn auch etwas schweren...
  4. Quest M3s Schaltplan

    Quest M3s Schaltplan: Guten Tag zusammen, ich besitze seit kurzem einen Quest M3s welchen ich bei Kleinanzeigen erworben habe. Leider musste ich feststellen, das der...
  5. [Verkauft] Quest M3

    Quest M3: Zum Verkauf steht ein Quest M3 , Baujahr Dezember 2014. Ich habe ihn 2015 bei Fricke gekauft und bis Anfang 2017 betrieben. Dann zog der Bullet...