How to use function16 on Modbus correctly

Hi everone the code posted works, but I am looking for a way to make a single write (Func 16) with all 21 holding registers (items) at a time. Cant find a way to make an array out of my items to send.

Bridge modbus:serial:interel [ port="/dev/ttyUSB0", baud=19200, stopBits="1.0", parity="none", dataBits=8, encoding="rtu" ] {

    Bridge poller WriteRegisters [ start=1, length=21, refresh=1000, type="holding" ] {
        // write from index 1 to 21
        Thing data Interel_OutputRegister_001 [ writeStart="1", writeValueType="uint16", writeType="holding", writeMultipleEvenWithSingleRegisterOrCoil="true" ]
        Thing data Interel_OutputRegister_002 [ writeStart="2", writeValueType="uint16", writeType="holding", writeMultipleEvenWithSingleRegisterOrCoil="true" ]
        Thing data Interel_OutputRegister_003 [ writeStart="3", writeValueType="uint16", writeType="holding", writeMultipleEvenWithSingleRegisterOrCoil="true" ]
        Thing data Interel_OutputRegister_004 [ writeStart="4", writeValueType="uint16", writeType="holding", writeMultipleEvenWithSingleRegisterOrCoil="true" ]
        Thing data Interel_OutputRegister_005 [ writeStart="5", writeValueType="uint16", writeType="holding", writeMultipleEvenWithSingleRegisterOrCoil="true" ]
        Thing data Interel_OutputRegister_006 [ writeStart="6", writeValueType="uint16", writeType="holding", writeMultipleEvenWithSingleRegisterOrCoil="true" ]
        Thing data Interel_OutputRegister_007 [ writeStart="7", writeValueType="uint16", writeType="holding", writeMultipleEvenWithSingleRegisterOrCoil="true" ]
        Thing data Interel_OutputRegister_008 [ writeStart="8", writeValueType="uint16", writeType="holding", writeMultipleEvenWithSingleRegisterOrCoil="true" ]
        Thing data Interel_OutputRegister_009 [ writeStart="9", writeValueType="uint16", writeType="holding", writeMultipleEvenWithSingleRegisterOrCoil="true" ]
        Thing data Interel_OutputRegister_010 [ writeStart="10", writeValueType="uint16", writeType="holding", writeMultipleEvenWithSingleRegisterOrCoil="true" ]
        Thing data Interel_OutputRegister_011 [ writeStart="11", writeValueType="uint16", writeType="holding", writeMultipleEvenWithSingleRegisterOrCoil="true" ]
        Thing data Interel_OutputRegister_012 [ writeStart="12", writeValueType="uint16", writeType="holding", writeMultipleEvenWithSingleRegisterOrCoil="true" ]
        Thing data Interel_OutputRegister_013 [ writeStart="13", writeValueType="uint16", writeType="holding", writeMultipleEvenWithSingleRegisterOrCoil="true" ]
        Thing data Interel_OutputRegister_014 [ writeStart="14", writeValueType="uint16", writeType="holding", writeMultipleEvenWithSingleRegisterOrCoil="true" ]
        Thing data Interel_OutputRegister_015 [ writeStart="15", writeValueType="uint16", writeType="holding", writeMultipleEvenWithSingleRegisterOrCoil="true" ]
        Thing data Interel_OutputRegister_016 [ writeStart="16", writeValueType="uint16", writeType="holding", writeMultipleEvenWithSingleRegisterOrCoil="true" ]
        Thing data Interel_OutputRegister_017 [ writeStart="17", writeValueType="uint16", writeType="holding", writeMultipleEvenWithSingleRegisterOrCoil="true" ]
        Thing data Interel_OutputRegister_018 [ writeStart="18", writeValueType="uint16", writeType="holding", writeMultipleEvenWithSingleRegisterOrCoil="true" ]
        Thing data Interel_OutputRegister_019 [ writeStart="19", writeValueType="uint16", writeType="holding", writeMultipleEvenWithSingleRegisterOrCoil="true" ]
        Thing data Interel_OutputRegister_020 [ writeStart="20", writeValueType="uint16", writeType="holding", writeMultipleEvenWithSingleRegisterOrCoil="true" ]
        Thing data Interel_OutputRegister_021 [ writeStart="21", writeValueType="uint16", writeType="holding", writeMultipleEvenWithSingleRegisterOrCoil="true" ]
    }

}

Thanks to all

Nobody ???
I little hint ?

I do not think this is possible. You can choose to write using FC6 or FC16, but that does not force a block write. The modbus binding write to device is triggered by sending an OH command to an OH Item, and you cannot command many Items simultaneously.

If you have to ensure that say two or four registers must be updated at once, there is a workaround (cheat) way. Set up a 32 or 64 bit data channel, commands to that Item would write a block of 2 or 4 registers. You would use rules to assemble the wanted register contents into a combination Item and then command that.

Can you give the justification, the use-case, for a ‘real’ multi register block write?

It may be possible to enhance the modbus binding. Perhaps an option for the poller Thing, “writeWholeBlock=true”.
A user could postUpdate the values they want into various Items, then when ready, send a single command to (any of?) the Items to trigger a write.

Woah, I suddenly remembered the v2 binding allows low-level tinkering with JSON controls. I know nothing about that, but I bet you can build block write with it.

help? @ssalonen ?

yeah it should be supported using transformations with write

Documentation with examples https://www.openhab.org/addons/bindings/modbus/#advanced-write-using-json