天天看点

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