Отправка векторных данных в шине

У меня есть векторные данные (переменная массива, например float32 mydata[5];). для передачи одиночных примитивных/базовых данных по шине это довольно просто.

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

этот элемент можно поместить внутрь использования

Bus=Simulink.Bus;
Bus.Elements=inside_data;

Но это работает, когда вход является примитивом. Но что, если мои данные являются вектором. как float32 a[5];, тогда как я могу отправить этот элемент данных в шину.

ОБНОВЛЕНИЕ Поэтому я попытался использовать постоянный блок с именем a с типом данных single, в котором входная часть была изменена на [1 2 3], которая является векторным вводом. другой элемент — b с типом данных uint8.

я использовал построитель s-функций только для проверки работы этой модели. я уже все установил (bus_mode включен, тип данных должен быть типом шины и т. д.). в выходной части я использовал что-то вроде:

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];

но проблема с декларацией. это дает мне ошибку, не может преобразовать из real32_T в real32_T *.


person Arun Kumar    schedule 15.06.2015    source источник


Ответы (1)


Основная идея состоит в том, чтобы создать Автобус нужного вам типа. Я сделал это следующим образом:

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

busInfo = Simulink.Bus.createObject(a);

Вы видите, что можно создать любую структуру данных, массив, вектор, что угодно, а затем создать шинный сигнал того же типа.

Я использую это в callbacks/preLoadFcn (Model Explorer), чтобы определить этот тип в рабочей области, он создает переменную slBus1 (ее сигнал шины моего типа), поэтому мне нужно определить вывод (или ввод, если необходимо) любого блока, такого как slBus1 только. А затем используйте Bus Selector для работы с данными массива.

Может ли это помочь вам?

ДОБАВИТЬ НОВУЮ ИНФОРМАЦИЮ

Это зависит от того, что вы хотите. Например: я создаю s-функцию для системы обратной связи. Он использует мою структуру следующим образом:

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

Посмотрите на это - я использую сигнал шины на входе и выходе и использую селектор шины для работы с данными. НЕ ЗАБУДЬТЕ определить входные и выходные данные как сигналы шины!

person Mikhail_Sam    schedule 16.06.2015
comment
можете ли вы сказать мне, как использовать это для s_function ?? - person Arun Kumar; 17.06.2015
comment
@ArunKumar Я добавил для вас кое-какую информацию в свой ответ, посмотрите на это. В моем примере я создаю сигнал шины в PreLoad, а затем использую его в любой s-функции. - person Mikhail_Sam; 17.06.2015
comment
Проблема, с которой я столкнулся, заключается не в создании шины для векторов... мне просто нужно добавить размеры (2D) к элементу, и он станет вектором. Но я сталкиваюсь с проблемой, когда пишу s-функции для этих векторных данных. Когда я пытаюсь получить отдельный элемент этого вектора и скопировать его в вывод, он не отображает значение должным образом в области видимости. Я думал, что мой метод неверен, но, похоже, что-то не так с распределением памяти. В любом случае, я должен понять это сам, а не публиковать. но я все равно приму твой ответ - person Arun Kumar; 17.06.2015
comment
Я думаю, вы правы - у simulink есть какое-то конкретное распределение памяти. Я избегаю всех этих проблем, тщательно описывая типы данных: посмотрите на мой пример — я не пишу a = BusSignal в начале своей функции! Каждый раз, когда я устанавливаю все размеры для каждой переменной, прежде чем использовать ее - все это нули. Попробуй это! - person Mikhail_Sam; 17.06.2015