मैं एक एक्सएमएल फ़ाइल लोड करने की कोशिश कर रहा हूं जिसका प्रयोग लैबव्यू में मेरे डीएक्यू को कॉन्फ़िगर करने के लिए किया जाएगा।

तो मेरे पास विकल्पों को देखते समय:

  1. मेरा एक्सएमएल चैनल विन्यास गतिशील है - जिसका अर्थ है कि एक एक्सएमएल में 3 चैनल हो सकते हैं और दूसरे में> 100 चैनल हो सकते हैं।
  2. मेरे लिए पाइथन में एक्सएमएल को पार्स करना और डेटा को लैबव्यू में संरचना/कार्य के रूप में पास करना बहुत आसान होगा।

जैसे एक्सएमएल चैनल के लिए

<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>

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. लैबव्यू में कोड कैसे निष्पादित करें?
  2. LabVIEW में DICT को कैसे हैंडल करें? या डेटा पास करने का कोई बेहतर समाधान है?
  3. DAQmx चैनलों को गतिशील रूप से कॉन्फ़िगर करने के लिए पैरा डेटा का उपयोग करें

मैंने लैबव्यू में एक्सएमएल पार्सर बनाने का प्रबंधन नहीं किया क्योंकि यह अधिक कठिन कोडिंग को लागू करता है और एक निश्चित सख्ती रखता है।

मैं LV DAQmx को लक्षित कर रहा हूं नमूना उदाहरण जारी रखता हूं और कॉन्फ़िगरेशन को पार्स किए गए xml से प्रतिस्थापित करता हूं।

enter image description here

असफ़ बेकर का समर्थन करने वाले सभी लोगों के लिए धन्यवाद

0
Assaf Baker 25 अक्टूबर 2020, 17:08

1 उत्तर

सबसे बढ़िया उत्तर

लैबव्यू में एक्सएमएल पार्स करना

LV में XML को पार्स करना थोड़ा मुश्किल है, लेकिन उतना मुश्किल नहीं है। हो सकता है, आप इसे आजमाएं?

यह कोड सभी चैनलों पर लूप करता है, विशेषताओं को निकालता है name और virtual, और उनके बच्चों RollingAvg से, यह विशेषता do_rolling_avg निकालता है।

enter image description here

हो सकता है, पहले नोड के सभी गुणों/मानों की सूची प्राप्त करना अधिक आसान हो, और फिर जेनरेट किए गए सरणी पर काम करें:

enter image description here

अब, स्मृति रिसाव से बचने के लिए अंत में सभी संदर्भों को बंद करना महत्वपूर्ण है, जो यहां त्वरित और गंदा किया जाता है।

इसके अलावा, अगर कुछ नहीं मिलता है, तो खोज VI एक त्रुटि फेंक देगा। (आपका पायथन भी ऐसा करेगा)। यदि आवश्यक हो तो कुछ त्रुटि प्रबंधन को जोड़ा जाना चाहिए।


यदि आप Python का उपयोग करने पर जोर देते हैं

आज, LV से सीधे Python को चलाने का विकल्प है। मुझे यह नहीं पता, मेरा एलवी 2017 का है। वहां, कमांडलाइन पर किसी भी कमांड को चलाने के लिए System Exec.vi का उपयोग करना संभव है, और इसके आउटपुट को LV में वापस पढ़ें:

enter image description here

अंत में, जो पायथन प्रिंट करता है, उसे स्ट्रिंग के रूप में वापस कर दिया जाएगा। मैं 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 कोड से मेल खाने चाहिए।

enter image description here

हालाँकि, JSON केवल साधारण डेटा प्रकारों को जानता है। समय या किसी अन्य जटिल डेटाटाइप को स्थानांतरित करने का कोई तरीका नहीं है, जब तक कि इसे टाइमस्टैम्प वाली स्ट्रिंग की तरह कुछ और सरल के रूप में पैक नहीं किया जा सकता है।

0
sweber 26 अक्टूबर 2020, 19:38