July 4, 2019

Activating System NC PTP Module

There is a special operation in TwinCAT 2 called 'level-up'. That is for PLCs based on Windows CE or Windows Compact only. You take plain PLC, level-up it and get PLC with Numerical motion Control Point-To-Point.

You have to own license key for this special level-up utility. This job was made special for service engineers but you can do it by yourself. Anyway you will get this:


Sometimes, after level-upping NC branch may absent in System Manager configuration. I.e. PLC already can do but System Manager does not allow to configure it.

Actually, we have rised the reg level but forgot to load TwinCAT system module.

TwinCAT 2 is a module (or composite) system. It consist of several low level drivers for different subsystems: TcIo.sys, TcRouter.sys, TcRTime.sys, TcNc.sys... In the case of WinCE, drivers are already integrated into the PLC image. You just have to plug-in this drivers.

The list of loading modules is located at \Hard Disk\TwinCAT\DefaultConfig.xml. Open it and insert new xml-section with TCNC module. See next:

Then we restart the PLC and get the result. It became much better:


Загрузка системного модуля NC PTP

В ПЛК на базе WinCE / Compact существует операция подъема уровня лицензии TwinCAT 2: был стандартный уровень PLC, а стал контроллер с NC PTP и возможностью управления движением.

Для подъема уровня TwinCAT используется специальная утилита, которая, конечно же, требует лицензионный ключ. Вообще, такой процедурой занимается сервисная служба, но можно и самому, а итогом послужит следующая картина:


Правда итог не так очевиден из System Manager: ветка NC может отсутствовать в конфигурации. Иными словами, контроллер уже может, а вот System Manager почему-то в упор не видит NC.

На самом деле уровень лицензии подняли, а модуль в TwinCAT еще не загрузили.

TwinCAT 2 — это модульная система. Она состоит из нескольких низкоуровневых драйверов для подсистем: TcIo.sys, TcRouter.sys, TcRTime.sys, TcNc.sys... В случае с WinCE драйверы уже встроены в образ, их просто нужно подключить.

Список модулей TwinCAT 2, загружаемых при старте системы, хранится в \Hard Disk\TwinCAT\DefaultConfig.xml. Открываем этот файл и дописываем загрузку модуля TCNC. Соответственно файл после редактирования будет выглядеть так:

<?xml version="1.0" encoding="UTF-8"?>
<TcBootProject>
    <Drivers>
        <Driver>
            <Type>1</Type>
            <ServiceName>TCIO</ServiceName>
        </Driver>
        <Driver>
            <Type>1</Type>
            <ServiceName>TCPLC</ServiceName>
        </Driver>
        <Driver>
            <Type>1</Type>
            <ServiceName>TCRTIME</ServiceName>
        </Driver>
        <Driver>
            <Type>1</Type>
            <ServiceName>TCNC</ServiceName>
        </Driver>
    </Drivers>
    <InitCmds/>
</TcBootProject>


Перезапускаем ПЛК и смотрим на результат. Было → стало:


July 3, 2019

Дребезг на трех языках

Паттерны и шаблоны можно находить в любой системе и на любом языке программирования. У Скотта Витлока (Scott Whitlock) в блоге про автоматизацию есть любопытная подборка паттернов (или шаблонов) Patterns of Ladder Logic Programming на языке лестничных диаграмм, релейной логики или просто LD. Всё как в большом и кровавом энтерпрайзе с рейтингом R.


Обычно в проектах я использую ST и C# за редким исключением, когда возникает необходимость в других языках, поэтому было особенно интересно посмотреть как будет выглядеть один и тот же алгоритм на трех разных языках программирования МЭК. Я взял паттерн "Дребезг контактов" (Debounce) и переписал его на LD, ST и CFC.

FBD брать не стал, так как есть CFC, а это более продвинутая и современная версия блочных диаграмм. На картинке выше, адаптация паттерна на языке LD под TwinCAT 3. Про объявление переменных чуть позже.

Вообще проблему с дребезгом лучше устранять на уровне железа, но если что, то в модули дискретных входов уже встроены фильтры. Правда они не настраиваются и не отключаются, что заказано, то заказано. Поэтому, чтобы иметь возможность подкрутить время нечувствительности, я воспользуюсь готовым паттерном, и проверю его работу одновременно на трех языках программирования. Сразу и одновременно.


Continuous Flow Chart


Паттерн настолько простой, что перенос не должен вызывать затруднения, разве что расставить последовательность операций, ну и бывает трудно найти панель инструментов с кнопками элементов диаграммы. Она прячется во View → Toolbox (Ctrl + Alt + X). Она же хранит элементы для LD и прочих конструкторов.

Объявление переменных остается прежним. Забегая вперед, оно будет таким же и для LD.


Structured Text


LD легко транслируется на ST. Интересно, что шапка с объявлением переменных и ФБ остается по прежнему одинаковой для всех трех языков:

FUNCTION_BLOCK DebounceLD // DebounceST // DebounceCFC
VAR_INPUT
    IN: BOOL;
    Delay: TIME := T#50MS;
END_VAR
VAR_OUTPUT
    Q: BOOL;
END_VAR
VAR
    DelayOn: TON;
    DelayOff: TOF;
END_VAR

Копируем в программу на ST шапку с объявлением переменных, переименовываем название функционального блока в DebounceST и дописываем тело программы. Текст лаконичнее картинки, редкий случай когда лучше один раз прочитать, чем долго скользить взглядом по картинке. Хотя, на вкус и цвет...

DelayOn(IN := IN, PT := Delay);
DelayOff(IN := IN, PT := Delay);
Q := DelayOn.Q OR (Q AND DelayOff.Q);

Количество строк (равное трем) также совпадает с тремя "ступенями" лестничной диаграммы LD.


Испытания


Подвергнем три функциональных блока различным испытаниям. С помощью визуализации можно на глазок проверить правильно ли они зажигают и гасят лампочки, а с помощью цикла мы внезапно проверим какой же из языков быстрее:

PROGRAM MAIN
VAR
    DebLD : DebounceLD;
    DebST : DebounceST;
    DebCFC: DebounceCFC;

[...]

lastExecTime := _TaskInfo[1].LastExecTime;

Timer(IN := TRUE);
IF Timer.Q THEN
    Timer(IN := FALSE);
    state := SEL(state >= 3, state + 1, 0);
END_IF

FOR i := 0 TO 10000 DO
    CASE state OF
    1:
        DebLD ( IN := in, Delay := delay, Q => outLD  );
        
    2:
        DebCFC( IN := in, Delay := delay, Q => outCFC );

    3:
        DebST ( IN := in, Delay := delay, Q => outST  );
    END_CASE
END_FOR

На самом деле правильность работы я определял по цифровому осциллографу, там же случайно выяснилось, что один из языков незначительно проигрывает в производительности... Это все очень не точно и не имеет большого значения, но все-равно интересно:


Синяя линия отражает значение переменной state, нулевое значение которой соответствует пустому циклу (когда внутри цикла практически ничего не происходит). Заметен небольшой всплеск активности в момент работы CFC функционального блока.

Правда все это крутилось внутри ноутбука, а я сталкивался с ситуацией, когда рантайм настоящего контроллера отличался от рантайма на ноуте. Поэтому я специально перепроверил поведение на 32-х разрядном контроллере CX9020 под WinCE.

Ситуация аналогичная:

Только не воспринимайте эти результаты всерьез: языки все равно равноценны и равнозначны. Пишите на том, который вам нравится или удобен в каждом конкретном случае.