tag:blogger.com,1999:blog-33874392642910145732024-02-19T15:49:35.941+03:00Go TwinCATWhen you get into <u>T</u>he <u>Win</u>dows <u>C</u>ontrol and <u>A</u>utomation <u>T</u>echnologyNikolai Voroninhttp://www.blogger.com/profile/06095643959617325612noreply@blogger.comBlogger163125tag:blogger.com,1999:blog-3387439264291014573.post-79859191225306168482020-12-01T03:43:00.001+03:002021-01-21T13:32:19.941+03:00Мы замкнули шину K-Bus<p>
Чтобы проверить информацию из
<a href="https://gotwincat.blogspot.com/2020/08/k-bus-interbus-terminal-internals.html" target="_blank">истории про K-Bus-Interbus</a>, коллега А по моей просьбе взял
BK9050, подключил к нему модуль дискретных входов-выходов
KL1859... и не стал подключать терминальный модуль.
</p>
<blockquote>Все испытания проводились в целях испытания. Ни один из модулей не
пострадал. Животные участие не принимали.<br /><span style="color: red;">Не пытайтесь повторить, потеряете
гарантию!</span></blockquote>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiDdy_drHbpJSBHnIHha1QjJwMXVI217bFh26Q5_9531hrNTCEX1wwly72eaZwse6v3VBsKkkJPRrgRUSKMH6PC_UpQjebEX_sChQ__Y-h0vKwzCPIs5WV9Q5y3oZfJI1OtZNU6_-XngKH-/s800/20201029_161549__.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="511" data-original-width="800" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiDdy_drHbpJSBHnIHha1QjJwMXVI217bFh26Q5_9531hrNTCEX1wwly72eaZwse6v3VBsKkkJPRrgRUSKMH6PC_UpQjebEX_sChQ__Y-h0vKwzCPIs5WV9Q5y3oZfJI1OtZNU6_-XngKH-/s16000/20201029_161549__.jpg" /></a>
</div>
<p>Сканируем… Устройства на шине недоступны. Проверяем индикацию коплера. На картинке выше виден единственный красный индикатор. Документация говорит, что это "K-Bus ERR", то есть ошибка шины K-Bus. В данном случае отсутствует терминальный модуль.</p><p>Вспоминаем результаты
препарации из предыдущей статьи и замыкаем шину:
</p>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhm_9s14AaCiOx-xb6sfuNxiOI6s9xydGZDanatvd4487EeZZPJ457VPaVeuPjWus4PPnBTaWaxCcYM49NZF_DaEMOBbWjsREkNCi_RtLxOize4F10SeIHEcInSpN_GYnt9_AW2o43Q4YzS/s800/20201029_161525__.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="611" data-original-width="800" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhm_9s14AaCiOx-xb6sfuNxiOI6s9xydGZDanatvd4487EeZZPJ457VPaVeuPjWus4PPnBTaWaxCcYM49NZF_DaEMOBbWjsREkNCi_RtLxOize4F10SeIHEcInSpN_GYnt9_AW2o43Q4YzS/s16000/20201029_161525__.jpg" /></a>
</div>
<p>Все индикаторы зеленые, шина доступна, устройства сканируются и обнаруживаются. <span style="color: red;">Никогда не делайте так в реальных условиях!</span> Всегда используйте терминальный
модуль
KL9010. </p>
Nikolai Voroninhttp://www.blogger.com/profile/06095643959617325612noreply@blogger.com3tag:blogger.com,1999:blog-3387439264291014573.post-57890825863054201492020-11-26T18:56:00.029+03:002021-01-21T13:33:03.880+03:00Компактные сервомодули ELM72xx<p>
Линейка сервотерминалов расширилась до 16 ампер. <a href="https://www.pc-control.net/pdf/042020/products/pcc_0420_elm72xx_e.pdf" target="_blank">ELM72xx</a>
предлагает прикоснуться к блестящему металическому корпусу компактного
сервотерминала.
</p>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiPaAv8-l4wg185jA1rQt2S_LLFPAVMXaGmrPhv50IE_4zhIWwcQ5eUcnRj_yrdIC_x3ufpJCi6nSu2V3ec89ux2UBNizxQhPflBMdlxCs1CYzThVkGybvD__RsriBIBSny_zSk0XzSRECx/s800/elm7222-9018.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="800" data-original-width="800" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiPaAv8-l4wg185jA1rQt2S_LLFPAVMXaGmrPhv50IE_4zhIWwcQ5eUcnRj_yrdIC_x3ufpJCi6nSu2V3ec89ux2UBNizxQhPflBMdlxCs1CYzThVkGybvD__RsriBIBSny_zSk0XzSRECx/s16000/elm7222-9018.jpg" /></a>
<p style="text-align: right;">
<span style="color: #999999; font-size: x-small;">Изображение: Beckhoff Automation</span>
</p>
</div>
<p>
Сервотерминалы устанавливаются на дин-рейке вместе с другими EtherCAT
терминалами в общей линейке. Металлический корпус лучше рассеивает тепло.
Кабели подключаются через разъемы: должно быть удобнее.
</p>
<p></p>
<ul style="text-align: left;">
<li>
ELM72<span style="background-color: #d9ead3; color: #38761d;">1</span><span style="color: #2b00fe;">1</span> — <span style="color: #2b00fe;">1</span>
двигатель до
<span style="background-color: #d9ead3;">4.5 A</span> (I<sub>rms</sub>).
</li>
<li>
ELM72<span style="background-color: #d9ead3;">1</span><span style="color: #800180;">2</span> — <span style="color: #800180;">2</span>
канала по
<span style="background-color: #d9ead3;">4.5 A</span> (I<sub>rms</sub>).
</li>
<li>
ELM72<span style="background-color: #fff2cc;">2</span><span style="color: #2b00fe;">1 </span>— <span style="color: #2b00fe;">один</span>
на
<span style="background-color: #fff2cc;">8 A</span> (I<sub>rms</sub>).
</li>
<li>
ELM72<span style="background-color: #fff2cc;">2</span><span style="color: #800180;">2 </span>— <span style="color: #800180;">два</span>
по
<span style="background-color: #fff2cc;">8 A</span> (I<sub>rms</sub>).
</li>
<li>
ELM72<span style="background-color: #f4cccc;">3</span><span style="color: #2b00fe;">1 </span>— тот самый
<span style="color: #2b00fe;">единственный</span> на
<span style="background-color: #f4cccc;">16 A</span> (I<sub>rms</sub>).
</li>
</ul>
<p>
Модули расчитаны на двигатели AM8100. Питание 48 вольт; 24В на половине мощности. Питание и обратная связь в одном кабеле — однокабельная технология. Можно
подключить внешний тормоз, обратную связь (энкодер или резольвер)
и внешний тормозной резистор. Цифровые входа поддерживают функцию
<a href="https://infosys.beckhoff.com/content/1033/ax5000_function_doku_hw2/36028797668933003.html" target="_blank">Probe Unit</a>.</p>
<p>TwinSAFE логика обеспечивает безопасность через простые функции STO/SS1 (<b>S</b>afe <b>T</b>orque <b>O</b>ff / <b>S</b>afe <b>S</b>top <b>1</b>) поверх EtherCAT (FSoE, Safety over EtherCAT) или в рамках комплекса безопасности движения Safe Motion (IEC 61800-5-2 / <a href="http://docs.cntd.ru/document/1200134047" target="_blank">ГОСТ Р МЭК 61800-5-2-2015</a>).</p><p>Остается вопрос о рассеивании тепла: нужны ли опциональные
вентиляторы для обдува блестящего металлического зада?
</p>
Nikolai Voroninhttp://www.blogger.com/profile/06095643959617325612noreply@blogger.com0tag:blogger.com,1999:blog-3387439264291014573.post-70187127613436235772020-11-17T19:42:00.180+03:002020-11-18T08:04:40.396+03:00Переменная через указатель, через ADS<p>Значение переменной можно прочитать через указатель по ADS.</p>
<div style="border-left: 1em solid rgb(250, 250, 250); margin-left: 2em; overflow: hidden; padding-left: 1em; width: auto;">
<pre style="line-height: 125%; margin: 0px;"><span style="color: #2b00fe;">PROGRAM</span> MAIN
<span style="color: #2b00fe;">VAR</span>
state: <span style="color: #2b00fe;">UINT</span>;
pState: <span style="color: #2b00fe;">POINTER TO</span> <span style="color: #2b00fe;">UINT</span>;
<span style="color: #2b00fe;">END_VAR</span>
pState := <span style="color: #2b00fe;">ADR</span>(state);</pre>
</div>
<p><br /></p><p>
Прочитаем значение переменной `state` через ее указатель `pState`. Нужно разыменовать указатель, добавив спец. символ `^` к имени указателя. Получим <span style="background-color: #fff2cc;">`pState^`</span>. Программа
на C# для текущей <b>версии 4.4.10</b> библиотеки Beckhoff.TwinCAT.Ads:
</p>
<div style="border-left: 1em solid rgb(250, 250, 250); margin-left: 2em; overflow: hidden; padding-left: 1em; width: auto;">
<pre style="line-height: 125%; margin: 0px;"><span style="color: #2b00fe;">ushort</span> state = (<span style="color: #2b00fe;">ushort</span>) tcAdsClient.ReadSymbol( <span style="background-color: #fff2cc; color: #990000;">"MAIN.pState^"</span>, <span style="color: #2b00fe;">typeof</span>( <span style="color: #2b00fe;">ushort</span> ), <span style="color: #2b00fe;">false</span> );</pre>
</div>
<p><br /></p>
<p>Значение переменной читается. Теперь возьмем пробную версию новой библиотеки <b>5.0.1-preview.12</b> под .NET Core 3.1.0. Код поподробнее:
</p>
<script src="https://gist.github.com/nikvoronin/44b46a0bb57a44cce4f83dfa4f3b6e20.js"></script>
<p><br /></p>
<p>Программа читает переменную и в зависимости от ее значения рисует замысловатые узоры. Имея указатель можно вытягивать значение переменной. Это полезное свойство и дополнительные телодвижения здесь не нужны.</p>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgLMnoGEwe4VhBtauLeeMDE8ZbBmtZJSGTQGApnCzhW7WOHwBZau2LBxoxRQD8UvBt0OkfMt0t_HEPFKPeH5YtHMMY-Idui_J8LnxyFfcsjFRargqH7LHEkf-PS7HwxxiwpHsyfn_S08LfU/s623/read-var-by-pointer-over-ads.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="227" data-original-width="623" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgLMnoGEwe4VhBtauLeeMDE8ZbBmtZJSGTQGApnCzhW7WOHwBZau2LBxoxRQD8UvBt0OkfMt0t_HEPFKPeH5YtHMMY-Idui_J8LnxyFfcsjFRargqH7LHEkf-PS7HwxxiwpHsyfn_S08LfU/s16000/read-var-by-pointer-over-ads.png" /></a>
</div>
<p><br /></p>
<p>Для новой библиотеки под .NET Core требуется создать файл роутинга <i>`StaticRoutes.xml`</i>. В этом файле настраиваются соединения между целевым контроллером и ПК. Если контроллер и ПК находятся на одной и той же машине, то настраивать этот файл не нужно. Можно просто удалить его.</p>
Nikolai Voroninhttp://www.blogger.com/profile/06095643959617325612noreply@blogger.com3tag:blogger.com,1999:blog-3387439264291014573.post-91282410352981297892020-11-13T19:06:00.021+03:002020-11-18T08:05:26.812+03:00Атрибут TcNcAxis<p>
<a href="https://infosys.beckhoff.com/content/1033/tc3_plc_intro/3107990667.html" target="_blank">Атрибут TcNcAxis</a>
линкует NC ось со стороны кода, автоматически изменяя конфигурацию ПЛК. Про этот атрибут уже было в
<a href="https://gotwincat.blogspot.com/2019/06/symbolic-linking-over-attributes.html" target="_blank">символьной линковке через атрибуты</a>. Здесь же будет пара-тройка нюансов.
</p>
<p><br /></p>
<h2 style="text-align: left;">Массивы</h2>
<p>
Большое количество осей удобно объединять в массивы. Массив осей можно
линковать одним атрибутом:
</p>
<div style="border-left: 1em solid rgb(250, 250, 250); margin-left: 2em; overflow: hidden; padding-left: 1em; width: auto;">
<pre style="line-height: 125%; margin: 0px;"><b><span style="color: #999999;">{attribute 'TcNcAxis' := '[1]:=Axis X; [2]:=Axis Y; [3]:=Axis Z' }</span></b>
axes: <span style="color: #2b00fe;">ARRAY</span> [<span style="color: #bf9000;">1</span>..<span style="color: #bf9000;">3</span>] <span style="color: #2b00fe;">OF</span> AXIS_REF;
</pre>
</div>
<p><br /></p><p>
В имени оси можно использовать пробел. Имя оси в атрибуте тоже записывается с
пробелами. Количество пробелов должно совпадать и между буквами в имени, и в
атрибуте. Axis⎵X и Axis⎵⎵X — это разные оси.
</p>
<p>
Если имя оси указано в атрибуте, но оси с таким именем нет, то в конфигурации
будет создана новая ось.
</p>
<p>
Согласно правилам, атрибуту нельзя подставить имя, в котором есть символы кавычек, точек с запятой и тому подобное. В названии оси такие символы
использовать можно, а в атрибут они не запишутся: сломают формат атрибута.
</p>
<p><br /></p>
<h2 style="text-align: left;">Автомапинг функциональных блоков</h2>
<p>
Если нет доступа к внутренностям функционального блока, можно воспользоваться…
атрибутом:
</p>
<div style="border-left: 1em solid rgb(250, 250, 250); margin-left: 2em; overflow: hidden; padding-left: 1em; width: auto;">
<pre style="line-height: 125%; margin: 0px;"><b><span style="color: #999999;">{attribute 'TcNcAxis' := '.axisZ:=Axis Z'}</span></b>
fbFoobar: FB_Foobar;
<span style="color: #38761d;">[...]</span>
<span style="color: #2b00fe;">FUNCTION_BLOCK</span> FB_Foobar
<span style="color: #2b00fe;">VAR</span>
axisZ: AXIS_REF;
<span style="color: #2b00fe;">END_VAR</span>
<span style="color: #38761d;">[...]</span>
</pre>
</div>
<div><br /></div>
<div>
В одном программном блоке может быть несколько экземпляров функционального
блока. Но можно слинковать оси только одного экземпляра ФБ. Нельзя линковать
несколько переменных AXIS_REF с одной и той же осью. При компиляции система
выдаст ошибку:
</div>
<blockquote>Mapping conflict! Same data of 'TINC^NC-Task 1 SAF^Axes^Axis
Z^Inputs^FromPlc' is written from different sources</blockquote>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiBhN8G6yLnlKWBcF0j4Se0IHzIhQcnh0rSvqr8Sly-qSr21utL3NcDgyY6-rvEvoseiVcxasDohXkBtI9nLgUYYfwBiBXm1dZhh_2EdVHO_ENrbFxQBuCn59IP7f_a8XLGBKec9cfmB8X2/s645/attribute-tcncaxis-double-mapping.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="345" data-original-width="645" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiBhN8G6yLnlKWBcF0j4Se0IHzIhQcnh0rSvqr8Sly-qSr21utL3NcDgyY6-rvEvoseiVcxasDohXkBtI9nLgUYYfwBiBXm1dZhh_2EdVHO_ENrbFxQBuCn59IP7f_a8XLGBKec9cfmB8X2/s16000/attribute-tcncaxis-double-mapping.png" /></a>
</div>
<p><br /></p>
Nikolai Voroninhttp://www.blogger.com/profile/06095643959617325612noreply@blogger.com0tag:blogger.com,1999:blog-3387439264291014573.post-60795716314006280762020-11-10T19:33:00.237+03:002020-11-10T19:33:00.236+03:00Секретный сервис 700<p>
Не все сервисы TwinCAT описаны в документации. В старых исходниках библиотеки
AdsClient, в файле <i>AdsSpecial.cs</i>, есть любопытная
функция <span style="background-color: #fff2cc;">public string <b>GetTargetDesc()</b></span>. Описание функции гласит: "<span style="background-color: #fff2cc;">Get an xml description of the plc...</span>". Посмотрим, какое именно описание отдаст нам контроллер.
</p>
<p>
Начнем с системного сервиса, порт номер R3_CTRLPROG = 10000.
<a href="https://infosys.beckhoff.com/content/1033/tcplclibsystem/html/tcplclibsys_constants.htm" target="_blank">Официальное описание списка функций</a>
заканчивается номером 600
(см. таблицу <i>System Service Index Groups</i>). Мы
же прочитаем индекс 700 (0x02BC<sub>hex</sub>). Настраиваем роутинг и начинаем
читать. Код C# программы:
</p>
<script src="https://gist.github.com/nikvoronin/66c924bf03f5b31960fa47fe35d8bbbc.js"></script>
<p> </p>
<p>
Первый запрос отправляем с параметром
<span style="background-color: #fff2cc;">typeof(int)</span>. Где-то внутри
библиотеки это транслируется в параметр команды равный 4 — это длина типа
данных <i>int</i> в байтах. В ответ, запрос вернет длину XML текста с
описанием устройства. Зная размер, мы отправляем второй запрос в тот же
порт-индекс-смещение, но в качестве параметра передаем длину описания,
полученного на предыдущем шаге. Результат парсим. С помощью LINQ ищем и
вытаскиваем интересующие нас поля описания.
</p>
<p>Контроллер CX9020 вернул такой XML:</p>
<script src="https://gist.github.com/nikvoronin/dd7f79209e4ecfaeba7d3c79fb5074e3.js"></script>
<p> </p>
<p>
Сравним описания от CX9020 (Win CE) и ноутбука (Windows 10). Чтобы отследить
различия, сохраним XML в отдельный файл: xdoc.Save( <span style="color: #990000;">"cx9020.xml" </span>); и воспользуемся программой WinMerge:
</p>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg9RttSGK6jvWlqMT1N7c8jfuCAhRyG_6T81tR2sPjg1ZTYNqeKRl0f2WbfrU3n_vkHHjXQD9y3KpdgRgZ5pi_C8JrDsR-Zo8fc6u4Vamhgjg6II86I9v2IMKSkLI-5BIUdKefFi7qrJWnF/s736/dev-description-secret-service.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="441" data-original-width="736" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg9RttSGK6jvWlqMT1N7c8jfuCAhRyG_6T81tR2sPjg1ZTYNqeKRl0f2WbfrU3n_vkHHjXQD9y3KpdgRgZ5pi_C8JrDsR-Zo8fc6u4Vamhgjg6II86I9v2IMKSkLI-5BIUdKefFi7qrJWnF/s16000/dev-description-secret-service.png" /></a>
</div>
<p><br /></p>
<h2 style="text-align: left;">TС/BSD</h2>
<p>
Новая, перспективная и все еще недоступная операционная система выдает
следующее описание:
</p>
<script src="https://gist.github.com/nikvoronin/8d5d86530ffe852a69cab34627e54b06.js"></script>
<p> </p>
<p>
Пропали элементы `ImageDevice`, `ImageLevel`. Значение `CPUArchitecture` стало
более осмысленным, но что такое 9 все еще непонятно.
</p>
<p><br /></p>
<h2 style="text-align: left;">Тоже сервисы</h2>
<p>
Можно найти еще несколько интересных сервисов, если копнуть глубже. Для
раскопок пригодится какой-нибудь HEX-вьюер (VSCode hexdump) и следующая
строка: <span style="color: #134f5c;">File</span>.WriteAllBytes( <span style="color: #990000;">$"idx_</span>{READDEVDESCRIPTION_IDX}<span style="color: #990000;">.bin"</span>,
adsStream.ToArray() ); <span style="color: #38761d;">// Начинайте копать.
</span></p>
<p>
Индекс <b>701</b> выдаст список всех сетевых интерфейсов доступных на
устройстве. IP-адреса, маски подсети и что-то еще. Формат неизвестен, но можно
разобраться самостоятельно. Копайте.
</p>
<p>
Из любопытного, для TC/BSD сервис возвращает название сетевого интерфейса в
юникс стиле — <span style="background-color: #fff2cc;">`em0`</span>.<br />А для Windows возвращает GUID: "<span style="background-color: #fff2cc;">{7D8FDCBA-6250-8DFF-4089-AB0845B12EDC} Qualcomm Atheros AR5BWB222 Wireless
Network Adapter 192.168.2.177 255.255.255.0</span>".
</p>
<p>
Индекс <b>702</b> отдает имя целевой машины: PC-8E5B1A, CX-3F5BC9... Строка
заканчивается <span style="background-color: #fff2cc;">'\0'</span>, не
забывайте про
<span style="background-color: #fff2cc;">.TrimEnd('\0');</span> Продолжайте
копать.
</p>
<p><br /></p>
Nikolai Voroninhttp://www.blogger.com/profile/06095643959617325612noreply@blogger.com0tag:blogger.com,1999:blog-3387439264291014573.post-73729020057549933982020-11-06T19:08:00.009+03:002020-11-06T19:08:01.190+03:00Агент данных OPC UA<p>Настроим агент данных на трансляцию данных из OPC UA сервера. Одновременно оставим без изменения <a href="https://gotwincat.blogspot.com/2020/11/mqtt-101-tc3-iot-data-agent-w-examples.html" target="_blank">трансляцию из ADS переменных</a>. Пусть ADS работает параллельно с OPC UA. Активируйте конфигурацию каждый раз, когда изменяете что-либо в схеме агента. Он перезапустится с новой схемой автоматически.</p>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiDHmnzptD6qC-VmmLNva9a6QsHlsqAKHBeuicbKpxVe0j9yK3U-zxWm5a1Gy_Dcrjj39bGdlFF0gYf6muD6x5a_Cr0S1ho2jprYyuJRR2wQJG7vSBPl8lbiW0sF7wHv01_Lk8r-JxranWQ/s900/opcua-extended-scheme.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="601" data-original-width="900" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiDHmnzptD6qC-VmmLNva9a6QsHlsqAKHBeuicbKpxVe0j9yK3U-zxWm5a1Gy_Dcrjj39bGdlFF0gYf6muD6x5a_Cr0S1ho2jprYyuJRR2wQJG7vSBPl8lbiW0sF7wHv01_Lk8r-JxranWQ/s16000/opcua-extended-scheme.png" /></a>
</div>
<p>
ПКМ по пустому месту → Add Gate (OpcUaDevice). В окне
<i>`Properties`</i> ввести в поле<i>`Url`</i> адрес своего OPC UA
сервера:
<span style="background-color: #fff2cc;">opc.tcp://192.168.1.100:4840</span>.
Добавьте канал подписчика: Add Channel (Subscriber), стрелка вниз 🡇.
</p>
<p>
Теперь открываем окно <i>`Target Browser`</i>, закладка <i>`OpcUa`</i>,
добавляем OPC UA сервер контроллера, выбираем необходимые объекты-переменные и
тащим их на "подписчика".
</p>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjuoVqxpmNVl1JsqMmZHF1SiW34TMn21jT7Sk0QstCbZdu8vfNxfgJpSRrbsMsULchL-OK3ZZ1pMOUiYaLcUn2-6mTA3t1wyrkilGOHy1zj2_rDU2CuCYReWXayALteUIq8zdUZcaPO3UyF/s838/opcua-target-browser.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="452" data-original-width="838" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjuoVqxpmNVl1JsqMmZHF1SiW34TMn21jT7Sk0QstCbZdu8vfNxfgJpSRrbsMsULchL-OK3ZZ1pMOUiYaLcUn2-6mTA3t1wyrkilGOHy1zj2_rDU2CuCYReWXayALteUIq8zdUZcaPO3UyF/s16000/opcua-target-browser.png" /></a>
</div>
<p>
Возможно понадобится донастроить переменные подписчика. В моем случае Агент
добавил мусор в имя переменной
<span style="background-color: #fff2cc;">ns=4;s=MAIN.nCounter</span>.
Исправляется в окне <i>`Properties`</i>, поле <i>`URN`</i> и превращается в
<span style="background-color: #fff2cc;">MAIN.nCounter</span>. Ниже в примере
исправлена только одна переменная-символ:
</p>
<pre>>>> {"Timestamp":"2020-11-06T11:48:08.151","GroupName":"_MQTT Broker_28","<span style="background-color: #fff2cc;">MAIN.nCounter</span>":-1946,"<span style="color: red;">ns=4;s=MAIN.rCounter</span>":784486.0}
>>> {"Timestamp":"2020-11-06T11:48:09.150","GroupName":"_MQTT Broker_28","MAIN.nCounter":-1846,"ns=4;s=MAIN.rCounter":784586.0}
>>> {"Timestamp":"2020-11-06T11:48:10.150","GroupName":"_MQTT Broker_28","MAIN.nCounter":-1746,"ns=4;s=MAIN.rCounter":784686.0}
</pre>
Nikolai Voroninhttp://www.blogger.com/profile/06095643959617325612noreply@blogger.com0tag:blogger.com,1999:blog-3387439264291014573.post-55730581451667849262020-11-03T18:15:00.005+03:002021-01-21T13:35:32.758+03:00Начало работы с агентом данных<p>
Агент позволяет передавать переменные программы и другие данные из одного
места в другое. Например, есть группа контроллеров CX8090. На отдельном ПК
устанавливается
<a href="https://download.beckhoff.com/download/document/automation/twincat3/TF6720_TC3_IoT_Data_Agent_EN.pdf" target="_blank">TC3 IoT Data Agent</a>. Он настраивается на проброс данных через интернет на сервер-брокер MQTT. Из
брокера данные забираются в базу данных. Позже аналитики анализируют, а
сервисный отдел мониторит и бдит. Версия TwinCAT, разрядность и тип процессора, древность контроллеров — все это не важно. Переменные из контроллера можно передавать куда угодно, в обе стороны.
</p>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj0eUkclbOITPYsnFBWbLYE8o3lKyWg1ziybbW_5dXGrOlEureTq2Aci7XyPr4hmF7DT2FH5cSXjz5grOu551sgi4tY94th4vdnGWb5B4NlRMLlp_80eMbQQ7105mumms08ZOin4iIcMBV_/s800/message-broker.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="569" data-original-width="800" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj0eUkclbOITPYsnFBWbLYE8o3lKyWg1ziybbW_5dXGrOlEureTq2Aci7XyPr4hmF7DT2FH5cSXjz5grOu551sgi4tY94th4vdnGWb5B4NlRMLlp_80eMbQQ7105mumms08ZOin4iIcMBV_/s16000/message-broker.png" /></a>
</div>
<p style="text-align: right;">
<span style="color: #999999; font-size: x-small;">Изображение: Beckhoff Automation</span>
</p>
<p>Современные протоколы типа MQTT–AMQTT–RabbitMQ не требуют входящего
подключения. Агент и контроллеры могут находится за NAT, файерволом или другой
сетевой инфраструктурой. IP-адрес может быть серым и динамическим, но
подключение к брокеру всегда исходящее. Поэтому переменные контроллера легко
отдавать и легко забирать. В обе стороны.</p>
<p><br /></p>
<h2 style="text-align: left;">Лицензии</h2>
<p>
Для ПК, на котором установливается Агент, необходимы минимум две лицензии:
<span style="background-color: #fff2cc;">TC1000 | TC3 ADS</span> и
<span style="background-color: #fff2cc;">TF6720 | TC3 IoT Data Agent</span>.
Доступна пробная лицензия на 7 дней.
</p>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgcEjrk_2Dqsmsqv0qT6hTBy9MapVpTccRPV1vkaX94Xrj1D8OC1f2UvtxibGtheCd5VB-fJjnp0i1pV_kdWWGaxnQYUcjAbtvDcS0zIvCSixpAdP_RKsCgPHjdsPSNnQ5_3kigFANEf4BI/s691/add_license_tf6720.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="244" data-original-width="691" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgcEjrk_2Dqsmsqv0qT6hTBy9MapVpTccRPV1vkaX94Xrj1D8OC1f2UvtxibGtheCd5VB-fJjnp0i1pV_kdWWGaxnQYUcjAbtvDcS0zIvCSixpAdP_RKsCgPHjdsPSNnQ5_3kigFANEf4BI/s16000/add_license_tf6720.png" /></a>
</div>
<p>
Лицензирование основано на группах порталов. Порталы объединяются в пакеты
(Gate packs). Порталом называют одно подключение. Например, подключение к
устройству через ADS или OPC UA. Лицензия TF6720 обеспечивает работу с
четырьмя порталами. Большее количество порталов можно получить после покупки
дополнительных лицензий (TF6721-TF6724). Количество порталов складываются:
TF6720 + TF6721 = 8 порталов.
</p>
<p><br /></p>
<h2 style="text-align: left;">Принципы работы</h2>
<p>
<b>Open local</b>, <b>Save local</b> работают со схемой в локальной конфигурации Агента
<span style="background-color: #fff2cc;">C:\TwinCAT\3.1\Boot\TcIotDataAgentConfig.xml</span>. Эта схема будет использована при старте Агента на этом локальном ПК. Во
время работы рядом будет лежать лог <b>TcIotDataAgent.log</b>. По нему
можно проводить диагностику работы Агента.
</p>
<p><b>Open file</b>, <b>Save file</b> импорт/экспорт схемы из отдельного файла.</p>
<p>
С помощью кнопки "активировать конфигурацию", можно активировать схему на
удаленном контроллере. На кнопке изображена традиционная горка кубиков (Save
to selected target and activate).
</p>
<p>
В окне <i>`Topology`</i> создаем схему передачи данных. Нужно запомнить
два простых принципа: создаем правой кнопкой мыши (ПКМ), а затем соединяем
элементы с помощью Ctrl + тащим и бросаем. Например:
</p>
<p></p>
<ul style="text-align: left;">
<li>
ПКМ по пустому месту → Add Gate (ADS) → получился круг — это ADS-портал,
ведущий к переменным контроллера.
</li>
<li>
Затем, ПКМ → Add Gate (MQTT) → появилось облако — это брокер MQTT,
источник данных.
</li>
<li>
ПКМ ADS портал → Add Channel (Subscriber) → создается
<i>подписчик (subscriber)</i> в виде прямоугольника. Стрелка вниз 🡇
указывает направление подключения.
</li>
<li>
ПКМ Подписчик → Add Symbol → добавляется новая переменная (symbol) для
чтения из контроллера. Можно сделать проще: открыть окно `<i>Target Browser`</i>, перетащить и бросить переменную на "подписчика".
</li>
</ul>
Схему можно создавать и редактировать через другие окна программы. Исследуйте
их. Выберите удобный способ работы с программой.
<p></p>
<p>
Аналогично поступаем с порталом <b>MQTT Broker</b>, где вместо `<i>Add Gate`</i> доступен `<i>Add Channel`</i>. Брокер работает не с переменными, а с
каналами. Через них идут потоки переменных.
</p>
<p>
Дальше тащим прямоугольник подписчика ADS: Ctrl + левая клавиша мыши (ЛКМ).
Бросаем его на прямоугольник канала MQTT. Между элементами появляются связи.
</p>
<p>Настройки всех элементов собраны в окне `<i>Properties`</i>.</p>
<p><br /></p>
<h2 style="text-align: left;">Пример программы</h2>
<p>Необходимо проработать четыре момента:</p>
<p></p>
<ul style="text-align: left;">
<li>
ПЛК программу как источник данных. Подойдет любая версия TwinCAT. Я брал как
вторую, так и третью версию TwinCAT. Меняется номер порта ADS 801 → 851, но
принципы создания схемы остается прежним.
</li>
<li>Создать схему передачи данных для Агента.</li>
<li>Выбрать MQTT брокер данных.</li>
<li>
Создать клиента для брокера MQTT. Я напишу простую программу на C#. Она
будет читать данные из брокера. Здесь можно воспользоваться готовыми
клиентами MQTT и запустить их на смартфоне.
</li>
</ul>
<p></p>
<p><br /></p>
<p>ПЛК программа примитивная:</p>
<div style="border-left: 1em solid rgb(250, 250, 250); margin-left: 2em; overflow: hidden; padding-left: 1em; width: auto;">
<pre style="line-height: 125%; margin: 0px;"><span style="color: #2b00fe;">PROGRAM</span> MAIN
<span style="color: #2b00fe;">VAR</span>
iCount: <span style="color: #2b00fe;">INT</span>;
rCount: <span style="color: #2b00fe;">REAL</span>;
<span style="color: #2b00fe;">END_VAR</span>
iCount := iCount + <span style="color: #bf9000;">1</span>;
rCount := rCount + <span style="color: #bf9000;">0.1</span>;
</pre>
</div>
<p><br /></p>
<h2 style="text-align: left;">Схема Агента</h2>
<p>
Пора выбрать бесплатного брокера на тестирование. Мне понравился
<b>HiveMQ</b>. Кроме него проверил <b>Mosquitto</b>. Он работал, но
значительно медленнее.
</p>
<p>Пришло время создать схему:</p>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhYn661hMJFK9pfN9nSYKJQv8N__YhMEbODBbp56N3louk08oqLI88tvDBFN-7GgUpgZfGNaE7vfzsdODOJMM22Vutf2mbVV_aqvX9p-5bjtHvHFApEuBs8lzVtk51sa6v45gBk6pCR7hv8/s824/iot-data-agent-scheme.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="529" data-original-width="824" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhYn661hMJFK9pfN9nSYKJQv8N__YhMEbODBbp56N3louk08oqLI88tvDBFN-7GgUpgZfGNaE7vfzsdODOJMM22Vutf2mbVV_aqvX9p-5bjtHvHFApEuBs8lzVtk51sa6v45gBk6pCR7hv8/s16000/iot-data-agent-scheme.png" /></a>
</div>
<br />
<p>
Разбивка по каналам позволяет устанавливать единые сетевые настройки для
нескольких переменных сразу. Можно создать один единственный канал и
транслировать в нем сразу несколько переменных. Чтобы было интереснее, я
разбил трансляцию от брокера на два канала (см. картинку выше, правая часть):
</p>
<p></p>
<ul style="text-align: left;">
<li>
<b>Ads_Mqtt_11_19</b> — транслирует переменную
<span style="background-color: #fff2cc;">MAIN.rCount</span>;
</li>
<li>
<b>Ads_Mqtt_11_17</b> — передает целое число из переменной
<span style="background-color: #fff2cc;">MAIN.iCount</span>.
</li>
</ul>
<p></p>
<p>
Внутри канала данные брокера можно раскидать по темам (Topic). Это
настраивается в окне <i>`Properties`</i>. Например, пусть <i>`rCount`</i> как
бы передается из жилой комнаты
<span style="background-color: #fff2cc;">GOT/TWINCAT/ROOM</span>, а переменная
<i>`iCount`</i> приходит из офиса
<span style="background-color: #fff2cc;">GOT/TWINCAT/OFFICE</span>. В клиенте
брокера я смогу выбрать или одну конкретную, интересующую меня тему, или сразу
несколько тем. Темы фильтруются с помощью спец. символов `*`, `?` или `#`.
Например, я хочу в одном канале получать данные ROOM+OFFICE: <span style="background-color: #fff2cc;">GOT/TWINCAT/#</span>.
</p>
<p><br /></p>
<h2 style="text-align: left;">Клиент брокера</h2>
<p>
Для C# я использовал библиотеку
<a href="https://github.com/chkr1011/MQTTnet" target="_blank">MQTTnet</a>. Она
легко устанавливается из
<a href="https://www.nuget.org/packages/MQTTnet/" target="_blank">NuGet</a>.
Раскомментируйте строку и подставьте название своего топика-комнаты в
константу <i>`MQTT_TOPIC`</i>.
</p>
<script src="https://gist.github.com/nikvoronin/dc7cc266bf0c7f77351b484cb530d836.js"></script>
<p> </p>
<p>Результат работы клиента:</p>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi2Eybr_xY0kCPg39i5o0CwMQxBAJEG-N_XvSu2gC8WqRRSH5GIi28Ibtw9SpgSg8uoMkECbIm_zBGwmjBAtTG8psEEoVtyB3hyphenhyphenkhAjUbK2V8OI27uc_nRaLehSoEL-GmJMUaFJg8BOpAGW/s800/csharp_client_console_output.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="177" data-original-width="800" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi2Eybr_xY0kCPg39i5o0CwMQxBAJEG-N_XvSu2gC8WqRRSH5GIi28Ibtw9SpgSg8uoMkECbIm_zBGwmjBAtTG8psEEoVtyB3hyphenhyphenkhAjUbK2V8OI27uc_nRaLehSoEL-GmJMUaFJg8BOpAGW/s16000/csharp_client_console_output.png" /></a>
</div>
<br />
<p>
Одновременно я установил на телефон бесплатный клиент <i>`MQTT Dash`</i> и он
также смог отображать данные с ПЛК. Трансляция идет через интернет, можно
сходить на обед и одним глазом посматривать как контроллер продолжает
работать:
</p>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhlupxYUksgovbyKiwIQvKER-kpKAuoru1SaFyZj7mleyTWIirl_Hx9BT8rPY11V11U58-72tg_76n8iyv-5hZR7mMYQo5SN3whdti-8sM34KsrjEkFmHuCIMnb84Qd_bd36zg1QWrmOB2w/s800/Screenshot_20201102-144019_MQTT_Dash.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="593" data-original-width="800" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhlupxYUksgovbyKiwIQvKER-kpKAuoru1SaFyZj7mleyTWIirl_Hx9BT8rPY11V11U58-72tg_76n8iyv-5hZR7mMYQo5SN3whdti-8sM34KsrjEkFmHuCIMnb84Qd_bd36zg1QWrmOB2w/s16000/Screenshot_20201102-144019_MQTT_Dash.png" /></a>
</div>
Nikolai Voroninhttp://www.blogger.com/profile/06095643959617325612noreply@blogger.com0tag:blogger.com,1999:blog-3387439264291014573.post-1092623889275328822020-10-31T14:21:00.078+03:002021-01-21T13:36:07.903+03:00Функции измерения нагрузки ПЛК<div class="separator" style="clear: both; float: right;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjueP7TJpNI64l5fWQ4DRh1si3rqq_D3q5lXSjPyxNkwQIa-gKlTwsLJX6F4qaBqMMXm2uiGGLI4hUkYEULUFkqgDcA6Shme1NVeWVF0kKor1VPq_NiSl3S_IkdpAOb9_gufrpdUiO4Zflv/s165/7948929803__Web.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="162" data-original-width="165" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjueP7TJpNI64l5fWQ4DRh1si3rqq_D3q5lXSjPyxNkwQIa-gKlTwsLJX6F4qaBqMMXm2uiGGLI4hUkYEULUFkqgDcA6Shme1NVeWVF0kKor1VPq_NiSl3S_IkdpAOb9_gufrpdUiO4Zflv/s16000/7948929803__Web.png" title="Изображение: Beckhoff Automation" /></a></div>
<p>Измерение загрузки контроллера можно условно разделить на:</p>
<ul style="text-align: left;">
<li>
измерение нагрузки процессора. Показывает справляется ли вся система в
целом: Windows + TwinCAT.
</li>
<li>
Измерение времени исполнения программы в текущем цикле. Укладывается ли текущая ветвь программы в заданное
время цикла.
</li>
<li>Профилирование. Замер времени выполнения отдельных частей программы.</li>
</ul>
<p></p>
<p>
И возвращаясь к теме <a href="https://gotwincat.blogspot.com/2020/08/cx8090-switch-on-cpu-overload-measurement-windows-registry.html" target="_blank">предыдущего поста</a>: "измерять производительность — это
хороший способ узнать, осталось ли что-нибудь за кадром. Иногда это
просто любопытство".
</p>
<p><br /></p>
<h2 style="text-align: left;">
Разбор программы
</h2>
<br />
<script src="https://gist.github.com/nikvoronin/c95e6e98fa14cbd9e1700a68ee5e762a.js"></script>
<br />
<p>
В программе выше используются функции:
<a href="https://infosys.beckhoff.com/content/1033/tcplclib_tc2_utilities/35067019.html" target="_blank">TC_SysLatency</a>,
<a href="https://infosys.beckhoff.com/content/1033/tcplclib_tc2_utilities/35062411.html" target="_blank">TC_CpuUsage</a>,
<a href="https://infosys.beckhoff.com/content/1033/tcplclibsystem/html/tcplclibsys_getcpucounter.htm" target="_blank">GETCPUCOUNTER</a>. Также используется информация из встроенного глобального массива
<a href="https://infosys.beckhoff.com/content/1033/tcplccontrol/html/tcplcctrl_variables_systemflags_systemtaskinfoarray.htm" target="_blank">SystemTaskInfoArr[]</a>. Он предоставляет структуру данных
<a href="https://infosys.beckhoff.com/content/1033/tcplclibsystem/html/tcplclibsys_systemtaskinfotype.htm" target="_blank">SYSTEMTASKINFOTYPE</a>.
</p>
<p>
<b>TC_SysLatency</b> пропустим, я по прежнему не вижу в нем смысла.
<b>TC_CpuUsage</b> возвращает целое число процентов нагрузки на процессор. Это значение должно совпадать с графиком в <i>System Manager</i>, но это не точно
и это было видно выше.
</p>
<p>
<b>GETCPUCOUNTER</b> работает независимо от счетчика в CPU. Это счетчик 100
наносекундных циклов. Увеличение на единицу соответствует прошедшему времени в
100 нс. Увеличение на 10 соответствует 1 микросекунде. Посмотрим как перевести в миллисекунды с десятичными долями:
</p>
<p>
52'108'000 <u>нано</u>секунд = 52'108'0 <span style="font-size: xx-small;">100*</span>нс =
52'108 <u>микро</u>секунд = 52,108 <u>милли</u>секунд.</p>
<p>LREAL cpuCntMs := (cpuCntLoDW + cpuCntHiDW) / 10000.0</p>
<p>
Счетчик можно использовать для профилирования времени выполнения отдельных
блоков программы внутри цикла. Можно узнать сколько времени занимает выполнение
подпрограммы или функционального блока.
</p>
<p>
<b>SystemTaskInfoArr[]</b> в том же цикле отдает структуру
<b>SYSTEMTASKINFOTYPE</b>. Индексом для массива служит номер текущей задачи. Индекс можно получить с помощью функции
<a href="https://infosys.beckhoff.com/content/1033/tcplclib_tc2_system/36028797049921931.html" target="_blank">GETCURTASKINDEX</a>
в этом же цикле и начать его использовать уже в следующей строке программы.
</p>
<p>
Структура <i>SYSTEMTASKINFOTYPE</i> содержит состояние предыдущего цикла. Эта структура содержит:
</p>
<p></p>
<ul style="text-align: left;">
<li>
<b>cycleTimeExceeded</b> — TRUE = время цикла превышено, FALSE = время выполнения в норме. Значение параметра не фиксируется, в каждом цикле оно может быть разным. Всё зависит от времени исполнения предыдущего цикла.
</li>
<li>
<b>cycleTime</b> — максимально возможное
время на выполнение цикла. Задается в сотнях наносекунд. Для перевода в миллисекунды, разделите значение <i>cycleTime</i> на
10000.0.</li>
<li>
<b>lastExecTime</b> — время выполнения программы в предыдущем цикле. Предыдущего, потому
что текущий цикл еще только выполняется, вот прямо сейчас, в данный момент. Значение в сотнях
наносекунд.
</li>
<li>
<b>cycleCount</b> — номер текущего цикла от момента включения контроллера.
Если номер цикла умножить на длительность цикла <i>cycleTime</i>, можно узнать
сколько прошло времени с момента включения контроллера.
</li>
</ul>
<p> </p>
<p>
В TwinCAT 3 массив поменял имя на <b>_TaskInfo[]</b>, а структура стала
более подробной и теперь называется <a href="https://infosys.beckhoff.com/content/1033/globaldatatypes/18014399224303243.html" target="_blank">PlcTaskSystemInfo</a>.</p>
Nikolai Voroninhttp://www.blogger.com/profile/06095643959617325612noreply@blogger.com0tag:blogger.com,1999:blog-3387439264291014573.post-34922944547775463922020-10-30T18:54:00.010+03:002021-01-21T13:36:24.113+03:00Нагрузка процессора CX8090Измерять производительность — это хороший способ знать, что осталось за кадром.
Правда иногда это просто любопытство. В случае с бюджетным CX8090, все немного тяжелее, и не только по причине слабого процессора частотой в 400
МГц. Кстати, на подходе
CX7000, и там будет целых 480 МГц, новый ARM Cortex™-M7 против старого ARM9.
<div><br /></div>
<div>
<div>
При первом подключении к CX8090, мы видим постоянную загрузку процессора в
10%. Так сделано специально — измерение нагрузки добавляет нагрузку на
процессор. Внезапно, эта тема обозрена в статье справочной системы <a href="https://infosys.beckhoff.com/content/1033/cx8090_hw/1610443147.html" target="_blank">CPU load</a>. Не стоит пренебрегать таким полезным ресурсом, и вообще полезно
гуглить, ведь так удобнее искать.
</div>
<div>
<div><br /></div>
<div>
В рабочем режиме измерение лучше отключить, лишняя нагрузка не нужна. И наоборот —
на этапе отладки полезно включить. Для этого необходимо запустить редактор
реестра:
<span style="background-color: #fff2cc;">Start → Run... → regedit</span>.
И внести изменения в один ключ:
<span style="background-color: #fff2cc;">HKLM/SOFTWARE/BECKHOFF/TWINCAT/RTime/<u>EnableRTimeMeasurement</u></span>. 0 = отключено, 1 = включено. Замеры производятся раз в 10 миллисекунд. Точность замеров нагрузки не гарантируется, если циклы задач длиннее 10 мс.
</div>
<div><br /></div>
<div>
И здесь пост должен был закончиться… посмотрим, как будет вести себя
нагрузка, если время цикла увеличить с 10 мс до 50 мс. Просто увеличим время цикла в пять раз.</div>
<div><br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-A6irFVf_ngjGZeqEA2Yi0hZdRB34z-e-F3RPM5Mxcs-PGuiDLx6KAZ3B8yh-lDW6kAMJ-ujwcQYt5xQBVPkV3NIZ8JWe_4M0Ri_Vl5vIAAn-9m0dRi4mzJrhRpR3m2Xhch6UGyK2T-4G/s458/normal-50ms-rtu.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="333" data-original-width="458" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-A6irFVf_ngjGZeqEA2Yi0hZdRB34z-e-F3RPM5Mxcs-PGuiDLx6KAZ3B8yh-lDW6kAMJ-ujwcQYt5xQBVPkV3NIZ8JWe_4M0Ri_Vl5vIAAn-9m0dRi4mzJrhRpR3m2Xhch6UGyK2T-4G/d/normal-50ms-rtu.png" /></a>
</div>
<div><br /></div>
<div>
При реальной нагрузке приблизительно в 30-33% график плющит и колбасит от
нуля до реального значения. Кстати, чтобы работал нижний график
<i>System Latency</i>, его нужно включить в реестре. Рядом с
параметром <i>EnableRTimeMeasurement</i> лежит параметр <i>EnableLatencyMeasurement</i>; 1 = работает, 0 = отключено.
</div>
</div>
</div>
<p>
И здесь пост должен был закончиться… но я набросал небольшую программу,
дублирующую показометры системной нагрузки. Внезапно программные функции дали
стабильный результат. Показания из программы я снимал через <i>Scope</i> первой
версии. Просто чтобы потренироваться в работе на старых системах.
</p>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjx6Njm3m3Xx1isBfoCik0vT1nARWqcVNFH0hSRdzqmrEiTC6KNnzW7nVt0bVZ3hmHu-QuspaY3iOeKZeFnkCklMUGhG9McbheQZguJIMSGq12S-V5CcSzY5qLjQg_v8jmZMVQO8sLeziy0/s800/normal-50ms-scope.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="290" data-original-width="800" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjx6Njm3m3Xx1isBfoCik0vT1nARWqcVNFH0hSRdzqmrEiTC6KNnzW7nVt0bVZ3hmHu-QuspaY3iOeKZeFnkCklMUGhG9McbheQZguJIMSGq12S-V5CcSzY5qLjQg_v8jmZMVQO8sLeziy0/s16000/normal-50ms-scope.png" /></a>
</div>
<p>В результате получил ровный, красный график нагрузки на процессор. <i>Latency</i> выведен зря,
никакой пользы я от него не нашел.
</p>
<p><br /></p>
<h2 style="text-align: left;">Превышаем лимит нагрузки</h2>
<p>Превысим нагрузку процессора и начнем с графика, показывающего времени цикла:</p>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiZMYuFgyuut5m7ye8D6kPMsAjS2kzvLI55Y-PYQTl-HkDHcdfiBr16Hh-DxmNQaowJlh8XyYsVq0sYDXb-cLZJHjttiY8w-dDpk8u-4H2t8M_NyNQRq7cDhMDR2tLppEu90no4m2Iex8EZ/s458/50ms-exceed-cpu-time.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="344" data-original-width="458" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiZMYuFgyuut5m7ye8D6kPMsAjS2kzvLI55Y-PYQTl-HkDHcdfiBr16Hh-DxmNQaowJlh8XyYsVq0sYDXb-cLZJHjttiY8w-dDpk8u-4H2t8M_NyNQRq7cDhMDR2tLppEu90no4m2Iex8EZ/s16000/50ms-exceed-cpu-time.png" /></a>
</div>
<p>
Время цикла по прежнему 50 мс. На графике уставлен потолок в 60 мс, чтобы
график было видно. Потолок устанавливается правой кнопкой мыши, <i>Settings…</i></p>
<p>
Значение <i>Total</i> показывает 52,108 мс, что на 2 мс больше лимита времени
цикла. Здесь же начинает увеличиваться счетчик превышения лимита
<i>Exceed counter</i>. Все очень плохо. Посмотрим на график нагрузки
процессора. Сначала системный, затем программный:
</p>
<div class="separator">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhG5LWoiaGO9q7WhTdjh7qihbpbkgp4AxkHQ7YGZj149s2-EkwsXYiSxHDuVcg2PcNU1V7qhufFJfHNIkYYzRONZSDHYvO5XTgth0c2n3DqtfH1mLCKY7OJjhnJU0UU-j1OADykhrSH-uJp/s459/50ms-exceed-rtu.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="335" data-original-width="459" height="146" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhG5LWoiaGO9q7WhTdjh7qihbpbkgp4AxkHQ7YGZj149s2-EkwsXYiSxHDuVcg2PcNU1V7qhufFJfHNIkYYzRONZSDHYvO5XTgth0c2n3DqtfH1mLCKY7OJjhnJU0UU-j1OADykhrSH-uJp/w200-h146/50ms-exceed-rtu.png" width="200" /></a>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjMZ9bKmAETkLp-XvQwnjel9MrGY5BJn3QguOsqqhxSHRPCu0kBcEULWn0BOZIUkBai5GygpGIx-0DPZx_vL2sxg5Kb251Oq9tI-jMeXsUKjcF4oYQNHa2HgXuYmT9BlTYTtymwD09ZXX7G/s800/50ms-exceed-scope.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="285" data-original-width="800" height="114" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjMZ9bKmAETkLp-XvQwnjel9MrGY5BJn3QguOsqqhxSHRPCu0kBcEULWn0BOZIUkBai5GygpGIx-0DPZx_vL2sxg5Kb251Oq9tI-jMeXsUKjcF4oYQNHa2HgXuYmT9BlTYTtymwD09ZXX7G/w320-h114/50ms-exceed-scope.png" width="320" /></a>
</div>
<p><br /></p>
<h2 style="text-align: left;">Когда значения не совпадают</h2>
<p>
Результат на графиках выше вполне ожидаемый, но(!) так бывает не всегда. На
следующих трех графиках время цикла находится в допустимых пределах, а
нагрузка процессора якобы превышена. Что происходит на самом деле понять трудно.</p>
<div class="separator">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCSAIUmdYedeBiHIgKxtSjLKJwaHs4Ij2aj8qFa5si8Uzj8N9vLQBJPCyeXlLausImILpKVtcztVhgQA13SmYzsESr_W0H9KJ6VJgCmWyXFUB_j_YdzcudjsTkSjyHgKihIDg9dSpyEFX1/s457/50ms-real-70perc-cpu-time.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="347" data-original-width="457" height="152" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCSAIUmdYedeBiHIgKxtSjLKJwaHs4Ij2aj8qFa5si8Uzj8N9vLQBJPCyeXlLausImILpKVtcztVhgQA13SmYzsESr_W0H9KJ6VJgCmWyXFUB_j_YdzcudjsTkSjyHgKihIDg9dSpyEFX1/w200-h152/50ms-real-70perc-cpu-time.png" width="200" /></a>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiZQ_vo63jSyfFkuyQheiW3jcuVt-Hfq3iss7ifQpTrY5weKXxpLruCT6Sb4k4EM4xqkpRhyphenhyphenLgZhhpD_unOQnxvOW7Qd0L6IIrwUWo1HyZ14EcZS7Y7qeoEPGgwSyY73TjwJekXtvK0TRno/s457/50ms-real-70perc-rtu.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="335" data-original-width="457" height="147" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiZQ_vo63jSyfFkuyQheiW3jcuVt-Hfq3iss7ifQpTrY5weKXxpLruCT6Sb4k4EM4xqkpRhyphenhyphenLgZhhpD_unOQnxvOW7Qd0L6IIrwUWo1HyZ14EcZS7Y7qeoEPGgwSyY73TjwJekXtvK0TRno/w200-h147/50ms-real-70perc-rtu.png" width="200" /></a>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiGjF7ewp8eyNfqAVe0Mc4ha2vYHu02pO3bJQX8gEqS1bgB_Cv2iWcs4Y7sRY5Y2LWl-mvefvqvDhmqd4ZDGbmfrJxNvBBdlGKvcdGzQBgjWRTMxu0ei7rAVmkI4NRgiqfRqTXe1EV3de1y/s800/50ms-real-70perc-scope.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="284" data-original-width="800" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiGjF7ewp8eyNfqAVe0Mc4ha2vYHu02pO3bJQX8gEqS1bgB_Cv2iWcs4Y7sRY5Y2LWl-mvefvqvDhmqd4ZDGbmfrJxNvBBdlGKvcdGzQBgjWRTMxu0ei7rAVmkI4NRgiqfRqTXe1EV3de1y/s320/50ms-real-70perc-scope.png" width="320" /></a>
</div>
<br />
<h2 style="text-align: left;">Выводы</h2>
<p>Стоит обратить внимание на примечания в справочной системе. Графики времени цикла и нагрузки на процессор нужно анализировать по
отдельности. Показания нагрузки на процессор строится как-то хитро, даже при времени цикла ≤10мс. Например, при
трехкратном превышении времени цикла можно получить нагрузку на процессор в
56%. Это некорректное показания. Значит для тонкой настройки ПЛК желательно
использовать программный способ. Все это относится конкретно к CX8090 и
TwinCAT 2.
</p><p>Разбор программы для измерения и краткое описание функций будет отдельным постом чуть позже.</p>
Nikolai Voroninhttp://www.blogger.com/profile/06095643959617325612noreply@blogger.com0tag:blogger.com,1999:blog-3387439264291014573.post-92067650345057278402020-10-29T19:30:00.097+03:002021-01-21T13:36:37.426+03:00Блоки питания Бекхофф<p>
В прайсе Бекхоффа появились блоки питания. Официальное описание находится в
разделе ввода-вывода:<br />beckhoff.com → Products → I/O → Power supplies.</p>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjGbtizEig_O9Y7S1GmWmL_JACRRpnwo6g9TP03uSQyIohN9gwYpG_8LW3ZCINnZtQeOpBzyaQIlHlcEImifC63W15Bs5Q8yeteev_axMwqT4tIgnY2C8WmRsOnPXCPapGPwiB1UNF5nFVd/s1134/PS3031-2440-0000_korrektur.png" style="margin-left: 1em; margin-right: 1em;"><img alt="PS3031-2440-0000 (Изображение: Beckhoff Automation)" border="0" data-original-height="1134" data-original-width="1096" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjGbtizEig_O9Y7S1GmWmL_JACRRpnwo6g9TP03uSQyIohN9gwYpG_8LW3ZCINnZtQeOpBzyaQIlHlcEImifC63W15Bs5Q8yeteev_axMwqT4tIgnY2C8WmRsOnPXCPapGPwiB1UNF5nFVd/w387-h400/PS3031-2440-0000_korrektur.png" width="387" /></a>
</div>
<p style="text-align: right;">
<span style="color: #999999; font-size: x-small;">Изображение: Beckhoff Automation</span>
</p>
<p>
Часть моделей пересекается, но различаются в габаритах, сертификатах, диагностике,
контроле, количестве входных фаз. Толстая иллюстрация выше, содержит все кнопки, индикаторы и разъемы. Есть блоки питания потоньше. Деление по модельным рядам для маркетинга:
</p>
<p></p>
<ul style="text-align: left;">
<li><b>PS1000</b> — небольшие решения (2,5–20 ампер).</li>
<li><b>PS2000</b> — стандартные решения (5–20 ампер).</li>
<li><b>PS3000</b> — повышенная нагрузка (10–40 ампер).</li>
</ul>
<p></p>
<p>
Для инженеров как обычно смотрим количество фаз в питающей сети, ток/мощность
и необходимость в диагностических входах-выходах. Подробности смотрите в инструкциях, далее краткий обзор.</p>
<p><br /></p>
<h2 style="text-align: left;">1 фазное напряжение</h2>
<p>
Номинальное входное напряжение — переменное 100..240 вольт. Допускается
диапазон 85..264 В. Предельный диапазон от 80 до 300 вольт может
использоваться только при плохих входных линиях питания и при прочих
просадках-выбросах. Максимально допустимое входное напряжение может достигать
300 вольт, но не дольше 500 миллисекунд.
</p>
<p>
На старте рабочего режима предусмотрен гистерезис: блок питания включается при
80 вольтах на входе и отключается при 70 В.
</p>
<p><br /></p><h2 style="text-align: left;">3 фазное напряжение</h2><p>Номинальное входное напряжение — 3 фазное, переменное 380..480 вольт. Допускается диапазон 323..576 В. На старте рабочего режима предусмотрен гистерезис: блок питания включается при 305 вольтах на входе и отключается при 275 В. При включении происходит задержка номинального напряжения на выходе в 500 / 600 мс. Зависит от входного напряжение 400 / 480 В.</p><p><br /></p>
<h2 style="text-align: left;">Выход `DC-OK`</h2>
<p>
Релейный контакт `DC-OK` работает также как индикатор `DC-OK LED`. Контакт
отражает состояние питания на выходе блока питания.
</p>
<p></p>
<ul style="text-align: left;">
<li>
Контакт замыкается, когда выходное напряжение достигает 90% уставки.
</li>
<li>
Контакт размыкается, когда выходное напряжение проседает ниже 90% уставки.
</li>
<li>
Игнорируются просадки напряжения короче 1 миллисекунды. Контакт остается
замкнутым.
</li>
<li>Просадки длиннее 1 миллисекунды размыкают контакт на 250 миллисекунд.</li>
</ul>
<p></p>
<p><br /></p>
<h2 style="text-align: left;">Вход выключения (Shut-down Input)</h2>
<p>
Позволяет отключать питание на выходе блока питания. Отключение происходит
мгновенно, а включение задерживается на 350 миллисекунд (возможно, но не
точно, необходимо удержать вход активным дольше 350мс).
</p>
<p>Вход способен работать в трех режимах:</p>
<p></p>
<ul style="text-align: left;">
<li>
Перемычка. Замыкает контакты, когда необходимо отключить питание. В рабочем режиме
перемычка отсутствует, то есть разомкнута. Сюда подойдет кнопка или реле.</li>
<li>Открытый коллектор. Управление током.</li>
<li>
Внешнее питание. Рабочий режим, когда на контактах отключения больше 4 вольт. Выход БП
отключается, когда напряжение на контактах падает ниже 1 вольта.
</li>
</ul>
<p></p>
<p><br /></p>
<h2 style="text-align: left;">Объединение нескольких БП</h2>
<p>
Обязательно использовать полностью идентичные модели блоков питания.
</p>
<p>Объединение блоков питания ухудшает параметры выходного тока: ток утечки, эл-магнитные наводки, пусковой ток,
гармоники, и тому подобное.
</p>
<blockquote>Общая рекомендация: не объединять несколько БП.</blockquote>
<p><br /></p>
<h3 style="text-align: left;">Последовательное подключение</h3>
<p>
Повышаем выходное напряжение. Можно соединять несколько БП вплоть до 150В.
Начиная с 60 В требуется повышенная осторожность и соблюдение мер
безопасности. Не допускать обратного напряжения в генераторных режимах (<nobr>ЭДС
самоиндукции,</nobr> <nobr>return voltage immunity,</nobr> <nobr>Back-E.M.F.).</nobr>
</p>
<p><br /></p>
<h3 style="text-align: left;">Параллельное подключение</h3>
<p>Получаем большую мощность, то есть больший максимальный ток. Можно резервировать блоки питания, разделяя между ними нагрузку. Схемы резервирования 1+1 или N+1. Оба варианта требует включения
диодных сборок или других буферных устройств.</p><p>Рекомендуется оставить заводские
настройки для всех БП или согласовать выходное напряжение с точностью ±100
милливольт. Читайте инструкцию!</p>
<p>По умолчанию в блоке питания установлен одиночный режим (Single Use). БП работает в одиночном
режиме, если джампер или переключатель `Parallel Use` отсутствуют.</p>
<p>
В параллельном режиме (Parallel Mode) блок питания допускает разброс выходного
напряжения до 2,5 вольт. В одиночном режиме разброс меньше, он равен 100
милливольтам. Характеристика жестче в одиночном режиме и мягче в параллельном
режиме. На холостом ходу в параллельном режиме выходное напряжение на 4%
больше напряжения при номинальной нагрузке. Так сделано для лучшей
балансировки блоков питания между собой.
</p>
Nikolai Voroninhttp://www.blogger.com/profile/06095643959617325612noreply@blogger.com0tag:blogger.com,1999:blog-3387439264291014573.post-16846779490911002962020-08-20T19:37:00.050+03:002021-01-21T13:37:19.626+03:00Сокеты не реального времени<p>
Из ПЛК задачи можно сделать TCP/UDP клиент или даже сервер. Это позволяет
работать с данными современной периферии без разработки промежуточных
слоев. У нас есть выбор между
<a href="http://download.beckhoff.com/download/document/automation/twincat3/TF6310_TC3_TCP_IP_EN.pdf" target="_blank">TF6310</a>
(обычная и давно практикуемая) и
<a href="http://download.beckhoff.com/download/document/automation/twincat3/TF6311_TC3_TCP_UDP_Realtime_EN.pdf" target="_blank">TF6311</a>
(модная, современная, риалтаймовая). Обе-две работают как на PC/CX (x86), так и
на CX (ARM). В этом посте будет практика работы с обычной библиотекой 6310, а с новой
разберемся как-нибудь позже.
</p>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjZ8UgEcvtyp6w3SiSNErLjXW2FUD9CFc8-JdwvreUXYbDxAO8Yy24YgsQ-D0WBm3G-HlBSaJmjffGT2sR4a_64_1mGfzMk1mIDIbYxXeDha2IEuQHMsuUGMW-BDSvTNzTU-xS1PciGbvm1/s504/zk1090-3891-0xxx.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="259" data-original-width="504" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjZ8UgEcvtyp6w3SiSNErLjXW2FUD9CFc8-JdwvreUXYbDxAO8Yy24YgsQ-D0WBm3G-HlBSaJmjffGT2sR4a_64_1mGfzMk1mIDIbYxXeDha2IEuQHMsuUGMW-BDSvTNzTU-xS1PciGbvm1/d/zk1090-3891-0xxx.jpg" /></a>
</div>
<p style="text-align: right;">
<span style="color: #999999; font-size: x-small;">Изображение: Beckhoff Automation</span>
</p>
<h2 style="text-align: left;">TF6311 TCP/UDP (realtime)</h2>
<p>
<a href="http://download.beckhoff.com/download/document/automation/twincat3/TF6311_TC3_TCP_UDP_Realtime_EN.pdf" target="_blank">Полное описание</a>
доступно в инфосисе. Обе библиотеки доступны из ПЛК задачи, но 6311 работает
"рядом" с ядром TwinCAT 3, на том же системном уровне.</p>
<p>Здесь заострю внимание на особенностях, плюсах и минусах.</p>
<p></p>
<ul style="text-align: left;">
<li>Только TwinCAT 3.</li>
<li>
Функционал не требует установки, все компоненты уже встроены в TwinCAT 3.
</li>
<li>Требуется лицензия TC3 TCP/UDP RT.</li>
<li>
Есть возможность использовать временную (trial) лицензию на время
разработки.
</li>
<li>
Работает напрямую с сетевой картой, минуя большинство механизмов
операционной системы.
</li>
<li>
TF6311 настраивается в проекте через
<a href="https://infosys.beckhoff.com/content/1033/tf6311_tc3_tcpudp/9007200331664523.html" target="_blank">TCP/UDP RT TcCom Parameter</a>. Это требует отдельного рассмотрения.
</li>
</ul>
<div><br /></div>
<h3 style="text-align: left;">Минусы</h3>
<div>
<ul style="text-align: left;">
<li>
Не рассчитан на большие и незнакомые сети. Вероятно подразумевается интернет, либо
большой интранет.
</li>
<li>Не для больших объемов данных.</li>
<li>Не поддерживает мультикаст в UDP.</li>
<li><i>Windows Compact CE</i> только начиная с версии 7.</li>
<li><i>
Windows Firewall</i> отсутствует в цепочке передачи пакетов (менее защищенные
соединения).
</li>
<li>
Только TwinCAT-совместимые карты. Список доступен в
<a href="https://infosys.beckhoff.com/content/1033/tcsystemmanager/reference/ethercat/html/ethercat_supnetworkcontroller.htm" target="_blank">Supported Network Controller by Beckhoff Ethernet Driver</a>.
</li>
<li>
Нет связи с локальным, стандартным сетевым интерфейсом Windows. Можно
реализовать через стороннего посредника.
</li>
<li>
Сетевые коммутаторы (эзернет свичи) EL6601 и
EL6614 не могут использоваться совместно с этой
библиотекой.
</li>
</ul>
<div><br /></div>
<h3 style="text-align: left;">Плюсы</h3>
</div>
<div>
<div>
<ul style="text-align: left;">
<li>Очень детерминированный и предсказуем (подтвердить не могу).</li>
<li>Поддержка С++ (похоже, что это основное назначение библиотеки).</li>
<li>Поддерживает ARP/Ping.</li>
</ul>
<div><br /></div>
</div>
</div>
<div><br /></div>
<h2 style="text-align: left;">TF6310 TCP/IP</h2>
<div><br /></div>
<div>
Работает через специальный ADS-сервер, а дальше через стандартный WinSock, по
сути копируя стандартный функционал сетевого ввода-вывода. Как и что
устанавливать вменяемо описано в справке, и проблем это обычно не вызывает.</div>
<div><br /></div>
<div>
Для TwinCAT 2 мы устанавливаем
<a href="https://infosys.beckhoff.com/content/1033/tcpipserver/html/tcpipserver_introduction.htm" target="_blank">TS6310</a>. Он приносит с собой следующие библиотеки в каталог
<span style="background-color: #fff2cc;">TwinCAT\Plc\Lib</span>:
</div>
<div>
<div>
<ul style="text-align: left;">
<li>
<a href="https://infosys.beckhoff.com/content/1033/tcpipserver/html/tcplclibtcpip_overview.htm" target="_blank">TcpIp.lib</a>
— базовые функции TCP/IP и UDP;
</li>
<li>
<a href="https://infosys.beckhoff.com/content/1033/tcpipserver/html/tcplclibsockethelper_overview.htm" target="_blank">TcSocketHelper.lib</a>
— вспомогательные функции TCP/IP, упрощающие жизнь разработчика.
Содержит готовые ФБ с полным циклом клиент-сервер и сервер-клиент.
</li>
<li>
<a href="https://infosys.beckhoff.com/content/1033/tcpipserver/html/tcplclibsnmp_overview.htm" target="_blank">TcSnmp.lib</a>
— протокол SNMPv1, вспомогательные функции.
</li>
<li><b>TwinCAT TCP/IP Connection Server</b> — по сути это мост ADS ↔ TCP/IP.</li>
</ul>
<div><br /></div>
</div>
</div>
<div><br /></div>
<h2 style="text-align: left;">Практика 6310</h2>
<div>
<div>
<b><br /></b>
</div>
<div>
<b>TCP-клиент</b> рассчитан на передачу больших объемов данных в виде
непрерывных потоков. Данные текут непрерывно, но ничто не мешает разбить их
на пакеты. Перед началом работы устанавливается соединения, которое по
окончании работы разрывается. Длительность передачи данных после соединения
не оговаривается: минуты, часы, дни, года. Так было задумано и это обычная практика работы с TCP/IP протоколом.</div>
<div><br /></div>
<div>Минимальная реализация TCP-клиента:</div>
<div>
<ul style="text-align: left;">
<li>
<i> FB_SocketConnect</i> и <i>FB_SocketClose</i> — для подключения и
разрыва сессии.
</li>
<li>
<i> FB_ClientServerConnection</i> — включает в себя оба предыдущих блока и
упрощает работу с ними.
</li>
<li>
<i>FB_SocketSend</i> и/или <i>FB_SocketReceive</i> — для обмена данными.
</li>
</ul>
</div>
<div><br /></div>
<div>Минимальная реализация TCP-сервера:</div>
<div>
<ul style="text-align: left;">
<li>
<i> FB_SocketListen</i> — открывает сокет на прослушивание в режиме
ожидания клиента.
</li>
<li>
<i> FB_SocketAccept</i> и <i>FB_SocketClose</i> — открывают и
соответственно закрывают соединение.
</li>
<li>
<i> FB_ServerClientConnection</i> — умеет все вышеперечисленное вместе и
упрощает работу.
</li>
<li>
<i>FB_SocketSend</i> и/или <i>FB_SocketReceive</i> — для обмена данными.
</li>
</ul>
</div>
<div><br /></div>
<div>
<b>UDP-клиент</b> пакетный, работает без установки постоянного соединения:
отправил пакет данных и забыл. Пакет может и не дойти, а может дойти
фрагментированным, то есть разбитым на несколько частей. Иногда задняя часть
может придти раньше передней (если ползли разными маршрутами). И так тоже было задумано, во славу производительности.</div>
<div><br /></div>
<div>Минимальная реализация UDP-клиента:</div>
<div>
<ul style="text-align: left;">
<li>
<i>FB_SocketUdpCreate</i> и <i>FB_SocketClose</i> — открыть/закрыть сокет.
</li>
<li>
<i> FB_SocketUdpSendTo</i> и/или
<i>FB_SocketUdpReceiveFrom</i> — прием-отправка данных.
</li>
</ul>
</div>
<div>
<div><br /></div>
<div>
Для UDP-пакета ограничен максимальный размер отправляемых данных. По
умолчанию он равен 8192 байт (это число задается константой
<i>TCPADS_MAXUDP_BUFFSIZE</i>). Поэтому стоит обратить внимание на
аргумент <i>cbLen</i> функции <i>FB_SocketUdpSendTo</i>. Ограничение
служит для экономии памяти.
</div>
</div>
<div><br /></div>
<div>
Для всех типов связи <b>FB_SocketCloseAll</b> закрыть всё открытое и
закончить любые работы в пределах текущего рантайма. Это который имеет
определенный порт, например, 801 для первого рантайма TwinCAT 2.
</div>
<div>
<i></i>
<blockquote>
<i>FB_SocketAccept</i>, <i>FB_SocketReceive</i>,
<i>FB_SocketUdpReceiveFrom</i> — вызываются циклически (polling), то есть
каждый цикл. Остальные блоки вызываются по мере необходимости.</blockquote>
</div>
</div>
<div><br /></div>
<div><br /></div>
<h2 style="text-align: left;">Производительность</h2><div><br /></div><h4 style="text-align: left;"><u>TwinCAT 2</u></h4>
<div>
<div><b><br /></b></div><div>
<b>CX8090</b> (TC2, WinCE 7, ARMv4) — идеально когда происходит один вызов сетевой
функции за цикл. 4 соединения за цикл работают нормально, при большем числе
идут таймауты.
</div>
<div><br /></div>
<div>
<b>CX9020</b> (TC2, WinCE 7, Arm Cortex™-A8) — 4 соединения одновременно
за цикл работают нормально, а дальше идут таймауты. Соединения-подключения
все равно необходимо выполнять последовательно: сначала устанавливается одно соединение и только затем выполняем следующее подключение.
</div>
<div><br /></div><div><br /></div><h4 style="text-align: left;"><u>TwinCAT 3</u></h4><div><br /></div>
<div>
<b>CX8190</b> (TC3, WinCE 7, ARM Cortex™-A9) — 10 соединений одновременно за
цикл работают нормально. Соединения-подключения необходимо выполнять
последовательно.
</div>
<div><br /></div>
<div>
<b>CX2030</b> (TC3, Windows 7 Emb Std, Core-i7) — 10 соединений одновременно
за цикл работают нормально. Соединения-подключения необходимо выполнять
последовательно.
</div>
</div>
<div><br /></div>
<div><br /></div>
<h2 style="text-align: left;">Не больше 10 клиентов</h2>
<div>
<div>
<ul style="text-align: left;">
<li>
Не больше 10 клиентов. Ограничение в 10 клиентских подключений на
рантайм, а возможно и на весь ПЛК, но это не точно.
</li>
<li>Разные циклы — разные подключения. Открывать соединение лучше друг за другом по одному за цикл.</li>
<li>
Функции всегда работают как минимум один цикл. После первого вызова, в последующих циклах можно спокойно
вызывать ФБ с
<span style="background-color: #fff2cc;">bExecute := FALSE</span>,
ожидая когда функция переключится в <span style="background-color: #fff2cc;">NOT bBusy</span>, что означает поступление данных либо ошибку.</li>
<li>
При обрыве связи возвращает
<span style="background-color: #fff2cc;">bError = FALSE</span> и
<span style="background-color: #fff2cc;">nRecByte = 0</span>. Для
определения обрыва необходимо самостоятельно использовать собственный
таймер для контроля таймаута. Великая вещь, что функции здесь
неблокирующие (разработчики на C++ и другие поймут).
</li>
<li>
Протокол поточный, если читаете данные пачками, то полученные данные
необходимо накапливать в буфере, десериализовать или просто сканировать этот буфер на предмет
специального тэга или какой-либо другой ситуации предусмотренной протоколом (это уже зависит от
специфики протокола).
</li>
</ul>
<div><br /></div>
</div>
</div>
<div>
Мне стало интересно откуда это волшебное и круглое десятичное число — десять. И почему нельзя взять и подключаться ко всему и сразу. Я начал следить за количеством соединений и количеством системных
потоков (threads).
</div>
<pre>Соединения - потоки
2 - 8
3 - 10
4 - 12
. . ..
6 - 16</pre>
<div>Просматривается явная зависимость — на каждое новое соединение создается два новых потока.
Зачем два? Заглянем в лог <i>TcpIpServer.log</i>:
</div>
<div><br /></div>
<script src="https://gist.github.com/nikvoronin/7c2b248b59b013107bc149d4568ee612.js"></script>
<div>
Видно, что сначала создается ADS-сокет
<span style="background-color: #fff2cc;">CTcpAdsSocket::CTcpAdsSocket();</span>
Он будет принимать команды и данные из ФБ ПЛК-задачи, а затем создается
требуемый TCP-сокет
<span style="background-color: #fff2cc;">CTcpSocket::Create();</span>
теперь уже для непосредственной передачи данных. Поэтому каждый цикл можно открыть только одно новое соединение — на запрос создания сокета создается только одна связка ADS ↔ TCP|UDP. Такая вот архитектура,
упрощенно.
</div>
<div><br /></div>
<div><br /></div>
<h3 style="text-align: left;">Не больше 10, но можно меньше</h3>
<div><br /></div>
<div>
Под Windows CE можно поиграть с ключами реестра: <span style="background-color: #fff2cc;">Start → Run... → regedit</span>. Создать ключ
<span style="background-color: #fff2cc;">Registry → New → Key</span>:
<span style="background-color: #fff2cc;">HKLM\SOFTWARE\Beckhoff\<u>TwinCAT TcpIp Server</u></span>. Внутри раздела доступны несколько значений-параметров типа DWORD. Что удалось выяснить:
</div>
<div><br /></div>
<div>
<div><b>MaxTcpSocketCount</b></div>
<div>0 = вероятно стандартные 10 сокетов-соединений.</div>
<div>
1 = запретить вообще все подключения. Теперь функции
<i>FB_SocketListen</i> и <i>FB_SocketConnect</i> возвращают код ошибки
<a href="https://infosys.beckhoff.com/content/1033/tcpipserver/html/tcpipserver_errors_internal.htm" target="_blank">TCPADSERROR_NOMOREENTRIES</a>
(0x0000800132769).
</div>
<div>2 = 1 доступное подключение.</div>
<div>3 = 2 доступных подключения.</div>
<div>[...]</div>
<div>11 = 10 максимально доступных подключений. Всё, больше нельзя.</div>
<div><br /></div>
<div>
<b>MaxUdpSocketCount</b> — аналогично <i>MaxTcpSocketCount</i>, но для UDP
протокола.
</div>
<div>
<b>AdsServerCommTimeout</b> — возможно таймаут ADS-сервера. Единицы
измерения вероятно миллисекунды.
</div>
<div>
<b>DisableKeepAlive</b> — запретить постоянные KeepAlive подключения?
</div>
<div>
<div>
<b>ThreadPriority</b> — приоритет системного потока? Значения не
известны.
</div>
</div>
<div><br /></div>
<div><b>LogLevel</b></div>
<div>0 = отключен.</div>
<div>
1 = включен. Логировать будет сюда:
<span style="background-color: #fff2cc;">\Hard Disk\TwinCAT\TcpIpServer.log</span>
</div>
<div><br /></div>
</div>
<div><br /></div>
<h2 style="text-align: left;">TcSocketHelper</h2>
<div><br /></div>
<div>
<a href="https://infosys.beckhoff.com/content/1033/tcpipserver/html/tcplclibsockethelper_overview.htm" target="_blank">TcSocketHelper.lib</a>
выполняет за нас все трудоемкие операции по клиентским подключениям к серверу
и в обратную сторону — отслеживает клиентские подключения к серверу.
<a href="https://infosys.beckhoff.com/content/1033/tcpipserver/html/tcplclibsockethelper_samples.htm" target="_blank">Доступные примеры</a>
лежат в справочной системе.
</div>
<div><br /></div>
<div>
<a href="https://infosys.beckhoff.com/content/1033/tcpipserver/html/tcplclibsockethelper_fb_serverclientconnection.htm" target="_blank">FB_ServerClientConnection</a> — выполняет функции TCP-сервера. Внутри себя содержит и выполняет
<i>FB_SocketListen</i>, <i>FB_SocketAccept</i> и <i>FB_SocketClose</i>. На
выходе выдает идентификатор сокета <i>hSocket</i> для подключившегося клиента.
Дальше передаем его в <i>FB_SocketSend</i> и/или <i>FB_SocketReceive</i>.
</div>
<div><br /></div>
<div>
<a href="https://infosys.beckhoff.com/content/1033/tf6310_tc3_tcpip/18014398593618827.html" target="_blank">FB_ClientServerConnection</a>
и
<a href="https://infosys.beckhoff.com/content/1033/tf6310_tc3_tcpip/18014398593621899.html" target="_blank">FB_ConnectionlessSocket</a> — первый служит для создания TCP-клиентов, а второй для UDP. Оба умеют создавать и
закрывать соединения. При успешном соединении выдают на выходе
<i>hSocket</i> для передачи в <i>FB_SocketSend</i> и/или
<i>FB_SocketReceive</i>.
</div>
<div><br /></div>
<div>
Из интересного все функции, связанные с получением данных (Receive), внутри
себя содержат механизм регулировки скорости обновления ФБ (пропуск тактов, троттлинг, throttling). Ничего особенного, это обычный
подход в такой ситуации. Кратко выглядит так:</div>
<div><br /></div>
<div style="border-left: 1em solid rgb(250, 250, 250); margin-left: 2em; overflow: hidden; padding-left: 1em; width: auto;">
<pre style="line-height: 125%; margin: 0px;"><span style="color: #2b00fe;">TYPE</span> T_ThrottleTimes: <span style="color: #2b00fe;">ARRAY</span>[<span style="color: #bf9000;">0</span>..<span style="color: #bf9000;">MAX_THROTTLE_MODE</span>] <span style="color: #2b00fe;">OF TIME</span>;
<span style="color: #2b00fe;">END_TYPE</span>
throttleTimes: T_ThrottleTimes := <span style="color: #bf9000;">T#</span><span style="color: #7f6000;">0s</span>, <span style="color: #bf9000;">T#</span><span style="color: #7f6000;">10ms</span>, <span style="color: #bf9000;">T#</span><span style="color: #7f6000;">20ms</span>, <span style="color: #bf9000;">T#</span><span style="color: #7f6000;">40ms</span>, <span style="color: #bf9000;">T#</span><span style="color: #7f6000;">60ms</span>, <span style="color: #bf9000;">T#</span><span style="color: #7f6000;">80ms</span>, <span style="color: #bf9000;">T#</span><span style="color: #7f6000;">100ms</span>,
<span style="color: #bf9000;">T#</span><span style="color: #7f6000;">200ms</span>, <span style="color: #bf9000;">T#</span><span style="color: #7f6000;">400ms</span>, <span style="color: #bf9000;">T#</span><span style="color: #7f6000;">600ms</span>, <span style="color: #bf9000;">T#</span><span style="color: #7f6000;">800ms</span>, <span style="color: #bf9000;">T#</span><span style="color: #7f6000;">1s</span>, <span style="color: #bf9000;">T#</span><span style="color: #7f6000;">2s</span>;</pre>
</div>
<div><br /></div>
<div>
<div>
И скрытая, только для внутреннего использования, функция-обертка над
таймером <i>FB_ThrottleTimer</i>, которая состоит всего-лишь из одной строки
с вызовом таймера:
</div>
<div><br /></div>
<div style="border-left: 1em solid rgb(250, 250, 250); margin-left: 2em; overflow: hidden; padding-left: 1em; width: auto;">
<pre style="line-height: 125%; margin: 0px;">timer(
IN := bIn,
PT := throttleTimes[<span style="color: #2b00fe;">LIMIT</span>(<span style="color: #bf9000;">0</span>, <span style="color: red;">selector</span>, <span style="color: #bf9000;">MAX_THROTTLE_MODE</span>)],
Q => bOut,
ET => tElapsed );</pre>
</div>
<div><br /></div>
<div>
Здесь <i>`selector`</i> задает текущий режим, а его значение изменяется
через вызов одного из четыре экшенов (Action):
</div>
<div>
<ul style="text-align: left;">
<li>MaxSpeed — selector = 0.</li>
<li>MinSpeed — selector = MAX_THROTTLE_MODE.</li>
<li>SlowDown — увеличивает задержку, уменьшает скорость опроса.</li>
<li>SpeedUp — уменьшает задержку, увеличивает скорость опроса.</li>
</ul>
</div>
<div><br /></div>
<div>
Суть этого действа в автоматическом регулировании интервал ожидания:
увеличивать интервал если сообщений нет, и снижать интервал ожидания, если
сообщения пошли часто-часто.
</div>
</div>
Nikolai Voroninhttp://www.blogger.com/profile/06095643959617325612noreply@blogger.com0tag:blogger.com,1999:blog-3387439264291014573.post-2209785604285689862020-08-18T19:10:00.137+03:002021-01-21T13:37:39.146+03:00Управление битовыми полями<p>
В TwinCAT 3 появился тип данных <a href="https://infosys.beckhoff.com/content/1033/tc3_plc_intro/9007201784183691.html" target="_blank">BIT</a>. Он предназначен искючительно для создания
новых типов данных с точно заданной структурой и удобного обмена данными с
периферией (железом). Применять его можно только при объявлении новых структур
данных:
</p>
<div style="border-left: 1em solid rgb(250, 250, 250); margin-left: 2em; overflow: hidden; padding-left: 1em; width: auto;">
<pre style="line-height: 125%; margin: 0px;"><span style="color: #2b00fe;">TYPE</span> BitBang :
<span style="color: #2b00fe;">STRUCT</span>
b0: <span style="color: #2b00fe;">BIT</span>;
b1: <span style="color: #2b00fe;">BIT</span>;
b2: <span style="color: #2b00fe;">BIT</span>;
<span style="color: #2b00fe;">END_STRUCT
END_TYPE</span></pre>
</div>
<p>
Биты будут упаковываться в байт. По мере заполнения места в байте и превышения
его размера система увеличит размер структуры на еще один байт и так далее,
экономя место. Аналогичная структура из полей типа BOOL будет занимать в
восемь раз больше места, так как в памяти под одно поле типа BOOL отводится
сразу целый байт.
</p>
<p>
Статьи в инфосисе: <a href="https://infosys.beckhoff.com/content/1033/tc3_plc_intro/9007201784183691.html" target="_blank">BIT</a>
и Structure →
<a href="https://infosys.beckhoff.com/content/1033/tc3_plc_intro/36028799548445323.html" target="_blank">Bit access in structures</a>.
</p>
<p>
Экономия не дается просто так. Для доступа к битовым полям требуется больше
времени из-за операций упаковки-распаковки. Поэтому используйте их только для
обмена данными с устройствами, а затем транслируйте в тип BOOL. Ниже
результат, а код будет в конце поста. По вертикали время на исполнение цикла (меньше — быстрее):
</p>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiT3Fn-oSFdezbmx8hIcYnmoNz7D8YY35tyv0Vs3WRU7sippxwHQIli4zkC6jURT-wK5EuJ0b3wmOlPGY75-zSYh_DB0f6FC0F5gaQp5nIJJ_gkmbgUF8L17lmEtd558-1_T7QZMgjl2yFD/s891/scope-performance.png" style="display: block; padding: 1em 0px;"><img border="0" data-original-height="464" data-original-width="891" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiT3Fn-oSFdezbmx8hIcYnmoNz7D8YY35tyv0Vs3WRU7sippxwHQIli4zkC6jURT-wK5EuJ0b3wmOlPGY75-zSYh_DB0f6FC0F5gaQp5nIJJ_gkmbgUF8L17lmEtd558-1_T7QZMgjl2yFD/d/scope-performance.png" /></a>
</div>
<p>
Где-то в полтора раза больше времени требуется на доступ к отдельным битам. На двух-трех операциях это будет незаметно. Глядя на результат выше, держите в голове, что счет там идет на десятки тысяч (до 100 000) операций за цикл. И это не то
место, где уместно <a href="https://gotwincat.blogspot.com/2018/08/performance-test-subprograms-call-tc2-and-tc3.html" target="_blank">экономить на абстракциях</a>.
</p>
<p><br /></p>
<h2 style="text-align: left;">Биты целочисленных данных</h2>
<p>
Целочисленные данные INT, BYTE, ... с самого начала позволяли читать и
устанавливать свои отдельные биты. Достаточно написать iVar.3 и получить
доступ к биту номер 3 (счет идет от нуля). Внезапно, нам подарили интересный
механизм именования отдельных битов целочисленных данных. Проще говоря, теперь
можно дать имена отдельным (или вообще всем) битам целого числа. Для этого лучше всего подходят константы, ведь в дальнейшем их значение нельзя будет изменить. Тем самым номер бита будет определен один единственный раз и не сможет изменяться в дальнейшем.</p><p>Можно создавать как локальные так и глобальные синонимы. С глобальными есть нюанс, поэтому испытания начнем с них. Идем в GVLs, создаем список GVL, название можно выбрать произвольное, пишем
следующее:</p>
<div style="border-left: 1em solid rgb(250, 250, 250); margin-left: 2em; overflow: hidden; padding-left: 1em; width: auto;">
<pre style="line-height: 125%; margin: 0px;"><span style="background-color: #fff2cc; color: #38761d;">//{attribute 'qualified_only'}</span>
<span style="color: #2b00fe;">VAR_GLOBAL <u>CONSTANT</u></span>
Enable: <span style="color: #2b00fe;">INT</span> := <span style="color: #bf9000;">3</span>;
Disable: <span style="color: #2b00fe;">BYTE</span> := <span style="color: #bf9000;">5</span>;
Error: <span style="color: #2b00fe;">DWORD</span> := <span style="color: #bf9000;">15</span>;
<span style="color: #2b00fe;">END_VAR</span></pre>
</div>
<p>
Важно <span style="color: red;">(!)</span> убрать атрибут <i>'qualified_only'</i> и указать, что это
константы. С включенным атрибутом работать не будет. Конкретный тип данных не важен, главное чтобы он был целочисленным. Значение константы (число) обозначает номер бита, нумерация по прежнему начинается с нуля.</p><p>Теперь ближе к коду, что именно можно с этим сделать?</p>
<div style="border-left: 1em solid rgb(250, 250, 250); margin-left: 2em; overflow: hidden; padding-left: 1em; width: auto;">
<pre style="line-height: 125%; margin: 0px;"><span style="color: #2b00fe;">PROGRAM</span> MAIN
<span style="color: #2b00fe;">VAR</span>
iVar: <span style="color: #2b00fe;">LINT</span>;
bVar: <span style="color: #2b00fe;">BYTE</span>;
<span style="color: #2b00fe;">END_VAR</span>
<span style="color: #2b00fe;">VAR <u>CONSTANT</u></span>
Enable: <span style="color: #2b00fe;">WORD</span> := <span style="color: #bf9000;">3</span>;
Ready: <span style="color: #2b00fe;">WORD</span> := <span style="color: #bf9000;">3</span>;
Disable: <span style="color: #2b00fe;">WORD</span> := <span style="color: #bf9000;">5</span>;
Error: <span style="color: #2b00fe;">WORD</span> := <span style="color: #bf9000;">15</span>;
<span style="color: #2b00fe;">END_VAR</span>
iVar.Enable := <span style="color: #bf9000;">TRUE</span>;
<span style="color: #2b00fe;">IF</span> iVar.Ready <span style="color: #2b00fe;">THEN</span>
iVar.Disable := <span style="color: #bf9000;">FALSE</span>;
<span style="color: #2b00fe;">END_IF</span>
<span style="color: #38761d;">// bVar.Error := FALSE;</span> <span style="color: red;">>>></span> <span style="background-color: #fff2cc;">`Error` is no valid bit number for `bVar`</span></pre>
</div>
<p>
<i>iVar.Enable</i> установит бит разрешения #3, а
<i>iVar.Disable</i> сбросит бит запрета #5. Выйти за разрядную сетку не
получится, компилятор бдит еще на этапе сборки (см. комментарий про
<i>bVar</i>).
</p><p>Можно дать одному и тому же биту разные названия. В примере выше поля <i>Enable</i> и <i>Ready</i> — это имена-синонимы четвертого бита (бит №3). Иногда это удобно и наглядно:</p>
<div style="border-left: 1em solid rgb(250, 250, 250); margin-left: 2em; overflow: hidden; padding-left: 1em; width: auto;">
<pre style="line-height: 125%; margin: 0px;">iVar.Enable := <span style="color: #bf9000;">TRUE</span>;
<span style="color: #38761d;">//</span> iVar = 2#0000_<span style="color: red;">1</span>000
<span style="color: #38761d;">//</span> iVar.Ready == <span style="color: red;">TRUE</span>
iVar.Disable := <span style="color: #bf9000;">TRUE</span>;
<span style="color: #38761d;">//</span> iVar = 2#00<span style="color: red;">1</span>0_1000
iVar.Ready := <span style="color: #bf9000;">FALSE</span>;
<span style="color: #38761d;">//</span> iVar = 2#0010_<span style="color: red;">0</span>000
<span style="color: #38761d;">//</span> iVar.Enable = <span style="color: red;">FALSE</span>
</pre>
</div>
<p><br /></p>
<h2 style="text-align: left;">Производительность</h2>
<p>
Любые операции с отдельными битами, независимо от типа операции, чтение ли
это или установка бита, приведут к дополнительным операциям упаковки/распаковки битов в байты. Это конечно же отразиться на
производительности. Да, это будут копейки относительно других операций (см. картинку выше),
но давайте посмотрим как обстоят дела с операциями чтения и записи по
отдельности, а в конце еще раз всё вместе:</p>
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhao-TjmawESvpOJhTM_17uztbWyoEGvU_8nxT4TZEsKevAqDxsvdniaRK2H6eeqS50_Ae0NxmkI3l6ZWOXqz0frWoA-n_YFbpujS45p9EGairqMH59CmPI46GjPBBNZoUSFezjqUWaMaVL/s895/scope-performance-read-write.png" style="display: block; padding: 1em 0px;"><img border="0" data-original-height="467" data-original-width="895" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhao-TjmawESvpOJhTM_17uztbWyoEGvU_8nxT4TZEsKevAqDxsvdniaRK2H6eeqS50_Ae0NxmkI3l6ZWOXqz0frWoA-n_YFbpujS45p9EGairqMH59CmPI46GjPBBNZoUSFezjqUWaMaVL/d/scope-performance-read-write.png" /></a>
</div>
<p>
Чтение требует чуть меньше времени, чем запись. Операции с отдельными битами требуют
больше времени, чем работа с булевым типом. Комплексные операции чтение-запись привносят еще большую нагрузку. Но(!) еще раз
повторюсь, здесь счет идет на десятки тысяч операций за один цикл. Не стоит
выигрывать наносекунды за счет читаемости кода. Кстати, код:
</p>
<script src="https://gist.github.com/nikvoronin/08067469c0e47b775476dbf0bef652ed.js"></script>
Nikolai Voroninhttp://www.blogger.com/profile/06095643959617325612noreply@blogger.com0tag:blogger.com,1999:blog-3387439264291014573.post-85419996523639068742020-08-13T19:30:00.029+03:002021-01-21T13:38:20.526+03:00Вебинар. TwinCAT 3 EventloggerИ опять с просмотра вебинара начнем знакомство с Eventlogger'ом. То есть с
чтения конспекта, пропущенного через инженера. Вебинар <i>`TwinCAT 3 Eventlogger: event-based communications from the TwinCAT runtime
system`</i>
прошел 8 мая 2018 года, но нас это не остановит, так как с возрастом продукт
становится только стабильнее и, главное, понятнее. За счет выпущенной
документации и конечно же опыта разработчика.
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhDLkx60ccL7mctHI1C98tQcDkvhqjgGQOI58m4A8tXh3LMKveqbEsqT8-B6dKpNOdO4X3gpHEwNNm35ntwFwUE9I3UchXUN3XCizrCDh6aviAs5DF0-eMjxSoIOaYigpizVo7-Wuf5dPWp/s800/00-eventlogger-architecture.png" style="display: block; padding: 1em 0px;"><img border="0" data-original-height="291" data-original-width="800" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhDLkx60ccL7mctHI1C98tQcDkvhqjgGQOI58m4A8tXh3LMKveqbEsqT8-B6dKpNOdO4X3gpHEwNNm35ntwFwUE9I3UchXUN3XCizrCDh6aviAs5DF0-eMjxSoIOaYigpizVo7-Wuf5dPWp/d/00-eventlogger-architecture.png" /></a>
</div>
<div style="text-align: right;">
<span style="color: #999999; font-size: x-small;">Изображение: Beckhoff Automation</span>
</div>
<div><br /></div>
<div>
Центральный компонент — EventLogger. Он встроен непосредственно в ядро TwinCAT
и для своей работы не требует покупки или активации каких-либо лицензий. Это
неотъемлемая часть ядра TwinCAT. Доступ к этому ядру ПЛК-программы
осуществляют через библиотеки (например, Tc3_Eventlogger), а библиотеки в свою
очередь через интерфейс COM-объектов TcСOM и ADS.
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjRxWq22yKKEsLXXPRNrUhcNR1yc0Ibn1tS073cMZhQHieLHzgTBIN4bC-NugqwuU9Wb6LR1vsqFyYokr1QXdp1B-dBNyfXlAicLOho3A7sf8WxL-CpknVYMC5jHYR1-C0A5Xwu1qDJwVbZ/s1678/00-eventlogger-architecture-internal.png" style="display: block; padding: 1em 0px;"><img border="0" data-original-height="727" data-original-width="1678" height="277" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjRxWq22yKKEsLXXPRNrUhcNR1yc0Ibn1tS073cMZhQHieLHzgTBIN4bC-NugqwuU9Wb6LR1vsqFyYokr1QXdp1B-dBNyfXlAicLOho3A7sf8WxL-CpknVYMC5jHYR1-C0A5Xwu1qDJwVbZ/w640-h277/00-eventlogger-architecture-internal.png" width="640" /></a>
</div>
<div style="text-align: right;">
<span style="color: #999999; font-size: x-small;">Изображение: Beckhoff Automation</span>
</div>
<div><br /></div>
<div>
Ряд сообщений можно автоматичеки пробрасывать в журналы Windows. Откройте
"Просмотр событий" Windows (или EventLogger) и вы увидите ряд сообщений, таких
же что и в TwinCAT.
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjRlRR-i3nRZcSNU55DP9vuExsYJo_a5PrlKD51BPD-hh2hc2iymFLlPhxUNUmN5BfvWyMa_tuViU9CCs0VsMf9QMX20ZCGya1R0HdUBu5u_Qn4_LienSfkWXAJI012hxKmfL6neupVOwCD/s797/01-windows-eventlogger.png" style="display: block; padding: 1em 0px;"><img border="0" data-original-height="475" data-original-width="797" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjRlRR-i3nRZcSNU55DP9vuExsYJo_a5PrlKD51BPD-hh2hc2iymFLlPhxUNUmN5BfvWyMa_tuViU9CCs0VsMf9QMX20ZCGya1R0HdUBu5u_Qn4_LienSfkWXAJI012hxKmfL6neupVOwCD/d/01-windows-eventlogger.png" /></a>
</div>
<div>
Eventlogger поддерживает произвольный набор сообщений, то есть вы можете
создавать свои собственные сообщения и события. Вы можете конструировать их,
встраивать в свои конфигурации, компилировать и затем использовать в своих
системах. Для создания сообщений служит ветка
<span style="background-color: #fff2cc;">Solution Explorer → SYSTEM → Type System</span>
в конфигурации проекта. Закладка справа <i>Event Classes</i> позволяет
объединять сообщения в классы по каким-либо удобным для вас критериям.
</div>
<div><br /></div>
<div>
События представлены специальным типом данных TwinCAT. События управляются с
помощью <i>TwinCAT Type System</i>. Следовательно они едины и одинаковы для
всех компонентов проекта, написанных на любом из доступых язков
программирования: ST, LD, C++, ... Плюс к этому, конфигурация событий хранится
в TMC-файлах, соответственно это XML-файл, который можно легко
автогенерировать с помощью произвольных (в том числе и внешних) инструментов.
</div>
<div><br /></div>
<div>
Для создания событий используется редактор TMC-файлов. В нем можно
задать идентификатор и наименование события, назначить человеко-читаемый текст
сообщения и придать тот или иной вес или важность событию, такие как ошибка,
сообщение, уведомление, информация и т. п.
</div>
<div><br /></div>
<div>
Текст сообщений может параметризоваться. Можно добавить прямо в текст метки,
которые в коде программы будут заменяться на актуальные значения: "Текущая
температура {1} превышает {0}". Кроме этого, можно задать источник события и
таким образом впоследствии увидеть, что сообщения одинакового типа
отправляются из разных подпрограмм (источников).
</div>
<div><br /></div>
<div>
В сообщения можно добавлять дополнительную информацию в виде
<i>JsonAttribute</i>. TwinCAT имеет встроенную
<a href="https://download.beckhoff.com/download/document/automation/twincat3/TwinCAT_3_PLC_Lib_Tc3_JsonXml_EN.pdf" target="_blank">библиотеку</a>
для работы с сообщениями JSON (теперь есть библиотека-парсер). Это позволяет к
текстовой информации добавить структурированную иерархическую информацию,
расширяющую данные. Например, это можно использовать для автоматической
обработки логов.
</div>
<div><br /></div>
<div><br /></div>
<h3 style="text-align: left;">Библиотека Tc3_EventLogger</h3>
<div><br /></div>
<div>Позволяет создавать события из программы ПЛК.</div>
<div><br /></div>
<div>
Сообщения (messages) просто создаются, а затем отправляются в системный лог.
Это не реалтайм система: одно событие в миллисекунду. На самом можно
отправлять больше одного за цикл, но это будет зависеть от производительности.
</div>
<div><br /></div>
<div>
Кроме сообщений можно создавать "Тревоги" (Alarms) которые могут находиться в
одном из состояний: тревога установлена (Raise), тревога сброшена (Release) и
тревога квитирована (Confirm). Также можно полностью удалить экземпляр объекта
тревоги из памяти (Clear), но в логе сообщения сообщение все равно остается и
не пропадает. Иллюстрация из справочной системы:
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjgTgHADF_5kBxzMNWZVfrgFjYgCEMBopa0O6Urzvf07NKXXfvt39v4s8DGbSuuELxoFS6bEoAZPcLwgf7UtSIqcHX2v4Bm56P66ueRCl15lRGzk2mESwmyMJRhgxqOmZku0bjDhpRcFsyU/s518/9007200051669771__Web.png" style="display: block; padding: 1em 0px;"><img border="0" data-original-height="518" data-original-width="465" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjgTgHADF_5kBxzMNWZVfrgFjYgCEMBopa0O6Urzvf07NKXXfvt39v4s8DGbSuuELxoFS6bEoAZPcLwgf7UtSIqcHX2v4Bm56P66ueRCl15lRGzk2mESwmyMJRhgxqOmZku0bjDhpRcFsyU/s0/9007200051669771__Web.png" /></a>
</div>
<div style="text-align: right;">
<span style="color: #999999; font-size: x-small;">Изображение: Beckhoff Automation</span>
</div>
<div><br /></div>
<div>
Работа из C++ очень похожа на работу из ST программ. Из C# тоже, но это будет
отдельно.
</div>
<div><br /></div>
<div><br /></div>
<h3 style="text-align: left;">Получение событий</h3>
<div><br /></div>
<div>
Вы создаете новый класс, расширяя
<a href="https://infosys.beckhoff.com/content/1033/tcplclib_tc3_eventlogger/5001704075.html" target="_blank">FB_ListenerBase</a>. После этого создаете конфигурацию (.Subscribe) и добавляете в нее
класс сообщений (.AddEventClass). Теперь необходимо вызывать каждый цикл
объект (экземпляр созданного вами нового класса). В случае прихода сообщения,
будут вызваны соответствующие методы класса.
</div>
<div><br /></div>
<div>Для C++ аналогично.</div>
<div><br /></div>
<div><br /></div>
<h3 style="text-align: left;">Доступ извне</h3>
<div><br /></div>
<div>
События <i>TwinCAT EventLogger</i> можно просматривать в Visual Studio: View →
Other Windows → TwinCAT Logged Events.
</div>
<div><br /></div>
<div>
Программы написанные на C# могут получить дступ через <i>ADS Proxy</i>. С
помощью класса <i>TcEventLogger</i> из сборки ADS. Причем текст сообщения
можно получать с учетом интернационализации локали, то есть на разных языках в
зависимости от предпочтений разработчика либо настроек системы.
</div>
<div><br /></div>
<div><br /></div>
<h3 style="text-align: left;">Интернационализация</h3>
<div><br /></div>
<div>
Если она вам не нужна (а она вам нужна, так как вы читаете блог на русском
языке), то можете игнорировать эту возможность и все будет на английском языке
(или немецком).
</div>
<div><br /></div>
Nikolai Voroninhttp://www.blogger.com/profile/06095643959617325612noreply@blogger.com0tag:blogger.com,1999:blog-3387439264291014573.post-70397159181940448122020-08-11T19:41:00.308+03:002021-01-21T13:39:00.745+03:00История K-Bus или INTERBUS<div>
Несерьезные действия временами приводят к серьезным или по крайней мере
полезным результатам. Как-то раз в проекте пропала конечная, защитная крышка
EtherCAT шины. Чтобы как-то компенсировать стоимость крышки, да и скорее не
стоимость, а время доставки, в голову коллеги явилась мысль заменить ее на
терминал от K-Bus. Интуиция подсказала, что металлические контакты установлены не просто так, а несут какое-то назначение. В EtherCAT-крышке у нас только
интеллектуальная пластмасса, а она, как известно, изолятор и ток не проводит. Модуль
KL9010
был вскрыт, препарирован и свет увидели его потроха.
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgxd_yjRQkGscAk1CQy20VnuvLsVjuxMJbu2rXOVKbRU2hc5XNu-ZK0UWX7ScrbsocHvY5aY7_xF_qnwWTxsVGhrcgvlYCf6wQPC4Xmf828MJfEottnOS2dsu9hPXqPqFYT1CHOqKYRQyWb/s800/doom-pretorians-key.jpg" style="display: block; padding: 1em 0px;"><img border="0" data-original-height="454" data-original-width="800" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgxd_yjRQkGscAk1CQy20VnuvLsVjuxMJbu2rXOVKbRU2hc5XNu-ZK0UWX7ScrbsocHvY5aY7_xF_qnwWTxsVGhrcgvlYCf6wQPC4Xmf828MJfEottnOS2dsu9hPXqPqFYT1CHOqKYRQyWb/d/doom-pretorians-key.jpg" /></a>
</div>
<div><br /></div>
<div><br /></div>
<h2 style="text-align: left;">Внутри у него...</h2>
<div><br /></div>
<div>
Модуль внутри пустой, но в зоне расопления(?) контактов, есть вставка из платы с
контактными площадками и накладными-прижимными клеммами. Две из них попарно
замкнуты перемычкой.
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjvZOE5CtzzmBhWqCVWZar_zrb8nqi2Uaj6iM-BYFr0V-5ZXbZ9cnhj6LD_5dDqKISSjiE86U5bID69lsIugApJxZQfvNfZiqmO66VHUiH2qqg6DdMSEpaGACkL8IbDCvGqbMVu8UheKU4e/s800/03.jpg" style="display: block; padding: 1em 0px;"><img border="0" data-original-height="468" data-original-width="800" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjvZOE5CtzzmBhWqCVWZar_zrb8nqi2Uaj6iM-BYFr0V-5ZXbZ9cnhj6LD_5dDqKISSjiE86U5bID69lsIugApJxZQfvNfZiqmO66VHUiH2qqg6DdMSEpaGACkL8IbDCvGqbMVu8UheKU4e/d/03.jpg" /></a>
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjKs0IRUdcVY6aiqpEmsSFNl_BDmrLMQwEKFmIIVZ2xqhsf8ayNh8C6APr2cY1cOfONx6QbFNMxYOddBqEkXrSh25p2-nue3CD2PynCwP7JIOCyw86SfF12HpaJqMC7s23J5vAhZH8vjThb/s800/01.jpg" style="display: block; padding: 1em 0px;"><img border="0" data-original-height="520" data-original-width="800" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjKs0IRUdcVY6aiqpEmsSFNl_BDmrLMQwEKFmIIVZ2xqhsf8ayNh8C6APr2cY1cOfONx6QbFNMxYOddBqEkXrSh25p2-nue3CD2PynCwP7JIOCyw86SfF12HpaJqMC7s23J5vAhZH8vjThb/d/01.jpg" /></a>
</div>
<div><br /></div>
<div>
Kа-бас шина не будет работать, а точнее не будет обнаруживать дочерние устройства,
если на ее конце не установить терминальный модуль KL9010. Теперь
мы точно знаем, что там перемычка: два средних контакта из шести замкнуты перемычкой.
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhkuWcH6i7f-TRUGwe14X2nmNep1dMAgAFqwZ5QA1UD__ldLyzwI83XxzUwnAwgtwAWkxdRGVI8SAyFfYLsxAwG3PFduVy0_R8d0BHzPdAqmHdCr-QAGyzc76Iy06A4alaAv1rhP5fbkhDM/s800/04.jpg" style="display: block; padding: 1em 0px;"><img border="0" data-original-height="358" data-original-width="800" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhkuWcH6i7f-TRUGwe14X2nmNep1dMAgAFqwZ5QA1UD__ldLyzwI83XxzUwnAwgtwAWkxdRGVI8SAyFfYLsxAwG3PFduVy0_R8d0BHzPdAqmHdCr-QAGyzc76Iy06A4alaAv1rhP5fbkhDM/d/04.jpg" /></a>
</div>
<div><br /></div>
<div><br /></div>
<h2 style="text-align: left;">История</h2>
<div><br /></div>
<div>
Я покопался в своем архиве и вытащил из-под груды ссылок занятный, но давно
заброшенный блог
<a href="https://gadgetsinside.wordpress.com" target="_blank">Gadgets Inside</a>
с гикпроном внутренностей терминалов. Там есть бекхофф и там есть интересные
заметки про шину K-bus.
</div>
<div><br /></div>
<div>
<a href="https://gadgetsinside.wordpress.com/2013/02/22/beckhoff-kl4032/" target="_blank">Beckhoff KL4032</a>, 2 channel, 12 bit, -10..+10V модуль выходов.
</div>
<div>
<a href="https://gadgetsinside.wordpress.com/2013/02/22/beckhoff-kl3062/" target="_blank">Beckhoff KL3062</a>, 2 channel, 12 bit, 0..10V модуль входов.
</div>
<blockquote>
<div>
KL is the “older” series of Beckhoff’s I/O modules, it incorporates the
K-bus connection interface, which is basically an INTERBUS interface, but
Beckhoff names it K-Bus (Koppler-Bus).
</div>
<div>[...]</div>
<div>
Beckhoff BK200A. Probably this is the INTERBUS protocol IC, but has a
“Beckhoff brand”.
</div>
<div>[...]</div>
On the back side there is only one bigger (44 pins) IC named Beckhoff BK200A.
This must be the INTERBUS protocol IC, just named in a “Beckhoff way”.
</blockquote>
<div>
KL — это более старая [пост 2013 года] серия Бекхоффских модулей входов-выход.
Модули построены вокруг К-bus интерфейса, который фактически является
интерфейсом INTERBUS, но Бекхофф называет его K-Bus (Koppler-Bus).
</div>
<div><br /></div>
<div>
Внутри модуля установлена микросхема <i>Beckhoff BK200A</i>. Вероятно,
это обычный интерфейс протокола INTERBUS, но под брэндом Бекхофф.
</div>
<div><br /></div>
<div>
С обратной стороны [это уже про другой терминал] платы находится только одна
большая 44-пиновая микросхема, обозначенная как <i>Beckhoff BK200A</i>...
дальше аналогично предыдущей выдержке.
</div>
<div><br /></div>
<div>
Поверим паталогоанатому на слово и на выходные запишемся в межавтобусный клуб
<i>Interbus Club</i>, а по дороге в клуб, полистаем брошюру
<a href="http://www.interbusclub.com/dl/Dok_interbus_basics_en.pdf" target="_blank">INTERBUS Basics</a>
(interbus club).
</div>
<div><br /></div>
<div><br /></div>
<h2 style="text-align: left;">Вступаем в клуб</h2>
<div><br /></div>
<div>Из брошюры узнаем, что:</div>
<div></div>
<blockquote>
This method is more efficient than the message-based method for a large number
of devices. The summation frame method ensures fixed data lengths for devices
and therefore constant transmission times. The determinism of this method is
essential for the accurate calculation of the response time.
</blockquote>
<div>
Этот метод более эффективен чем отправка отдельных сообщений большому
количеству устройств. Использование метода объединения фреймов [в один
большой] обеспечивает фиксированную длину данных от устройств и следовательно
гарантирует постоянное [предсказуемое] время передачи [фрейма].
Предсказуемость данного метода — это основа точного подсчета времени отклика.
</div>
<div><br /></div>
<div>Знакомая философия, не так ли? Картинка для наглядности:</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj17UEaTPafvfXHLSb7sMo7yyFm71JlftR06JnmfKR8344RAdAM5CN35x5kq3QKby-7jJGLei0VGqCYFN_KDhZpFhGr84Y2R1ZePcSxOL9G4NeKPkGOTQ7XRBRiIoatFYVRheQHtYvYhAN7/s931/03.png" style="display: block; padding: 1em 0px;"><img border="0" data-original-height="512" data-original-width="931" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj17UEaTPafvfXHLSb7sMo7yyFm71JlftR06JnmfKR8344RAdAM5CN35x5kq3QKby-7jJGLei0VGqCYFN_KDhZpFhGr84Y2R1ZePcSxOL9G4NeKPkGOTQ7XRBRiIoatFYVRheQHtYvYhAN7/d/03.png" /></a>
</div>
<div><br /></div>
<div>
От 485-го к витым парам Ethernet. Протоколы мигрируют туда же. Полезно иногда
оглянуться на историю.
</div>
<div><br /></div>
<div><br /></div>
<h2 style="text-align: left;">Так что там с перемычкой?</h2>
<div><br /></div>
<div>
Согласно описанию INTERBUS последний модуль должен замкнуть контакты номер 5 и
9, чтобы кольцо шины замкнулось. Что видимо и происходит в конечном модуле.
Вот картинка из документации Бекхофф на коплер
BK4000
(Interbus Bus Coupler):
</div>
<div class="separator" style="clear: both;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjwp3bnQGfWi9o7bYBIK4LLsyQoDJUhh2Oi1qs1KD3GugvVv_DgEcWAFCxGZ0TRpn-vSNP9kxpNehCEHxfWcZC5XwDP27rRjD13JRr6-e668QvCvnOiXhJgFHiccprWumPszGWD5AjT_e5Z/s817/01.png" style="display: block; padding: 1em 0px;"><img border="0" data-original-height="420" data-original-width="817" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjwp3bnQGfWi9o7bYBIK4LLsyQoDJUhh2Oi1qs1KD3GugvVv_DgEcWAFCxGZ0TRpn-vSNP9kxpNehCEHxfWcZC5XwDP27rRjD13JRr6-e668QvCvnOiXhJgFHiccprWumPszGWD5AjT_e5Z/d/01.png" /></a></div>
<div>Ну и напоследок, <i>терминатор</i> — поглотитель энергии (обычно резистор) на
конце длинной линии, сопротивление которого равно волновому сопротивлению
данной линии (<a href="https://ru.wikipedia.org/wiki/Терминатор_(электроника)" target="_blank">Википедия</a>). Здесь же обычный <i>джампер</i> или <i>перемычка</i>.</div>
Nikolai Voroninhttp://www.blogger.com/profile/06095643959617325612noreply@blogger.com0tag:blogger.com,1999:blog-3387439264291014573.post-88719105764529117892020-08-06T19:44:00.008+03:002021-01-21T13:39:34.034+03:00Вебинар. EtherCAT терминалы энергоэффективностиМедлен спустимся и обозрим измерительные модули на основе вебинара <a href="https://multimedia.beckhoff.com/webinar/en/webinar-ethercat-terminals-for-energy-management/" target="_blank">EtherCAT Terminals for energy management</a>. Ничего что с небольшим опозданием — вебинар все еще доступен в архиве, хотя и прошел в далеком 2018 году.<div><br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEinTn3g6aF_O5hKFEqsRYwbK4IX-YMuGYTJ30uGCdnyU2zVn44ELnslDHEHckNUD2REnRCqRRoIu8xKIDdZ7pMVZ7twr8mxd6jnPSkt2GijyiZ84gIqkHzRtKkcK0Z9YNODKqx-ZVUOIoDk/s570/webinar_20180619_e.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="320" data-original-width="570" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEinTn3g6aF_O5hKFEqsRYwbK4IX-YMuGYTJ30uGCdnyU2zVn44ELnslDHEHckNUD2REnRCqRRoIu8xKIDdZ7pMVZ7twr8mxd6jnPSkt2GijyiZ84gIqkHzRtKkcK0Z9YNODKqx-ZVUOIoDk/d/webinar_20180619_e.jpg" /></a>
</div>
<div style="text-align: right;">
<font color="#999999" size="1">Изображение: Beckhoff Automation</font>
</div>
<div><br /></div>
<h2 style="text-align: left;">Энергоэффективность</h2>
<div><br /></div>
<div>
Энергоэффективность — это не только про доставку электричества, но и про:
</div>
<div>
<ul style="text-align: left;">
<li>экономия энергии = экономия денежных средств.</li>
<li>Доставка энергии = надежность и непрерывность производства.</li>
<li>Производительность промышленности = повышение оборота.</li>
<li>Управление ресурсами = повышение прибыли.</li>
</ul>
</div>
<div><br /></div>
<div>
Чтобы этого достичь, нужно измерить энергию на различных этапах, которые в
свою очередь представлены различными типами сред с различными технологическими
параметрами: ток, теплоемкость/газ, вода, давление воздуха, температура,
мониторинг отказов оборудования.
</div>
<div><br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjlN4dZAIdFcFAa5Esrsne_mKQgKQ4HRHntkUORSiltgtthqF1DoCz4a07IEjq57Jul-oITfgWc5hWJDpaTrvbBKB2G3-Wlb8dtqg-hwRy-TNCh-0JsYeslbVOCrHhJfqzFqQBIpBhLeEMe/s2048/beckhoff-155-03-2016-fig-2.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1106" data-original-width="2048" height="346" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjlN4dZAIdFcFAa5Esrsne_mKQgKQ4HRHntkUORSiltgtthqF1DoCz4a07IEjq57Jul-oITfgWc5hWJDpaTrvbBKB2G3-Wlb8dtqg-hwRy-TNCh-0JsYeslbVOCrHhJfqzFqQBIpBhLeEMe/w640-h346/beckhoff-155-03-2016-fig-2.jpg" width="640" /></a>
</div>
<div style="color: #999999; text-align: right;"><font size="1">Изображение: Beckhoff Automation</font></div>
<div><br /></div><h2 style="text-align: left;">Электроток</h2>
<div><br /></div><div>Модули объеденены в шесть групп по типу измеряемой среды (см. картинку выше). Затем модули объеденены в три функциональные группы:</div><div><ul style="text-align: left;"><li>измерение (power measurement);</li><li>мониторинг (power monitoring);</li><li>эксплуатация (maintenance).</li></ul></div>
<div><br /></div>
<h3 style="text-align: left;">Эксплуатация</h3><div><br /></div>
<div>Это самые простые и дешевые терминалы: EL3423, EL3483. Они не производят измерения, а только сигнализируют о нормальном или ошибочном
состоянии линии электропитания (трехфазной в том числе). Также модули выдают отчет о качестве питания, в виде собирательного параметра <i>Power Quality Factor</i>, скомпилированного из нескольких разных измерений.</div>
<div><br /></div>
<div><br /></div>
<h3 style="text-align: left;">Мониторинг</h3><div><br /></div>
<div>EL3443 — более расширенные возможности по сравнению с предыдущей моделью EL3403.</div>
<div>EL3453 — быстрее, чем EL3413 и лучше гальванически развязан (690В, до 60А в
течении одной секунды).
</div><div><br /></div>
<div></div>
<div>Появились новые функции, опять-таки относительно EL3413 / EL3403:</div>
<div><ul style="text-align: left;"><li>данные обновляются чаще, до 10мс (50Гц);</li><li>обсчитывается больше гармоник (до 63);</li><li>полностью конфигурируемые PDO;</li><li>статистика измерения: мин-макс-среднее;</li><li>детектирование выбросов тока и напряжения;</li><li>измерение cos(𝜑) — коэффициент мощности (power factor);</li><li>измерение угла фаз;</li><li>сообщает об авариях: перекос фаз, утечки токов, и т. п.</li><li>КЗ: около одной микросекунды для тока и напряжения.</li></ul></div>
<div><br /></div><div><br /></div>
<h3 style="text-align: left;">Измерение</h3><div><br /></div>
<div>Все очень просто: EL37xx + TF3650. Основной акцент на новую (теперь в 2020 г. уже нет) библиотеку <b>TF3650 | TC3 Power Monitoring</b>.</div><div><br /></div>
<div><br /></div>
<h2 style="text-align: left;">Контроль и мониторинг питания</h2><div><br /></div>
<div><b>TF3650 | TC3 Power Monitoring</b> — это ПЛК библиотека для обработки "сырых" данных, полученных от модуля, для одно- и трехфазных систем. Краткое содержание:</div><div><ul style="text-align: left;"><li>ФБ для расчета RMS тока, напряжения и мощности.</li><li>Вывод мгновенных или усредненных, минимальных и максимальных значений
измеренных величин.</li><li>Частоты, спектры, гармноники</li></ul><div><br /></div></div>
Nikolai Voroninhttp://www.blogger.com/profile/06095643959617325612noreply@blogger.com0tag:blogger.com,1999:blog-3387439264291014573.post-57159962684814672592020-08-04T19:05:00.102+03:002020-08-05T10:44:48.005+03:00Всё есть файлВ Unix/Linux устройства могут выступать в качестве файла или
бинарного/символьного потока. Такая философия позволяет работать с потоком
данных устройства, как с обычным файлом: открываем-читаем-пишем. Все что нужно —
это иметь права доступа к устройству и знать протокол и структуру данных. В
Windows иногда тоже можно. Попробуйте, например, создать на рабочем столе файл с
именем <i>com2.txt.</i> Будет занято.
<div><br /></div>
<div><br /></div>
<h2 style="text-align: left;">Источник</h2>
<div><br /></div>
<div>
Сначала нужно определиться, что именно будем читать. Для начала я не стал
брать последовательные порты или другие устройства, а решил воспользоваться
псевдоустройством... поэтому будем читать случайные числа из
<span style="background-color: #fff2cc;">/dev/urandom</span>. Это не совсем
то, что мне хотелось бы проверить, но пока обойдемся этим. Как вариант можно
считать память операционной системы через
<span style="background-color: #fff2cc;">/dev/mem</span>. Сервис TwinCAT под
BSD запускается с <i>root</i> доступом, поэтому проблем возникнуть не должно.
</div>
<div><br /></div>
<div>
Прочитанное из устройства, можно просто сохранить в массив, но мы сделаем два
дела сразу — кроме чтения устройства, сохраним результат в файл, лежащий на
другом ПЛК. Итого: два ПЛК (один с TC/BSD, другой с Windows), соединены
обычной локальной сетью Ethernet. На одном ПЛК читаем случайные числа из
файла-псевдоустройства, а результат сохраняем на другой ПЛК в настоящий файл.
</div>
<div><br /></div>
<div><br /></div>
<h2 style="text-align: left;">Код</h2>
<div><br /></div>
<div>
Код настолько простой, что смотреть особенно не на что: ряд обычных файловых
операций. Именно в этом заключается преимущество подхода "всё есть файл".</div>
<div><br /></div>
<script src="https://gist.github.com/nikvoronin/e238b36e18d2db87a04d50dc9ba67879.js"></script>
<div><br /></div>
<div>
Открывать несколько файлов можно с помощью одного и того же ФБ. Главное делать
это последовательно: сначала один, затем другой. Основная задача получить
хендлер файла для дальнейших файловых операций. Нам нужно получить два
хэндлера, от двух файлов, заданных следующими
путями: <i>sDevPath</i> — задает путь к источнику
<i>'/dev/urandom'</i> и <i>sResPath</i> — путь к файлу с
результатом 'c:\dev\random.txt'. Сразу видно — где Юникс, а где Виндовс
(подсказка, обратить внимание на /слэши/ в путях). В финале добавим в
константы <i>VAR CONSTANT</i> адрес удаленного ПЛК:
<i>sRemoteNetId</i> = '172.17.176.49.1.1'.
</div>
<div><br /></div>
<div>
Будем читать бинарные данные, то есть числа в виде потока байтов. Поэтому при
открытии файла необходимо установить флаг бинарного режима чтения <span style="background-color: #fff2cc;">nMode := ... FOPEN_MODEBINARY</span>. Кстати, читать можно и блоками по несколько килобайт за раз, но в данном
случае так проще сохранять числа в виде текста.
</div>
<div><br /></div>
<div>
В остальном все очень просто: открываем, читаем, обрабатываем-конвертируем и
сохраняем. Преобразование значения байта как числа из диапазона 0..255 в
текстовый вид делается в строке:
</div>
<div><pre>tmpStr := CONCAT(BYTE_TO_STRING(buf), '$r$n');</pre></div>
<div>
... а в конце добавляем символ <i>'$r$n'</i> — перевод каретки CRLF, таким
образом выстраивая числа в столбик. Позднее, я засуну эти случайные числа в
Эксель для анализа.
</div>
<div><br /></div>
<div>
Набрав достаточное количество чисел, стоит вежливо остановить процесс через
принудительную установку переменной <i>RUN</i> в значение <i>FALSE</i>. Резкая
остановка работы программы, чревато тем, что на приемной стороне файл с
результатом останется открытым и занятым: ни прочитать, ни удалить. Если такое
произойдет, необходимо на приемной стороне вручную перезапустить системный
сервис <i>TwinCAT System Service</i> или выполнить из командной строки с
привелегиями администратора:
<span style="background-color: #fff2cc;">powershell -command "Restart-Service TcSysSrv -Force"</span>. Заметьте, какой уровень доверия возникает на двух ПЛК, между которыми
налажен роутинг. Это к вопросу о безопасности и отказоустойчивости по обе
стороны сетевого кабеля.
</div>
<div><br /></div>
<div><br /></div>
<h2 style="text-align: left;">Анализируем случайные числа</h2>
<div><br /></div>
<div>
В Юникс системах есть несколько генераторов случайных чисел. Они отличаются
надежностью, скоростью, блокировками, чем-либо еще, поэтому их несколько.
Анализировать можно даже случайные числа, тем более, что они псевдослучайные.
Например, можно посмотреть как числа распределены и устраивает ли это
раработчика, технолога или просто любопытного человека.
</div>
<div><br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg80LVklRNcvDqdZaYSMccovcGkKxU4y9B44SQRn4N3O_sHgnrsv7NtXwafEY6RY7FW3-OICEoY4oGCmPpEptVGn3XcVzJ97tgmamwScuUHkQX-ovpp5fUW5WyoFUfbExzvrvwA897w7fzb/s801/distribution-freq-n-scatter.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="288" data-original-width="801" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg80LVklRNcvDqdZaYSMccovcGkKxU4y9B44SQRn4N3O_sHgnrsv7NtXwafEY6RY7FW3-OICEoY4oGCmPpEptVGn3XcVzJ97tgmamwScuUHkQX-ovpp5fUW5WyoFUfbExzvrvwA897w7fzb/d/distribution-freq-n-scatter.png" /></a>
</div>
<div><br /></div>
<div>
Интересно посмотреть как распределяется нагрузка по ядрам. Всего виртуальной
машине выделены два ядра, но не факт, что ядра настоящие: возможно, что и
просто два потока (хост с гипертредингом). Зато видно как нагружен
<i>TcSystemService</i> — системный сервис TwinCAT:
</div>
<div><br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgo6hWgqMvga7gv85XTW4ftC_k04Xl1lQ4DJA31sJtj1UP-rbDEWvNaQ8XUm_WWj2Dzw1ddZssZQbCw68yqFd2SfJ4lVBadusyMETWUGazT5cwV_hHbl6q-a1BjXC709mww6yQEK7znJJMJ/s800/htop-var-run-tcsystemservice.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="177" data-original-width="800" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgo6hWgqMvga7gv85XTW4ftC_k04Xl1lQ4DJA31sJtj1UP-rbDEWvNaQ8XUm_WWj2Dzw1ddZssZQbCw68yqFd2SfJ4lVBadusyMETWUGazT5cwV_hHbl6q-a1BjXC709mww6yQEK7znJJMJ/d/htop-var-run-tcsystemservice.png" /></a>
</div>
<div><br /></div>
<div>
Вместо диспетчера задач здесь используется утилита <i>top</i> или
можно установить более красивый <i>htop</i>:
<span style="background-color: #fff2cc;">doas pkg install htop</span>. На
картинке выше используется <i>htop</i>.
</div>
Nikolai Voroninhttp://www.blogger.com/profile/06095643959617325612noreply@blogger.com0tag:blogger.com,1999:blog-3387439264291014573.post-9957345861997076732020-07-16T19:55:00.006+03:002021-01-21T13:40:11.530+03:00FB_FileLoad и память роутера<div>
Три в одном
<a href="https://infosys.beckhoff.de/content/1033/tcplclib_tc2_system/7083988875.html" target="_blank">FB_FileLoad</a>
умеет загружать файл целиком в память. Сам по себе, другие ФБ для работы с
файлами не нужны. Внутри него уже есть <i>FB_FileOpen</i>,
<i>FB_FileRead</i> и <i>FB_FileClose</i>. Два основных вопроса (всего четыре):
</div>
<div>
<ul style="text-align: left;">
<li>асинхронность? Иначе говоря, долгая загрузка должна быть разбита на несколько циклов.</li>
<li>Как быстро загрузит большой файл?</li>
<li>Что с потреблением памяти?</li>
<li>Вдруг свой будет работать лучше?</li>
</ul>
</div>
<div><br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgOMHELvN6lVgx2VzNo7kBYXX8j1-ORFaBWeb1arBR36KFckzxOTjnB-zFHnpJyR_W2P1KSUct_QEV1cz6Psz4s8W4nb_EUMaoWFPd-Ov-hxCydTR9hl-06Hx1_n5tzBxcK5SV5ELHGH23B/s800/fire-hdd-led-when-testing.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="513" data-original-width="800" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgOMHELvN6lVgx2VzNo7kBYXX8j1-ORFaBWeb1arBR36KFckzxOTjnB-zFHnpJyR_W2P1KSUct_QEV1cz6Psz4s8W4nb_EUMaoWFPd-Ov-hxCydTR9hl-06Hx1_n5tzBxcK5SV5ELHGH23B/d/fire-hdd-led-when-testing.jpg" /></a>
</div>
<div><br /></div>
<div>Используется библиотека <i>Tc2_System</i> версия 3.4.22.0</div>
<div>Базовое время цикла: 1мс</div>
<div>Время цикла ПЛК задачи: 1мс</div>
<div>
ПЛК:
CX5010-1110</div>
<div><br /></div>
<div><br /></div>
<h2 style="text-align: left;">Увеличение памяти. Бесплатно</h2>
<div><br /></div>
<div>
<div>
Память ПЛК = 512 Мб. Подсмотреть ее объем можно в панели управления:
</div>
<div><br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjjoymDUO_N9RZi57iEuCyfa5JohwyEraYGH3VeMy6fopTZvyNDIB5sFY_uu4BQUMKuIE9EQB1qvm4O7r2KNH5bhcIGAVTP2z36VC5Sr2UGF7GEHTIR1sFdsl2HPUIyk4iME4EMgFZA3cL5/s468/plc-memory-size.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="193" data-original-width="468" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjjoymDUO_N9RZi57iEuCyfa5JohwyEraYGH3VeMy6fopTZvyNDIB5sFY_uu4BQUMKuIE9EQB1qvm4O7r2KNH5bhcIGAVTP2z36VC5Sr2UGF7GEHTIR1sFdsl2HPUIyk4iME4EMgFZA3cL5/d/plc-memory-size.png" /></a>
</div>
<div><br /></div>
<div><br /></div>
<div>
Я пытался загрузить файл размером около 32.7Мб, а получил ошибку 0x070A
(1802)
<a href="https://infosys.beckhoff.com/content/1033/tcplclib_tc2_system/99079192176427915.html" target="_blank">ADSERR_DEVICE_NOMEMORY</a> — не хватает памяти. Причем на старте нехватка памяти в
<i>FB_FileLoad</i> не проверяется, а выясняется только по окончании
марлезонского балету. Получается, что ФБ что-то там грузит до последнего, а
потом внезапно память у него заканчивается. И судя по времени загрузки,
загрузить получается, но что-то в конце не складывается, идет не так как
было задумано и каменный цветок в итоге не выходит. Что с памятью?
</div>
<div><br /></div>
<div>
Во первых, код захватывает память статически: ему памяти либо хватает, либо
он просто не соберется. Вот что пишет компилятор:
</div>
<blockquote>
Size of generated code: 58432 bytes <br />Size of global data: 35024176
bytes <br />
<br />Total allocated memory size for code and data: 64445200 bytes
</blockquote>
<div>
Здесь все нормально. Возможно что-то выделяется динамически из памяти
роутера? Начинаю увеличивать память роутера: при 100 Мб контроллер все еще
работал, а при 300Мб вообще ничего не запустилось. Остановился на 50 Мб,
должно хватить. И хватило.
</div>
</div>
<div>
<div><br /></div>
<div>
Со времен статьи про
<a href="https://gotwincat.blogspot.com/2019/06/dynamic-memory-allocation-with-new-and-delete.html" target="_blank">New, Delete и память роутера</a>, то есть про динамическую память произошли небольшие изменения. Объем
памяти настраивается все там же: <span style="background-color: #fff2cc;">System → Real-Time → Router Memory → Configured Size [MB] -
мегабайты!</span>
</div>
<div>
...но теперь для активации необходимо не только активировать конфигурацию,
но и перезагрузить контроллер. Подробнее см.
<a href="https://gotwincat.blogspot.com/2020/07/tc3-how-is-loading-currentconfig-parameters.html" target="_blank">как загружаются параметры конфигурации</a>. Ну и теперь нам показывают чуть больше информации:
</div>
<div><br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEghA8-lntezBWWZB26u4l8jgMTJ2GROMQwS-cdxEbnkuqbGl0G37ZBaMtdXbbUQHqn7n7hk23_dh7_wz3VxZjzdt0-4y0lAcNkHg7e5fdArpIxZO3mWii9gxeo74mQVnDUw64u5Vll4E4LK/s566/enlarge-your-router-memory.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="318" data-original-width="566" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEghA8-lntezBWWZB26u4l8jgMTJ2GROMQwS-cdxEbnkuqbGl0G37ZBaMtdXbbUQHqn7n7hk23_dh7_wz3VxZjzdt0-4y0lAcNkHg7e5fdArpIxZO3mWii9gxeo74mQVnDUw64u5Vll4E4LK/d/enlarge-your-router-memory.png" /></a>
</div>
<div><br /></div>
<div><br /></div>
<div>
Когда памяти стало хватать, а файл стал загружаться без ошибок, я взял
<a href="https://infosys.beckhoff.com/content/1033/tcplclib_tc2_utilities/9007199289741963.html" target="_blank">FB_GetRouterStatusInfo</a>
и стал пристально следить за памятью роутера: <br />
</div>
<blockquote>Доступно всего, maxMem = 52428800 <br /><br />
До старта копирования, maxMemAvail = 52395456 <br />
После копирования, maxMemAvail = 52395456</blockquote>
<div>
Тоже все нормально, но внезапно я подключил <i>Scope</i> и все встало
на свои места. По вертикальной оси отмечены байты, отмасштабированные в
тысячах, хотя мегабайты должны быть кратны 1024, поэтому есть небольшое
расхождение в итоговых цифрах объема:
</div>
</div>
<div>
<div><br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi6ycdo5qBLYECBlq614PvfY8QzfMow7H-W6pS7HA_XxZHn21XjpOxMPf_-0_qcEGfpM0M2plJouuCTzOWNRXi9bu3nbynQlJjEJhoq0u2fk2zkYN27Y5CvIHmXTtBT_IUBdTRiaPYE0BZf/s735/50mb-router-memory.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="217" data-original-width="735" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi6ycdo5qBLYECBlq614PvfY8QzfMow7H-W6pS7HA_XxZHn21XjpOxMPf_-0_qcEGfpM0M2plJouuCTzOWNRXi9bu3nbynQlJjEJhoq0u2fk2zkYN27Y5CvIHmXTtBT_IUBdTRiaPYE0BZf/d/50mb-router-memory.png" /></a>
</div>
<div><br /></div>
<div>
Вот эта просадка — в виде красной ямы, происходит в конце загрузки. Система
куда-то грузит файл, затем выделяет под него память роутера, что-то делает,
затем данные появляются в моем статическом массиве, и тут же освобождается
память роутера. Зачем?
</div>
<div><br /></div>
<div>
Загрузка длится долго, около 30 секунд (см. ниже), буфер заполняется
постепенно, а итоговый массив с данными доступен весь и на всем протяжении
загрузки. Возможно, именно по этой причине, от нас временно пытаются скрыть
недозагруженные куски данных. Я попробовал выделить буфер динамически
— через команду <i>__NEW</i>, ну и получил очередную нехватку памяти,
так как от 50 мб осталось только 17 Мб и буфер под копирование выделять уже
было не из чего.
</div>
</div>
<div><br /></div>
<div><br /></div>
<h2 style="text-align: left;">Timeout</h2>
<div><br /></div>
<div>
<div>
Если ФБ загружает долго (а большие файлы он грузит долго), то при таймауте
ФБ выдает ошибку 0x0745 (1861)
<a href="https://infosys.beckhoff.com/content/1033/tcplclib_tc2_system/99079192176427915.html" target="_blank">ADSERR_CLIENT_SYNCTIMEOUT</a>. Но почему таймаут срабатывает через в два раза больший промежуток
времени: задаешь 2сек — срабатывает через 4, задаешь 5 сек — срабатывает через 10; 10 сек → 20 сек. Причем код ошибки
<i>nErrId</i> формируется через заданное время, а флаг ошибки
<i>bError</i> устанавливается спустя еще один промежуток таймаута (начиная
от установки кода ошибки). Итого, получаем удвоенное время. Это баг или
фича?
</div>
<div><br /></div>
<div>
Я поставил таймаут в один час T#1H и этого должно хватить на загрузку. И
хватило.
</div>
</div>
<div><br /></div>
<div><br /></div>
<h2 style="text-align: left;">Тестируем оригинал</h2>
<div><br /></div>
<div>
<div>
Под рукой был большой файл бинарного содержания
<span style="background-color: #fff2cc;">/Hard Disk/NK.BIN</span> размером
около ~32.7Mb. Загружаем его несколько раз: <br />
</div>
<pre>= 26,078 сек.
= 26,075 сек.
= 26,095 сек.
</pre>
<div>
Исходный код чтобы обратить внимание на таймаут в T#1h и напомнить про тест
памяти:
</div>
<div><br /></div>
</div>
<script src="https://gist.github.com/nikvoronin/b93b4b448e699798a4e390f53857f878.js"></script>
<div><br /></div>
<div><br /></div>
<h2 style="text-align: left;">Пишем свой FileLoad c буферами и чартами</h2>
<pre> 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 сек
</pre>
<div>
<div>
<div>
По результатам строим самый настоящий график из Экселя. Ось Y конечно же
не от нуля: там секунды, а они в 1000 раз больше миллисекунд, поэтому —
норм. По оси абсцисс отложен размер временного буфера или размер блока
байт, которые за раз подгружаются из файла (чтение идет блоками):
</div>
<div><br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiW6wrq_XfWffD1febUdDqC2pe9Wm2PLjDw8vZUVUlmtckq3-Sb48dLfRPTq-0dWGJ1By-PzIoNy3OhEwkZtVXtkv4Wt2o5W3eYi6_GNzO1mfORfDwKk1mSZVd0xY6Tg3Z0BwWrqa0eiDy_/s802/buffer-size-total-read-time.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="289" data-original-width="802" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiW6wrq_XfWffD1febUdDqC2pe9Wm2PLjDw8vZUVUlmtckq3-Sb48dLfRPTq-0dWGJ1By-PzIoNy3OhEwkZtVXtkv4Wt2o5W3eYi6_GNzO1mfORfDwKk1mSZVd0xY6Tg3Z0BwWrqa0eiDy_/d/buffer-size-total-read-time.png" /></a>
</div>
<div><br /></div>
<div><br /></div>
<div>Исходный код не зависящий от памяти роутера</div>
<div><br /></div>
</div>
<script src="https://gist.github.com/nikvoronin/2762f37b967562a7d473f14f0a2ed99d.js"></script>
</div>
Nikolai Voroninhttp://www.blogger.com/profile/06095643959617325612noreply@blogger.com0tag:blogger.com,1999:blog-3387439264291014573.post-25958596694765629122020-07-03T18:21:00.012+03:002021-01-21T13:41:54.152+03:00Установка TC/BSD BetaFreeBSD вместо Linux. Было известно еще в прошлом году, тогда же можно было
попробовать. Поэтому некий срез, который c прошлого 2019 года местами подзавял, но уж как есть.<div><br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEggGFD_cJ1wEnMynDvtyCAp_kuwLYP1yUstvNVeO4gxOCOoBvDjOP4as3E1Y_hBtX3r_lwZSz7rh285_i-4F7qHAEZVXw_mWySTmPEJlsC97lMgsRLf800pNJWucLToI5-R9SG-yHV-Viz6/s580/freebsdlogo-580x358.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="358" data-original-width="580" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEggGFD_cJ1wEnMynDvtyCAp_kuwLYP1yUstvNVeO4gxOCOoBvDjOP4as3E1Y_hBtX3r_lwZSz7rh285_i-4F7qHAEZVXw_mWySTmPEJlsC97lMgsRLf800pNJWucLToI5-R9SG-yHV-Viz6/d/freebsdlogo-580x358.jpg" /></a>
</div>
<div><br /></div>
<div><br /></div>
<h2 style="text-align: left;">Новости</h2>
<div><br /></div>
<div>
<b>PC-Control</b>, апрель 2019, стр. 7: "Основные моменты автоматизации:
TwinCAT, бьющееся сердце системы Beckhoff, набирает обороты с важной
инновацией в сегменте автоматизации: TwinCAT впервые будет доступен и в
операционной системе, отличной от Windows. "TwinCAT/BSD основан на FreeBSD,
зарекомендовавшей себя, исключительно надежной и продвинутой ОС с открытым
исходным кодом, которая уходит корнями в 80-е годы", - говорит управляющий
директор. Она также позволяет запускать большое количество программ Linux. В
то же время TwinCAT/BSD не подчиняется условиям лицензии Linux GPL. С точки
зрения компании, лицензирование BSD позволяет распространять программное
обеспечение для автоматизации среди поставщиков и пользователей в обычным для
отрасли образом, поскольку такая лицензия не требует открывать исходный код
программного обеспечения."
</div>
<div><br /></div>
<div><br /></div>
<div>
<b>Youtube</b>, 10 февраля 2020: TwinCAT/BSD объединяет рантайм XAR
TwinCAT 3 и FreeBSD, проверенной в промышленности и надежной операционной
системой с открытым исходным кодом. TwinCAT/BSD поддерживает все функции
TwinCAT 3 и дополнительно позволяет использовать современный HMI TwinCAT на
основе HTML5.
</div>
<div><br /></div>
<div>
<div class="separator" style="clear: both; text-align: center;">
<iframe allowfullscreen="true" class="BLOG_video_class" height="448" src="https://www.youtube.com/embed/2q4zgnCVkK4" width="800" youtube-src-id="2q4zgnCVkK4"></iframe>
</div>
</div>
<div><br /></div>
<div>
<div><br /></div>
</div>
<h3 style="text-align: left;"><b>Сейчас</b></h3>
<div><br /></div>
<div>Заказная позиция с сайта Beckhoff: CX2900-0026: 20 GB CFast card, 3D flash, extended temperature range (only for
Windows CE or
<span style="background-color: #fce8b2;">TwinCAT/BSD operating systems</span>)</div>
<div>
<div>
TwinCAT/BSD: Operating System for IPC Features, предположительная дата выпуска - второй квартал 2020.
</div>
</div>
<div><br /></div>
<div>Слухов и новостей было достаточно. Поэтому попробовал бету.</div>
<div><br /></div>
<div><br /></div>
<h2 style="text-align: left;">Виртуальная машина</h2>
<div><br /></div>
<div>
<div>
Сделать физическую флэшку с помощью <i>.iso</i> образа и
<i>Etcher</i>
(официальная рекомендация). Подключить-воткнуть флешку в ноутбук.
</div>
<div><br /></div>
<div>
<span style="background-color: #fce8b2;">cd %programfiles%\oracle\virtualbox</span>
</div>
<div><br /></div>
<div>
Выяснить какой номер диска присвоен флэшке. Нужено только номер. Номер
подставить вместо решетки `#` в
<span style="background-color: #fce8b2;">\\.\PhysicalDrive#</span>
</div>
<div><br /></div>
<div>
<span style="background-color: #fce8b2;">VBoxManage internalcommands createrawvmdk -filename
"%USERPROFILE%\.VirtualBox\usb.vmdk" -rawdisk \\.\PhysicalDrive1</span>
</div>
<div><br /></div>
<div>
Получится образ-ссылка на флэшку. Флэшку не вынимать, оставить подключенную.
(!) Запустить VirtualBox от имени Администратора.
</div>
<div><br /></div>
<div>
Для виртуальной машины отключить все диски и добавить один IDE контроллер
Master диск со ссылкой на <i>usb.vmdk</i>, созданный ранее, и один SATA
диск (размер минимум 16 Гб, можно динамически расширяемый).
</div>
<div><br /></div>
<div>
Запомнить размер SATA диска (или сделать его отличающимся от разера флэшки)
это поможет его отличить от флэшки позднее при установке BSD. Предположим
флэшка 8Гб, тогда SATA диск 10Гб или 20Гб.
</div>
<div><br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiCnI99tJ8SO-IStD2DAScBjRSoWS43_5h9z2pzH_QVqI3RHNcnbz-E3tHTj-k8D6WhDpffQHjBfzKM0urK9sPt-CsGmnikNcYXmNzvoq_rYVDMnHzO9sOt1dZLnHBsIO9XjVktIHVoX1-m/s800/VirtualBox_TC-BSD_11_12_2019_09_25_44.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="288" data-original-width="800" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiCnI99tJ8SO-IStD2DAScBjRSoWS43_5h9z2pzH_QVqI3RHNcnbz-E3tHTj-k8D6WhDpffQHjBfzKM0urK9sPt-CsGmnikNcYXmNzvoq_rYVDMnHzO9sOt1dZLnHBsIO9XjVktIHVoX1-m/d/VirtualBox_TC-BSD_11_12_2019_09_25_44.png" /></a>
</div>
<div><br /></div>
<div><br /></div>
<div>
Отключить загрузку со всех источников, т. е.
<span style="background-color: #fce8b2;">System → Boot Order</span> должен
быть пустой, все галки сняты. В вирт.машине включить поддержку
<span style="background-color: #fce8b2;">System → Enable EFI</span>.</div>
<div><br /></div>
<div>Загрузиться с флэшки.</div><div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjphmwrB1RZzOlzxgeJYIMNGIp4MTOy3_LiO44lFkAfJdU6rrXlXFGjl2IZcSbmhcGiL21l87j3_xSFn0n8cNJ6KrAMpDvWhmnoUNWkLmRbzAhMzUltdHIVgOZ72W0xOk8O8FO83rC0xjp0/s800/VirtualBox_TC-BSD_11_12_2019_09_25_04.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="407" data-original-width="800" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjphmwrB1RZzOlzxgeJYIMNGIp4MTOy3_LiO44lFkAfJdU6rrXlXFGjl2IZcSbmhcGiL21l87j3_xSFn0n8cNJ6KrAMpDvWhmnoUNWkLmRbzAhMzUltdHIVgOZ72W0xOk8O8FO83rC0xjp0/d/VirtualBox_TC-BSD_11_12_2019_09_25_04.png" /></a></div><div><br /></div><div><br /></div>
<div>Установить на SATA диск (см. картинку выше). Отключить вирт. машину и удалить контроллер IDE вместе с линком на
vmdk-образ флэшки. Включить вирт. машину и загрузиться.</div>
<div><br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiCAHxbTxEdzEH8D1YVYhuQNyT5Nd_OwAUfJdQPW1YYr3fiqR_uB1i-hOpsmO3cVQDBPkyFu6cIFko_JJvhuUcUG_sSKtyTbszt5-d9sBI-mM1UISbln_WdBcTdPm6vDoiO93gZV6z2tXwE/s574/VirtualBox_TC-BSD_11_12_2019_14_01_01.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="452" data-original-width="574" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiCAHxbTxEdzEH8D1YVYhuQNyT5Nd_OwAUfJdQPW1YYr3fiqR_uB1i-hOpsmO3cVQDBPkyFu6cIFko_JJvhuUcUG_sSKtyTbszt5-d9sBI-mM1UISbln_WdBcTdPm6vDoiO93gZV6z2tXwE/d/VirtualBox_TC-BSD_11_12_2019_14_01_01.png" /></a></div>
<div>login: Administrator</div>
<div>passwd: 1</div>
<div><br /></div>
<div><br /></div>
<h2 style="text-align: left;">Команды и кнопки системы</h2>
<div><ul style="text-align: left;"><li>Клавиша клавиатуры <i>Scroll Lock</i> включает-выключает вертикальную прокрутку
консоли. Непосредственно прокрутка производится клавишами <i>PgUp/PgDown</i>.</li><li><i>Alt+F1..F13</i> — переключает виртуальные консоли</li><li><i>dmesg</i> — загрузка устрйоства при старте системы</li><li>`#` в начале строки, означает запуск с рутовыми правами. Например, <span style="background-color: #fce8b2;">doas ps -a</span></li><li>`%` в начале строки, запуск с правами текущего пользователя.</li><li>Простой редактор текстов <i>EasyEditor</i>. Команда `ee` из командной строки. Например, <span style="background-color: #fce8b2;"># ee <имя
файла></span></li></ul></div>
<div><br /></div><div><br /></div>
<h2 style="text-align: left;">Доп пакеты</h2>
<div><blockquote><i>`doas`</i> в начале команд нужен для временного разрешения запуска под
рутовыми правами. Это аналог <i>`sudo`</i> в линуксе.</blockquote></div>
<div>
Посмотреть какие репозитории подключены в данный момент можно с помощью
команды <span style="background-color: #fce8b2;"># pkg -vv</span> (да-да, с двойной `vv` на конце).</div>
<div>Официальные пакеты прописаны в <span style="background-color: #fce8b2;">/etc/pkg/Train.conf</span>, но там только самое необходимое.</div>
<div>Доп. пакеты подключаются: <span style="background-color: #fce8b2;"># cp /etc/pkg/FreeBSD.conf /usr/local/etc/pkg/repos/FreeBSD.conf</span></div>
<div>
Если после этого удалить <span style="background-color: #fce8b2;">/etc/pkg/Train.conf</span> официальный репозиторий пакетов станет недоступен.</div>
<div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgYJ_NEvOz4e6v6Ffdftn61oVbn1UiUTIPcq20GbgBHP64SElYdulVU2NEqkt02eKevjU-xuWjmsJkObqt0QpwNbSJng09bZxHDa_Mb8pvFP6ffeWbdcu0dso5VXA-L6bAfcBgPClsRXSOJ/s800/vmbox_console-top.png" style="margin-left: 1em; margin-right: 1em; text-align: center;"><img border="0" data-original-height="657" data-original-width="800" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgYJ_NEvOz4e6v6Ffdftn61oVbn1UiUTIPcq20GbgBHP64SElYdulVU2NEqkt02eKevjU-xuWjmsJkObqt0QpwNbSJng09bZxHDa_Mb8pvFP6ffeWbdcu0dso5VXA-L6bAfcBgPClsRXSOJ/d/vmbox_console-top.png" /></a></div><div><br /></div><div><br /></div>
<h2 style="text-align: left;">Guest расширения VirtualBox</h2>
<div><br /></div>
<div>Просвещаться на <a href="https://wiki.freebsd.org/VirtualBox" target="_blank">Wiki FreeBSD VirtualBox</a>.</div>
<div><br /></div>
<div><span style="background-color: #fce8b2;"># pkg install emulators/virtualbox-ose-additions</span></div>
<div><span style="background-color: #fce8b2;"># pw groupmod wheel -m Administrator</span> — чтобы в дальнейшем работал буфер
обмена и др. плюшки граф. оболочек.</div>
<div><span style="background-color: #fce8b2;"># ee /etc/rc.conf</span> — откроется простой текстовый редактор, добавить в конец файла следующие строки:</div>
<div><br /></div><div>vboxguest_enable="YES"</div>
<div>vboxservice_enable="YES"</div><div class="separator" style="clear: both; text-align: center;"><div class="separator" style="clear: both; text-align: center;"><br /></div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiLNdhbdlaXuvsYVaFZJHg1jc78jSOOA2L12rmYhyphenhyphenv77ZdT76k7x5DvTgu6RbsUjCFwt8sAuHli9xfeIgSTgDTIEcATgPkg6SxruxrmwSQSCGzt6J984f4UJzrYMYoPHLFrSsycLX2XmIR4/s800/VirtualBox_TC-BSD_11_12_2019_10_01_36.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="491" data-original-width="800" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiLNdhbdlaXuvsYVaFZJHg1jc78jSOOA2L12rmYhyphenhyphenv77ZdT76k7x5DvTgu6RbsUjCFwt8sAuHli9xfeIgSTgDTIEcATgPkg6SxruxrmwSQSCGzt6J984f4UJzrYMYoPHLFrSsycLX2XmIR4/d/VirtualBox_TC-BSD_11_12_2019_10_01_36.png" /></a></div><div><br /></div><div><br /></div>
<div>
Для завершения редактора и сохранения нажать <span style="background-color: #fce8b2;">Escape → a → a</span>. Эскейп
срабатывает медленно, не стоит торопиться.</div>
<div>Перезагрузиться: <span style="background-color: #fce8b2;">doas reboot</span></div>
<div><br /></div><div><br /></div>
<h2 style="text-align: left;">Midnight Commander</h2>
<div><br /></div>
<div>Файловый двух-панельный менеджер, Norton/Total Commander из мира *nix.</div>
<div><br /></div>
<div>Установка: <span style="background-color: #fce8b2;"># pkg install mc</span></div>
<div>Запуск из командной строки: <span style="background-color: #fce8b2;">mc</span></div>
<div><br /></div>
<div><br /></div><h2 style="text-align: left;">XFCE4</h2>
<div><br /></div>
<div><a href="https://www.linuxphoto.com/2019/06/25/how-i-installed-xfce-on-freebsd/" target="_blank">Самое простое описание установки</a>. Человек наелся говна на форумах и свел все к простому списку действий. Спасибо!</div>
<div>Драйверы графики для AMD-Intel-Noname: <span style="background-color: #fce8b2;"># pkg install drm-kmod</span></div>
<div><br /></div><div>но(!)</div>
<div><br /></div><div><a href="https://www.freshports.org/emulators/virtualbox-ose-kmod" target="_blank">Драйверы для графики VirtualBox</a>: <span style="background-color: #fce8b2;"># pkg install emulators/virtualbox-ose-kmod</span></div>
<div><br /></div>
<div><span style="background-color: #fce8b2;">doas ee /etc/rc.conf</span></div>
<div>добавить строки</div><div><span style="background-color: #fce8b2;">kld_list="/boot/modules/i915kms.ko"</span> — для граф. адаптера <i>Intel</i>.</div>
<div><span style="background-color: #fce8b2;">kld_list="/boot/modules/vboxdrv.ko"</span> — для виртуального граф. адаптера <i>vbox</i>.</div>
<div><span style="background-color: #fce8b2;">dbus_enable="YES"</span></div>
<div><br /></div>
<div>Перезагрузиться: <span style="background-color: #fce8b2;">doas reboot</span></div>
<div><br /></div>
<div><span style="background-color: #fce8b2;"># pkg install xorg</span></div>
<div><span style="background-color: #fce8b2;"># pkg install xfce</span></div>
<div><br /></div>
<div>
Если установка прервалась по какой-либо причине (упало интернет соединение),
то повторить команды: установка продолжиться с прерванного пакета.</div>
<div>Запуск из командной строки: <span style="background-color: #fce8b2;">startxfce4</span></div><div><span style="background-color: #fce8b2;"><br /></span></div>
<div><br /></div>
<h2 style="text-align: left;">Общие каталоги</h2>
<div><br /></div>
<div>
В настройках вирт. машины настроить каталог для шаринга файла между хостом и
гостем.
</div>
<div>В вирт. машине под <i>xfce4</i> запустить терминал. Ввести:</div>
<div><br /></div>
<div><span style="background-color: #fce8b2;"># mount_vboxvfs -w myshare /mnt</span>, где</div>
<div><br /></div>
<div><i>myshare</i> — название шары как ресурса или точки монтирования (это не название
каталога!);</div><div><i>/mnt</i> — куда подмонтировать: каталог должен присутствовать,
автоматически он не создается (здесь вам не виндус). </div><div><br /></div><div>Название шары (здесь <i>myshare</i>) указывается при настройке виртуальной машины <span style="background-color: #fce8b2;">Shared Folder → Add Share → Mount point</span>.</div>
<div>Теперь можно таскать файлы между Windows и Tc/BSD туда-обратно. </div>
<div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhBGAW3peM0I_mEZCbP5RQyalWyVlVozUSZqVBk-35OyjqXlLQO1WFgSO67Tt-y-S7r0XnZ_6mEMaWQeQNxVTozfG7KlBO3gytvV3MBmiDNNWhJkN81k7Nm28xgz83VK8wdGY6HGN6IkIOr/s638/host-router-find-tcbsd-plc.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="252" data-original-width="638" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhBGAW3peM0I_mEZCbP5RQyalWyVlVozUSZqVBk-35OyjqXlLQO1WFgSO67Tt-y-S7r0XnZ_6mEMaWQeQNxVTozfG7KlBO3gytvV3MBmiDNNWhJkN81k7Nm28xgz83VK8wdGY6HGN6IkIOr/d/host-router-find-tcbsd-plc.png" /></a></div><div><br /></div><div><br /></div>
<h2 style="text-align: left;">Git</h2>
<div><br /></div>
<div><span style="background-color: #fce8b2;"># pkg install git</span></div>
<div><br /></div>
<div><br /></div><h2 style="text-align: left;">.NET Core 3</h2>
<div><br /></div>
<div><a href="https://github.com/jasonpugsley/core-sdk/wiki/.Net-Core-3.0.0-for-FreeBSD" target="_blank">.Net-Core-3.0.0-for-FreeBSD</a> — нужно всё скачать и выполнить все следующие пункты.</div><div><br /></div>
<div><br /></div>
<h3 style="text-align: left;">Необходимые пакеты</h3>
<div><br /></div>
<div><span style="background-color: #fce8b2;"># pkg install libunwind lttng-ust icu curl openssl111 bash git llvm60 cmake
krb5</span></div>
<div><span style="background-color: #fce8b2;"># ln -s /usr/local/bin/bash /bin/bash</span></div>
<div><br /></div><div><br /></div>
<h3 style="text-align: left;">.NET Core 3.0.0 prebuilt SDK</h3>
<div><br /></div>
<div>
Скачать
<a href="https://1drv.ms/u/s!AjHOiYW2Lw2OixlIm6XHWk67IPMc?e=cqMgbV" target="_blank">dotnet-sdk-3.0.100-freebsd-x64.tar.gz</a> и через расшареную папку скопировать в виртуальную машину. Распаковать в <span style="background-color: #fce8b2;">~/dotnet-sdk</span></div>
<div><br /></div><div><span style="background-color: #fce8b2;">mkdir ~/dotnet-sdk</span></div>
<div><span style="background-color: #fce8b2;">tar xf dotnet-sdk-3.0.100-freebsd-x64.tar.gz -C ~/dotnet-sdk</span></div>
<div><br /></div>
<div><br /></div><h3 style="text-align: left;">Essential .Net NuGet Base Packages</h3>
<div><br /></div>
<div>
Скачать <a href="https://1drv.ms/u/s!AjHOiYW2Lw2OixosgHKJbFPc9Nxr?e=VpK1CU" target="_blank">dotnet_pkgs-3.0.0-freebsd.tar</a>. Через расшареную папку скопировать в виртуальную машину. Распаковать в <span style="background-color: #fce8b2;">~/dotnet_pkgs</span></div>
<div><br /></div><div><span style="background-color: #fce8b2;">mkdir ~/dotnet_pkgs</span></div>
<div><span style="background-color: #fce8b2;">tar xf dotnet_pkgs-3.0.0-freebsd.tar -C ~/dotnet_pkgs</span></div>
<div><br /></div><div><br /></div>
<h3 style="text-align: left;">NuGet</h3>
<div><br /></div>
<div>
Создать или отредактировать файл настроек <span style="background-color: #fce8b2;">~/.nuget/NuGet/NuGet.Config</span>. Добавить в него</div>
<div><br /></div>
<pre style="text-align: left;"><?xml version="1.0" encoding="utf-8"?><br /><configuration><br /> <packageSources>
<add key="local_pkgs" value="/home/Administrator/dotnet_pkgs" />
<add key="nuget.org" value="https://api.nuget.org/v3/index.json" protocolVersion="3" /><br /> </packageSources><br /></configuration></pre>
<div><br /></div>
<div>
`Administrator` заменить на имя текущего пользователя или оставить как есть, если текущий пользователь это действительно Администратор (не рут, а именно
Administrator).
</div>
<div><br /></div>
<div><br /></div><h3 style="text-align: left;">Failed to initialize CoreCLR, HRESULT: 0x8007001F</h3>
<div><br /></div>
<div>Описание здесь: <a href="https://www.freshports.org/lang/linux-dotnet-cli/" target="_blank">linux-dotnet-cli</a></div>
<div><br /></div>
<div><span style="background-color: #fce8b2;"># ee /etc/sysctl.conf</span></div>
<div><br /></div><div>Добавить строку: <span style="background-color: #fce8b2;">vm.max_wired=1333000</span></div>
<div>Как вариант, вместе добавления строки можно попробовать из командной строки вызвать команду: <span style="background-color: #fce8b2;"># sysctl vm.max_wired=1333000</span></div>
<div><br /></div>
<div><br /></div><h3 style="text-align: left;">Проверяем работоспособность</h3>
<pre style="text-align: left;">mkdir ~/testapp<br />cd ~/testapp<br />~/dotnet-sdk/dotnet new console -o myApp<br />cd myApp<br />~/dotnet-sdk/dotnet run</pre>
<div><br /></div><div><br /></div>
<h2 style="text-align: left;">Создаем образ диска</h2>
<div><br /></div>
<div><a href="https://www.cyberciti.biz/faq/unix-linux-dd-create-make-disk-image-commands/" target="_blank">How to make disk image with dd on Linux or Unix</a></div>
<div>Подключаем, например, кард-ридер. Добавляем в вирт.машину соответствующее USB-устройство. Запускаем вирт. машину.</div><div><br /></div>
<div>В юниксе получаем список дисковых устройств: <span style="background-color: #fce8b2;"># camcontrol devlist</span>. Нам нужны `ada0` или `da0`, или другой диск. Для всяких сидиромов порядок
именования устройств может быть обратным. </div><div><br /></div><div>Получается что-то вроде следующего:</div>
<pre style="text-align: left;"># 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)
</pre>
<div>Подключаем шару к хост компьютеру (см. выше `общие каталоги`).</div>
<div>Запускаем дупликатор `dd`: <span style="background-color: #fce8b2;"># dd if=/dev/da0 of=/mnt/cfdisk-image-backup.dd bs=128K
conv=noerror,sync status=progress</span></div>
<div><br /></div>
<div>Ждем завершения, долго...</div>
<div><br /></div><div><br /></div>
<h2 style="text-align: left;">Putty</h2>
<div><br /></div>
<div>В случае ошибки: <i>SSH Shell fail - Couldn't agree a key exchange algorithm</i>.</div>
<div>Обновить <i>Putty</i>. В версии 0.73 все работает.</div>
<div><br /></div><div><br /></div>
<h2 style="text-align: left;">VNC</h2>
<div><br /></div>
<div><a href="https://forums.freebsd.org/threads/setting-up-a-vnc-server.27759/" target="_blank">TightVnc</a>: <span style="background-color: #fce8b2;"># pkg install net/tightvnc</span></div>
<div>Бесплатный клиент под Windows — <i>VncViewer</i></div>
<div>...</div><div><br /></div>
</div>
Nikolai Voroninhttp://www.blogger.com/profile/06095643959617325612noreply@blogger.com2tag:blogger.com,1999:blog-3387439264291014573.post-86877520611579754852020-07-03T18:20:00.008+03:002021-01-21T13:42:21.464+03:00Install TC/BSD BetaFreeBSD 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.<div><br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEggGFD_cJ1wEnMynDvtyCAp_kuwLYP1yUstvNVeO4gxOCOoBvDjOP4as3E1Y_hBtX3r_lwZSz7rh285_i-4F7qHAEZVXw_mWySTmPEJlsC97lMgsRLf800pNJWucLToI5-R9SG-yHV-Viz6/s580/freebsdlogo-580x358.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="358" data-original-width="580" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEggGFD_cJ1wEnMynDvtyCAp_kuwLYP1yUstvNVeO4gxOCOoBvDjOP4as3E1Y_hBtX3r_lwZSz7rh285_i-4F7qHAEZVXw_mWySTmPEJlsC97lMgsRLf800pNJWucLToI5-R9SG-yHV-Viz6/d/freebsdlogo-580x358.jpg" /></a>
</div>
<div><br /></div>
<div><br /></div>
<h2 style="text-align: left;">News</h2>
<div><br /></div>
<div>
<b>PC-Control</b>, 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."</div>
<div><br /></div>
<div><br /></div>
<div>
<b>Youtube</b>, 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.".
</div>
<div><br /></div>
<div>
<div class="separator" style="clear: both; text-align: center;">
<iframe allowfullscreen="true" class="BLOG_video_class" height="448" src="https://www.youtube.com/embed/2q4zgnCVkK4" width="800" youtube-src-id="2q4zgnCVkK4"></iframe>
</div>
</div>
<div><br /></div>
<div>
<div><br /></div>
</div>
<h3 style="text-align: left;"><b>Now</b></h3>
<div><br /></div>
<div>Accessories → CX2900-0026: 20 GB CFast card, 3D flash, extended temperature range (only for Windows CE or <span style="background-color: #fce8b2;">TwinCAT/BSD operating systems</span>)</div>
<div>
<div>
TwinCAT/BSD: <a href="https://www.beckhoff.com/english.asp?industrial_pc/news_twincat_bsd.htm" target="_blank">Operating System for IPC Features</a>, estimated market release <u>2nd quarter 2020</u>.
</div>
</div>
<div><br /></div>
<div>There was enough rumors. And I decided to try beta.</div>
<div><br /></div>
<div><br /></div>
<h2 style="text-align: left;">Jack in The Box</h2>
<div><br /></div>
<div>
<div>Make a physical USB flash drive using <i>.iso</i> image and <i>Etcher</i>
(this is an official recommendation). Plug the USB flash drive into the laptop.</div>
<div><br /></div>
<div>
<span style="background-color: #fce8b2;">cd %programfiles%\oracle\virtualbox</span>
</div>
<div><br /></div>
<div>
Find out what drive number is assigned to the flash drive. Only a number is needed. Replace the `#` symbol in <span style="background-color: #fce8b2;">\\.\PhysicalDrive#</span> with that number.</div><div><br /></div>
<div>
<span style="background-color: #fce8b2;">VBoxManage internalcommands createrawvmdk -filename
"%USERPROFILE%\.VirtualBox\usb.vmdk" -rawdisk \\.\PhysicalDrive1</span>
</div>
<div><br /></div><div><div>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 <i>VirtualBox</i> as Administrator.</div><div><br /></div><div>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).</div><div><br /></div><div>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.</div></div><div><br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiCnI99tJ8SO-IStD2DAScBjRSoWS43_5h9z2pzH_QVqI3RHNcnbz-E3tHTj-k8D6WhDpffQHjBfzKM0urK9sPt-CsGmnikNcYXmNzvoq_rYVDMnHzO9sOt1dZLnHBsIO9XjVktIHVoX1-m/s800/VirtualBox_TC-BSD_11_12_2019_09_25_44.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="288" data-original-width="800" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiCnI99tJ8SO-IStD2DAScBjRSoWS43_5h9z2pzH_QVqI3RHNcnbz-E3tHTj-k8D6WhDpffQHjBfzKM0urK9sPt-CsGmnikNcYXmNzvoq_rYVDMnHzO9sOt1dZLnHBsIO9XjVktIHVoX1-m/d/VirtualBox_TC-BSD_11_12_2019_09_25_44.png" /></a>
</div>
<div><br /></div>
<div><br /></div>
<div><div>Disable booting from all sources. <span style="background-color: #fce8b2;">System → Boot Order</span> have to be empty and all options switched off. In the virtual machine, enable support of the EFI: <span style="background-color: #fce8b2;">System → Enable EFI</span>.</div><div><br /></div><div>Boot from the USB flash drive.</div></div><div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjphmwrB1RZzOlzxgeJYIMNGIp4MTOy3_LiO44lFkAfJdU6rrXlXFGjl2IZcSbmhcGiL21l87j3_xSFn0n8cNJ6KrAMpDvWhmnoUNWkLmRbzAhMzUltdHIVgOZ72W0xOk8O8FO83rC0xjp0/s800/VirtualBox_TC-BSD_11_12_2019_09_25_04.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="407" data-original-width="800" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjphmwrB1RZzOlzxgeJYIMNGIp4MTOy3_LiO44lFkAfJdU6rrXlXFGjl2IZcSbmhcGiL21l87j3_xSFn0n8cNJ6KrAMpDvWhmnoUNWkLmRbzAhMzUltdHIVgOZ72W0xOk8O8FO83rC0xjp0/d/VirtualBox_TC-BSD_11_12_2019_09_25_04.png" /></a></div><div><br /></div><div><br /></div>
<div>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.</div><div><br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiCAHxbTxEdzEH8D1YVYhuQNyT5Nd_OwAUfJdQPW1YYr3fiqR_uB1i-hOpsmO3cVQDBPkyFu6cIFko_JJvhuUcUG_sSKtyTbszt5-d9sBI-mM1UISbln_WdBcTdPm6vDoiO93gZV6z2tXwE/s574/VirtualBox_TC-BSD_11_12_2019_14_01_01.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="452" data-original-width="574" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiCAHxbTxEdzEH8D1YVYhuQNyT5Nd_OwAUfJdQPW1YYr3fiqR_uB1i-hOpsmO3cVQDBPkyFu6cIFko_JJvhuUcUG_sSKtyTbszt5-d9sBI-mM1UISbln_WdBcTdPm6vDoiO93gZV6z2tXwE/d/VirtualBox_TC-BSD_11_12_2019_14_01_01.png" /></a></div>
<div>login: Administrator</div>
<div>passwd: 1</div>
<div><br /></div>
<div><br /></div>
<h2 style="text-align: left;">Command Line and Hotkeys</h2>
<div><ul style="text-align: left;"><li><i>Scroll Lock</i> on/off vertical scroll. Vertical scroll by <i>PgUp/PgDown</i>.</li><li><i>Alt+F1..F13</i> — switch current terminal.</li><li><i>dmesg</i> — boot devices.</li><li>`#` at the start of the line means root privileges. Ex.: <span style="background-color: #fce8b2;">doas ps -a</span></li><li>`%` at the start of the line means plain user.</li><li>Easy text editor <i>EasyEditor</i>. Starts with `ee` from command line. Ex.: <span style="background-color: #fce8b2;"># ee <filename.ext></span></li></ul></div>
<div><br /></div><div><br /></div>
<h2 style="text-align: left;">Another Packets</h2>
<div><blockquote><i>`doas`</i> before commands is for root privileges. Like a `sudo` in Linux.</blockquote></div>
<div>
Repository list currently available by <span style="background-color: #fce8b2;"># pkg -vv</span> (with double `vv` on the tail).</div>
<div>Official packets are in the <span style="background-color: #fce8b2;">/etc/pkg/Train.conf</span>, but it contains necessary packets only.</div>
<div>To append additional packets: <span style="background-color: #fce8b2;"># cp /etc/pkg/FreeBSD.conf /usr/local/etc/pkg/repos/FreeBSD.conf</span></div>
<div>
If you remove <span style="background-color: #fce8b2;">/etc/pkg/Train.conf</span> then, the official repository becomes unavailable.</div>
<div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgYJ_NEvOz4e6v6Ffdftn61oVbn1UiUTIPcq20GbgBHP64SElYdulVU2NEqkt02eKevjU-xuWjmsJkObqt0QpwNbSJng09bZxHDa_Mb8pvFP6ffeWbdcu0dso5VXA-L6bAfcBgPClsRXSOJ/s800/vmbox_console-top.png" style="margin-left: 1em; margin-right: 1em; text-align: center;"><img border="0" data-original-height="657" data-original-width="800" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgYJ_NEvOz4e6v6Ffdftn61oVbn1UiUTIPcq20GbgBHP64SElYdulVU2NEqkt02eKevjU-xuWjmsJkObqt0QpwNbSJng09bZxHDa_Mb8pvFP6ffeWbdcu0dso5VXA-L6bAfcBgPClsRXSOJ/d/vmbox_console-top.png" /></a></div><div><br /></div><div><br /></div>
<h2 style="text-align: left;">Guest Additions VirtualBox</h2>
<div><br /></div>
<div>Read at <a href="https://wiki.freebsd.org/VirtualBox" target="_blank">Wiki FreeBSD VirtualBox</a>.</div>
<div><br /></div>
<div><span style="background-color: #fce8b2;"># pkg install emulators/virtualbox-ose-additions</span></div>
<div><span style="background-color: #fce8b2;"># pw groupmod wheel -m Administrator</span> — clipboard and etc GUI stuff.</div>
<div><span style="background-color: #fce8b2;"># ee /etc/rc.conf</span> — when a simple text editor opens, append the following lines to the end of the file:</div>
<div><br /></div><div>vboxguest_enable="YES"</div>
<div>vboxservice_enable="YES"</div><div class="separator" style="clear: both; text-align: center;"><div class="separator" style="clear: both; text-align: center;"><br /></div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiLNdhbdlaXuvsYVaFZJHg1jc78jSOOA2L12rmYhyphenhyphenv77ZdT76k7x5DvTgu6RbsUjCFwt8sAuHli9xfeIgSTgDTIEcATgPkg6SxruxrmwSQSCGzt6J984f4UJzrYMYoPHLFrSsycLX2XmIR4/s800/VirtualBox_TC-BSD_11_12_2019_10_01_36.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="491" data-original-width="800" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiLNdhbdlaXuvsYVaFZJHg1jc78jSOOA2L12rmYhyphenhyphenv77ZdT76k7x5DvTgu6RbsUjCFwt8sAuHli9xfeIgSTgDTIEcATgPkg6SxruxrmwSQSCGzt6J984f4UJzrYMYoPHLFrSsycLX2XmIR4/d/VirtualBox_TC-BSD_11_12_2019_10_01_36.png" /></a></div><div><br /></div><div><br /></div>
<div>
To close the editor press <span style="background-color: #fce8b2;">Escape → a → a</span>. Escape works slowly, do not rush.</div>
<div>Finally, reboot: <span style="background-color: #fce8b2;">doas reboot</span></div>
<div><br /></div><div><br /></div>
<h2 style="text-align: left;">Midnight Commander</h2>
<div><br /></div>
<div>Two-panels file manager, like Norton/Total Commander but from *nix world.</div>
<div><br /></div>
<div>Installation: <span style="background-color: #fce8b2;"># pkg install mc</span></div>
<div>Command line: <span style="background-color: #fce8b2;">mc</span></div>
<div><br /></div>
<div><br /></div><h2 style="text-align: left;">XFCE4</h2>
<div><br /></div>
<div><a href="https://www.linuxphoto.com/2019/06/25/how-i-installed-xfce-on-freebsd/" target="_blank">The simplest installation description</a>. The man ate shit on the forums then reduced everything to a simple list of actions. Thank you man!</div>
<div>Graphics drivers AMD-Intel-Noname: <span style="background-color: #fce8b2;"># pkg install drm-kmod</span></div>
<div><br /></div><div>but (!)</div>
<div><br /></div><div><a href="https://www.freshports.org/emulators/virtualbox-ose-kmod" target="_blank">Graphics drivers for VirtualBox</a>: <span style="background-color: #fce8b2;"># pkg install emulators/virtualbox-ose-kmod</span></div>
<div><br /></div>
<div><span style="background-color: #fce8b2;">doas ee /etc/rc.conf</span></div>
<div>append next lines</div><div><span style="background-color: #fce8b2;">kld_list="/boot/modules/i915kms.ko"</span> —<i> Intel adapters.</i></div>
<div><span style="background-color: #fce8b2;">kld_list="/boot/modules/vboxdrv.ko"</span> — vbox virtual graphics adapter.</div>
<div><span style="background-color: #fce8b2;">dbus_enable="YES"</span></div>
<div><br /></div>
<div>Reboot: <span style="background-color: #fce8b2;">doas reboot</span></div>
<div><br /></div>
<div><span style="background-color: #fce8b2;"># pkg install xorg</span></div>
<div><span style="background-color: #fce8b2;"># pkg install xfce</span></div>
<div><br /></div>
<div>If the installation was interrupted by any reason, just repeat the commands and installation continues from the interrupted part.</div><div>Start from command line: <span style="background-color: #fce8b2;">startxfce4</span></div><div><span style="background-color: #fce8b2;"><br /></span></div>
<div><br /></div>
<h2 style="text-align: left;">Shared Folders</h2>
<div><br /></div>
<div>In the virtual machine settings configure a directory for sharing files between the host and the guest.
</div>
<div>Under the <i>xfce4</i> start a terminal session. Enter next:</div>
<div><br /></div>
<div><span style="background-color: #fce8b2;"># mount_vboxvfs -w myshare /mnt</span>, where</div>
<div><br /></div>
<div><i>myshare</i> — share name (not a folder path!);</div><div><i>/mnt</i> — target path to mount to. Folder have to be already present. </div><div><br /></div><div>Share name (here is `<i>myshare`</i>) should be defined when you setup virtual machine <span style="background-color: #fce8b2;">Shared Folder → Add Share → Mount point</span>.</div>
<div>Now you are ready to move files between Windows and Tc/BSD and back again. </div>
<div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhBGAW3peM0I_mEZCbP5RQyalWyVlVozUSZqVBk-35OyjqXlLQO1WFgSO67Tt-y-S7r0XnZ_6mEMaWQeQNxVTozfG7KlBO3gytvV3MBmiDNNWhJkN81k7Nm28xgz83VK8wdGY6HGN6IkIOr/s638/host-router-find-tcbsd-plc.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="252" data-original-width="638" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhBGAW3peM0I_mEZCbP5RQyalWyVlVozUSZqVBk-35OyjqXlLQO1WFgSO67Tt-y-S7r0XnZ_6mEMaWQeQNxVTozfG7KlBO3gytvV3MBmiDNNWhJkN81k7Nm28xgz83VK8wdGY6HGN6IkIOr/d/host-router-find-tcbsd-plc.png" /></a></div><div><br /></div><div><br /></div>
<h2 style="text-align: left;">Git</h2>
<div><br /></div>
<div><span style="background-color: #fce8b2;"># pkg install git</span></div>
<div><br /></div>
<div><br /></div><h2 style="text-align: left;">.NET Core 3</h2>
<div><br /></div>
<div><a href="https://github.com/jasonpugsley/core-sdk/wiki/.Net-Core-3.0.0-for-FreeBSD" target="_blank">.Net-Core-3.0.0-for-FreeBSD</a> — download all of you needed.</div><div><br /></div>
<div><br /></div>
<h3 style="text-align: left;">Necessary Packets</h3>
<div><br /></div>
<div><span style="background-color: #fce8b2;"># pkg install libunwind lttng-ust icu curl openssl111 bash git llvm60 cmake
krb5</span></div>
<div><span style="background-color: #fce8b2;"># ln -s /usr/local/bin/bash /bin/bash</span></div>
<div><br /></div><div><br /></div>
<h3 style="text-align: left;">.NET Core 3.0.0 prebuilt SDK</h3>
<div><br /></div>
<div>Download <a href="https://1drv.ms/u/s!AjHOiYW2Lw2OixlIm6XHWk67IPMc?e=cqMgbV" target="_blank">dotnet-sdk-3.0.100-freebsd-x64.tar.gz</a> then copy to the virtual machine through the shared folder. Extract into the <span style="background-color: #fce8b2;">~/dotnet-sdk</span></div>
<div><br /></div><div><span style="background-color: #fce8b2;">mkdir ~/dotnet-sdk</span></div>
<div><span style="background-color: #fce8b2;">tar xf dotnet-sdk-3.0.100-freebsd-x64.tar.gz -C ~/dotnet-sdk</span></div>
<div><br /></div>
<div><br /></div><h3 style="text-align: left;">Essential .Net NuGet Base Packages</h3>
<div><br /></div>
<div>
Download <a href="https://1drv.ms/u/s!AjHOiYW2Lw2OixosgHKJbFPc9Nxr?e=VpK1CU" target="_blank">dotnet_pkgs-3.0.0-freebsd.tar</a>. then copy to the virtual machine through the shared folder. Extract into the <span style="background-color: #fce8b2;">~/dotnet_pkgs</span></div>
<div><br /></div><div><span style="background-color: #fce8b2;">mkdir ~/dotnet_pkgs</span></div>
<div><span style="background-color: #fce8b2;">tar xf dotnet_pkgs-3.0.0-freebsd.tar -C ~/dotnet_pkgs</span></div>
<div><br /></div><div><br /></div>
<h3 style="text-align: left;">NuGet</h3>
<div><br /></div>
<div>Create or edit if existed settings file <span style="background-color: #fce8b2;">~/.nuget/NuGet/NuGet.Config</span>. Then append</div>
<div><br /></div>
<pre style="text-align: left;"><?xml version="1.0" encoding="utf-8"?><br /><configuration><br /> <packageSources>
<add key="local_pkgs" value="/home/Administrator/dotnet_pkgs" />
<add key="nuget.org" value="https://api.nuget.org/v3/index.json" protocolVersion="3" /><br /> </packageSources><br /></configuration></pre>
<div><br /></div>
<div>
`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`).
</div>
<div><br /></div>
<div><br /></div><h3 style="text-align: left;">Failed to initialize CoreCLR, HRESULT: 0x8007001F</h3>
<div><br /></div>
<div>Issue described there: <a href="https://www.freshports.org/lang/linux-dotnet-cli/" target="_blank">linux-dotnet-cli</a></div>
<div><br /></div>
<div><span style="background-color: #fce8b2;"># ee /etc/sysctl.conf</span></div>
<div><br /></div><div>Append line: <span style="background-color: #fce8b2;">vm.max_wired=1333000</span></div>
<div>Or you can try to execute next command from the command line: <span style="background-color: #fce8b2;"># sysctl vm.max_wired=1333000</span></div>
<div><br /></div>
<div><br /></div><h3 style="text-align: left;">Testing</h3>
<pre style="text-align: left;">mkdir ~/testapp<br />cd ~/testapp<br />~/dotnet-sdk/dotnet new console -o myApp<br />cd myApp<br />~/dotnet-sdk/dotnet run</pre>
<div><br /></div><div><br /></div>
<h2 style="text-align: left;">Disk Image</h2>
<div><br /></div>
<div><a href="https://www.cyberciti.biz/faq/unix-linux-dd-create-make-disk-image-commands/" target="_blank">How to make disk image with dd on Linux or Unix</a></div>
<div><br /></div>
<div>List of the disk drives: <span style="background-color: #fce8b2;"># camcontrol devlist</span>. We are going to use `ada0` and `da0`, or select what you want. </div><div><br /></div><div>For example:</div>
<pre style="text-align: left;"># 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)
</pre>
<div>Switch on shared folder (see above `Shared Folders`).</div>
<div>Start the duplicator `dd`: <span style="background-color: #fce8b2;"># dd if=/dev/da0 of=/mnt/cfdisk-image-backup.dd bs=128K
conv=noerror,sync status=progress</span></div>
<div><br /></div>
<div>Finnaly, please wait... it will take some time...</div>
<div><br /></div><div><br /></div>
<h2 style="text-align: left;">Putty</h2>
<div><br /></div>
<div>If error: <i>SSH Shell fail - Couldn't agree a key exchange algorithm</i>.</div>
<div>Should update <i>Putty</i>. No errors in version 0.73.</div>
<div><br /></div><div><br /></div>
<h2 style="text-align: left;">VNC</h2>
<div><br /></div>
<div><a href="https://forums.freebsd.org/threads/setting-up-a-vnc-server.27759/" target="_blank">TightVnc</a>: <span style="background-color: #fce8b2;"># pkg install net/tightvnc</span></div>
<div>Freeware client under the Windows — <i>VncViewer</i></div>
<div>...</div><div><br /></div>
</div>
Nikolai Voroninhttp://www.blogger.com/profile/06095643959617325612noreply@blogger.com3tag:blogger.com,1999:blog-3387439264291014573.post-65901368649138829412020-07-02T19:58:00.002+03:002021-01-21T13:42:48.047+03:00Как загружаются параметры конфигурации<div>Как на самом деле запускается текущая конфигурация TwinCAT 3?</div>
<div><br /></div>
<div>
Все ниже перечисленные действия можно и нужно делать через официальный
<a href="https://download.beckhoff.com/download/Document/automation/twincat3/AutomationInterface_pdf_EN.pdf" target="_blank">Automation Interface</a>, а пока соберем пачку файлов из загрузочного каталога
<span style="background-color: #fce8b2;">C:\TwinCAT\3.1\Boot\</span> и сравним
их между собой с помощью бесплатной
<a href="https://winmerge.org/" target="_blank">WinMerge</a>.
</div>
<div><br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjjxq5xmFctTPxi2i61JD4ULvtZgQdyLVO6VzFtJnyKpZvkOerm3Q9obMNN9WP9H0Dm3d1RLQimu_5MLYVgPLJwN9XoApw92c5gwEIgC-E8jiHnkR5m8nQFuTIws5EKozBUrHFXvDpA5P1T/s855/02_winmerge.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="365" data-original-width="855" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjjxq5xmFctTPxi2i61JD4ULvtZgQdyLVO6VzFtJnyKpZvkOerm3Q9obMNN9WP9H0Dm3d1RLQimu_5MLYVgPLJwN9XoApw92c5gwEIgC-E8jiHnkR5m8nQFuTIws5EKozBUrHFXvDpA5P1T/d/02_winmerge.png" /></a>
</div>
<div><br /></div>
<div><br /></div>
<div>
<div>
Нам нужно больше файлов. Будем последовательно вносить изменения в текущую
конфигурацию, активировать ее, а затем копировать из
каталога <i>Boot</i> только интересные файлы.
</div>
<div><br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhg8Kl7pMBg_Dnxq7OuOWbCL5zc9HnTUEDyEfMan7iXn5yw4P2IrATv3LaZN2h_6UX_sdBrL8HVFilc167V7Lz7wIM_GtQ1JMdOMw__U3HKnsPJZAW3J5RmwOUqUBQpez8TloYyRJDKVBJ8/s565/01_we-need-more-project-files.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="381" data-original-width="565" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhg8Kl7pMBg_Dnxq7OuOWbCL5zc9HnTUEDyEfMan7iXn5yw4P2IrATv3LaZN2h_6UX_sdBrL8HVFilc167V7Lz7wIM_GtQ1JMdOMw__U3HKnsPJZAW3J5RmwOUqUBQpez8TloYyRJDKVBJ8/d/01_we-need-more-project-files.png" /></a>
</div>
<div><br /></div>
<div>
... и сравнивать их между собой. Может быть и не так много файлов, как я
собрал.
</div>
</div>
<div><br /></div>
<div>
<div><br /></div>
<h2 style="text-align: left;">CurrentConfig.tszip</h2>
<div><br /></div>
<div>Это обычный zip-архив. Хранит копию проекта <i>.tsproj</i> для текущей
конфигурации. Например, <i>TwinCAT Project1.tsproj</i>. Здесь хранятся
значения параметров предусмотренные конфигурацией изначально. На самом деле
при старте системы загружаются не они, а значения, хранящиеся в файле
<i>CurrentConfig.xml</i>.
</div>
<div><br /></div>
<div><br /></div>
<h2 style="text-align: left;">CurrentConfig.xml</h2>
<div><br /></div>
<div>
Файл состоит из ряда xml-секций. Часть секций содержит параметры текущей
конфигурации:
</div>
<div>
<ul style="text-align: left;">
<li>
<b> TcBootProject</b> — корень. Содержит дату активации
конфигурации <i>CreateTime</i>.
</li>
<li>
<b> System</b> — системные настройки: сколько выделить памяти,
за каким ядром закрепить, размер стека, ...
</li>
<li>
<b> Drivers</b> — какие подсистемы TwinCAT 3 загрузить при
старте: IO, NC, RTime, ... Аналогично тому, что я писал про
<a href="https://gotwincat.blogspot.com/2019/07/twincat-2-levelup-and-how-to-load-tcnc-sys-module.html" target="_blank">загрузку системного модуля NC PTP</a>.
</li>
<li><b>InitCmds</b> — команды при старте системы</li>
<li><b>PostCmds</b> — команды после старта системы</li>
<li>
<b> ProjectInfo</b> — описание текущего проекта конфигурации:
уникальный идентификатор {GUID}, путь к файлу проекта, типы данных, ...
</li>
</ul>
</div>
<div><br /></div>
<div><br /></div>
<h2 style="text-align: left;">Offline → Online</h2>
<div><br /></div>
<div>
Для примера я буду использовать параметры энкодера NC-оси. Это удобно, так
как я только что изменял
<a href="https://gotwincat.blogspot.com/2020/07/nc-write-parameter-and-tc3-write-as-persistent.html" target="_blank">параметры NC оси</a>
официальным путем через функции типа <i>MC_WriteParameter</i>, но у меня
остался открытым вопрос, как работает
<i>MC_WriteParameter<u>Persistent</u></i>.
</div>
<div><br /></div>
<div>
После ряда экспериментов в текстовом редакторе, выяснилось, что содержимое
<i>.tsproj</i> файла проекта содержит параметры по умолчанию. Эти параметры
можно ассоциировать с графой <i>Offline Value</i> в таблицах параметров
энкодера. Если изменить эти параметры в файле проекта, а затем перезапустить
TwinCAT (Run → Config → Run), то текущее значение параметров в графе
<i>Online Value</i> не изменится. Получается, что эти изменения никак
не влияют на параметры работающего в данный момент проекта.
</div>
<div><br /></div>
<div>
После небольшой проверки стало понятно, что при активации проекта эти данные
транслируются и сохраняются в <i>CurrentConfig.xml</i>. Параметры этого
xml-файла как раз и являются <i>Online</i> данными. Если их
изменить, а затем перезапустить TwinCAT (Run → Config → Run), то мы применим
новые значения к работающему проекту. Именно эти параметры применяются при
загрузке текущего проекта и старте TwinCAT 3. Возможно, что TwinCAT 2 ведет
себя аналогично.
</div>
<div><br /></div>
<div><br /></div>
<h2 style="text-align: left;">InitCmds</h2>
<div><br /></div>
<div>
Эта xml-секция содержит список команд или операций отправляющих значения
параметров в сервис или устройство. Например, для NC один из множества
параметров - это настройки энкодера. Параметры записываются пачками, в виде
большого (или не очень) бинарного пакета.
</div>
<div>
<ul style="text-align: left;">
<li><b>key</b> — описание операции.</li>
<li><b>port</b> — ADS-порт устройства или сервиса.</li>
<li><b>iGrp</b> — индекс группы параметра.</li>
<li><b>iOffs</b> — индекс смещения параметра.</li>
<li>
<b>data</b> — бинарный пакет байтов, содержащий данные для
параметров. В шестнадцатеричных кодах, то есть два символа на байт.
Данные пишутся в память, поэтому какие-либо границы параметров не
указываются. Бинарный массив просто накладывается на пул адресов.
</li>
<li><b>message</b> — сообщение для лога TwinCAT.</li>
</ul>
</div>
<div><br /></div>
<div><br /></div>
<h2 style="text-align: left;">Внедряемся в конфиг</h2>
<div><br /></div>
<div>
Сравнив файлы, я нашел, что для задания параметров энкодера необходимо
обращаться к ADS-сервису
<span style="background-color: #fce8b2;">Port: 500; iGrp: 5124; iOffs: 0</span>. ADS порт 500 отвечает за системный сервис NC (см.
<a href="https://infosys.beckhoff.com/content/1033/tc3_adsnetref/7313155211.html" target="_blank">AmsPort Enumeration</a>). Секция <i>data</i> начинается с номера оси `01`, затем идут
какие-то неинтересные в данный момент данные, и с позиции 96 длинною в 16
символов идет значение <i>Scaling Factor Numerator</i>. Шестнадцать символов
— это hex-представление 8 байт данных, что хорошо укладывается в тип данных
LREAL/double.
</div>
<div><br /></div>
<div>
Теперь задача заключается в следующем: найти секцию <i>InitCmd</i> у
которой есть потомки с port = 500, iGrp = 5124 и
ключ <i>data</i> начинающийся символами `01`. Затем преобразовать
новое значение параметра в hex-вид и перезаписать его значение в ключ
<i>data</i>. По окончании сохранить XML, перезапустить TwinCAT и
наслаждаться результатом изменившегося параметра в графе
<i>Online Value</i>.
</div>
<div><br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjvvVGpSHoEz1YozfCqdHrRxUK8QL9mIGR27TFsfQ4bU241LfMPW8Z_ktNLwoolXh-FydY58KCpy7dZOvCcMGD6gjragS16vkm5-ZA95NhXVdDBJRrPk1crMsNpcUAKCVCdhMzjRd-mt3cg/s818/00_new-online-value-after-restart.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="472" data-original-width="818" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjvvVGpSHoEz1YozfCqdHrRxUK8QL9mIGR27TFsfQ4bU241LfMPW8Z_ktNLwoolXh-FydY58KCpy7dZOvCcMGD6gjragS16vkm5-ZA95NhXVdDBJRrPk1crMsNpcUAKCVCdhMzjRd-mt3cg/d/00_new-online-value-after-restart.png" /></a>
</div>
<div><br /></div>
<div><br /></div>
<div>
Код можно смотреть и редактировать на гитхабе:
</div>
<div><br /></div>
<div>
<script src="https://gist.github.com/nikvoronin/fb5ab0805abeb40ba1b63a462c51e202.js"></script>
</div>
<div><br /></div>
<div><br /></div>
<h2 style="text-align: left;">MC_WriteParameterPersistent</h2>
<div><br /></div>
<div>
Используя тестовую программу из статьи про
<a href="https://gotwincat.blogspot.com/2020/07/nc-write-parameter-and-tc3-write-as-persistent.html" target="_blank">параметры NC осей</a>, я параллельно сохранял файлы из загрузочного каталога <i>Boot</i>. Так я
смог быстро отследить, что именно происходит и каким-таким образом параметры
переживают перезагрузку.
</div>
<div><br /></div>
<div>И снова <i>CurrentConfig.xml</i></div>
<div><br /></div>
<div>
<script src="https://gist.github.com/nikvoronin/d1ab2e39729fe972f6e716fbc2b31f60.js"></script>
</div>
<div><br /></div>
<div>
Система создает специальную запись в конце
файла <i>CurrentConfig.xml</i>. Посмотрите, как она отметила эту запись
специальным атрибутом
<span style="background-color: #fce8b2;">runtimeadded="true"</span>. Теперь
понятно, как такие параметры переживают перезагрузку.
</div>
<div> </div>
<div>
Номер порта 500 остался без изменения, а вот группа-смещение изменились, да
и содержимое секции <i>data</i> похудело, выродившись в конкретное значение
параметра (16 символов → 8 байт → LREAL/double тип).
</div>
<div><br /></div>
<div>
Если обратиться к документации
<a href="https://download.beckhoff.com/download/Document/automation/twincat3/TwinCAT_3_ADS_Interface_NC_EN.pdf" target="_blank">TwinCAT 3 ADS Interface NC</a>
в инфосисе, обнаружится, что наконец-то используются официально
задокументированные штуки. Смотреть в п.2.4.1 "Index offset" specification
for axis parameter (Index group 0x4000 + AxisID).
</div>
<div><br /></div>
<div>iGrp: 16385 = 0x0000<u>4001</u> (0x4000 + AxisID)</div>
<div>
iOffs: 65571 = 0x000<u>10023</u> (0x00n10023. Component of the scaling factor:
numerator)
</div>
</div>
<div><br /></div>
<div>Всё, секрет раскрыт.</div>
Nikolai Voroninhttp://www.blogger.com/profile/06095643959617325612noreply@blogger.com0tag:blogger.com,1999:blog-3387439264291014573.post-76626305295440600512020-07-01T19:33:00.001+03:002021-01-21T13:43:30.798+03:00Параметры NC осей<div>
Параметры приводных проектов специально разнесены по нескольким местам. Во
первых, они разбиты по слоям или, иначе говоря, по месту применения: железо
(сервоусилитель) + NC + софт (PLC). Во вторых, так безопаснее: железо имеет
свои железные настройки, а все остальное и мягкое — располагает своими собственными "крутилками" и "показометрами".
</div>
<div><br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiv3J7e6g5cIgJB7879pceqbCSRSTrdpGSG1mqmLd58HkttsT-zr7LKf9-S4vYcaB3tfYb2w6qlTqjnb6tVkyLahGf7Ore9Pf9uRKjX039R2K7QW_8Ir8rMQ79u73oB64FgE8glnmNPzLXk/s570/twincat-3-extended-motion-control.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="392" data-original-width="570" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiv3J7e6g5cIgJB7879pceqbCSRSTrdpGSG1mqmLd58HkttsT-zr7LKf9-S4vYcaB3tfYb2w6qlTqjnb6tVkyLahGf7Ore9Pf9uRKjX039R2K7QW_8Ir8rMQ79u73oB64FgE8glnmNPzLXk/d/twincat-3-extended-motion-control.jpg" /></a>
</div>
<div style="text-align: right;">
<font color="#9e9e9e" size="1">Изображение: Beckhoff Automation</font>
</div>
<div><br /></div>
<div>
Тем не менее из ПЛК-проекта можно программно изменить любые
настройки любого слоя. Это не всегда очевидно, но добраться все-таки можно.
</div>
<div><br /></div>
<div><br /></div>
<h2 style="text-align: left;">Железо</h2>
<div><br /></div>
<div>
Я буду упрощать. Традиционно сервоусилитель разбит на три контура: контур
тока, контур скорости и контур положения. Первый контур опирается на физические
характеристики мотора и сервоусилителя. Второй и третий — это контуры, построенные вокруг тех или иных регуляторов скорости, положения, момента и тому подобное. Регуляторы типа ПИД, его модификации и возможно что-то экспериментальное.
Что и как они регулируют и чем управляют, попробуйте догадаться по их
названиям. После их настройки сервоусилитель готов принимать команды и крутить мотор в нужном направлении.
</div>
<div><br /></div>
<div><br /></div>
<h2 style="text-align: left;">Унификация и абстракция</h2>
<div><br /></div>
<div>
Моторы и сервоусилители бывают разные. А бывают не только моторы, но и просто исполнительные механизмы к
которым прилеплена обратная связь. И такую штуку тоже желательно
причесать под одну гребенку. В общем нам нужно абстрагироваться от конкретики исполнительного механизма. Поэтому дальше идет слой NC-сервиса. Он абстрагирует исполнительную систему так, что программе технологического процесса не нужно ничего знать о конкретике физических процессов в исполнительной системе. У NC есть свой набор
настроек.</div>
<div><br /></div>
<div>
<div>
Кроме собственныъ настроек у NC-системы есть свой собственный контур управления,
который может... делайте выводы сами:
</div>
<div><br /></div>
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhZF8_VrJzdukrz3IXEDh48cbyqKob21rm6_NqMKDYeUsvuJo9YB6FFzEc8_-SNpWOoaFdN2CwowJor2XtSTg4aWU4s0BmmweoktA3grl_HneGWoDbuFNSWO431OQcI8MAleSv_CCuVSame/s650/nc-position-controller.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="349" data-original-width="650" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhZF8_VrJzdukrz3IXEDh48cbyqKob21rm6_NqMKDYeUsvuJo9YB6FFzEc8_-SNpWOoaFdN2CwowJor2XtSTg4aWU4s0BmmweoktA3grl_HneGWoDbuFNSWO431OQcI8MAleSv_CCuVSame/d/nc-position-controller.png" /></a>
</div>
<div><br /></div>
<div><br /></div>
<h2 style="text-align: left;">Технологический процесс</h2>
<div><br /></div>
<div>
Процессом управляет программа. Управление она делает с помощью исполнительных
механизмов. Получается, что программа дергает за ручки и кнопки слоя
абстракции NC. У программы есть какие-то свои пожелания, которые она
передает в слой NC.
</div>
<div> </div>
<div>
Приводную часть настраивает "приводник" - специалист своего дела, а программы
пишет "программист" - он тоже специалист, но уже своего дела. Хорошо когда это один человек: сам
настроил, сам запрограммировал. Тем не менее, после тонкой настройки железа, эти настройки лучше
оставить в покое и больше не трогать. Правда бывает, что нужно и что-то
подкрутить программно.
</div>
<div><br /></div>
<div><br /></div>
<h2 style="text-align: left;">Крутим параметры</h2>
<div><br /></div>
<div>
Предположим, изменился коэффициент масштабирования энкодера
инкрементов-на-миллиметр. В лексиконе приводника - это <span style="background-color: #fce8b2;">Nc feed constant</span>. На самом деле это настройка не слоя железа, а настройка слоя NC.
Такое смешение сделано для удобства: приводник настраивает все низко-уровневые и средне-уровневые параметры движения и железа в одном месте. Программист же может
управляет параметрами движения типа скорость-ускорение и подрегулировать
динамику через NC. Опять-таки удобно.</div><div><br /></div><div>На картинке как раз кусок железа <i>Drive Manager'a</i>, где смешались в кучу слои:</div>
<div><br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhev9DaFBnZtFFUnszQiM6jLjOn1ptp9jZyOtNmN87W-Iu6eSdvpIIJ4iaYjOex8jD2GKAzPUP2wjulrsjA3sh4DBi51wQJtg_UPmNPjDw_myEF9tSQvxe1Xz7ybKMRvdlZr9tUGS_i-XT5/s631/drive-scaling-and-nc-parameters.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="403" data-original-width="631" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhev9DaFBnZtFFUnszQiM6jLjOn1ptp9jZyOtNmN87W-Iu6eSdvpIIJ4iaYjOex8jD2GKAzPUP2wjulrsjA3sh4DBi51wQJtg_UPmNPjDw_myEF9tSQvxe1Xz7ybKMRvdlZr9tUGS_i-XT5/d/drive-scaling-and-nc-parameters.png" /></a>
</div>
<div><br /></div>
<div>
Привод можно донастраивать через SoE, CoE и пр. В параметры NC можно залезть
через функциональные блоки типа <a href="https://infosys.beckhoff.com/content/1033/tcplclib_tc2_mc2/45035996343774219.html" target="_blank">MC_WriteParameter</a>, предоставляемой библиотекой <a href="https://infosys.beckhoff.com/content/1033/tcplclib_tc2_mc2/index.html" target="_blank">Tc2_MC2</a>. Эти настройки не навсегда — при следущей загрузке параметры откатятся до значений
заданных в конфигурации. Так сделано для безопасности.
</div><div><br /></div><div>Список всех доступных настроек содержится в перечисляемом типе <a href="https://infosys.beckhoff.com/content/1033/tcplclib_tc2_mc2/36028797089122187.html" target="_blank">MC_AxisParameter</a>. Его интересно полистать пару минут, вчитываясь в комментарии типа: <i><font color="#0b8043">(* new since 1/2012 *)</font></i> или <i><font color="#0b8043">...- available in Tc3 *)</font></i> — история как она есть.</div>
<div><br /></div>
<div>Чтобы как-то повлиять на значение параметров в конфигурации, можно при каждом старте ПЛК-программы задавать новые коэффициенты. Так и приходилось делать в TwinCAT 2. Теперь уже не обязательно — в TwinCAT 3
появились функции типа
<a href="https://infosys.beckhoff.com/content/1033/tcplclib_tc2_mc2/18014400729572107.html" target="_blank">MC_WriteParameterPersistent</a>. Через них достаточно задать параметр один раз и его значение легко переживет
перезапуск ПЛК. При активации новой конфигурации, эти значения будут заменены
на значения из новой конфигурации.</div>
<div><br /></div>
<div>Небольшой пример как пользоваться, но там и так все понятно:</div>
<div><br /></div>
<div><script src="https://gist.github.com/nikvoronin/32b333c6072ecf8884eeac4987bb202e.js"></script></div>
Nikolai Voroninhttp://www.blogger.com/profile/06095643959617325612noreply@blogger.com0tag:blogger.com,1999:blog-3387439264291014573.post-50069497326801356552020-06-23T19:47:00.002+03:002021-01-21T13:44:22.027+03:00Очередной билд TwinCAT 3.1.4024.10Появилась интеграция с Visual Studio 2019, потому что вышел очередной билд
TwinCAT 3.1.4024.10. Очередной билд - когда меняется самая последняя цифра,
например, 10. Темной темы по прежнему нет, поэтому посмотрим, что еще нового оно
нам принесло.
<div><br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgyjv_tech3bVwSXw8PG3i2gxL4oe6UwGNouh2B4v8ip-0scDvYmYZFErM9cKTvi1LWglQJORIuO0CqiwsXeOoX4UimX6Lo0LNa79pBcxYvCuCgl0tdeOsgeIiQBwuCc9-1QGLtPAJY8_4K/s950/00_vs2019_no-darkt-heme.png"><img border="0" data-original-height="348" data-original-width="950" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgyjv_tech3bVwSXw8PG3i2gxL4oe6UwGNouh2B4v8ip-0scDvYmYZFErM9cKTvi1LWglQJORIuO0CqiwsXeOoX4UimX6Lo0LNa79pBcxYvCuCgl0tdeOsgeIiQBwuCc9-1QGLtPAJY8_4K/d/00_vs2019_no-darkt-heme.png" /></a>
</div>
<div><br /></div>
<div><br /></div>
<h2 style="text-align: left;">Установка</h2>
<div><br /></div>
<div>
При установке появился новый пункт для самостоятельноно выбора компонентов
установки. В предыдущих версиях они тоже были, но здесь речь про TwinCAT XAE.
Вероятно подразумевается интеграция в уже установленную "студию" и отказ от
установки оболочки XAE по умолчанию. Подумал я и отключил...
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjtn_F5XnffpaAXRAgm6i66hmdRNB6zedyFnT4kU3WCm1Gtrq1AE_OVPfuTh-Gna0mcPT5iXEHRtro89PFHY6dCwZr4QIusLjuZWW_6eAXsFRLq3AvL1_S4YrSpoyKnk_gJ9ueqeX4IDVhG/s500/01_tc3.1.4022.10_install-no-xae_w-vs2019-integration.png"><img border="0" data-original-height="381" data-original-width="500" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjtn_F5XnffpaAXRAgm6i66hmdRNB6zedyFnT4kU3WCm1Gtrq1AE_OVPfuTh-Gna0mcPT5iXEHRtro89PFHY6dCwZr4QIusLjuZWW_6eAXsFRLq3AvL1_S4YrSpoyKnk_gJ9ueqeX4IDVhG/d/01_tc3.1.4022.10_install-no-xae_w-vs2019-integration.png" /></a>
</div>
<div><br /></div>
<div>
В результате оболочка XAE 2017, несмотря на мои пожелания, все-равно
установилась, а может и осталась от прошлой инсталляции. Зато интеграция в
Visual Studio Professional 2019 так и не произошла. <b>Вывод:</b> птичку не
трогать, пусть ставит XAE в любом случае, тогда интеграция в VS 2019 пройдет
без проблем, как и было задумано.
</div>
<div><br /></div>
<div><br /></div>
<h2 style="text-align: left;">Шаблон проекта</h2>
<div><br /></div>
<div>
В "студии" 2019 изменился стартовый экран создания проекта, соответственно это
отразилось и на создании проекта TwinCAT. Теперь чтобы создать проект нужно
приложить усилие для поиска нужного шаблона. Разработчики забыли (или не
смогли, или это невозможно) добавить теги и нужно пролистать список довольно
далеко или сразу ввести волшебное слово "twincat" в строке поиска:
</div>
<div><br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhSmgVyybVu3XjwZhShVVYo_tyHUv6H3eY0XpCZ3Z5MiHfTAl3ygX_WmRKVcFYKPayj_REN-xctj1vuZt_3gvk1F0fE9lHS2hPTulvhtChlkPg_H57Nt_U9fBsa71-q8Bi2qYb9JFWvlXHu/s950/02_vs2019_start-screen.png"><img border="0" data-original-height="317" data-original-width="950" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhSmgVyybVu3XjwZhShVVYo_tyHUv6H3eY0XpCZ3Z5MiHfTAl3ygX_WmRKVcFYKPayj_REN-xctj1vuZt_3gvk1F0fE9lHS2hPTulvhtChlkPg_H57Nt_U9fBsa71-q8Bi2qYb9JFWvlXHu/d/02_vs2019_start-screen.png" /></a>
</div>
<div><br /></div>
<div><br /></div>
<div>
По правде говоря, все не так плохо — в следующий раз шаблон проекта появится
слева в списке последних шаблонов (Recent project templates):
</div>
<div><br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjoU7Ch68qyRQWDsyr3uoVMJRPYqNUzuvlFBXT3NSWcc1Q6sEcvg0tgP9Xph4GZEf21jyBx6u6pZGtieYnqyXj4xZzLEbQ4o3gzRtt-VqFx410FcYBzAWBYHJyt24eFS51WAQ5d7XvRe4DC/s950/03_vs2019_start-screen-w-recent.png"><img border="0" data-original-height="378" data-original-width="950" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjoU7Ch68qyRQWDsyr3uoVMJRPYqNUzuvlFBXT3NSWcc1Q6sEcvg0tgP9Xph4GZEf21jyBx6u6pZGtieYnqyXj4xZzLEbQ4o3gzRtt-VqFx410FcYBzAWBYHJyt24eFS51WAQ5d7XvRe4DC/d/03_vs2019_start-screen-w-recent.png" /></a>
</div>
<div><br /></div>
<div><br /></div>
<h2 style="text-align: left;">Что нового?</h2>
<div><br /></div>
<div>
Не считая изменения в интеграции со студией, в RSS-новостях промелькнула
новость об изменениях в статическом анализаторе ПЛК-задач `<i>TE1200 | TC3 PLC Static Analysis`</i>. Там появились несколько новых правил оптимизации. В пакете умных вещей <i>`TF6760 | TwinCAT IoT HTTPS/REST`</i> добавилась поддержка Philips Hue и Telegram. Теперь можно управлять разноцветной лампочкой филипс не только через смартфон, но и с ПЛК, а им, в свою очередь, через смартфон с телеграммом.</div><div><br /></div><div>С нетерпением жду появления официального списка с полезными изменениями в новых билдах.</div>
Nikolai Voroninhttp://www.blogger.com/profile/06095643959617325612noreply@blogger.com0tag:blogger.com,1999:blog-3387439264291014573.post-62905805365602040962020-06-23T19:45:00.002+03:002021-01-21T13:44:53.075+03:00New TwinCAT build 3.1.4024.10The integration with Visual Studio 2019 has been arrived. That because now we
have the new build of TwinCAT version 3.1.4024.10. Changing of the last digit
(.10 in this version) is meaning that we have a new minor build not a new major
version. There is still no dark theme, so let's see what else it brought to us.
<div><br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjB-zajB9nQ-2-Fi64sPlvfSdy3_iQy0ek-EYTkXlZ978pJEt7G690pkIN7yHyIvqHbTfE178rxyFPIF3eYAG3NegTiazcrGhxYZ1nBSXIao6D9or6DGgNkrWshpNSEJX-kI-Bl7cc_yEwd/s950/00_vs2019_no-darkt-heme.png"><img border="0" data-original-height="348" data-original-width="950" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjB-zajB9nQ-2-Fi64sPlvfSdy3_iQy0ek-EYTkXlZ978pJEt7G690pkIN7yHyIvqHbTfE178rxyFPIF3eYAG3NegTiazcrGhxYZ1nBSXIao6D9or6DGgNkrWshpNSEJX-kI-Bl7cc_yEwd/d/00_vs2019_no-darkt-heme.png" /></a>
</div>
<div><br /></div>
<div><br /></div>
<h2 style="text-align: left;">Installation</h2>
<div><br /></div>
<div>
<div>
During installation, we got a new option for selecting of installation
components. That is TwinCAT XAE. It looks like an option for integration
into already installed Visual Studio and refusall of the installation of the
default XAE shell.
</div>
<div><br /></div>
<div>I thought so and turned it off...</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjtn_F5XnffpaAXRAgm6i66hmdRNB6zedyFnT4kU3WCm1Gtrq1AE_OVPfuTh-Gna0mcPT5iXEHRtro89PFHY6dCwZr4QIusLjuZWW_6eAXsFRLq3AvL1_S4YrSpoyKnk_gJ9ueqeX4IDVhG/s500/01_tc3.1.4022.10_install-no-xae_w-vs2019-integration.png"><img border="0" data-original-height="381" data-original-width="500" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjtn_F5XnffpaAXRAgm6i66hmdRNB6zedyFnT4kU3WCm1Gtrq1AE_OVPfuTh-Gna0mcPT5iXEHRtro89PFHY6dCwZr4QIusLjuZWW_6eAXsFRLq3AvL1_S4YrSpoyKnk_gJ9ueqeX4IDVhG/d/01_tc3.1.4022.10_install-no-xae_w-vs2019-integration.png" /></a>
</div>
<div><br /></div>
<div>
As a result, the XAE 2017 shell, despite my wishes, was installed anyway, or
maybe still remained from the previous installation. But the integration in
Visual Studio Professional 2019 did not happen. Conclusion: do not touch
this option (leave it turned on), let it install XAE in any case, and the
integration in VS 2019 will go without any problems, as it was intended.
</div>
</div>
<div><br /></div>
<div><br /></div>
<h2 style="text-align: left;">Project Templates</h2>
<div><br /></div>
<div>
<div>
In the VS 2019, the start screen with project templates was changed,
respectively, this has affected the creation of the TwinCAT project. Now to
create a project you might need to make an effort to find the right
template. The developers forgot (or it maybe not possible in anyway) to add
tags and you need to scroll the list quite far. But you can shorten you path
enter immediately the magic word "twincat" in the search bar:
</div>
<div><br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhSmgVyybVu3XjwZhShVVYo_tyHUv6H3eY0XpCZ3Z5MiHfTAl3ygX_WmRKVcFYKPayj_REN-xctj1vuZt_3gvk1F0fE9lHS2hPTulvhtChlkPg_H57Nt_U9fBsa71-q8Bi2qYb9JFWvlXHu/s950/02_vs2019_start-screen.png"><img border="0" data-original-height="317" data-original-width="950" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhSmgVyybVu3XjwZhShVVYo_tyHUv6H3eY0XpCZ3Z5MiHfTAl3ygX_WmRKVcFYKPayj_REN-xctj1vuZt_3gvk1F0fE9lHS2hPTulvhtChlkPg_H57Nt_U9fBsa71-q8Bi2qYb9JFWvlXHu/d/02_vs2019_start-screen.png" /></a>
</div>
<div><br /></div>
<div><br /></div><div>
In fact, everything is not so bad - next time the project template appears
in the recent templates list on the left of the window. Use pin icon to pin
it forever:
</div>
</div>
<div><br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjoU7Ch68qyRQWDsyr3uoVMJRPYqNUzuvlFBXT3NSWcc1Q6sEcvg0tgP9Xph4GZEf21jyBx6u6pZGtieYnqyXj4xZzLEbQ4o3gzRtt-VqFx410FcYBzAWBYHJyt24eFS51WAQ5d7XvRe4DC/s950/03_vs2019_start-screen-w-recent.png"><img border="0" data-original-height="378" data-original-width="950" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjoU7Ch68qyRQWDsyr3uoVMJRPYqNUzuvlFBXT3NSWcc1Q6sEcvg0tgP9Xph4GZEf21jyBx6u6pZGtieYnqyXj4xZzLEbQ4o3gzRtt-VqFx410FcYBzAWBYHJyt24eFS51WAQ5d7XvRe4DC/d/03_vs2019_start-screen-w-recent.png" /></a>
</div>
<div><br /></div>
<div><br /></div>
<h2 style="text-align: left;">What's up?</h2>
<div><br /></div>
<div>Just copy of the RSS news: <i>`TE1200 | TC3 PLC Static Analysis`</i> has been updated. The new version contains several rule optimizations. The packet of smart things <i>`TF6760 | TwinCAT IoT HTTPS/REST`</i> now includes support for Philips Hue and Telegram. This days your PLC can control the color of the light and you may rule this process through the Telegram messenger.</div><div><br /></div><div>I am eager to read useful changelog news.</div>
Nikolai Voroninhttp://www.blogger.com/profile/06095643959617325612noreply@blogger.com0tag:blogger.com,1999:blog-3387439264291014573.post-10858914538183410492020-05-09T17:23:00.000+03:002020-05-09T17:23:01.273+03:00Автозагрузка TwinCAT 3 в различных режимахПри старте операционной системы TwinCAT 3 может автоматически загрузится как в рабочем режиме, так и в режиме конфигурации. Впрочем, аналогичное происходит и со старой второй версией. Здесь важно, что задать режим можно только создав пустой проект или открыв текущий. Затем необходимо подключиться к локальной системе или удаленной системе, выбрать режим и нажать кнопку <i>Apply</i>. Очень много телодвижений. Иллюстрация ниже:<br />
<div>
<div>
<br /></div>
<div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgL-d6A3-peAeUQ4ANyXu7S-ToJFLjDcTeuY_0v2tidsdkqLkaGqqNxXzT0PZTu9a_qUbr__SFa-dh9_htM6E7jTgJv1LqrvFayNeXb86IzFINhnZOsw0sT2RZm3yMpUmbvys4jzZG5oMbs/" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="225" data-original-width="708" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgL-d6A3-peAeUQ4ANyXu7S-ToJFLjDcTeuY_0v2tidsdkqLkaGqqNxXzT0PZTu9a_qUbr__SFa-dh9_htM6E7jTgJv1LqrvFayNeXb86IzFINhnZOsw0sT2RZm3yMpUmbvys4jzZG5oMbs/d/tc-autoboot-xae-options.png" /></a></div>
</div>
<div>
<br /></div>
<div>
На самом деле режим автозагрузки хранится и устанавливается через реестр, и соответствующая кнопка прямо-таки напрашивается в трейбар, который также известен как системный лоток лежащий рядом с часами. Пока же эта кнопка не вернулась на свое законное место, мы будем использовать редактор реестра <i>regedit</i> или писать скрипты для задания режима. Кстати, ведь было же всё в TwinCAT 2, зачем убрали?</div>
</div>
<div>
<br /></div>
<div>
Для работы с 32-х разрядными системами:</div>
<div>
<br /></div>
<div style="border-left: 1em solid rgb(250, 250, 250); margin-left: 2em; overflow: hidden; padding-left: 1em; width: auto;">
<pre style="line-height: 125%; margin: 0px;"><span style="color: #b51200;">Windows Registry Editor Version 5.00</span>
<span style="color: #0b8043;">[HKEY_LOCAL_MACHINE\SOFTWARE\Beckhoff\TwinCAT3\System]</span>
<span style="color: blue;">"SysStartupState"</span>=<b>dword</b>:<span style="background-color: #fff2cc;">0000000<b>5</b></span>
</pre>
</div>
<div>
<br /></div>
<div>
Для работы с 64-х разрядными системами путь чуть длиннее, добавляется магическое <i>WOW6432Node</i>:</div>
<div>
<br /></div>
<div style="border-left: 1em solid rgb(250, 250, 250); margin-left: 2em; overflow: hidden; padding-left: 1em; width: auto;">
<pre style="line-height: 125%; margin: 0px;"><span style="color: #b51200;">Windows Registry Editor Version 5.00</span>
<span style="color: #0b8043;">[HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Beckhoff\TwinCAT3\System]</span>
<span style="color: blue;">"SysStartupState"</span>=<b>dword</b>:<span style="background-color: #fff2cc;">0000000<b>F</b></span>
</pre>
</div>
<div>
<br /></div>
<div>
Я назвал пост в честь TwinCAT 3.1, но мы все еще помним старушку TwinCAT 2, и там все будет выглядеть аналогично: просто нужно убрать номер версии из пути ключа, то есть сделать как-то так: <span style="background-color: #fff2cc;">HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Beckhoff\TwinCAT\System</span>. Не забывая, конечно же, про разрядность операционной системы и валшебного суффикса <i>WOW6432Node</i>.</div>
<div>
<br /></div>
<div>
Непосредственно режим задают магические числа в значении ключа <i>SysStartupState</i>:
<br />
<ul style="text-align: left;">
<li>0<b>5</b> - рабочий режим / Run Mode / зеленая иконка.</li>
<li>0<b>F</b> - режим конфигурации / Config Mode / синяя иконка. И да, это =15 в десятичной системе счисления.</li>
</ul>
</div>
<div>
<br />
Остается создать <i>.reg</i> файл и кликать по нему мышкой или отправить по почте. Вышеперечисленное относится к настольным операционным системам.</div>
Nikolai Voroninhttp://www.blogger.com/profile/06095643959617325612noreply@blogger.com0tag:blogger.com,1999:blog-3387439264291014573.post-78311398268129405782020-05-09T17:01:00.000+03:002020-06-23T12:39:59.368+03:00Autoload TwinCAT 3 Different ModesWhen the operation system is loading TwinCAT 3 may load either in a <i>Run Mode</i> or in a <i>Config Mode</i>. Same things happen with an old version number 2. So important, you can choose the working mode only if you create a new empty project or open already existed. Then you have to connect to the local or remote system, choose working mode and finally press the <i>Apply</i> button. Too long way, need a short cut. Illustration next:<br />
<div>
<div>
<br /></div>
<div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgL-d6A3-peAeUQ4ANyXu7S-ToJFLjDcTeuY_0v2tidsdkqLkaGqqNxXzT0PZTu9a_qUbr__SFa-dh9_htM6E7jTgJv1LqrvFayNeXb86IzFINhnZOsw0sT2RZm3yMpUmbvys4jzZG5oMbs/" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="225" data-original-width="708" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgL-d6A3-peAeUQ4ANyXu7S-ToJFLjDcTeuY_0v2tidsdkqLkaGqqNxXzT0PZTu9a_qUbr__SFa-dh9_htM6E7jTgJv1LqrvFayNeXb86IzFINhnZOsw0sT2RZm3yMpUmbvys4jzZG5oMbs/d/tc-autoboot-xae-options.png" /></a></div>
</div>
<div>
<br /></div>
<div>Actually, on loading mode stored and defined through the windows registry. This option is just necessary in the traybar menu next by the system clock. Till we are waiting for this option we will use <i>regedit</i> or write registry scripts for defining a working mode. So, this option already present in TwinCAT 2. Why it absent in the third one?</div></div><div><br /></div>
<div>For the x32 systems:</div>
<div>
<br /></div>
<div style="border-left: 1em solid rgb(250, 250, 250); margin-left: 2em; overflow: hidden; padding-left: 1em; width: auto;">
<pre style="line-height: 125%; margin: 0px;"><span style="color: #b51200;">Windows Registry Editor Version 5.00</span>
<span style="color: #0b8043;">[HKEY_LOCAL_MACHINE\SOFTWARE\Beckhoff\TwinCAT3\System]</span>
<span style="color: blue;">"SysStartupState"</span>=<b>dword</b>:<span style="background-color: #fff2cc;">0000000<b>5</b></span>
</pre>
</div>
<div>
<br /></div>
<div>
For the x64 systems the path is a little longer. Just added a magic voodoo word <i>WOW6432Node</i>:</div>
<div>
<br /></div>
<div style="border-left: 1em solid rgb(250, 250, 250); margin-left: 2em; overflow: hidden; padding-left: 1em; width: auto;">
<pre style="line-height: 125%; margin: 0px;"><span style="color: #b51200;">Windows Registry Editor Version 5.00</span>
<span style="color: #0b8043;">[HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Beckhoff\TwinCAT3\System]</span>
<span style="color: blue;">"SysStartupState"</span>=<b>dword</b>:<span style="background-color: #fff2cc;">0000000<b>F</b></span>
</pre>
</div>
<div>
<br /></div>
<div>
This blog post is about TwinCAT 3.1 but we still remember about the oldest one TwinCAT 2. Everything is exactly the same. Just remove the version number from the path key and voila: <span style="background-color: #fff2cc;">HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Beckhoff\TwinCAT\System</span>. Still need remember of the voodoo magic <i>WOW6432Node</i> and a bit depth of the operating system.</div>
<div>
<br /></div>
<div>
The working mode is defined by value of the registry key <i>SysStartupState</i>:
<br />
<ul style="text-align: left;">
<li>0<b>5</b> - Run Mode | green icon.</li>
<li>0<b>F</b> - Config Mode | blue icon. Equal = 15 in decimal system.</li>
</ul>
</div>
<div>
<br />
The last but not the least make a <i>.reg</i> file then click it by mouse on the target system or send through e-mail. For desktop systems oonly.</div>
Nikolai Voroninhttp://www.blogger.com/profile/06095643959617325612noreply@blogger.com0