Engee 文档
Notebook

为Engee开发硬件支持包.综合服务

库存总是有用的,因为你可以找到很多意想不到的事情。 例如,我找到了Analog Discovery2数据收集平台。 这是一个非常有趣的硬件,我认为与Engee交朋友会很好。 幸运的是,[Engee.Integration](https://engee.com/helpcenter/stable/ru/integration-with-hardware.html )允许您编写自己的扩展来支持我使用的硬件。 在这个项目中,使用模拟发现2的例子,我将向您展示如何为Engee编写自己的扩展。整合。

什么是模拟发现?

Analog Discovery是Digilent的一系列器件,用于数据采集、信号生成、逻辑分析仪和协议。 与此同时,它实际上是一个在USB上运行的袖珍设备! 在这儿:

analog_discovery_2_obl_600.png

你需要安装什么?

为了使我的扩展工作,我需要安装Digilent的波形。 如果我有Linux,我需要一个额外的Adept2运行时。 我还需要Engee客户端程序。整合。
在Engee本身,我将需要安装主要的Engee支持包。集成,适用于任何设备。 安装后,客户端的下载链接将可用。 这些步骤描述于документации

编写扩展-从哪里开始?

许多硬件制造商发布SDK库集和各种工具,用于在自定义应用程序中处理硬件。 Digilent还制作了自己的SDK,它只是dwf库的头文件。 但是,Engee的扩展。集成是在Python中创建的,头文件在这里根本不适用。 但是Python可以直接使用ctypes模块加载dll文件。 让我们记住这一点。

扩展架构

扩展是从devices模块的内置BaseDevice类继承的类。基地_device。 这个模块已经包含在客户端程序中,没有必要搜索它。 接下来,在Engee本身中,我们需要"注册"这个类并重新启动Engee核心。 有关此机制的详细信息,请参阅документации.

要编写扩展,您可以直接从此类的方法调用SDK函数,也可以在SDK上创建一个包装器,然后从方法调用包装器。
但是,在第一种情况下,我们每次进行更改时都必须重新启动扩展,而在第二种情况下,我们只需要重新启动客户端程序。 第二种选择看起来更可取。

重要! 为了使扩展在上传到Engee时"可见",必须遵循特殊的文件夹结构。 我添加了一个存档与我的扩展到项目符合这个结构。

扩展开发-注意什么

扩展的开发与常规开发没有太大的不同,但我想提请注意编写和调试代码的一些功能。

也许最重要的是扩展类方法的完整规范:参数类型,返回值类型。 这是扩展方法的要求。 让我们来看一个完全指定的方法的例子。:

``'蟒蛇
def get_sample(self,channel:int)->float:
c_channel=c_int(int(channel))
测量=浮点数()
measure=float(acq_single(self.hDevice,c_channel))
回报措施


正如您所看到的,我们明确指定通道输入是一个整数,输出将严格是一个浮点数。

二是调试。 要查看代码内部发生了什么,您需要添加输出,但print()不起作用。 要将信息输出组织到客户端程序的日志窗口,您需要使用main\_logger模块。:

``'蟒蛇
从main_logger导入MainLogger
记录器=MainLogger()

使用这种机制非常简单。 让我们来看看确保连接到设备的代码。:

``'蟒蛇
dwf。FDwfDeviceOpen(devid_c,byref(hdwf))
dwf。FDwfGetLastError(byref(错误))

匹配错误。价值:
个案0:
logger.info(f"已连接id{devid}的设备")

个案3:  
    logger.info(f"id为{devid}的设备已经连接,跳过")  
      
个案 _:  
    dwf。FDwfGetLastErrorMsg(szerr)  
    伐木工人。error(f"发生错误:{szerr.值}")  
    hdwf=c_int(-1)  

返回hdwf


在这里,我们使用logger对象的方法输出信息,输出进入客户端程序的日志。:

<img src="/helpcenter/stable/_next/static/media/example_resources/EDM_Custom_dev_media/image(2).png" alt="image.png" class="notebook-media">

然后Python让我感到惊讶的是,即使函数参数设置为 `int`,然后当试图通过这个论点 `float` 解释器将静默执行此操作。 因此,我不得不在类的方法中进行显式类型转换。:

``'蟒蛇
def start_sine(self,channel:int,freq:float,amp:float)->无:
	c_chan=c_int(int(通道))
	c_freq=浮点数(freq)
	c_amp=浮点数(安培)
	sinewavegen_config(self.hDevice,c_chan,c_freq,c_amp)
	通行证

测试扩展

编写代码后,您可以下载自己的扩展。 为此,请在Engee中运行以下命令:

module_path="/路径/到/模块"
使用Main。工程师。装置。UTILS的
使用Main。工程师。UTILS_API
utils=UTILS。Utils()
UTILS_API。loadExtension(utils,module_path)

重要的是要记住以下几点:

  1. 客户端程序必须正在运行,并且与Engee的连接已经建立。
  2. 对于Python,Windows路径由双斜杠分隔。 例如: C:\\srcs\\EDM_Development"
  3. 成功下载扩展后,使用命令重新启动内核 engee.clear_all() 并通过运行命令重新启动服务器程序 engee.package.start("Engee-Device-Manager") 并在客户端程序中重新建立连接

让我们检查一下我的扩展是否正常工作。 为此,您首先需要准备模拟发现本身:将第一个模拟输出连接到第一个模拟输入的加号,并将第一个模拟输入的减号连接到地。 为了清楚起见,让我们看看设备的引脚排列图片。:

analogdiscovery2-pinout-600.png

W1连接到1+,并1- 连接到
现在转到Engee并执行以下代码(假设客户端正在运行并与Engee建立通信):

现在我们可以创建一个对象来使用设备。:

In [ ]:
using Main.EngeeDeviceManager.Devices.DIGILENT
mydig = DIGILENT.Digilent()

请注意,设备以我们的类命名并转换为大写,构造函数的命名与类相同。

最后,您可以开始测试。 为此,我们将生成一个频率为2Hz,振幅为1V的正弦曲线。我们将设置频率为10kHz的数据捕获,我们将获得一个样本。:

In [ ]:
mydig.connect(-1)
mydig.start_sine(0,2.0,1.0)
mydig.start_acq(0,10000.0)
sample = mydig.get_sample(0)
println("接收数据:$样本" )
Получили данные: 0.725875469974313

ADC计数已收到,这意味着扩展正在工作。 让我们尝试获取大量样本并输出一个图表。:

In [ ]:
using Plots
ACQ = Vector{Float64}()
for i in range(1,30)
   sleep(0.01) 
   push!(ACQ,mydig.get_sample(0))
end
In [ ]:
plot(ACQ, xlabel=" 参考编号", ylabel = "电压,V", seriestype = :steppre)
Out[0]:

如果该图形不可见,则下面示出这种图形的示例。:

newplot (1).png

结论

恩吉。集成是一个用户可扩展的平台,允许您使用任何硬件。 要创建自定义扩展,您需要来自制造商和Python技能的SDK。