July 21, 2015

S и P параметры сервоусилителей

Несмотря на то, что сервоусилители AX5000 работают с шиной EtherCAT, внутри у них неонка SERCOS. Отсюда тянется специфика работы с параметрами и объяснение, почему этих параметров два вида: S и P.

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" (три). Для выполнения команды еще раз, необходимо записать число три в эту ячейку еще раз.

No comments

Post a Comment

Note: Only a member of this blog may post a comment.