Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Отображение данных в МАТЛАБ в режиме реального времени
Форум разработчиков электроники ELECTRONIX.ru > Cистемный уровень проектирования > Вопросы системного уровня проектирования
Mityan
Получаю байты с СОМ-порта. Как мне сделать красивый график, чтобы сидеть и наблюдать, как в него с течением времени точки добавляются?

В симулинке можно просто scope открыть во время симуляции, но у меня в м-коде. Как?

Задаю вопрос, потому что не могу даже сформулировать это подходящим для поисковика образом.
_4afc_
Цитата(Mityan @ Jul 25 2012, 13:11) *
Получаю байты с СОМ-порта. Как мне сделать красивый график, чтобы сидеть и наблюдать, как в него с течением времени точки добавляются?

Задаю вопрос, потому что не могу даже сформулировать это подходящим для поисковика образом.


Google(matlab com read) - третья строчка сверху.

А вообще проще в терминалке такой график смотреть:

ToR_TDA
Цитата(Mityan @ Jul 25 2012, 13:11) *
Задаю вопрос, потому что не могу даже сформулировать это подходящим для поисковика образом.

Аналогичной проблемой занимался, потом решил что это все от лукавого и стал накапливать буфер и выводить данные целиком и уже не в matlab (для моей задачи это было допустимо).
Ваш вопрос предполагает, что Вы уже умеете в M-коде инициализировать com-порт, читать его и что-то от туда получать в задержанном времени (через буфер).
По реальному времени на вскидку нашел в M-коде что-то похожее, не проверял.
Изначально у меня была идея вообще в simulink это делать, используя библиотеку COMMSTR.
Mityan
Вот код:

Код
%% Initial variables
clear all;
B_rate = 57600;             % Baud rate
Rx_packet_len = 25;      % Received packet length
Rx_counter = 0;             % Packet counter
Packets_per_second = 50;
Rx_buffer = zeros(Rx_packet_len,1);
Packet_header = hex2dec('7777');
%% Open port
s = serial('COM3','BaudRate',B_rate);
fopen(s);
%% Read cycle
while 1                    % Looking for packet header
    a = fread(s,1);                  
    if a == bitshift(Packet_header,-8)       % Byte 1
        a = fread(s,1);
        if a == bitand(Packet_header,255) % Byte 2
            fread(s,Rx_packet_len-2);
            break;
        end
    end
end
while 1                             % Infinite operation loop
    A = fread(s,Rx_packet_len);
    Rx_counter = Rx_counter + 1;
    if Rx_counter == Packets_per_second
        Rx_counter = 0;
        disp( dec2hex( A(1)*256 + A(2) ) );
    end
end


В первом бесконечном цикле просто ищу заголовок, чтобы синхронизироваться по нему.
Затем во втором бесконечном цикле намереваюсь разбирать пакет на компоненты и выводить интересующие параметры в режиме реального времени (типа осциллограф) вместо вот этого куска кода с Rx_counter.

Ссылка на функцию datetick интересная, буду изучать, возможно, это именно то что надо. Мне просто кажется, что на каждом цикле (или хотя бы на каждой секунде) просто делать плот - неоптимально.

В терминалке не подойдет, а вдруг я захочу некие операции еще произвести с данными, а потом уже выводить?


Симулинк я очень люблю, но это наверное не совсем для реал-тайм приложение.

Для тех, кто может этот мой кусок использовать: остановка Ctrl+C и перед новым запуском не забывайте fclose(s) делать, а то матлаб придется перезагружать (он просто уже этого сом-порта не увидит).
aT-DeviLru
Реализовывал приём и передачу данных в Matlab через COM-порт, используя графический интерфейс (GUI), где по таймеру считывал данные и отображал их.
Часть кода:
Код
% Функция настройки соединения по последовательному порту
function connect_Callback(hObject, eventdata, handles)
handles.ser = serial('COM2');
set(handles.ser,'BaudRate',9600);
fopen(handles.ser);

%Обработка принятых данных
function TmrFcn(src,event,handles)
handles = guidata(handles);
if handles.ser.BytesAvailable > 0
    % Чтение принятого байта
    x = fread(handles.ser,handles.ser.BytesAvailable,'uchar');
    % дальнейшая обработка и вывод на экран
    % ...    
end

% Настройка таймера для чтения принятых данных
handles.guifig = gcf;
handles.tmr = timer('TimerFcn',{@TmrFcn,handles.guifig},'BusyMode','Queue',...
    'ExecutionMode','FixedRate','Period',0.1);%timer
guidata(handles.guifig,handles);
start(handles.tmr);
Mityan
Пытаюсь реализовать GUI.

Помогите, пожалуйста, с синтаксисом.

Почитал много форумов matlab.exponenta.ru, но не нашел похожего примера.
Все успешно передают в функцию таймера параметры и рисуют графики. А возвратить значение как?
Конкретно, у меня есть handles.transaction_counter, который инкрементируется по нажатию кнопки одиночной посылки, а также при нажатии кнопки циклического опроса (она-то и запускает таймер). Хочу, чтобы на экране счетчик бежал, да не знаю, как с возвратом параметров справиться.

Если пишу handles.TMR = timer( 'TimerFcn',{@Timer_Func, handles}, ...
то при вызове start(handles.tmr) пишет -

??? Error while evaluating TimerFcn for timer 'Polling Timer'
H must be the handle to a figure or figure descendent.


Если передаю handles.TMR = timer( 'TimerFcn',{@Timer_Func, handles.transaction_counter, ...
Забыл уже, что пишет, но тоже ругается.

Пробовал объявить счетчик как global - вообще не понимаю, как должно работать, ни одна функция этого глобального счетчика не видит.

В хелпах матлаба ничего по этим поводам нет. Буду очень признателен.
syoma
Я делал GUI на Матлабе по вот этой Демке: http://www.mathworks.de/help/stateflow/exa...-subcharts.html
Мне очень понравилось. Чтобы сделать все в примерно реальном времени я использовал хитрую функцию, только забыл какую.
Herz
Цитата(Mityan @ Aug 17 2012, 12:03) *

А зачем?

Цитата(Mityan @ Jul 25 2012, 12:11) *
Получаю байты с СОМ-порта. Как мне сделать красивый график, чтобы сидеть и наблюдать, как в него с течением времени точки добавляются?

Я такую программку в своё время написал сам. Почти без навыков MATLABа. Это достаточно просто. Если хотите, выложу код.
Myron
Цитата(Herz @ Aug 18 2012, 04:18) *
Я такую программку в своё время написал сам. Почти без навыков MATLABа. Это достаточно просто. Если хотите, выложу код.

Выложитье, пожалуйста. И подскажите, какие ограничения - мах частота отсчетов, полоса и пр. - в Вашем случае. Можно ли сжимать и расширять в режиме реального времени, т.е. изменять количество точек на экране?
Herz
Дело было довольно давно и подробностей я уже не помню. Программка предназначалась для приёма последовательности из трёх 16-битных переменных (названных R, G, B ), разделённых пробелом, и вывода на экран, а также сохранения в лог-файле. Можно было выводить не каждую точку, а усреднять по нескольким значениям. Вряд ли Вас устроит в готовом виде, но, возможно, будет полезной как пример.Нажмите для просмотра прикрепленного файла
almost
В данный момент решаю подобную задачу, только для ethernet=>ip=>udp.
Windows не является приложением реального времени, к примеру тулза xPC target использует real time kernel для этого, которое позволяет дать максимальный приоритет вашему приложению (насколько я понял) и работать по промежуткам 20 мкс, мне этого хватает (т.е. для моих задач это является реальным временем).
Mityan
Цитата(Herz @ Aug 18 2012, 13:18) *
А зачем?


Я такую программку в своё время написал сам. Почти без навыков MATLABа. Это достаточно просто. Если хотите, выложу код.


Вы знаете, наверняка очень многие из задаваемых здесь вопросов вам покажутся достаточно простыми. Спросите всех, зачем они их задают.
Herz
Цитата(Mityan @ Aug 21 2012, 10:54) *
Вы знаете, наверняка очень многие из задаваемых здесь вопросов вам покажутся достаточно простыми. Спросите всех, зачем они их задают.

Это как раз понятно.
Непонятно, зачем Вы код выкладывали. Для критики, для поиска ошибок, похвастать или в качестве подарка?
Получилось, будто сами себя спросили и сами ответили.
Mityan
Цитата(Herz @ Aug 21 2012, 18:55) *
Это как раз понятно.
Непонятно, зачем Вы код выкладывали. Для критики, для поиска ошибок, похвастать или в качестве подарка?
Получилось, будто сами себя спросили и сами ответили.


Если б хвастал, написал бы: смотрите, какой у меня классный код! sm.gif
Хотя идеального кода не существует.

Конечно, для того, кому это может потом понадобиться
ViKo
Цитата(Mityan @ Aug 22 2012, 09:13) *
Если б хвастал, написал бы: смотрите, какой у меня классный код! sm.gif

Там, вроде, картинку просит... потом еще что-то... в-общем, не работает. Киньте весь проект в одном архиве, что ли.
Mityan
Да, действительно, выкладываю. Просто на экспоненте, где я консультировался, нельзя файлы прикрепить, поэтому я разместил словесное описание ГУИ.
serega_sh____
Цитата(Mityan @ Jul 25 2012, 14:13) *
Для тех, кто может этот мой кусок использовать: остановка Ctrl+C и перед новым запуском не забывайте fclose(s) делать, а то матлаб придется перезагружать (он просто уже этого сом-порта не увидит).


А Вы использовали вот такой инструмент?
Instrument Control Toolbox
Для решения этой проблемы есть простой способ:
1. Инициализировать прибор в этом инструменте
2. Открыть прибор в этом инструменте
3. Послать туда команду IDN? в этом инструменте
4. Закрыть прибор в этом инструменте
5. открыть в этом ТУЛСЕ последнюю вкладку "SessionLog" и скопировать оттуда правильный код обращения к приборам и их инициализацию. И все проблемы исчезнут мигом.
6. Если у Вас уже открыт прибор и повторное открытие вызывает глюк, то можно использовать функцию "EVAL" и во втором аргументе этой функции ставить пробел. Или спрашивать состояние перед обращением к прибору.

Да и прерывания помоему возможно сделать без заморочек с Ctrl+C. Но мы ни разу не заморачивались на это. Как то всё обходилось...

Tano
Вот код, которым можно померить скорость отображения графиков в ГУИ Матлаба:
http://matlab.exponenta.ru/forum/viewtopic.php?t=16899
KatKat
Тема близкая....., в Матлаб надо прочитать два сом-порта...
Два датчика данные сыпят одновременно каждый на свой сом-порт, битрейт 112500. Открываем 1 порт, затем 2 порт, читаем в цикле порт 1, порт 2, 1, 2 и т.д. на интервале неск. сек. Получаем два массива данных и два массива меток времени. При отображении данных имеет место задержка по времени полученных данных 2-го порта. И она равна (или близка) времени инициализации (открытия) 2 порта. Искуственно сдвигать и совмещать начало процессов не вариант (пока делаю так), не тот эффект, т.к. некое смещение все же остается.
Как можно решить проблему? Распараллелить процессы чтения двух портов ? Очистить буферы перед циклом чтения ? Что-то другое ?
Спасибо за подсказки ...
kleverd
Ну не секрет, что матлаб слегка тормозной. Если писать код непосредственно в м-файле, то задержка обязательно будет.
Но можно сделать подключаемую MEX-функцию и написать ее на С++. Скомпилировать ее встроенным в матлаб компилятором LCC. И вызвать ее из м-файла. Ваша функция будет возвращать массив из двух значений.
Про mex функции можно почитать в хелпе матлаба, набрав слово mex в строке поиска.
KatKat
Цитата(kleverd @ Apr 16 2015, 21:48) *
...можно сделать подключаемую MEX-функцию и написать ее на С++. Скомпилировать ее встроенным в матлаб компилятором LCC. И вызвать ее из м-файла. Ваша функция будет возвращать массив из двух значений.
Про mex функции можно почитать в хелпе матлаба, набрав слово mex в строке поиска.


Наткнулся на свое сообщение и ответ rolleyes.gif спасибо rolleyes.gif у матлаба все же нашелся способ совместить начало отсчета данных сом-портов.. но уже не вспомню...
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.