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

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

因此,当我查看选项时,我有:

  1. 我的 XML 通道配置是动态的 - 这意味着一个 XML 可能有 3 个通道,另一个 XML 可能有 >100 个通道。

  2. 对我来说,用 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)

需要帮助:

  1. 如何在LabVIEW中执行代码?

  2. 如何在LabVIEW中处理DICT?或者有更好的解决方案来传递数据吗?

  3. 使用 paras 数据动态配置 DAQmx 通道

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

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

https://img1.sycdn.imooc.com/6596772e00011a4607670573.jpg

一只名叫tom的猫
浏览 93回答 1
1回答

Cats萌萌

在Labview中解析XML在 LV 中解析 XML 有点棘手,但也不是那么困难。也许,你尝试一下?此代码循环遍历所有通道,提取属性name和virtual,并从它们的子通道中RollingAvg提取属性do_rolling_avg。也许,首先获取节点的所有属性/值的列表,然后处理生成的数组更方便:现在,重要的是在最后关闭所有引用以避免内存泄漏,这里这样做是快速而肮脏的。此外,如果未找到某些内容,搜索 VI 将抛出错误。(你的 Python 也会这样做)。如有必要,应添加一些错误处理。如果你坚持使用Python如今,可以选择直接从 LV 运行 Python。我不知道这一点,我的 LV 是 2017 年的。在那里,可以使用System Exec.vi在命令行上运行任何命令,并将其输出读回 LV:最后,Python 打印的内容将以字符串形式返回。我会使用 JSON,它可以轻松地将 dict 转换为 JSON:import jsona=[]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},&nbsp;{"name": "CH_PH2", "virtual": true, "RollingAvgFrame": 42.0}]在LV中,根据JSON结构定义一个簇,并使用Unflatten from JSONVI填充它。集群元素的名称必须与 JSON 代码中的名称匹配。然而,JSON 只知道简单的数据类型。没有办法传输时间或任何其他更复杂的数据类型,除非可以将其打包为更简单的东西,例如包含时间戳的字符串。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python