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中提供的代碼:

#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:

相關配置:



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

在使用bus時要先定義:
在simulink工具欄edit下找到bus editor 打開

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

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

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

在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就可以進行實時通訊。