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:
    27
    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:
    54
    Zustimmungen:
    30
    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:
    27
    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:
    54
    Zustimmungen:
    30
    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:
    27
    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:
    54
    Zustimmungen:
    30
    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:
    27
    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:
    255
    Zustimmungen:
    75
    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:
    54
    Zustimmungen:
    30
    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:
    27
    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
     
Thema:

Quest goes MODBUS (Arduino Slave für Artisan)

Die Seite wird geladen...

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

  1. Fragen zu KitchenAid Artisan Espressomaschine

    Fragen zu KitchenAid Artisan Espressomaschine: Hallo Habe eine Kitchenaid Artisan. Ich suche dafür eine Tidaka Dampflanze dazu.Welche würdet ihr nehmen ? Auch ein Blindsieb fehlt hier noch...
  2. [Erledigt] Brewista Artisan Gooseneck Kettle

    Brewista Artisan Gooseneck Kettle: Ich miste mal ein bisschen aus bei mir ;-) Verkaufe den Brewista Artisan Gooseneck Kettle in weiß. Funktioniert einwandfrei OVP vorhanden....
  3. [Erledigt] Brewista Artisan in Weiss

    Brewista Artisan in Weiss: Verkaufe Brewista Artisan Goosneck Wasserkocher in Weiss. Guter Zustand bis auf einen schwarzen Punkt (siehe Foto). 85 Euro bei einer Abholung in...
  4. Kitchen Aid Artisan Kabelbelegung Relais

    Kitchen Aid Artisan Kabelbelegung Relais: Hallo liebes Forum, ich habe bei der Reparatur meiner Kitchen Aid Artisan (erste Baujahre) den Fehler gemacht nicht alle Kabelstecker zu...
  1. Diese Seite verwendet Cookies um Inhalte zu personalisieren. Außerdem werden auch Cookies von Diensten Dritter gesetzt. Mit dem weiteren Aufenthalt akzeptierst du diesen Einsatz von Cookies.
    Information ausblenden