Showing posts with label MC_WriteParameterPersistent. Show all posts
Showing posts with label MC_WriteParameterPersistent. 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)

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

July 1, 2020

Параметры NC осей

Параметры приводных проектов специально разнесены по нескольким местам. Во первых, они разбиты по слоям или, иначе говоря, по месту применения: железо (сервоусилитель) + NC + софт (PLC). Во вторых, так безопаснее: железо имеет свои железные настройки, а все остальное и мягкое — располагает своими собственными "крутилками" и "показометрами".

Изображение: Beckhoff Automation

Тем не менее из ПЛК-проекта можно программно изменить любые настройки любого слоя. Это не всегда очевидно, но добраться все-таки можно.


Железо


Я буду упрощать. Традиционно сервоусилитель разбит на три контура: контур тока, контур скорости и контур положения. Первый контур опирается на физические характеристики мотора и сервоусилителя. Второй и третий — это контуры, построенные вокруг тех или иных регуляторов скорости, положения, момента и тому подобное. Регуляторы типа ПИД, его модификации и возможно что-то экспериментальное. Что и как они регулируют и чем управляют, попробуйте догадаться по их названиям. После их настройки сервоусилитель готов принимать команды и крутить мотор в нужном направлении.


Унификация и абстракция


Моторы и сервоусилители бывают разные. А бывают не только моторы, но и просто исполнительные механизмы к которым прилеплена обратная связь. И такую штуку тоже желательно причесать под одну гребенку. В общем нам нужно абстрагироваться от конкретики исполнительного механизма. Поэтому дальше идет слой NC-сервиса. Он абстрагирует исполнительную систему так, что программе технологического процесса не нужно ничего знать о конкретике физических процессов в исполнительной системе. У NC есть свой набор настроек.

Кроме собственныъ настроек у NC-системы есть свой собственный контур управления, который может... делайте выводы сами:



Технологический процесс


Процессом управляет программа. Управление она делает с помощью исполнительных механизмов. Получается, что программа дергает за ручки и кнопки слоя абстракции NC. У программы есть какие-то свои пожелания, которые она передает в слой NC.
 
Приводную часть настраивает "приводник" - специалист своего дела, а программы пишет "программист" - он тоже специалист, но уже своего дела. Хорошо когда это один человек: сам настроил, сам запрограммировал. Тем не менее, после тонкой настройки железа, эти настройки лучше оставить в покое и больше не трогать. Правда бывает, что нужно и что-то подкрутить программно.


Крутим параметры


Предположим, изменился коэффициент масштабирования энкодера инкрементов-на-миллиметр. В лексиконе приводника - это Nc feed constant. На самом деле это настройка не слоя железа, а настройка слоя NC. Такое смешение сделано для удобства: приводник настраивает все низко-уровневые и средне-уровневые параметры движения и железа в одном месте. Программист же может управляет параметрами движения типа скорость-ускорение и подрегулировать динамику через NC. Опять-таки удобно.

На картинке как раз кусок железа Drive Manager'a, где смешались в кучу слои:


Привод можно донастраивать через SoE, CoE и пр. В параметры NC можно залезть через функциональные блоки типа MC_WriteParameter, предоставляемой библиотекой Tc2_MC2. Эти настройки не навсегда — при следущей загрузке параметры откатятся до значений заданных в конфигурации. Так сделано для безопасности.

Список всех доступных настроек содержится в перечисляемом типе MC_AxisParameter. Его интересно полистать пару минут, вчитываясь в комментарии типа: (* new since 1/2012 *) или ...- available in Tc3 *) — история как она есть.

Чтобы как-то повлиять на значение параметров в конфигурации, можно при каждом старте ПЛК-программы задавать новые коэффициенты. Так и приходилось делать в TwinCAT 2. Теперь уже не обязательно — в TwinCAT 3 появились функции типа MC_WriteParameterPersistent. Через них достаточно задать параметр один раз и его значение легко переживет перезапуск ПЛК. При активации новой конфигурации, эти значения будут заменены на значения из новой конфигурации.

Небольшой пример как пользоваться, но там и так все понятно: