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
как сигнал переменного размера.
В редакторе MATLAB Function блоков щелкните Edit Data, чтобы открыть Диспетчер портов и данных.
Для выхода y
установите флажок Variable size.
Нажмите Apply.
Запустите модель и просмотрите выходные y
в Time Scope.
С cmd = 0
, никакие данные не записываются в буфер. Поэтому выход равен 0. Чтобы записать входные данные u
в буфер, установите cmd = 1
. После того, как вы запишете какие-то данные, если вы измените cmd
назад к 0, выходные Time Scope изменяются на следующее.