Thủ thuật Matlab - Lấy lại số liệu trên Scope và hiển thị trên đồ thị

March 28, 2008

Chắc hẳn các bạn làm việc với Matlab - Simulink đã làm quen với khối Scope trong thư viện Sinks, khối này khi hiển thị mô phỏng với thời gian tương đối dài thì chúng ta khó lòng thu lại được đường đặc tính của nó. Khi chụp thẳng hình này thì sẽ toàn màu đen, khi đem in làm báo cáo,.. thì rất khó nhìn. Vì vậy nên tôi làm như sau.

Với các mô hình Simulink đó, bạn kích đúp chuột vào khối Scope.

Hình 1:Chọn Parameter trên cửa sổ Scope.

Hình 2: chọn tab Data history, Chọn Save data to workspace, chọn kiểu structure with time vì cần có biến time.

Trong này có nhiều lựa chọn cho biến ở trong khung Format nhưng mình chọn kiểu Structure để dễ thao tác.

Hình 3: Sau khi chạy mô phỏng xong bạn sẽ thấy cửa sổ Workspace có biến ScopeData

Như vậy biến ScopeData là một structure nên dùng toán tử truy nhập (.) để truy nhập vào từng phần tử của nó. Bạn thử dùng lệnh sau để biết tên của các thành phần của biến này:

>>ScopeData

Bạn gõ lệnh sau để vẽ :

>>figure(1);
>>plot(ScopeData.time,ScopeData.signals.values);
>>grid on;

Lưu ý, với phiên bản Matlab R009b cần đổi lệnh plot thành bên dưới. Cảm ơn em trungkstn đã góp ý cho anh :)

plot(ScopeData.time,ScopeData.signals.values(:));

Hình 4: Cửa sổ figure 1 hiện ra, kích vào pictools trên thanh công cụ.

Khi cái scope của bạn có nhiều hình trong đó thì mà bạn muốn vẽ từng hình thì bạn làm như ví dụ sau. Mình có 2 hình trong một scope:

%% Plot speed
figure(1);
x = out.time;
y = out.signals(1).values;
plot(x,y,'k-','LineWidth',2);
title(' Motor speed [Rad/s]','FontSize',12);
xlabel('Time [s]','FontSize', 12);
grid on;

%% Plot torque
figure(2);
x = out.time;
y = out.signals(2).values;
plot(x,y,'k-','LineWidth',2);
title('Amature Current [A]','FontSize',12);
xlabel('Time [s]','FontSize', 12);
grid on;

Hình 5: Các công cụ hiện ra, bạn có thể xào nấu cái plot của mình theo ý muốn rùi nhé.

Tham khảo

Ngô Hải Bắc, Matlab - các thủ thuật nhỏ, đơn giản nhưng hiệu quả, www.dientuvietnam.net, 2006

Các bạn có ý kiến gì hoặc thắc mắc gì về Matlab xin cứ nêu câu hỏi nhé. Mình rảnh sẽ trả lời.

Các bài viết liên quan:

  1. Hiển thị Led 7 thanh trên GUI Matlab Chào các bạn. Mình cũng đang làm cái giao diện cho đồ án tốt nghiệp và có tìm kiếm source Matlab cho Led7 thanh và tìm được một project rất hay. Từ đó, có thể nhúng vào trong GUI của mình. Các bạn có thể xem Project đó tại đây. Demo cái hình trông cho [...]...
  2. Phan tich thuat toan: thuc hien lenh dieu khien tu PC qua RS232 Chào các bạn. Không biết ai đã đọc bài viết của mình PIC16F887 – Điều khiển thời gian đóng cắt một led từ PC qua UART chưa. Trong này, mình có thực hiện đặt thời gian đóng cắt từ PC bằng lệnh với cú pháp. Txyzt#: trong đó  xyzt là thời gian tính theo hệ [...]...
  3. Matlab001: Kỹ thuật lập trình Matlab căn bản Homepage: http://hocdelam.com/home/index.php Chào các bạn. Hiện nay bọn mình đang tổ chức một số khóa học miễn phí dành cho mọi người tại http://hocdelam.com nên mình copy một số bài học sang đây để các bạn biết và đăng ký. Mọi ý kiến đóng góp xin gửi về: supports@hocdelam.com Tải bài giảng tóm tắt về [...]...
  4. Tạo file .exe trong Matlab dùng Matlab Compiler Có nhiều bạn khá băn khoăn về việc dịch một ứng dụng trong Matlab ra file .exe để chạy độc lập trên các máy không cài Matlab đúng không ?? Hay là cách để đóng gói sản phẩm của mình thì nên làm thế nào ? Để có thể dịch ra file .exe yêu cầu [...]...
  5. Vẽ đồ thị trong Matlab Mình đang làm đồ án về đề tài giao tiếp máy tính và vđk qua công com, mình có 1 thắc mắc mong được các bạn chỉ giáo: khi dữ liệu được truyền vào máy tính thì có sự kiện BytesAvailable, mình viết hàm serial_Callback() để đọc dữ liệu này như sau: function serial_CallBack(obj,event) inval=fread(obj,1); [...]...
  6. Demo sử dụng RTAI, ComediLib kết hợp với Matlab/Simulink/RTW Sau khi tốn một thời gian config linh tinh với Ubuntu 8.04 cuối cùng cài đặt xong RTAI và ComediLib nhân diện được xong cái PCI6220 của NI. Đến phần cài cái trình để biên dịch mô hình thành mã C thì thằng Scilab/Scicos chạy tốn quá nhiều CPU, move 1 cái mô hình là [...]...

{ 47 comments… read them below or add one }

thu huyen April 2, 2009 at 12:46 pm

em da doc bai veit nay cua anh va lam theo huong dan nhung ma van khong duoc. Khi chay xong phan mo phong tren scope paramaters phan variable name ko co scopedata ma chi co scope thui. Khi dung em da thay lenh co scopedata bang scope. thu rat nhieu cach van ko duoc em ko hieu tai sao lai vay ca? anh co the giup em duoc ko? neu duoc xin hay lien lac qua email: happylife.huyen@gmail.com. Em cam on anh rat nhieu.

Reply

ngohaibac April 3, 2009 at 12:04 am

Em report lỗi lên anh xem thế nào nhé. Còn cái tên scopedata và scope là do em đặt mà. Mặc định nó có tên là Scope thì phải, em xem lại nhé.

Chúc em thành công.

Reply

Cuong June 2, 2009 at 11:27 am

Cám ơn anh Bắc, em đã làm và kết quả rất đẹp. Tuy nhiên khi đem hình đó in ra thì nó rất mờ vì nét nhỏ quả. Em phải copy cái figure vào paint thì nó Ok ngay nhưng một số chỗ hình hơi bị vỡ :( Anh xem giúp em xem nên làm thế nào?

Cảm ơn anh :)

Reply

ngohaibac June 2, 2009 at 8:04 pm

ực, cái đó đã ra figure rồi thì em chỉnh cho các đường của đồ thị đậm nét lên là được mà. Khi em chụp hình thì co cái hình đúng khuân mà em muốn chụp rồi hãy chụp. In ra ngọt ngào ngay. Anh đảm bảo đó.

Chúc em thành công.

Reply

Huedtvt June 14, 2009 at 10:22 am

anh Bắc ah! sao em làm giống như cái anh chỉ rồi nhưng nó chỉ hiện cái fugure ra chứ ko có hình ảnh cái đồ thị em muốn lấy. nó báo lỗi là :

“?? >>plot(ScopeData1.time,ScopeData1.signals.values);
Error: Missing variable or function.”
anh trả lời sớm giúp em với!

Reply

ngohaibac June 14, 2009 at 12:25 pm

@Huedtvt: Em nhìn trong workspace xem có cái biến ScopeData1 không nhé, nó là biến có tên giống trong setup cái Scope của em đó.

Chúc em thành công.

Reply

huedtvt June 16, 2009 at 8:52 pm

có anh ah!trong workspace có 3 biến ScopeData, ScopeData1, và ScopeData2. vì em dùng 3 scope để xem tín hiệu và em lưu nó vào workspace mà. lúc lưu biến em đổi tên khác cũng ko được. anh đã gặp trường hợp này chưa?

Reply

ngohaibac June 18, 2009 at 7:41 am

Chào em.

Anh chưa gặp thế bao giờ cả, về nguyên tắc là em có thể đặt bất cứ biến gì miễn là không trùng nhau giữa các scope là được rồi.

Em thử gõ lệnh sau lên command windows xem sao:

>> ScopeData1

Note: Chú ý viết hoa viết thường phải đúng như cái tên trong cái scope của em nhé.

Chúc em thành công.
.-= ngohaibac´s last blog ..Tăng cường bảo mật cho blog wordpress =-.

Reply

trungkstn June 19, 2009 at 6:33 am

Anh Bắc à với khối ScopeData thì OK với bài của anh rồi. Đi in cũng tốn ít mực. Nhưng XY Plane thì làm thế nào để Save được thành file ảnh anh nhỉ. Em viết báo cáo mà đến chỗ đó chẳng lẽ lại Print Screen :D thế thì mất hết tính chuyên nghiệp (mặc dù mình nghiệp dư :P )
Chúc anh mạnh khỏe
.-= trungkstn´s last blog ..Working With Vrml in MatLab =-.

Reply

ngohaibac June 20, 2009 at 8:34 am

Cái này á, có 2 giải pháp như sau:

- Cho nó ra 2 cái scope, khi đó sẽ có 2 biến nhá. Dựa vào đó mà plot ra thôi, 1 cái là trục x, cái kia là trục y. Chi tiết thì tự ngẫm nghĩ :) )
- Dùng khối to workspace cũng thế em ạ :)

Chúc em thành công.

Reply

trungkstn June 20, 2009 at 12:34 pm

Em hiều rồi thanks anh nha
.-= trungkstn´s last blog ..Working With Vrml in MatLab =-.

Reply

Lưu Vũ November 3, 2009 at 10:24 am

Hj, thanks bạn bắc nhiều về những tài liệu của ban. Mình đang làm về matlab, cậu có thể chỉ cho mình cách truyền số liệu giữa Simulink và guid ko?

Reply

ngohaibac November 7, 2009 at 9:26 am

Cái đó không hề khó, bạn cần phải biết thực hiện với Simulink bằng các câu lệnh, như câu lệnh nào để thay đổi tham số của các object, lệnh nào để thay đổi tham số chạy simulink, … là xong.

Còn GUI thì chủ yếu là gõ lệnh mà, nên tất cả các lệnh tính toán đều dùng okie cả, không có gì đặc biệt lắm.

Chúc bạn thành công.

Reply

Lưu Vũ November 9, 2009 at 12:56 pm

Lệnh ĐK simulink? cái này tôi chưa làm bao giờ, anh có thể cho tôi tài liệu hoặc chỉ tôi tìm tài liệu đc ko?

Reply

ngohaibac November 11, 2009 at 12:07 pm

Cái này nằm trong toolbox của Simulink, bạn mở Help ra là hoàn toàn có thể xem được thôi.

Reply

Lưu Vũ November 16, 2009 at 9:24 am

tôi tiến hành truyền số liệu như hình trên
out1—–>in2
in1<——out2
Giữa 2 khối subsystem1 và subsystem2 trong Simulink nhưng 2 đường dữ liệu này quá rối, nếu kết nối nhiều hơn 2 khối thì đường đi tín hiệu trở nên rất phức tạp. Bạn cho mình hỏi có cách nào để ghép 2 tín hiệu đó vào cùng 1 Bus ko

Reply

Thanh Tung November 22, 2009 at 4:30 am

Ngoai ra con cach nay nua : trong Command Window go lenh turn on the Scope figure properties:
>shh = get(0,’ShowHiddenHandles’);
set(0,’ShowHiddenHandles’,'On’)
set(gcf,’menubar’,'figure’)
set(gcf,’CloseRequestFcn’,'closereq’)
set(gcf,’DefaultLineClipping’,'Off’)
set(0,’ShowHiddenHandles’,shh)

Reply

tan November 23, 2009 at 12:15 am

chao ca nha
hom nay tui lang thag tren mang va biet ve matlab
tui dag down ve voc thu sao
nhung tui thay phan mem nay co ve nang day
hon 3G lun
chac cai vao may nang lam nhi
con van de hoc no ?
tui khong biet phai bat dau tu dau
vay ai da tung di truoc xin chi giao lai it kinh nghiem
va noi them tui hoc ben co khi vay tui dung phan mem nay sao cho hieu qua cho cong viec cua tui sau nay(mac du chua biet sau nay lam gi nua)
cam on rat nhieu

Reply

ngohaibac November 24, 2009 at 9:38 pm

3G là bình thường mà bạn. Một đĩa DVD của Matlab giờ là hơn 4G rồi :) . Bạn cứ cài đặt vào và thực hiện theo các hướng dẫn ở trong Help là làm được mà bạn.

Chúc bạn thành công.

Reply

minhsondaklak December 8, 2009 at 3:42 pm

Xin anh Ngo Hai Bac huong dan cách sử dụng khối From Workspace lấy tín hiệu từ Workspace đưa vào simulink.
Tôi đã thử dùng khối To Workspce để đưa tín hiệu từ khối Sine Wave vào Workspace với tên là SIN (cho sơ đồ này chạy trước để tạo biến SIN)
Sau đó dùng khối From Wokspace với tên là SIN để lấy tín hiệu từ biến SIN trong Workspace đưa vào simulink cho hiển thị ra Scope, nhưng cứ bị lỗi :
Invalid setting for parameter ‘Interpolate’ in ‘WORKSPACE_VAO/From Workspace’. When time field is not specified in ‘VariableName’ parameter, interpolation has to be turned off and the extrapolation option cannot be chosen for forming the output after the final data value.
Loay hoay với cái thông báo lỗi này mãi rồi cũng không được, nên phải theo chân Google vào được đây, nên nhờ anh xem giúp. Chắc phiền anh quá, mong thông cảm !

Reply

minhsondaklak December 9, 2009 at 8:38 am

He, ổn rồi !
Dùng cái Scope xuất số liệu ra Workspace như thủ thuật trên đây của anh N.H.Bac thì OK,
Đối chiếu lại thì thấy:
Hoá ra bị lỗi ở cái To Workspace, mặc định nó chỉ xuất struct mang số liệu, time để rỗng.
Cái From Workspace thì yêu cầu phải có time, nên không xài được cái struct đó, lỗi.
Thank nhiều!

Reply

ngohaibac December 9, 2009 at 11:36 am

Thế là ổn rồi em, tự mình tìm ra câu trả lời thì sẽ hiểu vấn đề rất tốt và sâu đó em.

Chúc em thành công.

Reply

Lưu Vũ January 21, 2010 at 9:48 am

Minh sơn có địa chỉ email mình hởi thêm về các khối Workspace? bạn làm mãi không dc. email của mình: vumicrotek@gmail.com. Thank cậu trước nha.

Reply

Nguyen Hưng January 18, 2010 at 11:03 am

Anh Bắc ơi, có thể chỉ cho em cách sử dụng khối from workspace trong simulink được không. em đang cần mô phỏng với tín hiệu đặt tính toán từ workspace

Reply

TRUNG HUYNH January 20, 2010 at 11:22 am

Em sử dụng scope trong simulink mô phỏng ra được một dạng sóng. Bây giờ em cần phân tích dạng sóng này dưới dạng FFT. Mong nhận đuợc sự giúp đỡ của anh.
cảm ơn anh nhiều

Reply

lưu Vũ March 29, 2010 at 11:23 am

__________
>|in1 out1|>
| Subsystem |
>|in2 out2|>
|________ _|
hình 1
__________
<|out1 in1||in2 out2|>
|________ _|
hình 2

khi sử dụng Creat Subsystem của Simulink chương trình chạy mặc định như hình 1. bây giờ em muốn chuyển sang hình 2 thì phải l như thế nào. Anh giúp tôi với. Thanks

Reply

ngohaibac March 29, 2010 at 6:06 pm

Chào em.

Nhìn hình của em anh chưa hiểu vấn đề nằm ở đâu cả, em chụp cái hình rồi up lên host chia sẻ ảnh nào đó đi em.

Chúc em thành công.

Reply

Lê Quang March 30, 2010 at 9:07 pm


[IMG]http://i424.photobucket.com/albums/pp325/digan/SubSystem.jpg[/IMG]
khi sử dụng Creat Subsystem của Simulink chương trình chạy mặc định như hình 1. bây giờ em muốn chuyển sang hình 2 thì phải l như thế nào. Anh giúp tôi với. Thanks

Reply

ngohaibac March 30, 2010 at 10:56 pm

Chào bạn.

Theo mình biết thì Simulink không có chức năng đổi chân như thế cho bạn đâu. Mặc định của nó là các đầu input cho vào 1 bên, các đầu output cho vào 1 bên. Không biết đó có phải 1 điểm yếu của Simulink hay không, nhưng trong nhiều chương trình mô phỏng cũng không hỗ trợ chức năng này.

Chúc bạn thành công.

Reply

Lê Quang March 31, 2010 at 12:41 am

http://s424.photobucket.com/albums/pp325/digan/?action=view&current=SubSystem.jpg
khi sử dụng Creat Subsystem của Simulink chương trình chạy mặc định như hình 1. bây giờ em muốn chuyển sang hình 2 thì phải l như thế nào, giúp mình với nha, mình đang cần gấp quá

Reply

trungkstn April 12, 2010 at 7:37 am

Anh à dạo em có đóng góp thế này.
Với Matlab 2009 (em dùng bản R2009b) thì
>>plot(ScopeData.time, ScopeData.signals.values);
Được chuyển thành
>>plot(ScopeData.time,ScopeData.signals.values(:));

Reply

ngohaibac April 12, 2010 at 7:56 am

Thank Trung,

Mấy nay chắc em bận rộn k thấy comment blog anh :p. Bản Matlab R2009b anh chưa có thử qua nên không rõ, anh sẽ bổ sung thêm vào bài viết cho hợp lý.

Chúc em thành công.

Reply

Lê Quang April 20, 2010 at 10:22 am

Tôi muốn tính giá trị trung bình dữ liệu trên đồ thị của scope trong một khoảng nhất định, ví dụ tính trung bình dữ liệu thu được trên scope từ giây thứ 2 đến giây thứ 3. Anh có kinh nghiệm gì không ah.

Reply

ngohaibac April 20, 2010 at 8:03 pm

Dựa vào vector time để lấy phần đồ thị muốn plot thôi bạn. ScopeData.time là toàn bộ thời gian đo, dựa vào đó lấy phần dữ liệu cần hiển thị thôi, nhưng cần xem là phân thử thứ bao nhiêu để plot, như: ScopeData.time(10:100)

Chúc bạn thành công.

Reply

xuanhungdt8 May 10, 2010 at 4:59 pm

Anh cho em hỏi: em dùng lệnh “plot(ScopeData.time,ScopeData.signals.values(:)); ” để vẽ nhưng giá trị time và signals có kích thước khác nhau ( ScopeData =

time: [51x1 double]
signals: [1x1 struct]
blockName: ‘coexistence/Scope’).
em phải làm thế nào được ?

Reply

xuanhungdt8 May 10, 2010 at 10:39 pm

Xin lỗi, em hỏi ngốc quá. Scope có tới 3 biến trong khi em chỉ nhập vào 1 nên nó không biết vẽ cái nào ^^. Sr lần nữa vì làm phiền anh.

Reply

ngohaibac May 11, 2010 at 8:41 am

Không vấn đề gì em. Em làm thế là được rồi đó :)

Chúc em thành công.

Reply

Lê Quang May 11, 2010 at 9:50 pm

Anh có thể chỉ giúp cách sử dụng khối to/from workspace. Tôi muốn gửi số liệu vào workspace sau đó lấy ra để xử lý. cảm ơn anh.

Reply

Trọng Nghĩa May 13, 2010 at 11:26 pm

Anh có thể chỉ cho em cách lấy 2 điểm trên đồ thị và xác định khoảng cách giữa 2 điểm này như thế nào đc ko.Ví dụ như em vẽ đáp ứng của một bộ điều khiển và cần xác định thời gian( trục hoành) giữa 2 điểm trên đồ thị thì phải làm thế nào.Anh giúp em với nhé.Cảm ơn anh nhiều.

Reply

ngohaibac May 14, 2010 at 8:14 am

Thời gian giữa 2 điểm trên trục hoành thì em lấy trường time trong biến đó là được mà.

Reply

Mr_CAD July 15, 2010 at 1:32 am

Chào anh Bắc!!

Trong khối Scope , em cho hai khung nhìn trên một Scope (trong mục number of axes = 2 ), áp dụng >>plot(ScopeData.time, ScopeData.signals.values); thì không vẽ được. có cách nào để vẽ cho trường hợp này không anh. Mong hồi âm của anh. Chúc anh sức khỏe và công việc tốt!!

Reply

vutung October 17, 2010 at 4:47 pm

cho minh hoi mun lay phan do thi >o thi lam the nao?la lay phan truc tung>0,truc hoanh >0 chi lay phan tu goc (0;0) thoi,thanks nhiu

Reply

vinh tung October 17, 2010 at 8:17 pm

chao anh Bac!
em co mot van de thac mat can anh giai dap dum`

g=1.4;
m=;
l=20:0.01:90;
p=l*pi/180
d=atan(2*(m^2*sin(p).^2-1)./tan(p)./(2+m^2*(g+cos(2*p))))*180/pi;
plot(d,l)
cai code nay` em muon’ cho gia trị m chạy để vẽ đồ thị hàm d(p) vậy em phải làm sao?

Reply

nguyenhung November 24, 2010 at 10:48 am

Chao Anh Hai Bac, em co tai lieu mo phong matlab khoi nhu so do, nhung e khong biet khoi “FLUX” nam o dau trong Matlab, nho bac giup em voi. Co hinh anh kem theo.Cam on bac nhieu. Chao bac!
http://profile.imageshack.us/user/nguyenkha79/

Reply

gathan December 15, 2010 at 9:56 am

em dùng matlab 2007a và làm theo cách của anh nhưng trên worrkspace k hiện ra tên biến là ScopeData,a giúp em với nhé

Reply

ha giang February 26, 2011 at 4:05 pm

a bac oi cho em hoi: từ biểu đồ có sẵn m dùng lệnh gì trong matlab để lấy được ảnh tương ứng của nó ạ,jay là mình phải viết hàm a.e tk a nhiu nhiu

Reply

Cao Dũng April 10, 2011 at 10:37 am

anh bắc ơi cho em hỏi làm sao để simulink lấy dữ liệu từ excel.
em cảm ơn anh nhìu.

Reply

Leave a Comment

Previous post:

Next post: