![](/img/trans.png)
[英]Read .daq (Data Acquisition Toolbox for Matlab) file format in python
[英]Read XML to LabVIEW as task / Cluster using Python to configure DAQ
我正在尝试加载一个 XML 文件,该文件将用于在 LabVIEW 中配置我的 DAQ。
因此,在查看选项时,我有:
例如 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 中创建 xml 解析器,因为它强制执行更多的硬编码并具有固定的结构。
我的目标是 LV DAQmx 继续采样示例,并将配置替换为已解析的 xml。
感谢每一位支持 Assaf Baker 的人
在 LV 中解析 XML 有点棘手,但并不难。 也许,你试一试?
此代码遍历所有通道,提取属性name
和virtual
,并从它们的子RollingAvg
中提取属性do_rolling_avg
。
可能,首先获取节点的所有属性/值的列表,然后处理生成的数组会更方便:
现在,重要的是在最后关闭所有引用以避免 memory 泄漏,这是快速而肮脏的,在这里完成。
此外,如果未找到某些内容,搜索 VI 将抛出错误。 (您的 Python 也会这样做)。 如有必要,应添加一些错误处理。
今天,有一个选项可以直接从 LV 运行 Python。 我不知道,我的 LV 是 2017 年的。在那里,可以使用System Exec.vi
在命令行上运行任何命令,并将其 output 读回 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))
Output:
[{"name": "CH_PH1", "virtual": false, "RollingAvgFrame": 3.141},
{"name": "CH_PH2", "virtual": true, "RollingAvgFrame": 42.0}]
在LV中,根据JSON结构体定义一个cluster,使用Unflatten from JSON
VI进行填充。 簇元素的名称必须与 JSON 代码中的名称匹配。
然而,JSON 只知道简单的数据类型。 无法传输时间或任何其他更复杂的数据类型,除非可以将其打包为更简单的内容,例如包含时间戳的字符串。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.