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)

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

No comments

Post a Comment

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