Engee 文档

通过Engee硬件支持包创建和使用自定义扩展

页面进行中。

硬件支持包*Engee*允许您组织*Engee*和 客户端程序

现在,您可以创建自己的Python模块,这些模块将在客户端程序上运行,并将结果返回给*Engee*。 为此,Julia代码是从Python模块自动生成的。 这允许您直接从*Engee*命令行或块调用函数。

技术是这一机制的核心。 RPC(远程过程调用)。 您在Julia中调用一个函数,该函数通过网络将参数发送到客户端计算机。 在那里,硬件支持包使用这些参数执行相应的Python函数并返回结果。

创建简单扩展的示例

让我们创建一个简单的自定义扩展。 要做到这一点,使用模板文件夹"模块",其中包含目录"设备"和"目标"。

  • *Device*是*不*与*Engee*模型交互并且不使用其数据的任意用户类。

  • Target*是一个用户类,它*与*Engee*模型交互,从中接收数据进行处理,并在另一个平台(微控制器,独立计算机等)上执行。).

在我们的例子中,我们将创建一个*设备*。

  1. 在"设备"文件夹中创建一个新的"演示"文件夹。

  2. 在"演示"中创建一个文件demo.py '用下面的代码:

import time
import datetime

from devices.base_device import BaseDevice

class Demo(BaseDevice):
    def __init__(self) -> None:
        pass

    def __del__(self) -> None:
        pass

    def solve_equation(self, x: float, y: float, z: float) -> float:
        return x * y - z

    def get_host_time(self) -> str:
        host_time = time.localtime()
        return str(host_time)

这是一个简单设备的例子。 我们的’Demo’类可以计算具有指定参数的方程的结果,并将当前时间从客户端程序返回到*Engee*。

请注意,'Demo’类继承自’BaseDevice'。 这是硬件支持包将其注册为RPC类所必需的。 如果我们创建一个目标,我们将继承自"BaseTarget`:

from targets.base_target import BaseTarget
对于自定义RPC类,必须从`BaseDevice`(如果它是设备)或`BaseTarget`(如果它是目标)继承。

数据结构的转移

如果你想传输复杂的数据结构,那么在同一目录中创建一个`演示`文件`models.py `。 例如:

from devices.base_models import BaseModel

class MyStruct(BaseModel):
    parameter_x: int
    parameter_y: int
    parameter_z: float
数据结构必须从`BaseModel’继承!

然后,您可以在主类中使用此结构。:

from devices.demo.models import MyStruct

class Demo(BaseDevice):
    ...
    def func(self, comp_s: MyStruct) -> float:
        return comp_s.parameter_x + comp_s.parameter_y + comp_s.parameter_z

在Engee中注册和使用模块

创建Python模块后,您需要生成相应的Julia代码并在*Engee*中注册模块。

首先,让我们来看看现有设备的列表。:

engee> using Main.EngeeDeviceManager.Devices.

CAN                   COM                   ECHO                  HID
HTTP                  L502BOARD             LOGITECHG29WHEEL      MODBUSMASTER
SOCKET                TFLEXDOCS             THRUSTMASTERJOYSTICK  THRUSTMASTERTHROTTLE
UM                    UTILS                 VISA

我们的’演示’模块还没有在这里。

指定我们的"模块"文件夹的路径并下载扩展名。:

engee> module_path = "/path/to/module"
engee> using Main.EngeeDeviceManager.Devices.UTILS
engee> using Main.EngeeDeviceManager.UTILS_API
engee> utils = UTILS.Utils()
engee> UTILS_API.loadExtension(utils, module_path)

如果一切都成功,客户端程序的日志中将出现以下消息:

INFO     | Extension with name: module was loaded successfully!

模块现已注册。 重新启动*Engee*内核并重新启动硬件支持包:

engee> engee.clear_all()
# 等待内核重启
engee> engee.package.start("Engee-Device-Manager")

让我们再看看设备列表:

engee> using Main.EngeeDeviceManager.Devices.

CAN                   COM                   DEMO                  ECHO
HID                   HTTP                  L502BOARD             LOGITECHG29WHEEL
MODBUSMASTER          SOCKET                TFLEXDOCS             THRUSTMASTERJOYSTICK
THRUSTMASTERTHROTTLE  UM                    UTILS                 VISA

"演示"模块现在在列表中,可以使用。:

engee> demo = DEMO.Demo()
Main.EngeeDeviceManager.Devices.DEMO.Demo("Demo", UUID("1ffb2334-3176-42ac-931e-c278af2506cb"), ["solve_equation", "get_host_time"], "Demo_1ffb2334-3176-42ac-931e-c278af2506cb_reply", Main.EngeeDeviceManager.Devices.DEMO.var"#solve_equation#3"{String, UUID}("Demo", UUID("1ffb2334-3176-42ac-931e-c278af2506cb")), Main.EngeeDeviceManager.Devices.DEMO.var"#get_host_time#4"{String, UUID}("Demo", UUID("1ffb2334-3176-42ac-931e-c278af2506cb")))

engee> demo.solve_equation(5.5, 6.6, 7.7)
28.599999999999998

engee> demo.get_host_time()
"time.struct_time(tm_year=2025, tm_mon=8, tm_mday=27, tm_hour=19, tm_min=32, tm_sec=52, tm_wday=2, tm_yday=239, tm_isdst=0)"

您的扩展将在每次运行客户端程序时自动加载。 如果您不再需要它,您可以从自动上传中删除它。:

engee> UTILS_API.deleteExtension(utils, module_path)
'DeleteExtension’函数从启动列表中删除扩展名。 要使更改生效,必须完全重新启动*Engee*硬件支持包。

因此,我们在*Engee*和自定义Python代码之间创建了一个"桥梁",在客户端程序上执行计算并在*Engee*中获得结果。

有用的连结