2011-02-24 6 views
8

हे दोस्तों, मैं एक मैटलैब स्क्रिप्ट (एम-फाइल) बनाने की कोशिश कर रहा हूं जिसे बाहरी वीबीए स्क्रिप्ट द्वारा नियंत्रित किया जाएगा।मैटलैब स्क्रिप्ट को नियंत्रित करना (रोकें, रीसेट करें)

मैटलैब स्क्रिप्ट एक ही ऑपरेशन करेगा हर बार (यहां तक ​​कि पैराम बदलते हैं, लेकिन इस मामले में यह मामला नहीं है) कुछ निश्चित लूप के लिए। पल मेरे नियंत्रण हिस्सा इस तरह दिखता है पर http://www.mathworks.de/help/techdoc/matlab_external/f135590.html#f133975

मेरा मुख्य समस्या यह है कि इस समस्या का matlab हिस्सा लागू करने के लिए है ...: अगर मैं यह सही देखते हैं, मैं matlab funktions VBA में इस तरह का उपयोग कर सकते

start.m:

run = 1; 
reset = 0; 
while run ~= 0  % Loop until external reset of 'run' to '0' 
    if reset ~= 0 
     doReset(); % Reset the parameters for the processing 
     reset = 0; 
     disp('I did a reset'); 
    end 

    disp('I am processing'); 
    doProcess(); 
    pause(1) 
end 
disp('I am done'); 

रीसेट हिस्सा बहुत ठीक काम करता है स्क्रिप्ट के द्वारा मान बदलने, लेकिन जब मैं मैन्युअल रूप से किसी अन्य मूल्य के लिए 'रन' या 'रीसेट' का मान परिवर्तित करने का प्रयास करते समय मेरे कार्यक्षेत्र में, कुछ भी नहीं होता ... मेरी लिपि निरस्त नहीं होती है, न ही फिर से करता है सेट-अगर यह काम करता है ... ऐसा लगता है कि स्क्रिप्ट वर्कस्पेस में किसी भी बदलाव को पहचान नहीं पाती है ?!

बाद में चर 'रन' और 'रीसेट' को VBA स्क्रिप्ट द्वारा सेट या सेट किया जाएगा। क्या कोई व्यावहारिक कारण है कि मैं हाथ से लूप को रोक नहीं सकता?

किसी भी सलाह के लिए धन्यवाद!

स्वागत करती है, poeschlorn

संपादित करें:

ऐसा लगता है कि स्क्रिप्ट शुरू करने से पहले एक बार चर लोड करता है और फिर कभी नहीं रनटाइम के दौरान ... वहाँ एक कार्यक्षेत्र चर को स्पष्ट करने के लिए उपयोग किया है एक संभावना है ?

संपादित करें 2:

मैं इस समय कोई अतिरिक्त Toolboxes साथ मैटलैब 2010b का उपयोग

संपादित करें 3:

मुझे पता चला, कई 'कार्यस्थानों' या मेढ़े देखते हैं कि Matlab में। यदि मेरा फ़ंक्शन चल रहा है, तो चर 'बेस' (?) वर्कस्पेस में संग्रहीत हैं, जो मैटलैब वर्कस्पेस नहीं है जिस पर आप प्रत्येक मान को क्लिक और बदल सकते हैं। तो मुझे इस अशुभ 'बेस' स्पेस तक पहुंच प्राप्त करनी है और ध्वज 'रन' को शून्य में बदलना है। कोई विचार?

+0

r.e. संपादित करें 3: कुछ भी अशुभ नहीं है, फ़ंक्शंस का अपना वैरिएबल स्टैक है, और वर्कस्पेस दूसरा है (आप नहीं चाहते हैं कि कोई उपयोगकर्ता फ़ंक्शन आपके वर्कस्पेस वैरिएबल और वीजा बनाम बदल रहा हो!)। यदि आपको वर्कस्पेस और उपयोगकर्ता फ़ंक्शंस में वैश्विक स्तर पर एक चर का उपयोग करने की आवश्यकता है, तो ** वैश्विक ** कीवर्ड, यानी अपने वर्कस्पेस और आपके द्वारा उपयोग किए जाने वाले किसी भी फ़ंक्शन में 'वैश्विक रन' का उपयोग करें - http://www.mathworks.com/ help/techdoc/matlab_prog/f0-38052.html # f0-38470 - यह मान रहा है कि आपका लूप बाहरी इंटरफ़ेस को अवरुद्ध नहीं कर रहा है ... –

+0

@ एडिट 3: ऐसा कोई फ़ंक्शन है: ['असाइनिंग'] (http: //www.mathworks.com/help/techdoc/ref/assignin.html) जो _very_ अनुशंसित है। – Juhl

+0

@ जुहल: यह फ़ंक्शन बहुत अनुशंसित क्यों है? मुझे इसके खिलाफ कोई बिंदु नहीं दिख रहा है ओ.ओ – poeschlorn

उत्तर

1

क्या आपकी स्क्रिप्ट एक स्क्रिप्ट एम-फाइल या फ़ंक्शन है?

यदि यह एक फ़ंक्शन है, तो आप वर्कस्पेस चर के दायरे को खो देंगे, यही कारण है कि यह काम नहीं कर रहा है। मैं इस तरह एक समारोह में अपने कोड बारी चाहते हैं:

function processRun(run,reset) 
    while run ~= 0  % Loop until external reset of 'run' to '0' 
     if reset ~= 0 
     doReset; % Reset the parameters for the processing 
     reset = 0; 
     disp('I did a reset'); 
     end 

     disp('I am processing'); 
     [run,reset] = doProcess; 
     pause(1) 
    end 

फिर आप रन के मूल्यों की स्थापना की और evertime आप VBA से फ़ंक्शन को कॉल रीसेट कर सकते हैं।

यदि आपके पास कोई स्क्रिप्ट है, तो रन को हटाने और शीर्ष से लाइनों को रीसेट करने का प्रयास करें, और स्क्रिप्ट चलाने से पहले उनके मान वर्कस्पेस में सेट करें। मुझे लगता है कि आप स्क्रिप्ट फ़ाइल चलाकर अपने वर्कस्पेस मानों को ओवरराइट कर रहे हैं।

+0

कोड स्वयं एम-फाइल की पूरी सामग्री है। मुझे समझने में थोड़ा समस्या है कि आपका कोड क्या है ... यदि मैं इसे सही देखता हूं, तो मुझे फ़ंक्शन प्रक्रिया को कॉल करना होगा (...) एक बार? और फिर मैं वर्कस्पेस में अपने मान बदल सकता हूं? – poeschlorn

+0

यदि आपके पास फ़ंक्शन परिभाषा नहीं है, तो मुझे लगता है कि आप स्क्रिप्ट में अपने वर्कस्पेस चर को ओवरराइट कर सकते हैं। मेरे मूल उत्तर में मेरा संपादन देखें। –

+0

ऐसा नहीं है कि 'reset' चर 0 पर रीसेट किया जा रहा है यदि और केवल यदि किसी कारण से यह 1 करने के लिए पिछले जांच और मौजूदा जांच के बीच समयावधि में बदल गया था मुझे लगता है। यही कारण आपकी वीबीए स्क्रिप्ट होगी और मुझे कोई तार्किक समस्या नहीं दिखाई दे रही है। मेरे लिए एक रहस्य –

4

मुझे लगता है कि आपकी समस्या यह है कि आपका लूप बाहरी इंटरफ़ेस के निष्पादन को अवरुद्ध कर रहा है। जबकि लूप चलता है आप अन्य इंटरफेस तक नहीं पहुंच सकते हैं।

मैं एक समान काम करना चाहता था - बाहरी प्रोग्राम (या तो रूबी या अन्य मैटलैब उदाहरण) द्वारा मैटलैब लूप के नियंत्रण की अनुमति दें। अब तक का सबसे लचीला समाधान यूडीपी का उपयोग कर रहा था। Matlab के लिए पीएनईटी नामक एक शानदार टूलबॉक्स है, और मुझे लगता है कि वीबी में सॉकेट लाइब्रेरी भी होनी चाहिए। मैं बस दोनों तरफ एक यूडीपी पोर्ट खोलता हूं, और प्रतिक्रिया देने और प्रतिक्रिया देने के लिए सरल टेक्स्ट कमांड का उपयोग करता हूं।

obj.conn = pnet('udpsocket', 9999); 
command = ''; 
while run ~= 0 
    nBytes = pnet(obj.conn, 'readpacket'); 
    if nBytes > 0 
     command = pnet(obj.conn, 'read', nBytes, 'string'); 
    end 
    switch command 
     case '--reset--' 
      doReset(); % Reset the parameters for the processing 
      reset = 0; 
      disp('I did a reset'); 
     case '--abort--' 
      run = 0; 
      disp('Going to abort'); 
     case '--echo--' 
      pnet(obj.conn, 'write', '--echo--'); 
      pnet(obj.conn, 'writepacket', remoteAddress, remotePort); 
    end 
    doProcess(); 
end 

इस तरह से मैं पाश से अवरुद्ध करने के बारे में चिंता किए बिना अपने ही एक्स्टेंसिबल नियंत्रण इंटरफ़ेस का निर्माण कर सकते हैं, यह पार मंच और पार भाषा काम कर सकते हैं, एक मशीन के भीतर या नेटवर्क पर काम कर सकते हैं।

अद्यतन: दो यूडीपी ग्राहकों के बीच बात करने के लिए, आपको दो मानार्थ यूडीपी बंदरगाहों की स्थापना करने की आवश्यकता है, दोनों ग्राहक हैं (यह उदाहरण मैटलैब में है, यहां ओब्जे का बहाना एक संरचना है, मेरे मामले में यह एक वर्ग है I pnet कार्यक्षमता लपेट):

obj = struct(); 
obj.success = 0; 
obj.client1Port = 9999; 
obj.client2Port = 9998; 
obj.client1Address = '127.0.0.1'; 
obj.client2Address = '127.0.0.1'; 
obj.conn1 = pnet('udpsocket', obj.client1Port); 
obj.conn2 = pnet('udpsocket', obj.client2Port); 

pnet(obj.conn1, 'write', '--echo--') 
pnet(obj.conn1, 'writepacket', obj.client2Address, obj.client2Port); 

nBytes = pnet(obj.conn2, 'readpacket'); 
if nBytes > 0 
    command = pnet(obj.conn2, 'read', nBytes, 'string'); 
    if regexpi(command,'--echo--') 
     obj.success = obj.success+1; 
     fprintf('Client 2 recieved this message: %s\n',command); 
     pnet(obj.conn2, 'write', '--echo--') 
     pnet(obj.conn2, 'writepacket', obj.client1Address, obj.client1Port); 
    end 
end 

nBytes = pnet(obj.conn1, 'readpacket'); 
if nBytes > 0 
    command = pnet(obj.conn1, 'read', nBytes, 'string'); 
    if regexpi(command,'--echo--') 
     obj.success = obj.success+1; 
     fprintf('Client 1 got this back: %s\n',command); 
    end 
end 

if obj.success == 2 
    fprintf('\nWe both sent and received messages!\n'); 
end 
+0

वाह, यह पूरी तरह से भयानक है रन = 1 द्वारा शुरू किया गया है। क्या आप मुझे बता सकते हैं, जहां मुझे पीएनईटी लाइब्रेरी मिल सकती है? यह प्रतीत कि Mathworks उन पूरे टूलबॉक्स कहीं भी नहीं है, लेकिन कुछ लोगों को inofficial लोड करने के लिए तैयार कर रहे हैं ... क्या आप मुझे बता कर सकें कि आप उपयोग कर रहे हैं? – poeschlorn

+1

हां, मैं पैनेट का उपयोग कर रहा हूं जो मनोविज्ञान टूलबॉक्स से पहले से ही प्रीकंपिल्ड (विन, ओएस एक्स और लिनक्स के लिए) है: [पीटीबी] (http://psychtoolbox.org/wikka.php?wakka=HomePage), आप डाउनलोड कर सकते हैं यह और निर्देशिका निकालें, या svn [यहां] स्क्रैप करें (http://svn.berlios.de/wsvn/osxptb/trunk/Psychtoolbox/PsychHardware/iViewXToolbox/tcp_udp_ip/?#a92ec166f430377948ced499fe2456e27) - टूलबॉक्स स्वयं पाया जाता है [ यहां] (http://www.mathworks.com/matlabcentral/fileexchange/345-tcpudpip-toolbox-2-0-6) - आप या तो टीसीपी (अधिक ओवरहेड के साथ विश्वसनीय) या यूडीपी (कनेक्शन रहित और तेज) का उपयोग कर सकते हैं; यूडीपी स्थापित करना आसान है। –

+1

नोट यदि आपके पास इंस्ट्रूमेंट कंट्रोल टूलबॉक्स है [यहां दस्तावेज] [http://www.mathworks.com/help/toolbox/instrument/f16-54297.html) है तो आप सीधे मैटलैब में यूडीपी का उपयोग भी कर सकते हैं। मैं ** ज्यादा **, PNET पसंद करते हैं के रूप में आप सरल डेटा प्रकार भेज सकते हैं न केवल, लेकिन फिर भी matlab OOP वस्तुओं, जो अन्यथा असंभव के करीब होगा serialise और नेटवर्क (अपने आप matlab की कमजोरी) पर भेजने के लिए। पीएनईटी के लिए एक मैटलैब जावा इंटरफ़ेस विकल्प भी है [यहां] (http://www.mathworks.com/matlabcentral/fileexchange/24525-a-simple-udp-communications-application) –

1

क्षमा करें, मैं एक टिप्पणी करने के लिए पर्याप्त प्रतिनिधि नहीं है तो मैं इसे यहाँ उद्धृत करता हूँ:

@Adam Leadbetter: धन्यवाद, यह समझ में आता है । केवल एक चीज मैं के साथ परेशानी habe (इस रीसेट के बाद और फिर फिर से शुरू) कैसे को रोकने के लिए स्क्रिप्ट जब यह रन से शुरू कर दिया गया है = 1 परम के रूप में ... - 7:17

हैं पर poeschlorn 25 फ़र, रीसेट को एक बार सेट करने के बाद आप लूप से बाहर निकलना चाहते हैं, और फिर run = 1 के बाद लूप को फिर से जारी रखने की प्रतीक्षा करें जो कि फिर से शुरू होने जैसा ही है?

function processRun() 
run = 1; 
while run ~= 1 
    run = doProcess(); 
end 

doProcess() अगर रिटर्न 0 तो समारोह processRun() खत्म हो जाएगा (व्यवहार की तरह आप जब रीसेट करना चाहते हैं), अगली बार जब processRun कहा जाता है कि यह "रीसेट"/मूलभूत मूल्यों से आरंभ होकर,।

या क्या मुझे कुछ याद आ रहा है?

+0

यदि आप कुछ खो रहे हैं, तो मैं भी हूं! मुझे लगता है कि आपने जो दिखाया है वह कोड के एक और मैटलैब केंद्रित तरीका है जो मैंने जोड़ा है। –

+0

हे जुल, अपने कोड बिल्कुल स्पष्ट है, लेकिन मुझे विश्वास है कि yould मेरी समस्या का समाधान नहीं कर रहा हूँ। इस मामले में doProcess() को स्क्रिप्ट को निरस्त करने या '0' लौटने के लिए कोई मानदंड प्राप्त करने की आवश्यकता है। इस creteria एक बाहरी स्रोत से आना है। मेरी समस्या यह है कि बाहरी बाधाओं तक पहुंच कैसे प्राप्त करें। – poeschlorn

संबंधित मुद्दे