ich hätte mal eine Frage zum Modbus. Ich möchte einen PID Regler ansteuern. Messen kann ich auf dem Bus aber der Regler hat keinerlei Regung gezeigt. Vielleicht kann mir jemand helfen.
Danke schon im Voraus. ModbusMaster.h hab ich verwendet.
#define Heiz_REG_Ausg (0x0021)
...
ModbusMaster Heiz (serialModbus, 1)
...
Int Serial Modbus = 3
...
Heiz.begin(9600);
...
Heiz.writesingleregister(Heiz_REG_Ausg, 1) // Relais 1- 0 ist aus 1 ist an
...
Das müsste doch eigentlich reichen. Oder was mach ich falsch.
ich hätte mal eine Frage zum Modbus. Ich möchte einen PID Regler ansteuern. Messen kann ich auf dem Bus aber der Regler hat keinerlei Regung gezeigt. Vielleicht kann mir jemand helfen.
Danke schon im Voraus. ModbusMaster.h hab ich verwendet.
#define Heiz_REG_Ausg (0x0021)
...
ModbusMaster Heiz (serialModbus, 1)
...
Int Serial Modbus = 3
...
Heiz.begin(9600);
...
Heiz.writesingleregister(Heiz_REG_Ausg, 1) // Relais 1- 0 ist aus 1 ist an
...
Das müsste doch eigentlich reichen. Oder was mach ich falsch.
Was soll das sein? Ein Sketch, dann kann es nicht funktionieren.
Bitte den kompletten Sketch in Code-Tags (</>) setzen, dann können wir auch was erkennen und helfen.
Welche Heizung?
Wie sieht die Ansteuerung aus?
BaudRate Richtig?
Du schreibst Register willst aber nur 1 Coil ansteuern muss das bei der Heizung so sein?
Ist die Baudrate Korrekt?
Welche Adresse hat dein Modbus Slave? Ist die 1 Korrekt?
ASCII Modbus oder RTU?
Den ganzen Sketch bitte posten evtl auch eine Beschreibung deiner Heizung bzw der Adressen
Konfiguration des Reglers hab ich gemacht. 9600Baud, 8 datenbits, 1 Stoppbit, keine Parität,
Slave 1.
Jumo cControl 08
Adresse ist 0x0021
Datentyp ist Int / Bit0
Signalbezeichnung ist Ausgang K1Relais (0=0x0001) Binärausgang 1 / 0=aus 1 = an
Da ist alles was ich habe oder was im Datenblatt steht. ModbusMaster ist die hier von der Arduino Seite. Code kann ich nicht in Tags setzten da der Browser hier veraltet ist und nicht alles richtig anzeigt.
Danke, also das geht schonmal ohne Bitverschiebung. Wenn ich dem Ctron einfach ne 257 für K1 schicke.
XXX.writeSingleRegister(XXXX, 257);
Wenn ich in das 0x0037 Register einen float schreiben will geht das aber nicht. Zumindestens übernimmt er das nicht.
XXX.writeSingleRegister(XXXXX, 0x42c80000); // Dez=100 = IEEE 754 Hex = 0x42c80000
oder
XXX.writeSingleRegister(XXXXX, 100); //geht auch nicht.
Wo liegt hier noch der Hund begraben?
Evtl muss du einen Float definieren und den dann senden. Sicher bin ich mir nicht also. float sendfloat=10.0; und dann den hier machen XXX.writeSingleRegister(XXXXX, sendfloat); Probier das mal so Float ist auch ein 4Byte Wert.
^Mangels wissen falsch ^
Jetzt komm ich nicht mehr mit...
Hab es jetzt nochmal so versucht aber das geht auch nicht.
XXX.writeSingleRegister(Heiz_REG_Temp, lowbyte (100); oder lowWord
XXX.writeSingleRegister(Heiz_REG_Temp+1, highbyte (100); oder lowWord
das geht nicht und
XXX.writeSingleRegister(Heiz_REG_Temp, lowbyte (0x42c80000)); oder lowWord
XXX.writeSingleRegister(Heiz_REG_Temp+1, highbyte (0x42c80000)); oder lowWord
Schau mal im zweiten Link man muss den 4byte Float auseinander nehmen und dann verdrehen (SWAP) und dann übertragen nicht zweimal das gleiche.
Highbyte und Lowbyte beziehen sich auf ein Word (2Bytes).
union float2word{
float f;
word words[2];
}Test;
void setup(){
}
void loop(){
Test.f=1.234;
XXX.writeSingleRegister(Heiz_REG_Temp,Test.words[0] ); // oder die [0] zu [1]
XXX.writeSingleRegister(Heiz_REG_Temp+1,Test.words[1]); // anderums
}