日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

matlab实时数据传输,利用QuaRC实现c++与simulink(matlab)之间实时双向数据传输

發(fā)布時間:2024/9/27 c/c++ 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 matlab实时数据传输,利用QuaRC实现c++与simulink(matlab)之间实时双向数据传输 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

1. 軟件環(huán)境

1.1

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

1.2

Matlab (樓主用的2013b)

1.3

QuaRC ?(樓主用的2.4版本)

2. 硬件環(huán)境

無特殊要求,一般主流PC均可流暢運(yùn)行。

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;

}

樓主對其進(jìn)行了修改,如下:

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

相關(guān)配置:

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

詳細(xì)參見:

在使用bus時要先定義:

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

如圖,定義一個名為BusObject的bus數(shù)據(jù),定義完之后需要對定義的bus數(shù)據(jù)進(jìn)行初始化

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

使用bus,每次運(yùn)行時都需要打開對應(yīng)mat文件,很麻煩!設(shè)法讓他在編譯model時自己啟動

在InitFcn對話框中加入:

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

'my_bus_object.mat'))

最后一項是你要加載的mat文件名。

完成以上后開始對simulink的model進(jìn)行編譯(ctrl+M),然后鏈接。接著打開c++編譯執(zhí)行,就可以實(shí)時進(jìn)行行數(shù)據(jù)傳輸了!

5. 注意事項

1.1

首先運(yùn)行simulink程序,因?yàn)檫@個是服務(wù)器端。

我們也可以將simulink作為客戶端,c++作為服務(wù)短,對應(yīng)的simulink模塊需要變化。具體可以看QuaRc里面的具體講解

1.2

斷開連接時應(yīng)先斷開客戶端,然后暫停服務(wù)器端,最后停止服務(wù)器端。

6. 這樣C++與matlab就可以進(jìn)行實(shí)時通訊。

總結(jié)

以上是生活随笔為你收集整理的matlab实时数据传输,利用QuaRC实现c++与simulink(matlab)之间实时双向数据传输的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。