Зачем чтение данных из dsp.AsyncBuffer Объект выдает Размерность ошибку несоответствия в блоке MATLAB Function?

Если вы считываете данные из асинхронного буфера внутри блока MATLAB Function (Simulink), блок выдает ошибку несоответствия размерности, если выход read метод не задан как сигнал переменного размера.

Вот bufferWrapper функция, которая содержит алгоритм внутри блока MATLAB Function. Когда вход на cmd порт 1, а dsp.AsyncBuffer объект записывает входные данные, u, в буфер. Когда вход на cmd порт 0объект считывает данные из буфера.

function [y,isData] = bufferWrapper(u,cmd) 

persistent asyncBuff 
if isempty(asyncBuff) 
   asyncBuff = dsp.AsyncBuffer; 
   setup(asyncBuff,u);
end
 
if cmd % write
    write(asyncBuff,u);
    y = zeros(3,1);
    isData = false;
else % read
    y = read(asyncBuff,3);
    isData = true;
end

Необходимо инициализировать буфер путем вызова write или setup перед первым вызовом в read.

Во время операции записи первый выход, y, есть zeros(3,1) и второй выход, isData, равен 0. Во время операции чтения y - данные в буфере и isData равен 1.

Запустите модель, и происходит следующая ошибка.

Область выхода read(asyncBuff,3) в линии 14 переменный размер. Выход переменного размера, потому что размер сигнала, выводимого read функция зависит от входных параметров, чтобы read. Чтобы устранить эту ошибку, задайте y как сигнал переменного размера.

  1. В редакторе MATLAB Function блоков щелкните Edit Data, чтобы открыть Диспетчер портов и данных.

  2. Для выхода yустановите флажок Variable size.

  3. Нажмите Apply.

Запустите модель и просмотрите выходные y в Time Scope.

С cmd = 0, никакие данные не записываются в буфер. Поэтому выход равен 0. Чтобы записать входные данные u в буфер, установите cmd = 1. После того, как вы запишете какие-то данные, если вы измените cmd назад к 0, выходные Time Scope изменяются на следующее.

См. также

Объекты

Похожие темы