为了账号安全,请及时绑定邮箱和手机立即绑定

使用Python将XML作为任务/集群读取到LabVIEW以配置DAQ

使用Python将XML作为任务/集群读取到LabVIEW以配置DAQ

一只名叫tom的猫 2024-01-04 17:14:53
我正在尝试加载一个 XML 文件,该文件将用于在 LabVIEW 中配置我的 DAQ。因此,当我查看选项时,我有:我的 XML 通道配置是动态的 - 这意味着一个 XML 可能有 3 个通道,另一个 XML 可能有 >100 个通道。对我来说,用 Python 解析 xml 并将数据作为结构/任务传递给 LabVIEW 会更容易。例如对于 XML 通道<Channels>        <Channel name="CH_PH1" enable="True" visible="False" virtual="False" units="A" physical_channel="PXI1Slot2/ai0" b_factor="0" m_factor="1033.221069" measurement_type="VOLTAGE" type="D" max_value="0.1" min_value="-0.1">          <RollingAvg do_rolling_avg="False" rolling_avg_frame_sec="0" />        </Channel>        <Channel name="CH_PH2" enable="True" visible="False" virtual="False" units="A" physical_channel="PXI1Slot2/ai1" b_factor="0" m_factor="1073.772766" measurement_type="VOLTAGE" type="D" max_value="0.1" min_value="-0.1">          <RollingAvg do_rolling_avg="False" rolling_avg_frame_sec="0" />        </Channel>        <Channel name="P_CH" enable="True" visible="False" virtual="True" units="V" formula="CH_PH1*CH_PH2" doTotalEnergy="False">          <RollingAvg do_rolling_avg="False" rolling_avg_frame_sec="0" />        </Channel>        <Channel name="P_PH_Total" enable="True" visible="False" virtual="True" units="V" formula="CH_PH1+CH_PH2" doTotalEnergy="False">          <RollingAvg do_rolling_avg="False" rolling_avg_frame_sec="0" />        </Channel></Channels>我的 Python 代码用于解析 xml:def xml():    import xml.etree.ElementTree as ET    tree = ET.parse(r'C:\Users\LAB_PTG\Desktop\Cosmo_v0.93.6\nidaq.xml')    root = tree.getroot()    P={}    C={}    for Channel in root.iter('Channel'):        z=(Channel.attrib)        if z['virtual']=='False':            P.update({z['name']:(z['physical_channel'],z['enable'],z['m_factor'],z['max_value'])})        else:            C.update({z['name']:(z['formula'])})    print(P,C)需要帮助:如何在LabVIEW中执行代码?如何在LabVIEW中处理DICT?或者有更好的解决方案来传递数据吗?使用 paras 数据动态配置 DAQmx 通道我没有设法在 LabVIEW 中创建 xml 解析器,因为它强制执行更多硬编码并具有固定的限制。我的目标是 LV DAQmx 继续采样示例,并用解析的 xml 替换配置。
查看完整描述

1 回答

?
Cats萌萌

TA贡献1805条经验 获得超9个赞

在Labview中解析XML

在 LV 中解析 XML 有点棘手,但也不是那么困难。也许,你尝试一下?

此代码循环遍历所有通道,提取属性namevirtual,并从它们的子通道中RollingAvg提取属性do_rolling_avg

https://img1.sycdn.imooc.com/6596773f0001fdfe07880465.jpg

也许,首先获取节点的所有属性/值的列表,然后处理生成的数组更方便:

https://img1.sycdn.imooc.com/6596774d0001c3d303320113.jpg

现在,重要的是在最后关闭所有引用以避免内存泄漏,这里这样做是快速而肮脏的。

此外,如果未找到某些内容,搜索 VI 将抛出错误。(你的 Python 也会这样做)。如有必要,应添加一些错误处理。


如果你坚持使用Python

如今,可以选择直接从 LV 运行 Python。我不知道这一点,我的 LV 是 2017 年的。在那里,可以使用System Exec.vi在命令行上运行任何命令,并将其输出读回 LV:

https://img1.sycdn.imooc.com/6596775d000143e902820149.jpg

最后,Python 打印的内容将以字符串形式返回。我会使用 JSON,它可以轻松地将 dict 转换为 JSON:


import json


a=[]

a.append({'name':'CH_PH1', 'virtual':False, 'RollingAvgFrame':3.141})

a.append({'name':'CH_PH2', 'virtual':True, 'RollingAvgFrame':42.0})

print(json.dumps(a))

输出:


[{"name": "CH_PH1", "virtual": false, "RollingAvgFrame": 3.141}, 

{"name": "CH_PH2", "virtual": true, "RollingAvgFrame": 42.0}]

在LV中,根据JSON结构定义一个簇,并使用Unflatten from JSONVI填充它。集群元素的名称必须与 JSON 代码中的名称匹配。

https://img1.sycdn.imooc.com/6596776e00016ad805310250.jpg

然而,JSON 只知道简单的数据类型。没有办法传输时间或任何其他更复杂的数据类型,除非可以将其打包为更简单的东西,例如包含时间戳的字符串。



查看完整回答
反对 回复 2024-01-04
  • 1 回答
  • 0 关注
  • 40 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信