Нет данных с первого устройства

ДА, надо расширить документацию в этой части.
Давайте здесь сейчас коротко расскажу, как это работает.

Берем шаблон, например config-wbio-do-hs-8.json. Смотрим заголовок:
%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5
Видим параметры “stride” и “shift” (в ваших устройствах входов типа DI параметр shift в шаблоне отсутствует, он принимается равным 0).

Дальше смотрим setup-секцию:
%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5

Видно, что в 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-регистров состояний входов/запись состояний выходов отсчитываются также от указанных в шаблоне с соответствующим смещением.

1 лайк