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

使用Python将XML作为任务/集群读取到LabVIEW以配置DAQ,python,xml,labview,Python,Xml,Labview,我正在尝试加载一个XML文件,该文件将用于在LabVIEW中配置我的DAQ 因此,在查看我的选项时: 我的XML通道配置是动态的——这意味着一个XML可能有3个通道,另一个可能有>100个通道 对我来说,在Python中解析xml并将数据作为结构/任务传递给LabVIEW会容易得多 e、 g.对于XML通道 <Channels> <Channel name="CH_PH1" enable="True" visible=&q

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

因此,在查看我的选项时:

  • 我的XML通道配置是动态的——这意味着一个XML可能有3个通道,另一个可能有>100个通道
  • 对我来说,在Python中解析xml并将数据作为结构/任务传递给LabVIEW会容易得多
  • e、 g.对于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>
    
    所需帮助:

  • 如何在LabVIEW中执行代码
  • 如何在LabVIEW中处理DICT?还是有更好的解决方案来传递数据
  • 使用PARTS数据动态配置DAQmx通道
  • 我没有在LabVIEW中创建xml解析器,因为它强制执行更硬的编码,并且具有固定的结构

    我的目标是LV DAQmx示例,并用解析的xml替换配置

    谢谢大家的支持 Assaf Baker

    在Labview中解析XML 在LV中解析XML有点棘手,但没有那么困难。也许,你试试看

    此代码在所有通道上循环,提取属性
    name
    virtual
    ,并从其子项
    RollingAvg
    ,提取属性
    do\u rolling\u avg

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

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

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


    如果您坚持使用Python 现在,有一个选项可以直接从LV运行Python。我不知道,我的LV是2017年的。 在这里,可以使用
    System Exec.vi
    在命令行上运行任何命令,并将其输出读回LV:

    最后,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结构定义集群,并使用JSON中的
    Unflatten
    VI填充集群。集群元素的名称必须与JSON代码中的名称匹配


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

    您可能会发现使用TestScript更容易,TestScript是Wineman Technology提供的免费LabVIEW/Python连接器,主要由您自己编写。对于JSON,我建议使用JKI提供的JSON工具包,或者JSontextToolkit。它们都支持除类以外的所有LV数据类型。哇,非常感谢您提供的详细答案。非常感谢。我将查看并研究它,如果可以的话,还会提出更多问题:)Json选项看起来很不错,我想我会同意。Json选项是否支持动态通道数,或者我必须定义一个固定长度的结构?有没有一种方法可以剪切您所做的XML解析vi,以便我更好地使用它并学习?@user27400068,该vi是一个片段-尝试将此图像拖放到LabVIEW block diagram,2017或更高版本。关于JSON-可能有动态数量的通道(将被视为JSON数组类型),但要注意通道数据。所有元素都应该有相同的组件,您可能会发现使用TestScript更容易,TestScript是Wineman技术提供的免费LabVIEW/Python连接器,主要由您自己编写。
    [{"name": "CH_PH1", "virtual": false, "RollingAvgFrame": 3.141}, 
    {"name": "CH_PH2", "virtual": true, "RollingAvgFrame": 42.0}]