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

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.

{ 55 comments… add one }
  • thu huyen April 2, 2009, 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, 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, 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, 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, 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, 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, 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, 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, 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 😀 thế thì mất hết tính chuyên nghiệp (mặc dù mình nghiệp dư 😛 )
    Chúc anh mạnh khỏe
    .-= trungkstn´s last blog ..Working With Vrml in MatLab =-.

    Reply
    • ngohaibac June 20, 2009, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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: [51×1 double]
    signals: [1×1 struct]
    blockName: ‘coexistence/Scope’).
    em phải làm thế nào được ?

    Reply
  • xuanhungdt8 May 10, 2010, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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
  • Ngoc February 6, 2012, 4:14 pm

    Anh Bac oi, cho e hoi ti,
    E co mot ham so f(x) chagn han, voi moi gia tri cua x co dinh truoc, e tinh duoc 1 gia tri cua f, sau do e dung lenh for x = 1:10 chang han, roi dinh duoc cac gia tri cua f, sau do e dugn lenh hold on de ve tat ca tren do thi, bgio e muon tao mot cai bang de bieu dien gia tri cua ham f theo x a? E ko biet lam the nao ca, vi neu dung lenh for cho x chay, thi e chi lay duoc 1 gia tri cua ham f thui, ?
    E cam on anh nhieu a?

    Reply
  • phantantoi May 5, 2012, 10:01 pm

    a Hai Bac oi…. cứu e bài này…
    Bài toán: Dao dộng cưỡng bức điều hòa.
    Tham số: tần số dao động riêng omega0 , hệ số tắt dần gama, tần số cưỡng bức omega.
    Output lên đồ thị: Trình bày đồ thị hàm dao động theo thời gian .
    mô phỏng bằng simulink chạy trên giao diện GUI…. e làm được cái simulink rồi, nhưng e ko biết cách nào để cho nó chạy được trên GUI. e có xem mấy cái vi dụ tham khao của anh nhưng e làm thì chạy không được…
    cứu e với… còn mấy bửa nữa là nộp rồi…

    Reply
  • truong November 18, 2012, 12:28 am

    Bổ sung thêm: trong scope có nhiều đồ thị, ví dụ có 3 đồ thị:
    plot(dothi.time,dothi.signals.values(:,1),’b’,dothi.time,dothi.signals.values(:,2),’r’,dothi.time,dothi.signals.values(:,3),’c’);

    Reply
  • Huy June 5, 2013, 10:02 pm

    Hi Anh Bac!
    Em lay do thi tren Scope. Nhung em muon thay doi thông số trên model thi se được dạng sóng khác, nhưng vẫn trên một plot. Anh Bac hướng dẫn dum em. Cam on

    Reply
  • huy April 7, 2014, 6:39 pm

    >> figure(1);
    >> plot(ScopeData.time,ScopeData.signals.values);
    ??? Error using ==> plot
    Data may not have more than 2 dimensions
    em bị lỗi này là sao hả a ??

    Reply
  • tranhoan April 23, 2014, 8:49 pm

    em chào anh
    anh có thể giúp em chuyển đổi kết quả thu được của mô phỏng thành matran 1 hàng nhiều cột được không ah

    Reply
    • HuyNguyen August 9, 2014, 5:34 pm

      Anh có thể chỉ cho em cách chỉnh sửa trên figure. Mo phỏng trên scope lấy trục X là time, trục Y là điện áp. Nhưng khi xuất ra workspace thì trục X không đúng là thời gian chọn. Trục Y thì hiển thị giá trị âm, và giá trị dương. Trên đồ thị dạng sóng thì đúng. 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 X) từ điểm bắt đầu là 0 trên đồ thị cả trục X và trục Y thì phải làm thế nào.Anh giúp em với nhé. Cảm ơn anh nhiều.

      Reply
  • hongviet December 23, 2014, 2:42 pm

    mình có hàm f(x)=(x-5)^2+(x-5)^2
    x1 [-10,10]
    chon 2 số cha ngẫu nhiên
    chon số con theo cha
    chạy trên matlab
    ai giúp với

    Reply

Leave a Comment