Daily MaverickTHE INTERVIEW: Cat got your tongue? Certifiably funny Cape Town comedian goes canine crazyThe Jerusalem PostEl-Sayed’s church appearance raises questions about antisemitism, Israel - opinionInquirerDole OKs new wage order for W. Visayas, Negros OccidentalZDF heuteAktuelle Pressemitteilungen des ZDFVarietyPaul Bettany, Asha Banks, Gugu Mbatha-Raw and Colin Firth Team for Feel-Good Comedy ‘It’s Alright,’ Protagonist Launches Sales (EXCLUSIVE)Ghafla“I Tell the Truth”: Rigathi Gachagua Rejects Bullying Allegations By OppositionBusiness AMBelgië heeft de laagste tewerkstellingsgraad van niet-EU-burgers in de EUSBS 뉴스[단독] '대통령 순방단' 개인정보, 벨기에 전달하다 샜나n-tvKerosin treibt die Kosten: Lufthansa kündigt deutlichen Anstieg von Flugpreisen anSouth China Morning PostHong Kong set for first taste of autumn as a strong northeast monsoon approachesESPN DeportesKnicks sufre ante Nets, pero gana y evita frío sótano3DNewsAsus представила «задушенную» Radeon RX 9060 XT LP в компактном корпусе
The Daily Newsstand · Free, Always
Tuesday, November 3, 2026

ПЛК на микроконтроллере. Визуализация цепей и отладка в реальном времени

Translate

ПЛК на микроконтроллере. Визуализаци цепей и отладка в реальном времени⁠

Уровень сложностиПростой

Время на прочтение3 мин

Охват и читатели0

Расскажу  подход в оживлении цепей и функциональных блоков в своей среде разработки под ПЛК. Я не использую  никаких графических фреймворков и библиотек, тут как раз случай когда самому сделать быстрее чем изучать что то новое. Все функциональные блоки программы  отображающие в среде на ПК : рисуют примитивами (прямоугольниками, линиями, точками,текстом etc...) .

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

 <LD_Unit Name="SEND" Group="Message" Width="120" Height="80">
      <Variables>
         -----Входящие сигналы/Переменные-----------
      </Variables>
      <types>
               SEND typedef
              {
                 Структура
              }
      </types>
      <lists>
           Линия -------
           Квадрат------
           Текст--------
      </lists>
      <code>
        <Line>
             ------------------------- КОД -----------------------
       </Line>
      </code>
    </LD_Unit>

Главное - те примитивы которые будут анимированы, привязываются к переменным:

        <Item Type="LINE" color="#ffffff" Style="onoff:#96C1FF">
          <Value>this</Value>
...
После запуска проекта, Item Type="LINE" - конвертируется в обьект.

Style=“onoff:#96C1FF” - как раз и говорит что делать- если значение переменной больше 0, меняем цвет, положение, текст и другие эффекты.

Компилятор.

Компилятор - собственной разработки, не LLVM\Clang и подобные конструкторы. Вся логика расстановки переменных и инструкций в памяти разрабатывал сам, и вместе с программой для ПЛК создается файл на подобии .elf:

--- DISASSEMBLY & BINARY CODE ---
Instruction [Offset]                          | Binary Representation (MSB..LSB)
------------------------------------------------------------------------
0] LDRI R3 Address: 818                       | 00000110 00110000 00000011 00110010
4] LDPHY R3 R3 R0                             | 00001001 00011000 11000000 00000000
8] SDRI R3 Address: 814                       | 00001101 00110000 00000011 00101110
12] MOV R0 R28 R0                             | 00111100 00000111 00000000 00000000
16] SDRI R0 Address: 818                      | 00001101 00000000 00000011 00110010

--- SYMBOLS & VARIABLES MEMORY MAP ---
Address    | Name                           | Type            | Size  
--------------------------------------------------------------------------------------
818        | system.AddrTime                | dword           | 4     
814        | system.Time                    | dword           | 4     
778        | system.IN_phy                  | pointer         | 4     
798        | system.emodule_.DI_0           | byte            | 1     
800        | system.emodule_.DI_2           | byte            | 1     
804        | system.emodule_.DI_6           | byte            | 1 
--- SYMBOLS & VARIABLES MEMORY MAP ---
Address    | Name                           | Type            | Size  
--------------------------------------------------------------------------------------
818        | system.AddrTime                | dword           | 4     
814        | system.Time                    | dword           | 4     
778        | system.IN_phy                  | pointer         | 4     
798        | system.emodule_.DI_0           | byte            | 1     
800        | system.emodule_.DI_2           | byte            | 1     
804        | system.emodule_.DI_6           | byte            | 1 

Вместе с человекочитамым текстом формируется файл для моей среды разработки:

#####XML_SYMBOLS_BEGIN#####
<?xml version="1.0" encoding="UTF-8"?>
<symbols>
  <symbol name="system.AddrTime" type="dword" address="818" size="4"/>
  <symbol name="system.Time" type="dword" address="814" size="4"/>
  <symbol name="system.IN_phy" type="pointer" address="778" size="4"/>
  <symbol name="system.emodule_.DI_0" type="byte" address="798" size="1"/>
  <symbol name="system.emodule_.DI_2" type="byte" address="800" size="1"/>

Тут содержится имя переменной, ее тип и адрес. Это позволяет не только отправить команду чтоб записать в переменную какое то значение, но и читать:

Установка значения переменной в программе ПЛК.

Установка значения переменной в программе ПЛК.

Теперь когда компилятор вернул нам регион памяти переменных, мы отправляем команду на МК - просто прислать нам регион памяти (а память у нас виртуальная, обычный массив uint8_t meory[size] )

Получаем в среде этот регион из массива, и среда уже понимает какая переменна за что отвечает, а движок отрисовки на этих значениях знает что делать.

В целом графика выглядит так:

Очень легкая среда которая даже в режиме отрисовки занимает в ОЗУ всего 120 Мб, и может работать даже на первых версиях Raspberry PI (Среда разработана с Open JDK).

View the original on Хабр →

KioskNews shows a cleaned-up reading view extracted from the publisher’s page — the original always lives on their site, not ours.