July 16, 2020

FB_FileLoad и память роутера

Три в одном FB_FileLoad умеет загружать файл целиком в память. Сам по себе, другие ФБ для работы с файлами не нужны. Внутри него уже есть FB_FileOpen, FB_FileRead и FB_FileClose. Два основных вопроса (всего четыре):
  • асинхронность? Иначе говоря, долгая загрузка должна быть разбита на несколько циклов.
  • Как быстро загрузит большой файл?
  • Что с потреблением памяти?
  • Вдруг свой будет работать лучше?


Используется библиотека Tc2_System версия 3.4.22.0
Базовое время цикла: 1мс
Время цикла ПЛК задачи: 1мс
ПЛК: CX5010-1110


Увеличение памяти. Бесплатно


Память ПЛК = 512 Мб. Подсмотреть ее объем можно в панели управления:



Я пытался загрузить файл размером около 32.7Мб, а получил ошибку 0x070A (1802) ADSERR_DEVICE_NOMEMORY — не хватает памяти. Причем на старте нехватка памяти в FB_FileLoad не проверяется, а выясняется только по окончании марлезонского балету. Получается, что ФБ что-то там грузит до последнего, а потом внезапно память у него заканчивается. И судя по времени загрузки, загрузить получается, но что-то в конце не складывается, идет не так как было задумано и каменный цветок в итоге не выходит. Что с памятью?

Во первых, код захватывает память статически: ему памяти либо хватает, либо он просто не соберется. Вот что пишет компилятор:
Size of generated code: 58432 bytes
Size of global data: 35024176 bytes

Total allocated memory size for code and data: 64445200 bytes
Здесь все нормально. Возможно что-то выделяется динамически из памяти роутера? Начинаю увеличивать память роутера: при 100 Мб контроллер все еще работал, а при 300Мб вообще ничего не запустилось. Остановился на 50 Мб, должно хватить. И хватило.

Со времен статьи про New, Delete и память роутера, то есть про динамическую память произошли небольшие изменения. Объем памяти настраивается все там же: System → Real-Time → Router Memory → Configured Size [MB] - мегабайты!
...но теперь для активации необходимо не только активировать конфигурацию, но и перезагрузить контроллер. Подробнее см. как загружаются параметры конфигурации. Ну и теперь нам показывают чуть больше информации:



Когда памяти стало хватать, а файл стал загружаться без ошибок, я взял FB_GetRouterStatusInfo и стал пристально следить за памятью роутера:
Доступно всего, maxMem = 52428800

До старта копирования, maxMemAvail = 52395456
После копирования, maxMemAvail = 52395456
Тоже все нормально, но внезапно я подключил Scope и все встало на свои места. По вертикальной оси отмечены байты, отмасштабированные в тысячах, хотя мегабайты должны быть кратны 1024, поэтому есть небольшое расхождение в итоговых цифрах объема:


Вот эта просадка — в виде красной ямы, происходит в конце загрузки. Система куда-то грузит файл, затем выделяет под него память роутера, что-то делает, затем данные появляются в моем статическом массиве, и тут же освобождается память роутера. Зачем?

Загрузка длится долго, около 30 секунд (см. ниже), буфер заполняется постепенно, а итоговый массив с данными доступен весь и на всем протяжении загрузки. Возможно, именно по этой причине, от нас временно пытаются скрыть недозагруженные куски данных. Я попробовал выделить буфер динамически — через команду __NEW, ну и получил очередную нехватку памяти, так как от 50 мб осталось только 17 Мб и буфер под копирование выделять уже было не из чего.


Timeout


Если ФБ загружает долго (а большие файлы он грузит долго), то при таймауте ФБ выдает ошибку 0x0745 (1861) ADSERR_CLIENT_SYNCTIMEOUT. Но почему таймаут срабатывает через в два раза больший промежуток времени: задаешь 2сек — срабатывает через 4, задаешь 5 сек — срабатывает через 10; 10 сек → 20 сек. Причем код ошибки nErrId формируется через заданное время, а флаг ошибки bError устанавливается спустя еще один промежуток таймаута (начиная от установки кода ошибки). Итого, получаем удвоенное время. Это баг или фича?

Я поставил таймаут в один час T#1H и этого должно хватить на загрузку. И хватило.


Тестируем оригинал


Под рукой был большой файл бинарного содержания /Hard Disk/NK.BIN размером около ~32.7Mb. Загружаем его несколько раз:
= 26,078 сек.
= 26,075 сек.
= 26,095 сек.
  
Исходный код чтобы обратить внимание на таймаут в T#1h и напомнить про тест памяти:



Пишем свой FileLoad c буферами и чартами

  1 Кб = 92,368 сек
  4 Кб = 42,063 сек
  8 Кб = 33,781 сек
 16 Кб = 29,631 сек
 32 Кб = 28,251 сек
 64 Кб = 26,625 сек <<<<
128 Кб = 26,613 сек
  1 Мб = 26,179 сек
  4 Мб = 26,115 сек
По результатам строим самый настоящий график из Экселя. Ось Y конечно же не от нуля: там секунды, а они в 1000 раз больше миллисекунд, поэтому — норм. По оси абсцисс отложен размер временного буфера или размер блока байт, которые за раз подгружаются из файла (чтение идет блоками):



Исходный код не зависящий от памяти роутера

July 3, 2020

Установка TC/BSD Beta

FreeBSD вместо Linux. Было известно еще в прошлом году, тогда же можно было попробовать. Поэтому некий срез, который c прошлого 2019 года местами подзавял, но уж как есть.



Новости


PC-Control, апрель 2019, стр. 7: "Основные моменты автоматизации: TwinCAT, бьющееся сердце системы Beckhoff, набирает обороты с важной инновацией в сегменте автоматизации: TwinCAT впервые будет доступен и в операционной системе, отличной от Windows. "TwinCAT/BSD основан на FreeBSD, зарекомендовавшей себя, исключительно надежной и продвинутой ОС с открытым исходным кодом, которая уходит корнями в 80-е годы", - говорит управляющий директор. Она также позволяет запускать большое количество программ Linux. В то же время TwinCAT/BSD не подчиняется условиям лицензии Linux GPL. С точки зрения компании, лицензирование BSD позволяет распространять программное обеспечение для автоматизации среди поставщиков и пользователей в обычным для отрасли образом, поскольку такая лицензия не требует открывать исходный код программного обеспечения."


Youtube, 10 февраля 2020: TwinCAT/BSD объединяет рантайм XAR TwinCAT 3 и FreeBSD, проверенной в промышленности и надежной операционной системой с открытым исходным кодом. TwinCAT/BSD поддерживает все функции TwinCAT 3 и дополнительно позволяет использовать современный HMI TwinCAT на основе HTML5.



Сейчас


Заказная позиция с сайта Beckhoff: CX2900-0026: 20 GB CFast card, 3D flash, extended temperature range (only for Windows CE or TwinCAT/BSD operating systems)
TwinCAT/BSD: Operating System for IPC Features, предположительная дата выпуска - второй квартал 2020.

Слухов и новостей было достаточно. Поэтому попробовал бету.


Виртуальная машина


Сделать физическую флэшку с помощью .iso образа и Etcher (официальная рекомендация). Подключить-воткнуть флешку в ноутбук.

cd %programfiles%\oracle\virtualbox

Выяснить какой номер диска присвоен флэшке. Нужено только номер. Номер подставить вместо решетки `#` в \\.\PhysicalDrive#

VBoxManage internalcommands createrawvmdk -filename "%USERPROFILE%\.VirtualBox\usb.vmdk" -rawdisk \\.\PhysicalDrive1

Получится образ-ссылка на флэшку. Флэшку не вынимать, оставить подключенную. (!) Запустить VirtualBox от имени Администратора.

Для виртуальной машины отключить все диски и добавить один IDE контроллер Master диск со ссылкой на usb.vmdk, созданный ранее, и один SATA диск (размер минимум 16 Гб, можно динамически расширяемый).

Запомнить размер SATA диска (или сделать его отличающимся от разера флэшки) это поможет его отличить от флэшки позднее при установке BSD. Предположим флэшка 8Гб, тогда SATA диск 10Гб или 20Гб.



Отключить загрузку со всех источников, т. е. System → Boot Order должен быть пустой, все галки сняты. В вирт.машине включить поддержку System → Enable EFI.

Загрузиться с флэшки.



Установить на SATA диск (см. картинку выше). Отключить вирт. машину и удалить контроллер IDE вместе с линком на vmdk-образ флэшки. Включить вирт. машину и загрузиться.

login: Administrator
passwd: 1


Команды и кнопки системы

  • Клавиша клавиатуры Scroll Lock включает-выключает вертикальную прокрутку консоли. Непосредственно прокрутка производится клавишами PgUp/PgDown.
  • Alt+F1..F13 — переключает виртуальные консоли
  • dmesg — загрузка устрйоства при старте системы
  • `#` в начале строки, означает запуск с рутовыми правами. Например, doas ps -a
  • `%` в начале строки, запуск с правами текущего пользователя.
  • Простой редактор текстов EasyEditor. Команда  `ee` из командной строки. Например, # ee <имя файла>


Доп пакеты

`doas` в начале команд нужен для временного разрешения запуска под рутовыми правами. Это аналог `sudo` в линуксе.
Посмотреть какие репозитории подключены в данный момент можно с помощью команды # pkg -vv (да-да, с двойной `vv` на конце).
Официальные пакеты прописаны в /etc/pkg/Train.conf, но там только самое необходимое.
Доп. пакеты подключаются: # cp /etc/pkg/FreeBSD.conf /usr/local/etc/pkg/repos/FreeBSD.conf
Если после этого удалить /etc/pkg/Train.conf официальный репозиторий пакетов станет недоступен.



Guest расширения VirtualBox


Просвещаться на Wiki FreeBSD VirtualBox.

# pkg install emulators/virtualbox-ose-additions
# pw groupmod wheel -m Administrator — чтобы в дальнейшем работал буфер обмена и др. плюшки граф. оболочек.
# ee /etc/rc.conf — откроется простой текстовый редактор, добавить в конец файла следующие строки:

vboxguest_enable="YES"
vboxservice_enable="YES"



Для завершения редактора и сохранения нажать Escape → a → a. Эскейп срабатывает медленно, не стоит торопиться.
Перезагрузиться: doas reboot


Midnight Commander


Файловый двух-панельный менеджер, Norton/Total Commander из мира *nix.

Установка: # pkg install mc
Запуск из командной строки: mc


XFCE4


Самое простое описание установки. Человек наелся говна на форумах и свел все к простому списку действий. Спасибо!
Драйверы графики для AMD-Intel-Noname: # pkg install drm-kmod

но(!)

Драйверы для графики VirtualBox: # pkg install emulators/virtualbox-ose-kmod

doas ee /etc/rc.conf
добавить строки
kld_list="/boot/modules/i915kms.ko" — для граф. адаптера Intel.
kld_list="/boot/modules/vboxdrv.ko" — для виртуального граф. адаптера vbox.
dbus_enable="YES"

Перезагрузиться: doas reboot

# pkg install xorg
# pkg install xfce

Если установка прервалась по какой-либо причине (упало интернет соединение), то повторить команды: установка продолжиться с прерванного пакета.
Запуск из командной строки: startxfce4


Общие каталоги


В настройках вирт. машины настроить каталог для шаринга файла между хостом и гостем.
В вирт. машине под xfce4 запустить терминал. Ввести:

# mount_vboxvfs -w myshare /mnt, где

myshare — название шары как ресурса или точки монтирования (это не название каталога!);
/mnt — куда подмонтировать: каталог должен присутствовать, автоматически он не создается (здесь вам не виндус). 

Название шары (здесь myshare) указывается при настройке виртуальной машины Shared Folder → Add Share → Mount point.
Теперь можно таскать файлы между Windows и Tc/BSD туда-обратно. 



Git


# pkg install git


.NET Core 3


.Net-Core-3.0.0-for-FreeBSD — нужно всё скачать и выполнить все следующие пункты.


Необходимые пакеты


# pkg install libunwind lttng-ust icu curl openssl111 bash git llvm60 cmake krb5
# ln -s /usr/local/bin/bash /bin/bash


.NET Core 3.0.0 prebuilt SDK


Скачать dotnet-sdk-3.0.100-freebsd-x64.tar.gz и через расшареную папку скопировать в виртуальную машину. Распаковать в ~/dotnet-sdk

mkdir ~/dotnet-sdk
tar xf dotnet-sdk-3.0.100-freebsd-x64.tar.gz -C ~/dotnet-sdk


Essential .Net NuGet Base Packages


Скачать dotnet_pkgs-3.0.0-freebsd.tar. Через расшареную папку скопировать в виртуальную машину. Распаковать в ~/dotnet_pkgs

mkdir ~/dotnet_pkgs
tar xf dotnet_pkgs-3.0.0-freebsd.tar -C ~/dotnet_pkgs


NuGet


Создать или отредактировать файл настроек ~/.nuget/NuGet/NuGet.Config. Добавить в него

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <packageSources>     <add key="local_pkgs" value="/home/Administrator/dotnet_pkgs" />     <add key="nuget.org" value="https://api.nuget.org/v3/index.json" protocolVersion="3" />
  </packageSources>
</configuration>

`Administrator` заменить на имя текущего пользователя или оставить как есть, если текущий пользователь это действительно Администратор (не рут, а именно Administrator).


Failed to initialize CoreCLR, HRESULT: 0x8007001F


Описание здесь: linux-dotnet-cli

# ee /etc/sysctl.conf

Добавить строку: vm.max_wired=1333000
Как вариант, вместе добавления строки можно попробовать из командной строки вызвать команду: # sysctl vm.max_wired=1333000


Проверяем работоспособность

mkdir ~/testapp
cd ~/testapp
~/dotnet-sdk/dotnet new console -o myApp
cd myApp
~/dotnet-sdk/dotnet run


Создаем образ диска


Подключаем, например, кард-ридер. Добавляем в вирт.машину соответствующее USB-устройство. Запускаем вирт. машину.

В юниксе получаем список дисковых устройств: # camcontrol devlist. Нам нужны `ada0` или `da0`, или другой диск. Для всяких сидиромов порядок именования устройств может быть обратным. 

Получается что-то вроде следующего:
# camcontrol devlist
    <VBOX HARDDISK 1.0>   at scbus0 target 0 lun 0 (ada0,pass0)
    <VBOX CD-ROM 1.0>     at scbus1 target 0 lun 0 (pass1,cd0)
  
Подключаем шару к хост компьютеру (см. выше `общие каталоги`).
Запускаем дупликатор `dd`: # dd if=/dev/da0 of=/mnt/cfdisk-image-backup.dd bs=128K conv=noerror,sync status=progress

Ждем завершения, долго...


Putty


В случае ошибки: SSH Shell fail - Couldn't agree a key exchange algorithm.
Обновить Putty. В версии 0.73 все работает.


VNC


TightVnc# pkg install net/tightvnc
Бесплатный клиент под Windows — VncViewer
...

Install TC/BSD Beta

FreeBSD instead of Linux. It was already known last year, and it was possible to try but not buy. So, it is good time to cook some slices, which from the last 2019 is not so fresh, but as is.



News


PC-Control, April 2019, pg. 7: "Automation highlights: TwinCAT, beating heart of the system Beckhoff is lifting the wraps on an important innovation in the automation segment: TwinCAT will now, for the first time, also be available on an operating system other than Windows. "TwinCAT/BSD runs on FreeBSD, an established, exceptionally robust and advanced open source OS that can trace its roots all the way back to the 1980s," says the managing director. It can also run a large number of Linux programs. However, TwinCAT/BSD is not subject to Linux GPL licensing terms. From the company's perspective, BSD licensing allows the automation software to be distributed to vendors and users in the industry’s usual manner because there is no requirement to release the software’s source code."


Youtube, 10 February 2020: "TwinCAT/BSD combines the TwinCAT 3 runtime XAR with FreeBSD, an industrially tested and reliable open source operating system. TwinCAT/BSD supports all TC3 functions and additionally enables the use of the modern HTML5-based TwinCAT HMI.".



Now


Accessories → CX2900-0026: 20 GB CFast card, 3D flash, extended temperature range (only for Windows CE or TwinCAT/BSD operating systems)
TwinCAT/BSD: Operating System for IPC Features, estimated market release 2nd quarter 2020.

There was enough rumors. And I decided to try beta.


Jack in The Box


Make a physical USB flash drive using .iso image and Etcher (this is an official recommendation). Plug the USB flash drive into the laptop.

cd %programfiles%\oracle\virtualbox

Find out what drive number is assigned to the flash drive. Only a number is needed. Replace the `#` symbol in \\.\PhysicalDrive# with that number.

VBoxManage internalcommands createrawvmdk -filename "%USERPROFILE%\.VirtualBox\usb.vmdk" -rawdisk \\.\PhysicalDrive1

You will get an image-link to the flash drive. Do not remove the flash drive, leave it plugged in during all the operations followed below. (!) Launch VirtualBox as Administrator.

For the virtual machine, disconnect all disks and add one IDE controller Master disk with a link to `usb.vmdk`, created earlier. And one SATA disk (at least 16 GB size, dynamically expandable type is acceptable).

Remember the size of the SATA disk (or make it different of the size of the flash drive). This will help you to distinguish it later from the flash drive when you will be installing BSD. Let suppose that flash drive is 8GB drive size, and the SATA drive is 10GB or 20GB.



Disable booting from all sources. System → Boot Order have to be empty and all options switched off. In the virtual machine, enable support of the EFI: System → Enable EFI.

Boot from the USB flash drive.



Install OS to the SATA drive (see picture above). Disable Virtual Box and remove the IDE controller along with a link to the vmdk-image of a flash drive. Turn on the virtual machine then boot.

login: Administrator
passwd: 1


Command Line and Hotkeys

  • Scroll Lock on/off vertical scroll. Vertical scroll by PgUp/PgDown.
  • Alt+F1..F13 — switch current terminal.
  • dmesg — boot devices.
  • `#` at the start of the line means root privileges. Ex.: doas ps -a
  • `%` at the start of the line means plain user.
  • Easy text editor EasyEditor. Starts with `ee` from command line. Ex.: # ee <filename.ext>


Another Packets

`doas` before commands is for root privileges. Like a `sudo` in Linux.
Repository list currently available by # pkg -vv (with double `vv` on the tail).
Official packets are in the /etc/pkg/Train.conf, but it contains necessary packets only.
To append additional packets: # cp /etc/pkg/FreeBSD.conf /usr/local/etc/pkg/repos/FreeBSD.conf
If you remove /etc/pkg/Train.conf then, the official repository becomes unavailable.



Guest Additions VirtualBox



# pkg install emulators/virtualbox-ose-additions
# pw groupmod wheel -m Administrator — clipboard and etc GUI stuff.
# ee /etc/rc.conf — when a simple text editor opens, append the following lines to the end of the file:

vboxguest_enable="YES"
vboxservice_enable="YES"



To close the editor press Escape → a → a. Escape works slowly, do not rush.
Finally, reboot: doas reboot


Midnight Commander


Two-panels file manager, like Norton/Total Commander but from *nix world.

Installation: # pkg install mc
Command line: mc


XFCE4


The simplest installation description. The man ate shit on the forums then reduced everything to a simple list of actions. Thank you man!
Graphics drivers AMD-Intel-Noname: # pkg install drm-kmod

but (!)

Graphics drivers for VirtualBox: # pkg install emulators/virtualbox-ose-kmod

doas ee /etc/rc.conf
append next lines
kld_list="/boot/modules/i915kms.ko" — Intel adapters.
kld_list="/boot/modules/vboxdrv.ko" — vbox virtual graphics adapter.
dbus_enable="YES"

Reboot: doas reboot

# pkg install xorg
# pkg install xfce

If the installation was interrupted by any reason, just repeat the commands and installation continues from the interrupted part.
Start from command line: startxfce4


Shared Folders


In the virtual machine settings configure a directory for sharing files between the host and the guest.
Under the xfce4 start a terminal session. Enter next:

# mount_vboxvfs -w myshare /mnt, where

myshare — share name (not a folder path!);
/mnt — target path to mount to. Folder have to be already present. 

Share name (here is `myshare`) should be defined when you setup virtual machine Shared Folder → Add Share → Mount point.
Now you are ready to move files between Windows and Tc/BSD and back again. 



Git


# pkg install git


.NET Core 3


.Net-Core-3.0.0-for-FreeBSD — download all of you needed.


Necessary Packets


# pkg install libunwind lttng-ust icu curl openssl111 bash git llvm60 cmake krb5
# ln -s /usr/local/bin/bash /bin/bash


.NET Core 3.0.0 prebuilt SDK


Download dotnet-sdk-3.0.100-freebsd-x64.tar.gz then copy to the virtual machine through the shared folder. Extract into the ~/dotnet-sdk

mkdir ~/dotnet-sdk
tar xf dotnet-sdk-3.0.100-freebsd-x64.tar.gz -C ~/dotnet-sdk


Essential .Net NuGet Base Packages


Download dotnet_pkgs-3.0.0-freebsd.tar. then copy to the virtual machine through the shared folder. Extract into the ~/dotnet_pkgs

mkdir ~/dotnet_pkgs
tar xf dotnet_pkgs-3.0.0-freebsd.tar -C ~/dotnet_pkgs


NuGet


Create or edit if existed settings file ~/.nuget/NuGet/NuGet.Config. Then append

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <packageSources>     <add key="local_pkgs" value="/home/Administrator/dotnet_pkgs" />     <add key="nuget.org" value="https://api.nuget.org/v3/index.json" protocolVersion="3" />
  </packageSources>
</configuration>

`Administrator` have to be replaced with the name of the current user. You can stay it unchangeable if you are the Administrator (not a `root`, but your name is `Administrator`).


Failed to initialize CoreCLR, HRESULT: 0x8007001F


Issue described there: linux-dotnet-cli

# ee /etc/sysctl.conf

Append line: vm.max_wired=1333000
Or you can try to execute next command from the command line: # sysctl vm.max_wired=1333000


Testing

mkdir ~/testapp
cd ~/testapp
~/dotnet-sdk/dotnet new console -o myApp
cd myApp
~/dotnet-sdk/dotnet run


Disk Image



List of the disk drives: # camcontrol devlist. We are going to use `ada0` and `da0`, or select what you want. 

For example:
# camcontrol devlist
    <VBOX HARDDISK 1.0>   at scbus0 target 0 lun 0 (ada0,pass0)
    <VBOX CD-ROM 1.0>     at scbus1 target 0 lun 0 (pass1,cd0)
  
Switch on shared folder (see above `Shared Folders`).
Start the duplicator `dd`: # dd if=/dev/da0 of=/mnt/cfdisk-image-backup.dd bs=128K conv=noerror,sync status=progress

Finnaly, please wait... it will take some time...


Putty


If error: SSH Shell fail - Couldn't agree a key exchange algorithm.
Should update Putty. No errors in version 0.73.


VNC


TightVnc# pkg install net/tightvnc
Freeware client under the Windows — VncViewer
...

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. Через них достаточно задать параметр один раз и его значение легко переживет перезапуск ПЛК. При активации новой конфигурации, эти значения будут заменены на значения из новой конфигурации.

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