S -- стандартные.
P -- от слова "product" -- уникальные для продукта. Могут различаться для разных версий, продуктов и т. п.
Тем не менее, работа с этими параметрами ведется через EtherCAT и где-то есть преобразование (на самом деле не преобразование, а маппинг операционного образа данных). Поэтому, для прямого доступа через EtherCAT используются следующие значения:
Группа (IGrp), константа:
EC_ADS_IGRP_ECAT_SOE = 0xF420
Смещение (IOffs) формируется сложнее:
(nDriveNo & 7) << 24 | (nElement << 16) | nIdn;
- nDriveNo -- номер канала сервоусилителя.
- nElement -- номер функции CoE, иначе говоря, что и с чем будем делать. Например, nElement для записи значения в ячейку: EC_SOE_ELEMENT_VALUE = 0x40.
- nIdn -- номер ячейки SoE (SERCOS over EtherCAT).
В библиотеке TcEthercat.lib для разработчиков подготовлены специальные константы. Например, nIdn для параметра S_0_0099, формируется как сумма номера параметра и соответствующей константы смещения: S_0_IDN + 99.
S-параметры расположены в начале адресного пространства, P-параметры смещены на постоянную величину:
S_0_IDN = 0
P_0_IDN = 0x8000
Так выглядит вычисление смещения изнутри функционального блока:
nOffset := SHL(BYTE_TO_DWORD(nDriveNo AND 16#07), 24) OR SHL(BYTE_TO_DWORD(nElement), 16) OR nIdn;
fbAdsWrite( WRITE := TRUE,
NETID := sNetId,
PORT := nSlaveAddr,
IDXGRP := EC_ADS_IGRP_ECAT_SOE,
IDXOFFS := nOffset,
SRCADDR := pSrcBuf,
LEN := cbBufLen,
TMOUT := tTimeout );
Кроме ячеек для хранения данных, существуют ячейки для исполнения команд сервоусилителя. Для выполнения таких команд (например, сброс ошибки сервоусилителя через командный параметр S_0_0099), достаточно записать в эту ячейку магическую цифру "3" (три). Для выполнения команды еще раз, необходимо записать число три в эту ячейку еще раз.