在总线中发送矢量数据

Sending vector data in the bus

我有一个矢量数据(例如数组变量float32 mydata[5];)。在总线中传输单个 primitve/basic 数据非常简单。

inside_data=Simulink.BusElement;
inside_data.Name='somename';
inside_data.SampleTime = -1;
inside_data.datatype='single';

这个元素可以放在 using

里面
Bus=Simulink.Bus;
Bus.Elements=inside_data;

但是当输入是原语时这有效。但是如果我的数据是一个向量呢?喜欢 float32 a[5]; 那么我怎样才能在总线上发送这个数据元素。

更新 所以我尝试使用一个名为 a 的常量块,数据类型为 single,其中我将输入部分更改为 [1 2 3],这是一个向量输入。 另一个元素是数据类型为 uint8 的 b。

我使用 s-function builder 只是为了检查这个模型的工作情况。我已经设置了所有内容(bus_mode on ,数据类型为总线类型等)。在输出部分我使用了类似的东西:

y0[0]=u0->a[0];
y0[1]=u0->a[1];
y0[2]=u0->a[2];
y1[0]=u0->b;

但它抛出错误

c:\program files (x86)\matlab_v7111_r10bsp1\extern\include\matrix.h(313) : error C2061: syntax error : identifier 'mxLogical' 
c:\program files (x86)\matlab_v7111_r10bsp1\extern\include\matrix.h(313) : error C2059: syntax error : ';' 

我的最终目标是s_function

所以如果我在 s_func 中声明一个变量为

real32_T *a_output[5]=(real32_T *)ssGetOutputPortRealSignal(S,0); 

然后我有一个结构(因为我用总线传输数据所以总线头文件有这个结构)以及我如何声明输入并将其分配给输出。

a_output[0]=my_struct->a_input[0];
a_output[1]=my_struct->a_input[1];
a_output[2]=my_struct->a_input[2];
a_output[3]=my_struct->a_input[3];
a_output[4]=my_struct->a_input[4];

但问题出在声明上。它给我错误 cannot convert from real32_T to real32_T * 。

主要思想是创建您需要的类型的总线。 我是这样做的:

num = zeros(15,15,15);
move   = zeros(15,15,15);
a = struct('number',num,'movement', move);

busInfo = Simulink.Bus.createObject(a);

您可以看到可以创建任何您想要的数据结构、数组、向量,然后创建相同类型的总线信号。

我在 callbacks/preLoadFcn(模型资源管理器)中使用它在工作区中定义此类型,它创建 slBus1 变量(我的类型的总线信号),因此我需要定义输出(或必要时输入)仅像 slBus1 的任何块。然后使用 Bus Selector 处理数组数据。

对你有帮助吗?

添加新信息

这取决于你想要什么。 例如:我为反馈系统创建了 s-function。它像这样使用我的结构:

function a = fcn(BusSignal)
%#codegen
num = zeros(15,15,15);
move   = zeros(15,15,15);
%...some math actions with num and move...
a = struct('number',num,'movement', move);
%...and some action with a structure... for example:
if (c>b)
    a.number(1,2,3) = 15;
    a.movement(1,2,3)   = 42;
else
    a = BusSignal;
end

看看这个——我在入口和出口处使用总线信号,并使用总线选择器来处理它的数据。 请记住将输入和输出数据定义为总线信号!