为Engee开发硬件支持包.综合服务
库存总是有用的,因为你可以找到很多意想不到的事情。 例如,我找到了Analog Discovery2数据收集平台。 这是一个非常有趣的硬件,我认为与Engee交朋友会很好。 幸运的是,[Engee.Integration](https://engee.com/helpcenter/stable/ru/integration-with-hardware.html )允许您编写自己的扩展来支持我使用的硬件。 在这个项目中,使用模拟发现2的例子,我将向您展示如何为Engee编写自己的扩展。整合。
什么是模拟发现?
Analog Discovery是Digilent的一系列器件,用于数据采集、信号生成、逻辑分析仪和协议。 与此同时,它实际上是一个在USB上运行的袖珍设备! 在这儿:
你需要安装什么?
为了使我的扩展工作,我需要安装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()
measure =float(acq_single(self.hDevice,c_channel))
return measure
正如您所看到的,我们明确指定通道输入是一个整数,输出将严格是一个浮点数。
二是调试。 要查看代码内部发生了什么,您需要添加输出,但print()不起作用。 要将信息输出组织到客户端程序的日志窗口,您需要使用main_logger模块。:
from main_logger import MainLogger
logger = MainLogger()
使用这种机制非常简单。 让我们来看看确保连接到设备的代码。:
dwf.FDwfDeviceOpen(devid_c,byref(hdwf))
dwf.FDwfGetLastError(byref(error))
match error.value:
case 0:
logger.info(f"Device with id {devid} connected" )
case 3:
logger.info(f"Device with id {devid} is already connected, skipping" )
case _:
dwf.FDwfGetLastErrorMsg(szerr)
logger.error(f"Error occured: {szerr.value}")
hdwf = c_int(-1)
return hdwf
在这里,我们使用logger对象的方法输出信息,输出进入客户端程序的日志。:
然后Python让我感到惊讶的是,即使函数参数设置为 int,那么当试图通过这个论点 float 解释器将静默执行此操作。 因此,我必须在类方法中进行显式类型转换。:
def start_sine(self, channel:int,freq:float,amp:float) -> None:
c_chan = c_int(int(channel))
c_freq = float(freq)
c_amp = float(amp)
sinewavegen_config(self.hDevice,c_chan, c_freq, c_amp)
pass
测试扩展
编写代码后,您可以下载自己的扩展。 为此,请在Engee中运行以下命令:
module_path = "/path/to/module"
using Main.EngeeDeviceManager.Devices.UTILS
using Main.EngeeDeviceManager.UTILS_API
utils = UTILS.Utils()
UTILS_API.loadExtension(utils, module_path)
重要的是要记住以下几点:
- 客户端程序必须正在运行,并且与Engee的连接已经建立。
- 对于Python,Windows路径由双斜杠分隔。 例如:
C:\\srcs\\EDM_Development" - 成功下载扩展后,使用命令重新启动内核
engee.clear_all()并通过运行命令重新启动服务器程序engee.package.start("Engee-Device-Manager")并在客户端程序中重新建立连接
让我们检查一下我的扩展是否正常工作。 为此,您首先需要准备模拟发现本身:将第一个模拟输出连接到第一个模拟输入的加号,并将第一个模拟输入的减号连接到地。 为了清楚起见,让我们看看设备的引脚排列图片。:
即W1连接到1+,并1- 连接到地。
现在转到Engee并执行以下代码(假设客户端正在运行并与Engee建立通信):
现在我们可以创建一个对象来使用设备。:
using Main.EngeeDeviceManager.Devices.DIGILENT
mydig = DIGILENT.Digilent()
请注意,设备以我们的类命名并转换为大写,构造函数的命名与类相同。
最后,您可以开始测试。 为此,我们将生成一个频率为2Hz,振幅为1V的正弦曲线。我们将设置频率为10kHz的数据捕获,我们将获得一个样本。:
mydig.connect(-1)
mydig.start_sine(0,2.0,1.0)
mydig.start_acq(0,10000.0)
sample = mydig.get_sample(0)
println("接收数据:$样本" )
ADC计数已收到,这意味着扩展正在工作。 让我们尝试获取大量样本并输出一个图表。:
using Plots
ACQ = Vector{Float64}()
for i in range(1,30)
sleep(0.01)
push!(ACQ,mydig.get_sample(0))
end
plot(ACQ, xlabel=" 参考编号", ylabel = "电压,V", seriestype = :steppre)
如果该图形不可见,则下面示出这种图形的示例。:
结论
恩吉。集成是一个用户可扩展的平台,允许您使用任何硬件。 要创建自定义扩展,您需要来自制造商和Python技能的SDK。