AnyMath 文档

自定义引擎支持包.综合服务

子系统 恩吉。综合服务 之间提供交互 AnyMath 和外部硬件通过客户端程序和支持包。

您可以扩展*Engee子系统的功能。集成*通过开发我们自己的自定义支持包。 支持包是一个Python模块,它在客户端程序中运行,并在 AnyMath .

使*Engee子系统。集成*可以使用自定义包, AnyMath 用Julia语言自动为它们生成代码。 这允许您直接从 命令行 AnyMath img 41 1 2 或者从街区。

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

执行架构

了解代码执行的分布方式非常重要:

Python代码*在客户端程序过程中直接在用户计算机上执行; Julia*代码在子系统中执行 AnyMath 并协调互动。

例如,当调用:

using Main.EngeeDeviceManager.Devices.EXTDEVICE
device = EXTDEVICE.Extdevice()
device.function()

Julia-代码在 AnyMath ,而Python是一个函数 功能() -在客户端计算机上,其结果返回到 AnyMath .

开发自定义支持包

自定义支持包可以实现为:

*设备(设备)*是一个任意用户定义的类,它不是*设计来直接执行模型仿真的 *AnyMath 并且在运行时不使用其内部数据进行计算。 它为块和脚本提供了自定义方法。 有关开发自定义设备支持包的详细信息,请参阅 开发自定义设备支持包.

*目标(目标)*是一个自定义类,它*与模型交互 AnyMath ,从其接收数据进行处理并在另一个平台(微控制器,独立计算机等)上执行。). 有关目标开发的详细信息,请参阅 开发自定义嵌入式系统支持包.

可用的Python包

在开发自定义支持包时,您可以使用所有标准Python包以及以下第三方包:

可用Python包列表
包裹 资料描述

aiohttp

异步HTTP客户端/服务器框架(asyncio)

自动闪光

删除未使用的导入和变量

强盗

静态Python代码安全分析器

[医]贝特型

运行时快速混合类型检查

黑色

一个不妥协的代码格式化程序

证明;证明

Mozilla的CA捆绑包

cffi

用于从Python调用C代码的外部函数接口

doc格式,doc格式

根据PEP257格式化文档字符串

高射炮8

模块化源代码检查器:pep8,pyflakes和其他

gpib-ctypes

PYTHON的GPIB接口,使用ctypes实现

隐藏

Hidapi的Ctypes绑定

httpx

下一代HTTP客户端

intelhex

用于操作英特尔十六进制文件的Python库

伊斯特

用于排序Python导入的实用程序/库

jinja2

一个非常快速和富有表现力的模板引擎

jupyter-客户端

Jupyter协议实现和客户端库

jupyter-核心

Jupyter基本包

jwcrypto的

JOSE Web标准的实施

mdurl

标记URL实用程序

味精背包

MessagePack序列化器

多区

多领域的实施

n.麻木,麻木

Python中计算数组的基本包

订购-套装

记住其顺序的OrderedSet

n.贴片,贴片

用于更改动态链接器和RPATH ELF可执行文件的实用程序

路径规格

用于匹配gitignore样式中的文件路径的实用程序

平台,平台

确定合适的平台特定目录

[医]疯狂

使用Python类型提示进行数据验证

大西洋-核心

Pydantic验证和序列化的主要功能

pydantic-设置

使用Pydantic管理设置

[医]皮杜诺克利

Arduino-cli周围的包装器

[医]火花香

被动Python程序检查器

[医]皮莫德总线

Python中的全功能Modbus协议栈

[医]皮塞里亚

Python串口扩展

[医]皮乌斯布

来自Python的USB访问模块

[医]皮维萨

Gpib、RS232、TCPIP和USB工具的PYTHON VISA绑定

皮维萨-py

VISA库的纯Python实现

[医]皮亚姆

Python的YAML解析器和发射器

[医]pyzmq

0mq的Python绑定

n.redis

Python客户端用于Redis数据库和键值存储

请求

Python中人的HTTP

设置工具

轻松下载、构建、安装、更新和删除Python包。

汤姆尔

Python库为汤姆的明显,最小的语言

鹿untokenize

将令牌转换为源代码(同时保留空格)

urllib3

具有线程安全连接池、文件发送和其他功能的HTTP库

对于自定义RPC类,必须继承自 N.基地,基地 (如果是设备)或从 基本目标 (如果它是一个目标)。

数据结构必须继承自 基本模型!

*所有方法必须包含参数和返回值的完整类型注释。*例如:

# НЕПРАВИЛЬНО - без аннотаций
def __init__(self, param1, param2):
    pass

# ПРАВИЛЬНО - с полными аннотациями
def __init__(self, param1: int, param2: float) -> None:
    pass

def calculate(self, x: float, y: int) -> str:
    return "result"

如果没有注释,系统将无法正确生成Julia代码并在Python和Julia之间转换数据类型。

用于从块调用的方法不应以 _-这样的方法将无法从脚本和块中获得。

嵌入式系统支持包(目标)应位于 目标/<目标文件夹>/.

设备支持包必须位于 设备/<设备文件夹>/.

您可以使用内置日志记录系统调试支持包。 有关详细信息,请参阅[调试]。 将有关支持包的信息添加到窗口 «设备» 在device类中实现静态方法。 __get_机会_列表;有关更多信息,请参阅[状态]

上传自定义包到Engee。综合服务

在客户端程序中 恩吉。综合服务 按照以下步骤操作:

  1. 打开硬件状态窗口。

  2. 选择选项卡 «扩展».

    engee integrations custom packages 1 cn

  3. 点击 «添加扩展».

  4. 选择包含要添加到客户端程序的自定义支持包的文件夹。

    engee integrations custom packages 2 cn

如果下载成功,客户端程序的诊断窗口中将显示一条消息。:

INFO: Расширение с именем extension было успешно загружено!

若要获取有关诊断窗口中找到的支持包类和方法的扩展信息,请在开发人员模式下运行客户端程序。:

engee-device-manager.exe -d

成功下载支持包后,诊断窗口中将显示其他信息。:

engee integrations custom packages 4 cn

调试支持包

要调试支持包,请使用 主博客 -内置*Engee测井系统。综合服务*:

  1. 发射*Engee。开发人员模式下的集成*(engee-设备管理器。exe-d)并在客户端程序的诊断窗口中查看日志。

  2. 通过 主博客 从您的支持包的代码。

    例子::

    logger.info("Connect {}:{}", host, port)
    logger.error("Read failed: {}", err)

集成日志记录系统的可用方法:

  • 伐木工人。调试("消息") -调试信息;

  • logger.info ("讯息") -资讯讯息;

  • 伐木工人。警告("讯息") -警告;

  • 伐木工人。错误("讯息") -错误。

消息将显示在客户端程序的诊断窗口中。 有关使用内置日志记录系统的示例,请参阅文章 开发自定义设备支持包

在客户端程序界面中显示支持包状态

客户端程序显示 恩吉。综合服务#status【已安装硬件状态】:驱动是否加载,设备是否连接。 若要将有关支持包的信息添加到硬件状态窗口,请在device类中实现静态方法。 __get_机会_列表.

操作原理:

  1. 在启动时,客户端程序从包中导入所有模块。 设备目标.

  2. 为每个注册的类检查一个私有方法。 __get_机会_列表.

  3. 如果找到该方法,则调用它并返回一个列表。 机会,机会.

  4. 客户端程序每3秒轮询一次此列表,并在硬件状态窗口中显示信息。

字段 机会,机会:

  • 钥匙 -行的唯一标识符。 例子:: "my_driver"

  • [医]钥匙 -界面中的标题。 例子:: "MyDevice驱动程序:"

  • 值_键 -状态文本。 例子:: "加载" / "未加载"

  • 值_args -格式化值的参数。 例子:: ()

  • 颜色 -指示颜色: "绿色", "橙色", "红色". 例子:: "绿色"

  • 类别: -硬件状态窗口中的选项卡:

    • "硬件" — «设备»

    • "协议" — «协议»

    • "软件" — «软件集成» (默认情况下)

    • "嵌入式" — «嵌入式系统»

如果未指定字段,则类别由设备包的名称自动确定。

自定义设备支持包的示例:

from devices.base_device import BaseDevice

class MyDevice(BaseDevice):

    @staticmethod
    def __get_opportunity_list() -> list[BaseDevice.OpportunityStatus]:
        status = BaseDevice.opportunity_status

        driver_loaded = False
        try:
            import some_library  # замените на вашу зависимость
            driver_loaded = True
        except ImportError:
            pass

        results = []

        if driver_loaded:
            results.append(status(
                key="my_driver",
                title_key="MyDevice driver:",
                value_key="Loaded",
                color="green",
                category="hardware",
            ))
        else:
            results.append(status(
                key="my_driver",
                title_key="MyDevice driver:",
                value_key="Not loaded",
                color="orange",
                category="hardware",
            ))

        results.append(status(
            key="my_device",
            title_key="MyDevice status:",
            value_key="Available",
            color="green",
            category="hardware",
        ))

        return results

添加此方法后,支持包将出现在选项卡上 «设备» 在*Engee客户端程序中。整合*。

支持包的同步和使用 AnyMath

对于自定义支持包出现在 工程师。装置。工程师。目标。,在命令行上运行 AnyMath :

using Main.EngeeDeviceManager
using Main.EngeeDeviceManager.UTILS_API

utils = UTILS_API.Utils()
UTILS_API.syncExtensions()

如果对方法签名进行了更改或添加了新方法,请调用 syncExtensions() 又来了。 同步后,支持包模块可用于 AnyMath .

每次运行客户端程序时,都会自动下载您的支持包。 如果不再需要,那么您可以将其从客户端程序中的启动中删除。:

engee integrations custom packages 3 cn