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