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中提供的代碼:
#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就可以進行實時通訊。
總結
以上是生活随笔為你收集整理的matlab实时数据传输,利用QuaRC实现c++与simulink(matlab)之间实时双向数据传输的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 汽车国六排放标准什么时间实施?
- 下一篇: 请问欧马可的新能源大家熟悉不?说说这车怎