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就可以进行实时通讯。