LinuxCNC призначений для взаємодії з апаратним забезпеченням. Але мало хто з користувачів має апаратне забезпечення з однаковими характеристиками — воно може бути схожим, але не однаковим. І навіть для абсолютно однакового апаратного забезпечення можуть існувати різні способи його використання, наприклад, для різних матеріалів або з різними фрезами, що вимагатиме адаптації управління вже працюючою системою. Була потрібна абстракція, щоб спростити налаштування LinuxCNC для широкого спектру апаратних пристроїв. На найвищому рівні це може бути просто спосіб, що дозволяє завантажувати та з’єднувати між собою низку «будівельних блоків» для складання складної системи.

У цьому розділі представлено рівень абстракції апаратного забезпечення. Ви побачите, що багато з його складових є драйверами для апаратних пристроїв. Однак HAL може не тільки налаштовувати драйвери апаратного забезпечення.

1. Огляд HAL

Рівень абстракції обладнання (або з посиланням на link:https://en.wikipedia.org/wiki/2001:_A_Space_Odyssey_(film)[«Космічна одіссея 2001 року» (просто «HAL») – це програмне забезпечення для

  • забезпечують інфраструктуру для зв’язку з багатьма програмними та апаратними компонентами системи та між ними.

  • за бажанням обробляти та/або перевизначати цю інформацію під час її потоку від компонента до компонента.

Сам по собі цей Middleware не має відношення до його застосування на CNC. Наприклад, пошук в Інтернеті виявив астрономічне застосування для управління телескопами за допомогою LinuxCNC. Двигуни переміщують телескоп у потрібне положення, і він повинен знати, як співвіднести активність двигуна з ефектом цього позиціонування в реальному світі. Така синхронізація положень двигунів з положеннями в реальному світі нагадує те, що повинні робити верстати з CNC або космічні апарати.

Будь-який контролер машини повинен знати:

  • про його внутрішній стан та як це відображається на навколишнє середовище (координати машини, стан перемикачів/регуляторів),

  • як очікується, що виконавчі механізми змінять цей стан,

  • як забезпечити оновлення внутрішнього стану за допомогою датчиків (енкодерів, зондів).

Шар HAL складається з частин (які називаються «компонентами»), які

  • пов’язані один з одним, наприклад, для оновлення даних про положення або для того, щоб алгоритм планування повідомляв двигунам про наступний крок.

  • може знати, як спілкуватися з обладнанням,

  • може просто обробляти вхідні дані та надавати вихідні дані іншим компонентам,

  • завжди періодично виконуються або

    • з дуже високою частотою виконання в кілька мікросекунд (мкс), що називається базовим потоком, наприклад, до

      1. дати кроковому двигуну тригер для кроку вперед або

      2. зчитати положення, представлене кодером.

    • з нижчою частотою кожну мілісекунду (мс), наприклад, до

      1. скоригувати планування наступних рухів для виконання інструкції G-коду.

    • як компоненти "користувацького простору", що не працюють у реальному часі та виконують "головний цикл", як і будь-яке інше програмне забезпечення, і можуть бути перервані або затримані, коли решта системи зайнята або перевантажена.

Взяті разом, HAL дозволяє

  1. програмувати для машини, яку програміст безпосередньо не знає, але може покладатися на програмний інтерфейс із чітко визначеним впливом на машину. Цей інтерфейс може бути використаний для

    • скажіть машині, що робити

    • послухайте, що машина хоче розповісти про стан, у якому вона знаходиться.

  2. Вертикальні абстракції: Системний інтегратор-людина такої машини використовує HAL

    • описати, як виглядає машина та який кабель керує тим, який двигун приводить у рух яку вісь.

    • Опис машини, інтерфейси програміста та інтерфейс користувача якимось чином «зустрічаються» в цьому абстрактному шарі.

  3. Горизонтальні абстракції:

    • Не всі машини мають усілякі функції

    • Фрезерні, токарні верстати та роботи мають багато спільного

      • характеристики (двигуни, шарніри тощо),

      • алгоритми планування своїх рухів.

HAL не взаємодіє безпосередньо з користувачем. Але було передбачено кілька інтерфейсів, які дозволяють маніпулювати HAL

  • з командного рядка за допомогою команди "halcmd".

  • зі скриптів Python та

  • з програм на C/C++,

але жоден з цих інтерфейсів не є «самим HAL».

HAL сама по собі не є програмою, вона складається з одного або декількох списків завантажених програм (компонентів), які періодично виконуються (у строгій послідовності), та області спільної пам’яті, яку ці компоненти використовують для обміну даними. Основний скрипт HAL виконується тільки один раз під час запуску машини, налаштовуючи потоки реального часу та місця спільної пам’яті, завантажуючи компоненти та налаштовуючи зв’язки даних між ними («сигнали» та «контакти»).

В принципі, кілька машин можуть спільно використовувати загальний HAL, щоб забезпечити їх взаємодію, проте поточна реалізація LinuxCNC обмежена одним інтерпретатором і одним модулем завдань. Наразі це майже завжди інтерпретатор G-коду і «milltask» (який, як виявилося, також добре працює для токарних верстатів і цілком підходить для роботів), але ці модулі можна вибирати під час завантаження. Зі зростанням інтересу до управління декількома взаємодіючими машинами, подолання цього обмеження, ймовірно, є одним з головних кроків для майбутнього розвитку LinuxCNC. Однак це дещо складно, і спільнота все ще обмірковує свої думки з цього приводу.

HAL лежить в основі LinuxCNC і використовується та/або розширюється всіма частинами LinuxCNC, включаючи графічні інтерфейси користувача. Інтерпретатор G-коду (або альтернативної мови) знає, як інтерпретувати G-код, і перекладає його в операції машини, запускаючи сигнали в HAL. Користувач може запитувати HAL різними способами, щоб отримати інформацію про його стан, який також відображає стан машини. Під час написання версії 2.9 графічні інтерфейси користувача все ще є винятком із цього правила і можуть знати те, чого HAL не знає (і не повинен знати).

2. Зв’язок

HAL особливий тим, що може дуже швидко спілкуватися

  • з іншими програмами, але зокрема

  • з його компонентами, які зазвичай виконуються в одному з потоків реального часу.

І під час спілкування частина LinuxCNC, з якою відбувається спілкування, не потребує підготовки до спілкування: всі ці дії виконуються асинхронно, тобто жоден компонент не перериває своє звичайне виконання для отримання сигналу, а сигнали можуть надсилатися відразу, тобто програма може чекати, поки надійде певне повідомлення, наприклад сигнал увімкнення, але їй не потрібно готуватися до отримання цього повідомлення.

Система зв’язку

  • представляє та контролює все обладнання, підключене до системи,

  • запускає та зупиняє інші програми, що взаємодіють.

Зв’язок з апаратним забезпеченням самої машини здійснюється відповідними спеціалізованими компонентами HAL.

Шар HAL є спільним простором, в якому всі численні частини, що складають LinuxCNC, обмінюються інформацією. Цей простір має контакти, які ідентифікуються за назвою, хоча інженер LinuxCNC може віддати перевагу асоціації з контактом електронної схеми. Ці контакти можуть передавати числові та логічні значення, булеві, плаваючі та цілочисельні значення з знаком і без знака. Існує також (відносно новий) тип контакту під назвою hal_port, призначений для байтових потоків, та фреймворк для обміну більш складними даними під назвою hal_stream (який використовує приватну спільну область пам’яті, а не контакт HAL). Ці два останні типи використовуються відносно рідко.

За допомогою HAL ви можете надіслати сигнал на цей контакт. Кожна частина HAL може зчитати значення сигналу з цього контакту. Це триває доти, доки на цей контакт не буде надіслано новий сигнал, який замінить попереднє значення. Основна система обміну повідомленнями HAL не залежить від CNC, але HAL постачається з великою кількістю компонентів, які знають багато про CNC і передають цю інформацію через контакти. Є контакти, що представляють

  • статична інформація про машину

  • поточний стан машини

    • кінцеві вимикачі

    • позиції, що підраховуються кроковими двигунами або вимірюються енкодерами

  • одержувачам інструкцій

    • ручне керування положенням машини ("поштовх")

    • позиції, які крокові двигуни повинні зайняти далі

За аналогією з електронними кабелями, контакти можуть бути з’єднані між собою, тому значення, що змінюється в одному контакті, служить вхідним сигналом для іншого контакту. Компоненти HAL готують такі вхідні та вихідні контакти і, таким чином, автоматично запускаються для виконання.

Компоненти HAL

Багато «експертних» програмних компонентів LinuxCNC зазвичай реалізовані як компоненти HAL, які концептуально також називаються модулями. Ці комп’ютерні експерти постійно зчитують з HAL інформацію про стан, якого повинна досягти машина, і порівнюють цей бажаний стан із станом, в якому машина перебуває в даний момент. Коли існує різниця між тим, що повинно бути, і тим, що є в даний момент, виконуються певні дії для зменшення цієї різниці, при цьому постійно записуються оновлення поточного стану назад в простір даних HAL.

Є компоненти, що спеціалізуються на взаємодії з кроковими двигунами, а інші компоненти знають, як керувати сервоприводами. На вищому рівні деякі компоненти знають, як осі машини розташовані в 3D, а інші знають, як виконувати плавний рух від однієї точки простору до іншої. Токарні верстати, фрезерні верстати та роботи будуть відрізнятися за компонентами LinuxCNC, які є активними, тобто завантаженими конфігураційним файлом HAL для цієї машини. Проте дві машини можуть виглядати дуже по-різному, оскільки побудовані для дуже різних цілей, але якщо вони обидві використовують сервомотори, то вони все одно можуть використовувати один і той самий сервокомпонент HAL.

Походження стимулу до переїзду

На найнижчому (найближчому до апаратного забезпечення) рівні, наприклад для крокових двигунів, опис стану цього двигуна є дуже інтуїтивним: це кількість кроків у певному напрямку. Різниця між бажаним положенням і фактичним положенням перетворюється на рух. Швидкість, прискорення та інші параметри можуть бути внутрішньо обмежені в самому компоненті або, за бажанням, обмежені компонентами, розташованими вище за течією. (Наприклад, у більшості випадків значення положення осі, що надсилаються до компонентів генератора кроків, вже обмежені та сформовані відповідно до налаштованих обмежень машини або поточної швидкості подачі.)

Будь-який рядок G-коду інтерпретується та запускає набір процедур, які, у свою чергу, знають, як взаємодіяти з компонентами, що знаходяться на середньому шарі, наприклад, для створення кола.

Піни та сигнали

HAL займає особливе місце в серцях програмістів завдяки способу представлення потоку даних між модулями. Коли традиційні програмісти думають про змінні, адреси або порти вводу-виводу, HAL посилається на «контакти». Ці контакти з’єднуються або отримують значення за допомогою сигналів. Подібно до того, як інженер-електрик з’єднує дроти між контактами компонентів млина, інженер HAL встановлює потік даних між контактами екземплярів модулів.

Графічний інтерфейс LinuxCNC (AXIS, GMOCCAPY, Touchy тощо) відображає стан деяких контактів (наприклад, кінцевих вимикачів), але для усунення несправностей і налаштування існують також інші графічні інструменти: Halshow, Halmeter, Halscope і Halreport.

У решті цього вступу представлено

  • синтаксис того, як контакти різних компонентів з’єднані у файлах конфігурації HAL, та

  • програмне забезпечення для перевірки значень контактів

    • у будь-який момент,

    • розвиваючись з часом.

3. Проектування системи HAL

.HAL базується на традиційних методах проектування систем.

HAL базується на тих самих принципах, що використовуються для проектування апаратних схем і систем, тому спочатку варто розглянути ці принципи. Будь-яка система, включаючи верстат з CNC, складається з взаємопов’язаних компонентів. Для верстата з CNC цими компонентами можуть бути головний контролер, сервопідсилювачі або крокові приводи, двигуни, енкодери, кінцеві вимикачі, пускові пристрої, можливо, частотний перетворювач для приводу шпинделя, PLC для управління зміною інструменту тощо. Виробник верстата повинен вибрати, змонтувати та з’єднати ці деталі, щоб створити цілісну систему.

Концепція схеми HAL
Figure 1. Концепція HAL - З’єднання подібних електричних кіл.

Рисунок один буде записано в коді HAL ось так:

net signal-blue    component.0.pin1-in      component.1.pin1-out
net signal-red     component.0.pin3-out     component.1.pin3-in     component.1.pin4-in

3.1. Вибір деталі

Конструктор машини не повинен турбуватися про те, як працює кожна окрема деталь. Він розглядає їх як «чорні скриньки». На етапі проектування він вирішує, які деталі він буде використовувати — крокові або сервоприводи, сервопідсилювач якої марки, які та скільки кінцевих вимикачів тощо. Рішення інтегратора про те, які конкретні компоненти використовувати, базується на функціях цих компонентів та технічних характеристиках, наданих виробником пристрою. Розмір двигуна і навантаження, яке він повинен приводити в рух, впливатимуть на вибір підсилювача, необхідного для його роботи. Вибір підсилювача може впливати на типи зворотного зв’язку, необхідні підсилювачу, і сигнали швидкості або положення, які повинні надсилатися до підсилювача від системи управління.

У світі HAL інтегратор повинен вирішити, які компоненти HAL необхідні. Зазвичай для кожної інтерфейсної плати потрібен драйвер. Додаткові компоненти можуть знадобитися для програмного генерування імпульсів кроку, функціональності PLC та широкого спектру інших завдань.

3.2. Проектування взаємозв’язків

Розробник апаратної системи не тільки вибирає деталі, але й вирішує, як ці деталі будуть з’єднані між собою. Кожна чорна скринька має клеми, можливо, тільки дві для простого вимикача або десятки для сервоприводу чи PLC. Вони повинні бути з’єднані між собою. Двигуни підключаються до сервопідсилювачів, кінцеві вимикачі підключаються до контролера тощо. Під час роботи над проектом конструктор створює велику схему підключення, яка показує, як усі деталі повинні бути з’єднані між собою.

Під час використання HAL компоненти з’єднуються між собою сигналами. Розробник повинен вирішити, які сигнали потрібні та що вони повинні з’єднувати.

3.3. Впровадження

Після завершення складання схеми підключення настає час збирати машину. Необхідно придбати та встановити деталі, а потім з’єднати їх між собою відповідно до схеми підключення. У фізичній системі кожне з’єднання являє собою шматок дроту, який потрібно відрізати та підключити до відповідних клем.

HAL надає ряд інструментів, які допомагають «побудувати» систему HAL. Деякі з цих інструментів дозволяють «підключити» (або відключити) окремий «провід». Інші інструменти дозволяють зберегти повний перелік усіх деталей, проводів та іншої інформації про систему, щоб її можна було «відновити» за допомогою однієї команди.

3.4. Тестування

Дуже мало машин працюють правильно з першого разу. Під час тестування конструктор може використовувати вимірювальний прилад, щоб перевірити, чи працює кінцевий вимикач, або виміряти напругу постійного струму, що подається на сервомотор. Він може підключити осцилограф, щоб перевірити налаштування приводу або знайти електричні перешкоди. Він може виявити проблему, яка вимагає зміни схеми підключення; можливо, деталь потрібно підключити по-іншому або замінити на щось зовсім інше.

HAL надає програмні еквіваленти вольтметра, осцилографа, генератора сигналів та інших інструментів, необхідних для тестування та налаштування системи. Ті самі команди, що використовуються для побудови системи, можуть бути використані для внесення необхідних змін.

3.5. Короткий зміст

Цей документ призначений для людей, які вже знають, як здійснювати таку інтеграцію апаратних систем, але не знають, як підключити апаратне забезпечення до LinuxCNC. Дивіться розділ Приклад віддаленого запуску в документації HAL UI Examples.

Приклад віддаленого запуску (схема)
Figure 2. Приклад віддаленого запуску (схема)

Традиційна конструкція обладнання, описана вище, закінчується на межі головного блоку управління. За межами блоку управління знаходиться низка відносно простих блоків, з’єднаних між собою для виконання необхідних функцій. Всередині блок управління є великою загадкою — величезною чорною скринькою, яка, сподіваємося, працює.

HAL розширює цей традиційний метод проектування апаратного забезпечення на внутрішню частину великої чорної скриньки. Він перетворює драйвери пристроїв і навіть деякі внутрішні частини контролера на менші чорні скриньки, які можна з’єднувати між собою і навіть замінювати, як і зовнішнє апаратне забезпечення. Це дозволяє «схемі підключення системи» показувати частину внутрішнього контролера, а не тільки велику чорну коробку. І найголовніше, це дозволяє інтегратору тестувати та модифікувати контролер, використовуючи ті ж методи, які він використовував би для решти апаратного забезпечення.

Такі терміни, як двигуни, підсилювачі та енкодери, знайомі більшості інтеграторів машин. Коли ми говоримо про використання надзвичайно гнучкого екранованого кабелю з вісьмома провідниками для підключення енкодера до плати входу сервоприводу в комп’ютері, читач відразу розуміє, про що йдеться, і задається питанням: «Які роз’єми мені знадобляться для кожного кінця?». Такий самий підхід є необхідним для HAL, але конкретний хід думок може зайняти трохи часу, щоб налагодитися. Використання термінів HAL спочатку може здатися трохи дивним, але концепція роботи від одного з’єднання до наступного є такою самою.

Ідея розширення схеми підключення на внутрішню частину контролера і є сутністю HAL. Якщо ви звикли до ідеї взаємозв’язку апаратних чорних скриньок, то, ймовірно, не матимете проблем із використанням HAL для взаємозв’язку програмних чорних скриньок.

4. Концепції HAL

Цей розділ є глосарієм, що містить визначення основних термінів HAL, але він дещо відрізняється від традиційного глосарію, оскільки терміни в ньому не розташовані в алфавітному порядку. Вони розташовані відповідно до їхнього взаємозв’язку або послідовності в системі HAL.

Компонент:: Коли ми говорили про дизайн апаратного забезпечення, ми називали окремі елементи «деталями», «будівельними блоками», «чорними скриньками» тощо. Еквівалентом HAL є «компонент» або «компонент HAL». У цьому документі використовується термін «компонент HAL», коли існує ймовірність плутанини з іншими видами компонентів, але зазвичай використовується просто «компонент». Компонент HAL — це частина програмного забезпечення з чітко визначеними входами, виходами та поведінкою, яку можна встановлювати та з’єднувати між собою за потреби. + + Багато компонентів HAL моделюють поведінку матеріальної частини машини, і контакт дійсно може бути призначений для підключення до фізичного контакту на пристрої для зв’язку з ним, звідси і походить назва. Але найчастіше це не так. Уявіть собі модернізацію ручного токарного/фрезерного верстата. LinuxCNC реалізує те, як машина представляє себе зовнішньому світу, і другорядним є те, чи реалізація малювання кола вже реалізована на машині, чи надається з LinuxCNC. І зазвичай до уявної модернізації додають кнопки, які сигналізують про дію, наприклад, аварійну зупинку. LinuxCNC і машина стають єдиним цілим. І це завдяки HAL.

Параметр:: Багато апаратних компонентів мають налаштування, які не пов’язані з іншими компонентами, але все одно потребують доступу. Наприклад, сервопідсилювачі часто мають підлаштувальні потенціометри для налаштування та тестові точки, до яких можна підключити вимірювальний прилад або осцилограф для перегляду результатів налаштування. Компоненти HAL також можуть мати такі елементи, які називаються «параметрами». Існує два типи параметрів: вхідні параметри еквівалентні трим-потенціометрам — це значення, які користувач може налаштовувати і які залишаються фіксованими після встановлення. Вихідні параметри не можуть бути налаштовані користувачем — вони еквівалентні тестовим точкам, які дозволяють контролювати внутрішні сигнали.

Закріпити:: Апаратні компоненти мають термінали, які використовуються для їх з’єднання між собою. Еквівалентом HAL є «контакт» або «контакт HAL». «Контакт HAL» використовується в разі необхідності, щоб уникнути плутанини. Всі контакти HAL мають назви, і ці назви використовуються при їх з’єднанні між собою. Контакти HAL є програмними об’єктами, які існують тільки всередині комп’ютера.

Physical_Pin:: Багато пристроїв вводу-виводу мають реальні фізичні контакти або термінали, які підключаються до зовнішнього обладнання, наприклад, контакти роз’єму паралельного порту. Щоб уникнути плутанини, їх називають «фізичними контактами». Це ті елементи, які «виступають» у реальний світ.

Note

Ви можете задатися питанням, який зв’язок існує між HAL_pins, physical_pins та зовнішніми елементами, такими як кодери або карта STG: тут ми маємо справу з інтерфейсами типу перетворення/конвертації даних.

Сигнал:: У фізичній машині клеми реальних апаратних компонентів з’єднані між собою дротами. Еквівалентом дроту в HAL є «сигнал» або «сигнал HAL». Сигнали HAL з’єднують контакти HAL між собою відповідно до вимог виробника машини. Сигнали HAL можна від’єднувати та під’єднувати за бажанням (навіть під час роботи машини).

Тип:: При використанні реального обладнання ви не підключали б 24-вольтовий релейний вихід до аналогового входу +/-10 В сервопідсилювача. Контакти HAL мають ті самі обмеження, які залежать від їхнього типу. І контакти, і сигнали мають типи, і сигнали можна підключати тільки до контактів того самого типу. Наразі існує 4 типи, а саме:

+ - біт - одне значення TRUE/FALSE або ON/OFF - float — 64-бітове число з плаваючою комою, з роздільною здатністю приблизно 53 біти та динамічним діапазоном понад 1000 біт. - u32 – 32-бітове беззнакове ціле число, допустимі значення від 0 до 4 294 967 295 - s32 – 32-бітове знакове ціле число, допустимі значення від -2 147 483 648 до +2 147 483 647 - u64 – 64-бітове беззнакове ціле число, допустимі значення від 0 до 18 446 744 073 709 551 615 - s64 – 64-бітове знакове ціле число, допустимі значення від -9,223,372,036,854,775,808 до +9,223,372,036,854,775,807

Функція:: Реальні апаратні компоненти, як правило, реагують на вхідні сигнали миттєво. Наприклад, якщо вхідна напруга на сервопідсилювачі змінюється, вихідна напруга також змінюється автоматично. Проте програмні компоненти не можуть діяти «автоматично». Кожен компонент має специфічний код, який повинен бути виконаний, щоб компонент міг виконувати свої функції. У деяких випадках цей код просто виконується як частина компонента. Однак у більшості випадків, особливо в компонентах реального часу, код повинен виконуватися в певній послідовності та з певними інтервалами. Наприклад, вхідні дані повинні бути прочитані перед тим, як виконувати обчислення на вхідних даних, а вихідні дані не повинні записуватися до завершення обчислень. У цих випадках код стає доступним для системи у вигляді однієї або декількох «функцій». Кожна функція є блоком коду, який виконує певну дію. Системний інтегратор може використовувати «потоки» для планування серії функцій, які будуть виконуватися в певному порядку і через певні проміжки часу.

Нитка:: «Потік» — це список функцій, які виконуються через певні проміжки часу в рамках завдання, що виконується в режимі реального часу. Коли потік створюється вперше, він має певний проміжок часу (період), але не має функцій. Функції можна додавати до потоку, і вони будуть виконуватися послідовно кожного разу, коли потік запускається.

Наприклад, припустимо, що ми маємо компонент parport з назвою hal_parport. Цей компонент визначає один або кілька контактів HAL для кожного фізичного контакту. Контакти описані в розділі документації цього компонента: їхні назви, як кожен контакт пов’язаний з фізичним контактом, чи є вони інвертованими, чи можна змінити полярність тощо. Але цього недостатньо, щоб передати дані з контактів HAL на фізичні контакти. Для цього потрібен код, і саме тут на сцену виходять функції. Компонент parport потребує щонайменше двох функцій: одна для зчитування фізичних вхідних контактів і оновлення контактів HAL, інша для отримання даних з контактів HAL і запису їх на фізичні вихідні контакти. Обидві ці функції є частиною драйвера parport.

5. Компоненти HAL

Кожен компонент HAL — це програмне забезпечення з чітко визначеними вхідними даними, вихідними даними та поведінкою, яке можна встановлювати та з’єднувати між собою за потреби. У розділі HAL Components List наведено перелік усіх доступних компонентів та короткий опис їхніх функцій.

6. Проблеми з синхронізацією в HAL

На відміну від моделей фізичного з’єднання між чорними ящиками, на яких, як ми вже говорили, базується HAL, просте з’єднання двох контактів за допомогою HAL-сигналу далеко не відповідає дії фізичного корпусу.

Справжня релейна логіка складається з реле, з’єднаних між собою, і коли контакт розмикається або замикається, струм негайно протікає (або зупиняється). Інші котушки можуть змінювати стан тощо, і все це просто «відбувається». Але в логіці типу PLC це працює не так. Зазвичай під час одного проходу по драбині кожна сходинка оцінюється в порядку її появи і тільки один раз за прохід. Ідеальним прикладом є драбина з однією сходинкою, з контактом NC, з’єднаним послідовно з котушкою. Контакт і котушка належать до одного реле.

Якби це було звичайне реле, то щойно на котушку подається живлення, контакти починають розмикатися та знеструмлювати її. Це означає, що контакти знову замикаються тощо, і т.д. Реле перетворюється на зумер.

У випадку з PLC, якщо котушка вимкнена, а контакт закритий, коли PLC починає оцінювати щабель, то після завершення цього проходу котушка вмикається. Той факт, що вмикання котушки відкриває контакт, який її живить, ігнорується до наступного проходу. На наступному проході PLC бачить, що контакт відкритий, і знеструмлює котушку. Таким чином, реле все ще швидко перемикається між увімкненим і вимкненим станом, але з частотою, яка визначається тим, як часто PLC оцінює щабель.

У HAL функція — це код, який оцінює щабель (щаблі). Фактично, реальна версія ClassicLadder, що підтримує HAL, експортує функцію, яка саме це і робить. Тим часом, потік — це те, що запускає функцію через певні проміжки часу. Так само, як ви можете вибрати, щоб PLC оцінював усі свої щаблі кожні 10 мс або кожну секунду, ви можете визначити потоки HAL з різними періодами.

Різниця між потоками полягає не в тому, що саме потік робить, а в тому, які функції з ним пов’язані. Справжня відмінність полягає просто в тому, як часто потік виконується.

У LinuxCNC у вас може бути потік тривалістю 50 мкс та потік тривалістю 1 мс. Вони будуть створені на основі BASE_PERIOD та SERVO_PERIOD, фактичний час залежить від значень у вашому INI-файлі.

Наступний крок – вирішити, що має робити кожен потік. Деякі з цих рішень однакові в (майже) будь-якій системі LinuxCNC. Наприклад, обробник команд руху завжди додається до servo-thread.

Інші з’єднання будуть виконані інтегратором. Вони можуть включати підключення функцій зчитування енкодера драйвера STG і запису DAC до сервопотоку, або підключення функції StepGen до базового потоку, разом з функцією (функціями) parport для запису кроків в порт.