А что вам дадут лежащие где-то здесь либы? Вам нужно 57 и 400. Ну поставите стартовый 57, и все равно будет структура в 343 регистра.
Местная либа (ниже привели) не работает с отдельными регистрами. Вы также определяете непрерывный блок памяти для слейва, только не в конфигурации. Разница - небольшая.
Лучше уточняйте у них (где мастер) макс номер регистра. Если из тыщи не вышли - наколотите "4 byte" сколько указали по максимуму/2 (идент узла в помощь) и пишите только что нужно как и делали.
А чтоб забыть про конфигурацию и не заниматься хренью с вычислениями адресов - можно типа так:
Код:
var
регистр_W : word := ..
регистр_X : word := ..
W : word;
X : real;
---------------------------
SysMemCpy(ADR(W), ADR(%QD6.1.0) + 2 * регистр_W, SIZEOF(W)); //взяли из слейва
.. поработали c W
X := .. посчитали чего-то
SysMemCpy(ADR(%QD6.1.0) + 2 * регистр_X, ADR(X), SIZEOF(X)); //и положили в слейв
И пофиг на выравнивание если вдруг невыравненые адреса у того мастера.
А для всяких булей проще через точку или промежуточные функции GET/SET_BIT написать с заданием абсолютного адреса бита. Погромист вы или кто? Пусть машина считает - она для того.
Да и для либы с этим же проще. Все равно блок слейва - единое пространство памяти
Ну или через syslibcom пакеты самому колбасить "на лету" без выделения памяти под слейв - это скучно хотя и возможно.