天天看點

matlab實時資料傳輸,利用QuaRC實作c++與simulink(matlab)之間實時雙向資料傳輸

1. 軟體環境

1.1

Visual Studio 2005/2008/2010/2012(樓主用的2012)

1.2

Matlab (樓主用的2013b)

1.3

QuaRC  (樓主用的2.4版本)

2. 硬體環境

無特殊要求,一般主流PC均可流暢運作。

3. C++程式(用戶端)

1.1

首先在vs中添增QuaRC頭檔案與庫檔案檔案夾目錄。

1.1.1

在Property Page->Configuration

Properties->C/C++->Additional Include Directories 加入

$(QUARC_DIR)include。

1.1.2

在Property Page->Configuration

Properties->Linker->General->Additional Library

Directories 加入 $(QUARC_DIR)lib\windows。

1.1.3

在Property Page->Configuration

Properties->Linker->Input->Additional Dependencies

加入 quanser_communications.lib quanser_runtime.lib

quanser_common.lib。

1.2 編寫C++用戶端程式。

先來看一段QuaRC中提供的代碼:

matlab實時資料傳輸,利用QuaRC實作c++與simulink(matlab)之間實時雙向資料傳輸

#include

#include

#include "quanser_messages.h"

#include "quanser_communications.h"

#include "stdafx.h"

static int stop = 0;

static void control_c_handler(int signum)

{

stop

= 1;

}

int _tmain(int argc, _TCHAR* argv[])

{

const

char uri[] =

"shmem://foobar:1";

const t_boolean

nonblocking =

false;

const char

* locale =

NULL;

t_connection client;

t_error result;

char

message[512]; signal(SIGINT,

control_c_handler); result = qcomm_connect(uri, nonblocking,

&client);

if (result == 0)

{

t_double buffer =

0.0;

t_int buffer_size

= sizeof(buffer);

while

(!stop)

{ result

= qcomm_receive_double(client, &buffer, buffer_size);

if

(result == -QERR_CONNECTION_NOT_BOUND)

{

result

= qcomm_send(client, &buffer, buffer_size);

if

(result < 0)

break;

}

else

if (result <= 0)

break; result

= qcomm_send(client, &buffer, buffer_size);

if

(result < 0)

break;

} qcomm_close(client);

printf("Connection

closed. The last value received is: %lf.\n",

buffer); if (result <

0)

{

msg_get_error_messageA(locale,

result, message, sizeof(message));

printf("Error

communicating on URI '%s'. %s\n", uri, message);

}

}

else

{

qcomm_close(client);

msg_get_error_messageA(locale,

result, message, sizeof(message));

printf("Unable to

connect to URI '%s'. %s\n", uri, message);

}

printf("Press enter to exit\n");

getchar();

return 0;

}

樓主對其進行了修改,如下:

#include

#include

#include "quanser_messages.h"

#include

"quanser_communications.h"

#include

//#include "afx.h"

#include

using namespace std;

static int stop = 0;

static void control_c_handler(int

signum)

{

stop =

1;

}

int main(int argc, char* argv[])

{

const char

uri[]

= "shmem://foobar:1";

const t_boolean nonblocking

= false;

const char *

locale  =

NULL;

t_connection

client;

t_error result;

char

message[512];

signal(SIGINT,

control_c_handler);

result = qcomm_connect(uri,

nonblocking, &client);

if (result == 0)

{

double buffer[3] = {4.0,3.0,2.0};

double buffer1[3] =

{4.0,1.0,2.0};

int buffer_size =

sizeof(buffer);

//cout<

while (!stop)

{

//buffer1=buffer1+0.001;

// cout<

result =

qcomm_receive(client, &buffer, buffer_size);

//cout<

//cout<

if

(result == -QERR_CONNECTION_NOT_BOUND)

{

result

= qcomm_send(client, &buffer1, buffer_size);

//cout<

buffer1[0]=buffer1[0]-0.01;

if

(result < 0)

break;

}

else if

(result <= 0)

break;

result =

qcomm_send(client, &buffer1, buffer_size);

if

(result < 0)

break;

}

qcomm_close(client);

printf("Connection closed.

The last value received is: %lf.\n",

buffer);

if (result <

0)

{

msg_get_error_messageA(locale, result, message,

sizeof(message));

printf("Error communicating on URI '%s'. %s\n",

uri, message);

}

}

else

{

qcomm_close(client);

msg_get_error_messageA(locale, result, message,

sizeof(message));

printf("Unable to connect

to URI '%s'. %s\n", uri, message);

}

printf("Press enter to

exit\n");

getchar();

return 0;

}

建立simulink的model:

matlab實時資料傳輸,利用QuaRC實作c++與simulink(matlab)之間實時雙向資料傳輸

相關配置:

matlab實時資料傳輸,利用QuaRC實作c++與simulink(matlab)之間實時雙向資料傳輸
matlab實時資料傳輸,利用QuaRC實作c++與simulink(matlab)之間實時雙向資料傳輸
matlab實時資料傳輸,利用QuaRC實作c++與simulink(matlab)之間實時雙向資料傳輸

如果傳輸數組(樓主傳遞的是1×3的向量),得用到bus。

詳細參見:

matlab實時資料傳輸,利用QuaRC實作c++與simulink(matlab)之間實時雙向資料傳輸

在使用bus時要先定義:

在simulink工具欄edit下找到bus editor 打開

matlab實時資料傳輸,利用QuaRC實作c++與simulink(matlab)之間實時雙向資料傳輸

如圖,定義一個名為BusObject的bus資料,定義完之後需要對定義的bus資料進行初始化

matlab實時資料傳輸,利用QuaRC實作c++與simulink(matlab)之間實時雙向資料傳輸

具體操作,在bus editor中對要初始化的object,

matlab實時資料傳輸,利用QuaRC實作c++與simulink(matlab)之間實時雙向資料傳輸

使用bus,每次運作時都需要打開對應mat檔案,很麻煩!設法讓他在編譯model時自己啟動

matlab實時資料傳輸,利用QuaRC實作c++與simulink(matlab)之間實時雙向資料傳輸

在InitFcn對話框中加入:

load(fullfile(fileparts(get_param(bdroot, 'Filename')),

'my_bus_object.mat'))

最後一項是你要加載的mat檔案名。

完成以上後開始對simulink的model進行編譯(ctrl+M),然後連結。接着打開c++編譯執行,就可以實時進行行資料傳輸了!

5. 注意事項

1.1

首先運作simulink程式,因為這個是伺服器端。

我們也可以将simulink作為用戶端,c++作為服務短,對應的simulink子產品需要變化。具體可以看QuaRc裡面的具體講解

1.2

斷開連接配接時應先斷開用戶端,然後暫停伺服器端,最後停止伺服器端。

6. 這樣C++與matlab就可以進行實時通訊。