Showing posts with label ADS Interface NC. Show all posts
Showing posts with label ADS Interface NC. Show all posts

July 2, 2020

Как загружаются параметры конфигурации

Как на самом деле запускается текущая конфигурация TwinCAT 3?

Все ниже перечисленные действия можно и нужно делать через официальный Automation Interface, а пока соберем пачку файлов из загрузочного каталога C:\TwinCAT\3.1\Boot\ и сравним их между собой с помощью бесплатной WinMerge.



Нам нужно больше файлов. Будем последовательно вносить изменения в текущую конфигурацию, активировать ее, а затем копировать из каталога Boot только интересные файлы.


... и сравнивать их между собой. Может быть и не так много файлов, как я собрал.


CurrentConfig.tszip


Это обычный zip-архив. Хранит копию проекта .tsproj для текущей конфигурации. Например, TwinCAT Project1.tsproj. Здесь хранятся значения параметров предусмотренные конфигурацией изначально. На самом деле при старте системы загружаются не они, а значения, хранящиеся в файле CurrentConfig.xml.


CurrentConfig.xml


Файл состоит из ряда xml-секций. Часть секций содержит параметры текущей конфигурации:
  • TcBootProject — корень. Содержит дату активации конфигурации CreateTime.
  • System — системные настройки: сколько выделить памяти, за каким ядром закрепить, размер стека, ...
  • Drivers — какие подсистемы TwinCAT 3 загрузить при старте: IO, NC, RTime, ... Аналогично тому, что я писал про загрузку системного модуля NC PTP.
  • InitCmds — команды при старте системы
  • PostCmds — команды после старта системы
  • ProjectInfo — описание текущего проекта конфигурации: уникальный идентификатор {GUID}, путь к файлу проекта, типы данных, ...


Offline → Online


Для примера я буду использовать параметры энкодера NC-оси. Это удобно, так как я только что изменял параметры NC оси официальным путем через функции типа MC_WriteParameter, но у меня остался открытым вопрос, как работает MC_WriteParameterPersistent.

После ряда экспериментов в текстовом редакторе, выяснилось, что содержимое .tsproj файла проекта содержит параметры по умолчанию. Эти параметры можно ассоциировать с графой Offline Value в таблицах параметров энкодера. Если изменить эти параметры в файле проекта, а затем перезапустить TwinCAT (Run → Config → Run), то текущее значение параметров в графе Online Value не изменится. Получается, что эти изменения никак не влияют на параметры работающего в данный момент проекта.

После небольшой проверки стало понятно, что при активации проекта эти данные транслируются и сохраняются в CurrentConfig.xml. Параметры этого xml-файла как раз и являются Online данными. Если их изменить, а затем перезапустить TwinCAT (Run → Config → Run), то мы применим новые значения к работающему проекту. Именно эти параметры применяются при загрузке текущего проекта и старте TwinCAT 3. Возможно, что TwinCAT 2 ведет себя аналогично.


InitCmds


Эта xml-секция содержит список команд или операций отправляющих значения параметров в сервис или устройство. Например, для NC один из множества параметров - это настройки энкодера. Параметры записываются пачками, в виде большого (или не очень) бинарного пакета.
  • key — описание операции.
  • port — ADS-порт устройства или сервиса.
  • iGrp — индекс группы параметра.
  • iOffs — индекс смещения параметра.
  • data — бинарный пакет байтов, содержащий данные для параметров. В шестнадцатеричных кодах, то есть два символа на байт. Данные пишутся в память, поэтому какие-либо границы параметров не указываются. Бинарный массив просто накладывается на пул адресов.
  • message — сообщение для лога TwinCAT.


Внедряемся в конфиг


Сравнив файлы, я нашел, что для задания параметров энкодера необходимо обращаться к ADS-сервису Port: 500; iGrp: 5124; iOffs: 0. ADS порт 500 отвечает за системный сервис NC (см. AmsPort Enumeration). Секция data начинается с номера оси `01`, затем идут какие-то неинтересные в данный момент данные, и с позиции 96 длинною в 16 символов идет значение Scaling Factor Numerator. Шестнадцать символов — это hex-представление 8 байт данных, что хорошо укладывается в тип данных LREAL/double.

Теперь задача заключается в следующем: найти секцию InitCmd у которой есть потомки с port = 500, iGrp = 5124 и ключ data начинающийся символами `01`. Затем преобразовать новое значение параметра в hex-вид и перезаписать его значение в ключ data. По окончании сохранить XML, перезапустить TwinCAT и наслаждаться результатом изменившегося параметра в графе Online Value.



Код можно смотреть и редактировать на гитхабе:



MC_WriteParameterPersistent


Используя тестовую программу из статьи про параметры NC осей, я параллельно сохранял файлы из загрузочного каталога Boot. Так я смог быстро отследить, что именно происходит и каким-таким образом параметры переживают перезагрузку.

И снова CurrentConfig.xml


Система создает специальную запись в конце файла CurrentConfig.xml. Посмотрите, как она отметила эту запись специальным атрибутом runtimeadded="true". Теперь понятно, как такие параметры переживают перезагрузку.
 
Номер порта 500 остался без изменения, а вот группа-смещение изменились, да и содержимое секции data похудело, выродившись в конкретное значение параметра (16 символов → 8 байт → LREAL/double тип).

Если обратиться к документации TwinCAT 3 ADS Interface NC в инфосисе, обнаружится, что наконец-то используются официально задокументированные штуки. Смотреть в п.2.4.1 "Index offset" specification for axis parameter (Index group 0x4000 + AxisID).

iGrp:  16385 = 0x00004001 (0x4000 + AxisID)
iOffs: 65571 = 0x00010023 (0x00n10023. Component of the scaling factor: numerator)

Всё, секрет раскрыт.