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

Read XML to LabVIEW as task / Cluster using Python to configure DAQ

我正在尝试加载一个 XML 文件,该文件将用于在 LabVIEW 中配置我的 DAQ。

所以在查看选项时我有:

  1. 我的 XML 频道配置是动态的 - 这意味着一个 XML 可能有 3 个频道,另一个可能有 >100 个频道。
  2. 对我来说解析 Python 中的 xml 并将数据作为 structure/task 传递给 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)

需要帮助:

  1. 如何在LabVIEW中执行代码?
  2. 如何在LabVIEW中处理DICT?还是有更好的方案来传递数据?
  3. 使用参数数据动态配置 DAQmx 通道

我没能在 LabVIEW 中创建 xml 解析器,因为它强制执行更多的硬编码并具有固定的结构。

我的目标是 LV DAQmx 继续采样示例,并将配置替换为已解析的 xml。

感谢大家的支持 阿萨夫·贝克

在 Labview

中解析 XML

在 LV 中解析 XML 有点棘手,但并不难。也许,你试一试?

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

可能,先获取一个节点的所有属性/值的列表,然后在生成的数组上工作更方便:

现在,重要的是在最后关闭所有引用以避免内存泄漏,这在此处快速而肮脏地完成。

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


如果你坚持使用Python

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

最后,Python 打印的内容将作为字符串返回。 我会使用 JSON,它可以轻松地将字典转换为 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 代码中的名称相匹配。

但是,JSON 只知道简单的数据类型。无法传输时间或任何其他更复杂的数据类型,除非可以将其打包为更简单的内容,例如包含时间戳的字符串。