Modbus write multiple holding register 0x10

Hallo,

ich komme beim Modbus write multiple holding register einfach nicht weiter.
Ich möchte in meinem Wechselrichter ein paar Registe beschreiben, aber das klappt nicht. Der Wechselrichter reagiert nur auf erite multiple holding Register (0x10), auf write singel register (0x06) reagiert er laut Doku und diverser Foren nicht.´Das wäre ja kein Problem, aber ich befürchte, der Wechselrichter will da etwas, das nicht ganz Modbus konform ist.
z.B, möchte ich dem Register 0x0880 den Wert 1 schreiben. Also habe ich im Modbus Devise die Adresse 2176 eingetragen und die Funktion „Schreibe Multiple Holding Register (16)“. Und den Wert mal auf 1 geschrieben. Davon bekomme ich ein Timeout
Auf dem Modbus wird folgendes übertragen:

85 08 80 00 01 02 00 01   + CRC 

Das sollte eigentlich normalerweise so stimmen, nur bekomme ich so nur ein Timeout
Ich habe in einem Projekt auf Github einen Sopurcecode für einen ESP gefunden und da werden so weit ich das verstehe noch 2 zusätzliche Nullen übertragen, also sollte das wieso auch immer so aussehen:

85 08 80 00 01 02 00 01 00 00   + CRC 

Kann ich die 2 zusätzlichen Nullen irgendwie aus Symcon heraus mit übertragen?
Oder verstehe ich den Source Code falsch?

responseDispatch.registerCount = 1;
				resultDispatch = _registerHandler->writeRawDataRegister(REG_DISPATCH_RW_DISPATCH_START, DISPATCH_START_START, &responseDispatch);
				if (resultDispatch != modbusRequestAndResponseStatusValues::writeDataRegisterSuccess)
				{
					sprintf(stateAddition, "{\r\n    \"responseStatus\": \"%s\",\r\n    \"failureDetail\": \"REG_DISPATCH_RW_DISPATCH_START\"\r\n}", responseDispatch.statusMqttMessage);
				}
				else
				{
					delay(RS485_TRIES * 50);

wobei
REG_DISPATCH_RW_DISPATCH_START = 0x0880
DISPATCH_START_START = 1

und :

Sends a basic Write Data Register request to the Alpha system and returns back for the calling function to do onward procesing
This expects number of registers (1 for 2 byte registers, 2 for 4 byte registers) in the structure before called
*/
modbusRequestAndResponseStatusValues RegisterHandler::writeRawDataRegister(uint16_t registerAddress, uint32_t value, modbusRequestAndResponse* rs)
{
	modbusRequestAndResponseStatusValues result = modbusRequestAndResponseStatusValues::preProcessing;
	if (result == modbusRequestAndResponseStatusValues::preProcessing)
	{
		if (rs->registerCount == 1)
		{
			uint8_t	frame[] = { ALPHA_SLAVE_ID, MODBUS_FN_WRITEDATAREGISTER, registerAddress >> 8, registerAddress & 0xff, 0, rs->registerCount, 2, value >> 8, value & 0xff, 0, 0 };
			result = _modBus->sendModbus(frame, sizeof(frame), rs);
		}
		else if (rs->registerCount == 2)
		{
			uint8_t	frame[] = { ALPHA_SLAVE_ID, MODBUS_FN_WRITEDATAREGISTER, registerAddress >> 8, registerAddress & 0xff, 0, rs->registerCount, 4, value >> 24, value >> 16, value >> 8, value & 0xff, 0, 0 };
			result = _modBus->sendModbus(frame, sizeof(frame), rs);
		}
		// And now it has been sent to the device, the response is essentially synchronos so by the time we get a response we will know if success or failure

So wie ich das sehe, muss ich einfach 2 x eine 0 zusätzlich mitschicken. Oder ich verstehe da was falsch. Der ganze Code liegt auf: Alpha2MQTT/Alpha2MQTT at master · dxoverdy/Alpha2MQTT · GitHub

Kann ich aus Symcon heraus irgendwie den write multiple Register so ausführen, wie es mein Wechselrichter haben will?

Danke im Voraus
Chris

Und welchen Datentyp hast du eingestellt?
Michael
PS: 0x85 an Anfang von einem Datenpaket dürfte nur als Antwort kommen und heißt Fehler (0x80) und die 5 war der Schreibbefehl.

Ich habe short als Datentyp eingetragen.
ich habe im ersten Post auch einen Fehler in den Modbus Bytes:
wenn ich das Register schreibe werden folgende bytes gesendet:

55 10 08 80 00 01 02 00 01 3F 53

wobei ja 55 die Modbus Adresse ist und 3F 53 die Checksum

Und laut Sourcecode für den ESP möchte das System folgendes empfangen:

55 10 08 80 00 01 02 00 01 00 00 ?? ?? 

Die beiden Fragezeichen stehen für die Checksum

short ist ja auch falsch, das sind nur 2 Byte und nicht 4.
benutzte einen 32Bit Wert, damit 4 Byte gesendet werden.

Die 55 bei dir gehört nicht zu dem Paket, sondern aus dem davor.
Immer in der ModBus Gateway Instanz den Debug öffnen, dann siehst du immer einzelne Pakete (ohne Checksumme)

Edith: das hätte dir die Forumssuche eigentlich ausspucken sollen

Das habe ich auch schon probiert, geht leider auch nicht.
Ich muss mir den Code von Github nochmals in Ruhe anschauen. Evtl muss ich zuerst noch etwas mit einem anderen Register freischalten. Ich kann das Register zwar lesen, aber leider nicht schreiben, obwohl es laut Doku auch beschrieben werden kann.

Also mein Datenpaket schaut so aus, wie du es haben wolltest. :person_shrugging:

Danke für die Unterstützung.
Ich habe mir den Code für den ESP nochmals angeschaut und bin nun drauf gekommen, das die zwei Nullen am Ende vor dem Senden noch durch den CRC Code ausgetauscht werden. Also passt dann der Datentyp Short short und alles sollte eigentlich korrekt gesendet werden. Nur kommt einfach keine Antwort vom System zurück.
Wahrscheinlich muss ich im System noch irgendwas freischalten um diese Register beschreiben zu dürfen.
Ich werde noch weiter probieren und dann berichten falls es funktioniert.