2012-01-05 8 views
7

मैं एक Matlab स्क्रिप्ट है कि डेटा में पढ़ता वास्तविक समय में एक आभासी कॉम पोर्ट का उपयोग कर लिखा है अद्यतन करने के लिए चाहते हैं। मैंने एक एमफाइल में सिग्नल प्रोसेसिंग की एक महत्वपूर्ण मात्रा की है।मैटलैब GUI का उपयोग गाइड: गतिशील रूप से रेखांकन

अगला, मुझे एक कॉम्पैक्ट जीयूआई रखने की आवश्यकता महसूस हुई जो जानकारी को सारांश के रूप में प्रदर्शित करता है।

मैंने हाल ही में मैटलैब के अंतर्निहित जीयूआई उपकरण, गाइड के खुदाई और पढ़ना शुरू कर दिया है। मैंने कुछ ट्यूटोरियल्स का पालन किया है और बटन-प्रेस के बाद मेरे जीयूआई पर प्रदर्शित करने के लिए सफलतापूर्वक अपने ग्राफ प्राप्त करने में सक्षम हूं।

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

% --- Executes on button press in pushbutton1. 
function pushbutton1_Callback(hObject, eventdata, handles) 
% hObject handle to pushbutton1 (see GCBO) 
% eventdata reserved - to be defined in a future version of MATLAB 
% handles structure with handles and user data (see GUIDATA) 
global data 
global time 

% Time domain plot 
axes(handles.timeDomainPlot); 
cla; 
plot (time, data); 

संपादित बदला गया कोड:

यहाँ जीयूआई के लिए प्रासंगिक कोड वर्तमान में है

% --- Executes on button press in pushbutton1. 
function pushbutton1_Callback(hObject, eventdata, handles) 
% hObject handle to pushbutton1 (see GCBO) 
% eventdata reserved - to be defined in a future version of MATLAB 
% handles structure with handles and user data (see GUIDATA) 

%Setting it to display something when it ends 
% t = timer('TimerFcn', 'timerOn=false; disp(''Updating GUI!'')',... 
t = timer(... 
      'TasksToExecute', 10, ... % Number of times to run the timer object 
      'Period', 3, ...     
      'TimerFcn', GUIUpdate()); 

%Starting the timer 
start(t) 

function GUIUpdate() 
global data 
global time 
%Parameters below axes 
    global min 
    global max 
     % Time domain plot 
    axes(handles.timeDomainPlot); 
    cla; 
    plot (time, data); 
    %Other parameters: 
    set(handles.mean, 'String', mean); 
    set(handles.max, 'String', max); 

त्रुटि है कि मैं मिलता है:

??? Error using ==> GUI_Learning>GUIUpdate 
Too many output arguments. 

Error in ==> 
@(hObject,eventdata)GUI_Learning('pushbutton1_Callback',hObject,eventdata,guidata(hObject)) 


??? Error while evaluating uicontrol Callback 
+0

संभावित डुप्लिकेट: http://stackoverflow.com/questions/1007385/getting-matlab-timer-to-update-matlab-guide-gui – Nzbuu

+0

@ c0d3rz timerfcn कॉलबैक को परिभाषित करने के बारे में इस लिंक को देखें http: // www। mathworks.com/help/techdoc/matlab_prog/f9-39541.html#f9-42494 @GUI अद्यतन करने के लिए 'timerfcn' सेट करने और GUIUpdate को बदलने का प्रयास करें ताकि इसमें दो इनपुट 'GUIUpdate (obj, event) 'हो। 'ओबीजे' टाइमर ऑब्जेक्ट के लिए हैंडल होगा और 'इवेंट' के बारे में कुछ विवरण होगा कि इसे कैसे कहा जाता था। डिफ़ॉल्ट टाइमर फ़ंक्शन कॉलबैक कम से कम उन दो तर्कों को पारित किया जाएगा। मुझे यकीन नहीं है कि यह आपकी त्रुटि का सही कारण है लेकिन आपका नमूना सही नहीं दिखता है। अगर मुझे बाद में मौका मिलता है तो मैं एक उदाहरण टाइमर पोस्ट करने की कोशिश करूंगा। –

उत्तर

10

टाइमर एफसीएन कॉलबैक के साथ टाइमर का उपयोग करने का एक उदाहरण यहां दिया गया है। मैंने 1 अक्ष और 1 बटन के साथ एक साधारण जीयूआई बनाया।

उद्घाटन समारोह में मैं साजिश शुरू करता हूं और टाइमर बनाता हूं। स्टार्ट बटन कॉलबैक में मैं टाइमर शुरू करता हूं और डेटा में हेरफेर करना शुरू करता हूं। टाइमर फ़ंक्शन कॉलबैक बस इसके हैंडल के माध्यम से लाइन के वाई-डेटा को अपडेट करता है। नीचे जीयूआई के एम फ़ाइल (कतरना init अनुभाग और उत्पादन FCN से प्रासंगिक कार्य हैं।

function testTimer_OpeningFcn(hObject, eventdata, handles, varargin) 
global y x 
x = 0:.1:3*pi; % Make up some data and plot 
y = sin(x); 
handles.plot = plot(handles.axes1,x,y); 
handles.timer = timer('ExecutionMode','fixedRate',... 
        'Period', 0.5,... 
        'TimerFcn', {@GUIUpdate,handles}); 
handles.output = hObject; 
guidata(hObject, handles); 

% --- Executes on button press in startButton. 
function startButton_Callback(hObject, eventdata, handles) 
global y x 
start(handles.timer) 
for i =1:30 
    y = sin(x+i/10); 
    pause(1) 
end 

function GUIUpdate(obj,event,handles) 
global y 
set(handles.plot,'ydata',y); 

आप एक बंद बटन कैसे अपने जीयूआई संरचित है पर निर्भर करता है टाइमर को रोकने के लिए चाहते हो सकता है और थे/कैसे डेटा है । अद्यतन

संपादित करें: बेसिक हैंडल जानकारी इस बात का कुछ बहुत बुनियादी है और आप पहले से ही पता हो सकता है यह:

एक वस्तु को एक व्यक्ति संभाल कि आप() फ़ंक्शन या के साथ पढ़ सकते हैं गुण का एक समूह होता है सेट() फ़ंक्शन के साथ सेट करें। उदाहरण के लिए शायद मैं अपने जीयूआई में किसी कारण से स्टार्ट बटन के पाठ को बदलना चाहता था।

set(handles.startButton,'String','Something Other Than Start'); 

आप बस अपने कोड में कहीं भी ब्रेक पॉइंट सेट करना चाहते हैं (शायद एक बटन दबाएं) और हैंडल स्ट्रक्चर के साथ खेलें। get() चल रहा है अपनी संपत्तियों को जानने के लिए विभिन्न वस्तुओं पर आदेश।

अब हैंडल संरचना में सभी शामिल हैं ... umm ... आपके जीयूआई ऑब्जेक्ट्स के साथ-साथ कोई भी कस्टम आइटम जो आपके स्टोर के लिए सुविधाजनक हो सकता है। अधिकांश जीयूआई कॉलबैक स्वचालित रूप से हैंडल स्ट्रक्चर पास करते हैं ताकि आपके पास जीयूआई के सभी हिस्सों तक आसानी से पहुंच हो।

पूर्व। 'स्टार्टबटन' कॉलबैक स्वचालित रूप से handles पास हो गया था। तो मुझे handles.timer के माध्यम से टाइमर ऑब्जेक्ट तक आसानी से पहुंच मिली थी।

जो मुझे handles में कस्टम चीजों को चिपकाने के लिए लाता है। शुरुआती कार्य में मैंने हैंडल संरचना handles.timer और handles.plot पर एक नया आइटम जोड़ा क्योंकि मुझे पता था कि वे अन्य कॉलबैक (जैसे बटन प्रेस और टाइमर एफसीएन कॉलबैक) में उपयोगी होंगे।

हालांकि, इन चीजों को स्थायी रूप से स्टोर करने के लिए आपको 'guidata' फ़ंक्शन का उपयोग करने की आवश्यकता है।यह फ़ंक्शन मूल रूप से संशोधित handles संरचना को संग्रहीत करता है या आप इसे कॉल करने के तरीके के आधार पर handles की एक प्रति पुनर्प्राप्त करता है। तो उद्घाटन समारोह में निम्न पंक्ति मुख्य जीयूआई में संशोधित हैंडल संरचना (जोड़ा। टाइमर और .plot) संग्रहित कर रहा है।

guidata(hObject,handles); 

मूल रूप से किसी भी समय आप handles में कुछ जोड़ने आप परिवर्तन स्थाई बनाने के लिए है कि रेखा होनी चाहिए।

अब यह बुलाने की अन्य विधि है:

handles = guidata(hObject); %hObject can be any handle who is a child of the main GUI. 

यह जीयूआई के लिए हैंडल संरचना प्राप्त हो सकें।

और अंतिम handles.output = hObject आपके जीयूआई लॉन्च करते समय केवल डिफ़ॉल्ट आउटपुट है। अगर आप अपने जीयूआई को मैटलैब की कमांड लाइन के माध्यम से इस h = myGUI; पर कॉल करते हैं तो इसे अपने जीयूआई में हैंडल वापस करना चाहिए।

+0

धन्यवाद बहुत एरो एनर्जी। मुझे लगता है कि मुझे काम करना है कि मैं आपकी कोड सहायता के साथ कैसे चाहता था। मैं वास्तव में सहायता के लिए आभारी हूं। मैंने वेबसाइट पर टाइमर सहायता पढ़ी, लेकिन वास्तव में यह सही नहीं हो सका, आपके कोड स्निपेट ने वास्तव में मदद की। यह मुझे आश्चर्यचकित करता है कि आपने मुझे मदद करने के लिए प्रासंगिक कोड लिखने का समय निकाला। एक बार फिर धन्यवाद! – c0d3rz

+0

क्या आप कृपया कोड की इन दो पंक्तियों को क्या कर सकते हैं: हैंडल.आउटपुट = एचओब्जेक्ट; guidata (hobbject, हैंडल); – c0d3rz

+0

मैं इस हैंडल का उपयोग करने के बारे में अनिश्चित हूं। * नोटेशन। मैंने हैंडल का उपयोग करने पर मैटलैब सहायता फ़ाइल पढ़ी, लेकिन इससे मुझे बहुत अधिक समझ नहीं आया। – c0d3rz

1

आप उपयोग करने की आवश्यकता एक timer object। प्लॉट अपडेट करने वाले फ़ंक्शन होने के लिए कॉलबैक सेट करें।

+0

क्या कोई विकल्प है? – c0d3rz

+0

मेरे ज्ञान का सबसे अच्छा नहीं है। क्या कोई अच्छा कारण है कि आप इसे इस तरह से नहीं कर सकते? – Nzbuu

+0

क्या आप कृपया मेरे संपादन पर एक नज़र डालें। मैं टाइमर फ़ंक्शन का सही ढंग से उपयोग नहीं कर सकता। – c0d3rz

1

Making Graphs Responsive with Data Linking और linkdata कमांड पर एक नज़र डालें।

यदि एकाधिक आंकड़ों में प्लॉट्स में एक ही वैरिएबल दिखाई देता है, तो आप वैरिएबल में किसी भी प्लॉट को लिंक कर सकते हैं। आप डेटा ब्रशिंग के साथ ग्राफिंग अप ग्राफ के साथ संगीत कार्यक्रम में लिंक किए गए प्लॉट का उपयोग कर सकते हैं, लेकिन उनके पर भी। भूखंडों लिंक करने से आपको देता है

  • रेखांकन आधार कार्यक्षेत्र में या एक समारोह के भीतर
  • रेखांकन प्रतिक्रिया जब आप चर संपादक में चर बदल सकते हैं और कमांड लाइन
  • डेटा ब्रश करने के माध्यम से चर संशोधित बनाओ चर में परिवर्तनों का जवाब बनाओ कि डीबगिंग उद्देश्यों के लिए चित्रमय "घड़ी खिड़कियों" बनाएँ

घड़ी खिड़कियों अगर आप उपयोगी होते हैं एक ही बार में

  • उनमें से अलग चित्रमय अभ्यावेदन को प्रभावित MATLAB भाषा में कार्यक्रम। उदाहरण के लिए, के माध्यम से चरणबद्ध करने के लिए डेटा प्रोसेसिंग एल्गोरिदम को परिशोधित करते समय, आप फ़ंक्शन निष्पादित कथन के रूप में चर में परिवर्तनों के आलेखों का जवाब दे सकते हैं।

  • मैंने नीचे एक त्वरित और गंदे परीक्षण किए और मुझे यकीन नहीं है कि यह एक जीयूआई में काम करेगा, यह एक काम करता है लेकिन चाल चल सकता है।

    नोट 1: मुझे अपने सबराउटिन में ब्रेक पॉइंट जोड़ना पड़ा जहां यह वास्तव में साजिश ऑटो-अपडेट देखने के लिए वैश्विक y को संशोधित करता है। यदि डेटा तेजी से बदल रहा है तो आपको खींचा, रोकें, या टाइमर के कुछ संयोजन की आवश्यकता हो सकती है।

    function testLinking() 
    global x y 
    %Links failed if the global did not also exist in the base workspace 
    evalin('base','global x y'); 
    x = 0:.1:3*pi; % Make up some data and plot 
    y = sin(x); 
    
    h = plot(x,y,'ydatasource','y','xdatasource','x'); 
    linkdata on 
    testSub 
    
    function testSub() 
    %Test to see if a sub can make a linked global refresh 
    global x y 
    for i = 1:10 
        %This should automatically update the plot. 
        y = sin(x+i/10); 
    end 
    

    संपादित करें: वहाँ कैसे अपने कार्यों संरचित कर रहे हैं पर निर्भर करता वैश्विक के इर्द तरीके हो सकता है ... लेकिन मैं बहुत करने के लिए इसे में खुदाई करने के लिए समय नहीं है।

    +0

    धन्यवाद एयरो, हालांकि मैं अपने प्रश्न में स्पष्ट नहीं था। ग्राफ बदलने के अलावा, मेरे पास कुछ स्थिर टेक्स्ट बॉक्स भी हैं, जिन्हें मैं भी अपडेट करना चाहता हूं। ऐसा लगता है कि टाइमर जाने का रास्ता है ... – c0d3rz

    +0

    @ c0d3rz अपना टाइमर काम करने के लिए मदद के लिए मेरा दूसरा जवाब देखें। –

    0

    आप सीरियल ऑब्जेक्ट पर कॉलबैक जोड़ सकते हैं जो प्लॉटिंग फ़ंक्शन निष्पादित करता है। आपको कॉलबैक को ऑब्जेक्ट पर 'बाइट्सएवेटएफसीएन' ईवेंट में संलग्न करना होगा (कॉम ऑब्जेक्ट के गुणों के बारे में अधिक जानकारी के लिए this देखें)।

    अनिवार्य रूप से, जब कॉम पोर्ट पर बाइट उपलब्ध होते हैं, तो आप एक विशिष्ट फ़ंक्शन चलाने के लिए मैटलैब को निर्देश देते हैं। आपके मामले में, यह GUI अपडेट करने वाला फ़ंक्शन होगा। यदि आपको पहले आने वाले डेटा को संसाधित करने की आवश्यकता है, तो आपका कॉलबैक फ़ंक्शन पहले सिग्नल प्रोसेसिंग करेगा और फिर प्लॉटिंग कमांड करेगा।

    +0

    धन्यवाद जॉर्ज, हालांकि मैं अपने प्रश्न में स्पष्ट नहीं था। ग्राफ बदलने के अलावा, मेरे पास कुछ स्थिर टेक्स्ट बॉक्स भी हैं, जिन्हें मैं भी अपडेट करना चाहता हूं। ऐसा लगता है कि टाइमर जाने का रास्ता है ... – c0d3rz

    +0

    आप get/set का उपयोग करके बॉक्स को भी अपडेट कर सकते हैं। बात यह है कि मुझे आपके कोड का तर्क नहीं पता है। – Jorge

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