ДА, надо расширить документацию в этой части.
Давайте здесь сейчас коротко расскажу, как это работает.
Берем шаблон, например config-wbio-do-hs-8.json. Смотрим заголовок:
Видим параметры “stride” и “shift” (в ваших устройствах входов типа DI параметр shift в шаблоне отсутствует, он принимается равным 0).
Дальше смотрим setup-секцию:
Видно, что в IODIR нам надо записать 0 перед началом работы, в IPOL — тоже ноль, и так далее.
А как вычислить адрес нужного holding-регистра, что скрывается за этими xxx?
Формула следующая:
Shift = (((SlaveId.Secondary - 1) % 4) + 1) * DeviceConfig()->Stride + DeviceConfig()->Shift;
Каждое подключенное устройство имеет порядковый номер (SlaveId.Secondary), начинающийся с 1 для первого устройства.
Подставляем значения в формулу:
Shift = ((( 1 - 1) % 4) + 1) * 500 + 1000 = (0+1)*500+1000=1500 и получаем сдвиг для адресов регистров первого модуля.
В setup-секции написано, что адрес регистра IODIR — 10000. Добавляем к нему 1500 и получаем, что для первого устройства ввода вывода надо в регистр 11500 записать 0x0000.
Проверим. В таблице регистров мы видим, что конфигурационные регистры для модуля 1, если это модуль вывода) занимают диапазон от 11500 до 11505:
Так, значит все верно посчитали.
Соответственно, адрес регистра IPOL будет 11501, GPINTEN – 11502 и т.п.
По всем регистрам из-setup-секции устройства нужно записать указанные значения.
Значения coil-регистров состояний входов/запись состояний выходов отсчитываются также от указанных в шаблоне с соответствующим смещением.