Сообщество Engee

Arduino: меняем параметры на лету

Автор
avatar-alexevsalexevs
Notebook

Пакет поддержки Arduino: настраиваемые параметры

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

Введение

В предыдущем примере мы освоили подключение Arduino и работу в независимом и интерактивном режимах Engee. Возможности последнего шире и интереснее в плане взаимодействия Engee и приложения реального времени на Target Hardware, что и будет рассмотрено в этом примере.

Для примера мы сменили целевое устройство: вместо Arduino Uno используем Arduino Mega (для разнообразия и демонстрации поддержки различных модификаций платы).

Модель примера

Модель примера относительно стандартного Blink немного видоизменена. Мы сравниваем два сигнала:

  • SIN - синусоидальный с частотой 2 Гц от блока Sine Wave с настраиваемой амплитудой и смещением,
  • REF - постоянный от блока Constant с настраиваемым значением.

Результат сравнения преобразуется в тип Float64 и в виде сигнала LED передаётся на цифровой пин встроенного светодиода.

fig_0.png

Так как мы используем другой контроллер, в блоке EDM-Target-Arduino необходимо изменить значение порта (в случае этого примера - COM9) и имя платы (arduino:avr:mega для Arduino Mega2560). Пути тулчейна и модели оставим без изменений.

Подготовка

Чтобы получить больше информации и возможностей, проведём небольшую подготовку:

Терминал

В большей степени этот шаг актуален для пользователей Windows - нужно запустить клиентское приложение Engee.Интеграции через терминал командой:

engee-device-manager.exe -d

Естественно, терминал необходимо открыть в папке с программой, или предварительно перейти в неё.

Для запуска следует пользоваться оболочкой командной строки UNIX-подобной среды, например - Cygwin или Git Bash. Windows PowerShell по умолчанию "отстыкует" процесс не будет выводить интересующие нас сообщения.

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

fig_01.png

Разберём некоторые сообщения в выводе терминала:

  • DEBUG | rpc.rpc:__queues_processing:680 | reply to Arduino_3cc86652-45ee-43e6-a8a1-c444859c33c2_reply

    На стороне клиента создан объект Arduino.

  • INFO | targets.boards.Arduino.Arduino:generate_executable_code:154 | Model arduino_monitor_and_tune project generated.

  • DEBUG | rpc.rpc:handler:433 | SUCCESS: generate_executable_code

  • INFO | targets.boards.Arduino.Arduino:compile_model:180 | Model arduino_monitor_and_tune compiled.

  • DEBUG | rpc.rpc:handler:431 | SUCCESS: compile_model=name='arduino_monitor_and_tune' id='f4f53df1-1ac8-429d-bd1b-bb90bf284dc0'

  • DEBUG | rpc.rpc:handler:431 | SUCCESS: upload_model=name='arduino_monitor_and_tune' id='f4f53df1-1ac8-429d-bd1b-bb90bf284dc0'

  • DEBUG | rpc.rpc:handler:431 | SUCCESS: start_model=name='arduino_monitor_and_tune' id='f4f53df1-1ac8-429d-bd1b-bb90bf284dc0'

    Проект модели создан, сгенерирован исполняемый код, модель скомпилирована, загружена, приложение реального времени запущено.

  • DEBUG | targets.xcp_target.xcp_target:_start_stream:206 | start_stream

    Запуск передачи данных в Engee

  • DEBUG | targets.xcp_target.xcp_target:_data_reader_loop:414 | Pushing 2 samples per port; total so far = 6

  • DEBUG | targets.xcp_target.xcp_target:_data_reader_loop:419 | Last model time: 0.04

    Отправлены буферированные данные за 2 шага моделирования, всего отправлено 6 значений, шаг расчёта модели - 0.04 с

  • DEBUG | rpc.rpc:handler:431 | SUCCESS: start_stream=b9c4d0bf-2766-f81d-3373-bcae8b91fab1

    Интерактивный режим в Engee запущен

  • DEBUG | targets.xcp_target.xcp_target:_data_reader_loop:414 | Pushing 5 samples per port; total so far = 21

  • DEBUG | targets.xcp_target.xcp_target:_data_reader_loop:419 | Last model time: 0.14

    Отправлены буферированные данные за 5 шагов моделирования, всего с начала передачи отправлено 21 значение, текущий шаг расчёта модели - 0.14 с

В строке name='arduino_monitor_and_tune' id='f4f53df1-1ac8-429d-bd1b-bb90bf284dc0' указаны имя и ID текущей модели. По этому ID в папке /user/codegen_target/f4f53df1-1ac8-429d-bd1b-bb90bf284dc0 можно найти результаты генерации кода модели - файлы Си и codeinfo.json

In [ ]:
readdir("/user/codegen_target/f4f53df1-1ac8-429d-bd1b-bb90bf284dc0")
Out[0]:
5-element Vector{String}:
 "arduino_monitor_and_tune.c"
 "arduino_monitor_and_tune.h"
 "arduino_monitor_and_tune_data.c"
 "codeinfo.json"
 "main.c"

Сейчас приложение реального времени отправляет данные в Engee для визуализации, также, как мы знаем, из Engee можно управлять выполнением приложения.

Кроме того, мы можем в модели Engee "на лету" менять параметры модели. Но для начала их нужно сделать "настраиваемыми".

Настраиваемые параметры

Перейдём во вкладку "Генерация кода" модели, и поменяем поведение параметров.

fig_02.png

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

In [ ]:
;cat /user/codegen_target/f4f53df1-1ac8-429d-bd1b-bb90bf284dc0/arduino_monitor_and_tune_data.c
#include "arduino_monitor_and_tune.h"

/* Tunable parameters initialization */
Ext_arduino_monitor_and_tune_P arduino_monitor_and_tune_P = {
	.SineWave_Amplitude = 2.5, 
	.SineWave_Frequency = 1ll, 
	.SineWave_Phase = 0ll, 
	.SineWave_Bias = 2.5, 
	.SineWave_Offset = 0ll, 
	.SineWave_Samples = 25ll, 
	.Constant_Value = 2.5
};

Встроенные параметры

Если же не изменить поведение параметров модели, то при редактировании значений в окне сообщений клиентской программы и терминале можно увидеть сообщения ошибок об отсутствии параметров. При этом, в модели Engee изменения произойдут, а в приложении реального времени - нет.

fig_1.png
fig_2.png

Если мы всё же не забыли поменять поведение параметров, ошибок не будет, а модель и приложение на Arduino будут идентично реагировать на изменение параметров.

Изменение параметров "на лету"

Ниже можно ознакомиться с тем, как это работает:

Полный вывод терминала для этого примера записан в файл terminal.txt для ознакомления.

Кроме уже разобранных отладочных сообщений, в терминале можно наблюдать новый вид сообщений:

Сообщения терминала

  • DEBUG | rpc.rpc:handler:431 | SUCCESS: change_param=['b66d92a7-374b-47d6-a220-15b648840886', 'Value', 1]

    Параметр Value изменён на значение "1"

  • DEBUG | rpc.rpc:handler:431 | SUCCESS: change_param=['dfbca8b4-535b-4ec5-8d15-c0deea70a7cf', 'Amplitude', 1.5]

    Параметр Amplitude изменён на значение "1.5"

Первое значение в векторе change_param - это ID блока. Его можно также легко найти в сгенерированном codeinfo.json для соответствующих настраиваемых параметров:

In [ ]:
filename = joinpath("/user/codegen_target/f4f53df1-1ac8-429d-bd1b-bb90bf284dc0/","codeinfo.json")
(start_line, end_line) = 30,91

open(filename, "r") do file
    for (i, line) in enumerate(eachline(file))
        if i > end_line
            break
        elseif i >= start_line
            println(line)
        end
    end
end
    "tunable_params": {
        "cname": "arduino_monitor_and_tune_P",
        "ctype": "Ext_arduino_monitor_and_tune_P",
        "fields": [
            {
                "name": "SineWave_Amplitude",
                "cname": "SineWave_Amplitude",
                "ctype": "double",
                "mtype": "double",
                "dims": [],
                "uuid": "dfbca8b4-535b-4ec5-8d15-c0deea70a7cf"
            },
            {
                "name": "SineWave_Frequency",
                "cname": "SineWave_Frequency",
                "ctype": "int64_t",
                "mtype": "int64",
                "dims": [],
                "uuid": "dfbca8b4-535b-4ec5-8d15-c0deea70a7cf"
            },
            {
                "name": "SineWave_Phase",
                "cname": "SineWave_Phase",
                "ctype": "int64_t",
                "mtype": "int64",
                "dims": [],
                "uuid": "dfbca8b4-535b-4ec5-8d15-c0deea70a7cf"
            },
            {
                "name": "SineWave_Bias",
                "cname": "SineWave_Bias",
                "ctype": "double",
                "mtype": "double",
                "dims": [],
                "uuid": "dfbca8b4-535b-4ec5-8d15-c0deea70a7cf"
            },
            {
                "name": "SineWave_Offset",
                "cname": "SineWave_Offset",
                "ctype": "int64_t",
                "mtype": "int64",
                "dims": [],
                "uuid": "dfbca8b4-535b-4ec5-8d15-c0deea70a7cf"
            },
            {
                "name": "SineWave_Samples",
                "cname": "SineWave_Samples",
                "ctype": "int64_t",
                "mtype": "int64",
                "dims": [],
                "uuid": "dfbca8b4-535b-4ec5-8d15-c0deea70a7cf"
            },
            {
                "name": "Constant_Value",
                "cname": "Constant_Value",
                "ctype": "double",
                "mtype": "double",
                "dims": [],
                "uuid": "b66d92a7-374b-47d6-a220-15b648840886"
            }
        ]
    },

Заключение

На простом примере мы ознакомились с преимуществами интерактивного режима выполнения модели на Target Hardware для пакета поддержки Arduino. Разобрались, как анализировать процесс обмена данными в этом режиме, используя терминал, а также как изменять параметры модели "на лету" и подтверждать такие изменения.