Engee 文档
Notebook

Arduino支持包:可配置参数

我们继续掌握Arduino编程,而无需使用Engee支持包深入代码。 在这个例子中,让我们更详细地深入了解模型的交互式执行模式:我们不仅会从Arduino接收数据,还会发送数据。 我们还将详细研究终端的调试和信息消息。

导言

在[前面的例子](https://engee.com/community/ru/catalogs/projects/arduino-bystryi-start )我们已经掌握了独立和交互式Engee模式下的Arduino连接和操作。 在Engee和目标硬件上的实时应用程序之间的交互方面,后者的功能更广泛,更有趣,这将在本示例中讨论。

例如,我们更改了目标设备:而不是Arduino Uno,我们使用Arduino Mega(用于多样化并演示对各种电路板修改的支持)。

示例模型

示例的模型相对于标准Blink稍作修改。 我们正在比较两个信号。:

  • SIN -正弦与频率2Hz从正弦波单位与可调整的幅值和偏移,
  • REF -来自具有可配置值的常量块的常量。

比较的结果转换为类型 Float64 并作为信号 LED 传输到内置LED的数字引脚。

fig_0.png

由于我们使用的是不同的控制器,因此有必要更改EDM-Target-Arduino块中的端口值(在此示例的情况下 - COM9)及董事会名称(arduino:avr:mega 为Arduino Mega2560)。 我们将保持tulchain路径和模型不变。

准备工作

为了获得更多的信息和机会,我们会做一些准备。:

终端机

在更大程度上,此步骤与Windows用户相关-您需要启动Engee客户端应用程序。通过终端与命令集成:

engee-device-manager.exe -d

当然,终端必须与程序的文件夹中打开,或首先去它。

要运行,请使用类UNIX命令行shell,如Cygwin或Git Bash。 默认情况下,Windows PowerShell会"解锁"进程,并且不会输出我们感兴趣的消息。

启动客户端程序并建立连接后,就可以启动模型的交互执行模式,之后我们会在终端中看到调试消息的输出。:

fig_01.png

我们来分析一下终端输出中的一些消息:

{蓝色}(调试)/*{绿色}(rpc。rpc:__queues_processing:680)/{blue}(回复Arduino_3cc86652-45ee-43e6-a8a1-c444859c33c2_reply)**

在客户端创建了一个Arduino对象。

*信息/{绿色}(目标。木板。Arduino的。Arduino:generate_executable_code:154)|Model arduino_monitor_and_tune项目生成。

*{蓝色}(调试)/{绿色}(rpc。rpc:处理程序:433)/{蓝色}(成功:生成_executable_code)

*信息/{绿色}(目标。木板。Arduino的。Arduino:编译_model:180)|模型arduino_monitor_and_tune编译。

*{蓝色}(调试)/{绿色}(rpc。rpc:handler:431)/{blue}(成功:编译_model=name='arduino_monitor_and_tune'id='f4f53df1-1ac8-429d-bd1b-bb90bf284dc0')

*{蓝色}(调试)/{绿色}(rpc。rpc:handler:431)/{blue}(成功:上传_model=name='arduino_monitor_and_tune'id='f4f53df1-1ac8-429d-bd1b-bb90bf284dc0')

*{蓝色}(调试)/{绿色}(rpc。rpc:handler:431)/{blue}(成功:start_model=name='arduino_monitor_and_tune'id='f4f53df1-1ac8-429d-bd1b-bb90bf284dc0')

模型项目已创建,可执行代码已生成,模型已编译,加载,实时应用程序已启动。

*{蓝色}(调试)/{绿色}(目标。xcp_target的。xcp_target:_start_stream:206)/{blue}(开始_stream)

开始数据传输到Engee

*{蓝色}(调试)/{绿色}(目标。xcp_target的。xcp_target:_data_reader_loop:414)/{blue}(每个端口推送2个样本;到目前为止总计=6)

*{蓝色}(调试)/{绿色}(目标。xcp_target的。xcp_target:_data_reader_loop:419)|最后模型时间:0.04

缓冲数据在2个仿真步骤中发送,共发送6个值,模型计算步骤为0.04s

*{蓝色}(调试)/{绿色}(rpc。rpc:处理程序:431)/{蓝色}(成功:开始_stream=b9c4d0bf-2766-f81d-3373-bcae8b91fab1)

互动模式在Engee中运行

*{蓝色}(调试)/{绿色}(目标。xcp_target的。xcp_target:_data_reader_loop:414)/{blue}(每个端口推送5个样本;到目前为止总计=21)

*{蓝色}(调试)/{绿色}(目标。xcp_target的。xcp_target:_data_reader_loop:419)|最后模型时间:0.14

缓冲数据在5个仿真步骤中发送,自发送开始以来共发送了21个值,当前模型计算步骤为0.14s

排队 name='arduino_monitor_and_tune' id='f4f53df1-1ac8-429d-bd1b-bb90bf284dc0' 指定当前模型的名称和ID。 通过文件夹中的此ID /user/codegen_target/f4f53df1-1ac8-429d-bd1b-bb90bf284dc0 您可以找到模型代码生成-C和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模型和应用程序将对参数更改做出相同的响应。

随时更改参数

下面你可以看到它是如何工作的。:

此示例的完整终端输出写入文件终端。txt进行熟悉。

除了已经反汇编的调试消息外,您还可以在终端中看到一种新类型的消息。:

终端消息

*{蓝色}(调试)/{绿色}(rpc。rpc:处理程序:431)/成功:更改_param=['b66d92a7-374b-47d6-a220-15b648840886','值',1]

Value参数已更改为"1"
*{蓝色}(调试)/{绿色}(rpc。rpc:handler:431)/SUCCESS:change_param=['dfbca8b4-535b-4ec5-8d15-c0deea70a7cf','Amplitude',1.5]

振幅参数已更改为"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"
            }
        ]
    },

结论

通过一个简单的例子,我们了解了交互式模型执行模式在Arduino支持包的目标硬件上的优势。 我们想出了如何使用终端分析这种模式下的数据交换过程,以及如何动态更改模型参数并确认这些更改。