为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(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)
重要的是要记住以下几点:
- 客户端程序必须正在运行,并且与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。