在总线中发送矢量数据
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
看看这个——我在入口和出口处使用总线信号,并使用总线选择器来处理它的数据。
请记住将输入和输出数据定义为总线信号!
我有一个矢量数据(例如数组变量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