Showing posts with label TcBSD. Show all posts
Showing posts with label TcBSD. Show all posts

November 10, 2020

Секретный сервис 700

Не все сервисы TwinCAT описаны в документации. В старых исходниках библиотеки AdsClient, в файле AdsSpecial.cs, есть любопытная функция public string GetTargetDesc(). Описание функции гласит: "Get an xml description of the plc...". Посмотрим, какое именно описание отдаст нам контроллер.

Начнем с системного сервиса, порт номер R3_CTRLPROG = 10000. Официальное описание списка функций заканчивается номером 600 (см. таблицу System Service Index Groups). Мы же прочитаем индекс 700 (0x02BChex). Настраиваем роутинг и начинаем читать. Код C# программы:

 

Первый запрос отправляем с параметром typeof(int). Где-то внутри библиотеки это транслируется в параметр команды равный 4 — это длина типа данных int в байтах. В ответ, запрос вернет длину XML текста с описанием устройства. Зная размер, мы отправляем второй запрос в тот же порт-индекс-смещение, но в качестве параметра передаем длину описания, полученного на предыдущем шаге. Результат парсим. С помощью LINQ ищем и вытаскиваем интересующие нас поля описания.

Контроллер CX9020 вернул такой XML:

 

Сравним описания от CX9020 (Win CE) и ноутбука (Windows 10). Чтобы отследить различия, сохраним XML в отдельный файл: xdoc.Save( "cx9020.xml" ); и воспользуемся программой WinMerge:


TС/BSD

Новая, перспективная и все еще недоступная операционная система выдает следующее описание:

 

Пропали элементы `ImageDevice`, `ImageLevel`. Значение `CPUArchitecture` стало более осмысленным, но что такое 9 все еще непонятно.


Тоже сервисы

Можно найти еще несколько интересных сервисов, если копнуть глубже. Для раскопок пригодится какой-нибудь HEX-вьюер (VSCode hexdump) и следующая строка: File.WriteAllBytes( $"idx_{READDEVDESCRIPTION_IDX}.bin", adsStream.ToArray() ); // Начинайте копать.

Индекс 701 выдаст список всех сетевых интерфейсов доступных на устройстве. IP-адреса, маски подсети и что-то еще. Формат неизвестен, но можно разобраться самостоятельно. Копайте.

Из любопытного, для TC/BSD сервис возвращает название сетевого интерфейса в юникс стиле — `em0`.
А для Windows возвращает GUID: "{7D8FDCBA-6250-8DFF-4089-AB0845B12EDC} Qualcomm Atheros AR5BWB222 Wireless Network Adapter 192.168.2.177 255.255.255.0".

Индекс 702 отдает имя целевой машины: PC-8E5B1A, CX-3F5BC9... Строка заканчивается '\0', не забывайте про .TrimEnd('\0'); Продолжайте копать.


August 4, 2020

Всё есть файл

В Unix/Linux устройства могут выступать в качестве файла или бинарного/символьного потока. Такая философия позволяет работать с потоком данных устройства, как с обычным файлом: открываем-читаем-пишем. Все что нужно — это иметь права доступа к устройству и знать протокол и структуру данных. В Windows иногда тоже можно. Попробуйте, например, создать на рабочем столе файл с именем com2.txt. Будет занято.


Источник


Сначала нужно определиться, что именно будем читать. Для начала я не стал брать последовательные порты или другие устройства, а решил воспользоваться псевдоустройством... поэтому будем читать случайные числа из /dev/urandom. Это не совсем то, что мне хотелось бы проверить, но пока обойдемся этим. Как вариант можно считать память операционной системы через /dev/mem. Сервис TwinCAT под BSD запускается с root доступом, поэтому проблем возникнуть не должно.

Прочитанное из устройства, можно просто сохранить в массив, но мы сделаем два дела сразу — кроме чтения устройства, сохраним результат в файл, лежащий на другом ПЛК. Итого: два ПЛК (один с TC/BSD, другой с Windows), соединены обычной локальной сетью Ethernet. На одном ПЛК читаем случайные числа из файла-псевдоустройства, а результат сохраняем на другой ПЛК в настоящий файл.


Код


Код настолько простой, что смотреть особенно не на что: ряд обычных файловых операций. Именно в этом заключается преимущество подхода "всё есть файл".


Открывать несколько файлов можно с помощью одного и того же ФБ. Главное делать это последовательно: сначала один, затем другой. Основная задача получить хендлер файла для дальнейших файловых операций. Нам нужно получить два хэндлера, от двух файлов, заданных следующими путями: sDevPath — задает путь к источнику '/dev/urandom' и sResPath — путь к файлу с результатом 'c:\dev\random.txt'. Сразу видно — где Юникс, а где Виндовс (подсказка, обратить внимание на /слэши/ в путях). В финале добавим в константы VAR CONSTANT адрес удаленного ПЛК: sRemoteNetId = '172.17.176.49.1.1'.

Будем читать бинарные данные, то есть числа в виде потока байтов. Поэтому при открытии файла необходимо установить флаг бинарного режима чтения nMode := ... FOPEN_MODEBINARY. Кстати, читать можно и блоками по несколько килобайт за раз, но в данном случае так проще сохранять числа в виде текста.

В остальном все очень просто: открываем, читаем, обрабатываем-конвертируем и сохраняем. Преобразование значения байта как числа из диапазона 0..255 в текстовый вид делается в строке:
tmpStr := CONCAT(BYTE_TO_STRING(buf), '$r$n');
... а в конце добавляем символ '$r$n' — перевод каретки CRLF, таким образом выстраивая числа в столбик. Позднее, я засуну эти случайные числа в Эксель для анализа.

Набрав достаточное количество чисел, стоит вежливо остановить процесс через принудительную установку переменной RUN в значение FALSE. Резкая остановка работы программы, чревато тем, что на приемной стороне файл с результатом останется открытым и занятым: ни прочитать, ни удалить. Если такое произойдет, необходимо на приемной стороне вручную перезапустить системный сервис TwinCAT System Service или выполнить из командной строки с привелегиями администратора: powershell -command "Restart-Service TcSysSrv -Force". Заметьте, какой уровень доверия возникает на двух ПЛК, между которыми налажен роутинг. Это к вопросу о безопасности и отказоустойчивости по обе стороны сетевого кабеля.


Анализируем случайные числа


В Юникс системах есть несколько генераторов случайных чисел. Они отличаются надежностью, скоростью, блокировками, чем-либо еще, поэтому их несколько. Анализировать можно даже случайные числа, тем более, что они псевдослучайные. Например, можно посмотреть как числа распределены и устраивает ли это раработчика, технолога или просто любопытного человека.


Интересно посмотреть как распределяется нагрузка по ядрам. Всего виртуальной машине выделены два ядра, но не факт, что ядра настоящие: возможно, что и просто два потока (хост с гипертредингом). Зато видно как нагружен TcSystemService — системный сервис TwinCAT:


Вместо диспетчера задач здесь используется утилита top или можно установить более красивый htop: doas pkg install htop. На картинке выше используется htop.

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
...