Передача структуры параметров S-функции m-кода уровня 1 в Simulink

Я пытаюсь передать структуру параметров S-функции в MATLAB. У меня есть куча параметров, и я хотел бы избежать их передачи следующим образом:

% Общая форма синтаксиса S-функции MATLAB: % [SYS,X0,STR,TS,SIMSTATECOMPLIANCE] = SFUNC(T,X,U,FLAG,P1,...,Pn)

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

Сначала я попробовал (в ответ Филу):

функция [sys, x0, str, ts, simStateCompliance] = system1 (t, x, u, флаг, DATA_HMMWV)

размеры.NumInputs = 2;

также,

с Simulink, выглядящим как:

Но я получаю эту ошибку:

введите здесь описание изображения

Фил, вот почему я попытался добавить еще один входной порт в S-Function, я думал, что он должен быть там.

Я также пробовал: размеры.NumInputs = 1;

и я получаю эту ошибку: введите здесь описание изображения

Кроме того, вы уверены, что DATA_HMMWV является параметром? В этом окне он выглядит немного иначе, чем Param: введите описание изображения здесь

НОВОЕ:::: 25.01.2016

Фил, проблема не в моей производной функции, проблема в том, что я до сих пор не передаю структуру в функцию. Вот картинка. Обратите внимание, что данные находятся в рабочей области модели, и я передал их (DATA_HMMWV) в функцию, но когда я останавливаю симуляцию в строке 13 (режим отладки), DATA_HMMWV не находится в рабочей области функции.

введите здесь описание изображения

Если код продолжается (to flag = 1), мы получаем: введите здесь описание изображения

Если код продолжает работать, он вылетает с ошибкой: введите здесь описание изображения

Итак, в функцию было передано недостаточно входных аргументов. Кроме того, функция очень проста:

% function sys = mdlDerivatives(t,x,u,DATA_HMMWV)

sys = DATA_HMMWV.g;

% end mdlПроизводные

Он просто пытается получить параметр из структуры.


person Huckleberry Febbo    schedule 19.01.2016    source источник
comment
Вы действительно должны писать S-функцию уровня 2, а не S-функцию уровня 1. Для синтаксиса уровня 1 ваша переменная P1 должна иметь тот же тип данных, что и переменная, которую вы передаете, поэтому просто передайте структуру в качестве входных данных. (Для S-функций уровня 2 вам нужно научиться использовать объекты шины.)   -  person Phil Goddard    schedule 20.01.2016
comment
Фил, большое спасибо за ваши предложения. Я рассмотрю S-функцию уровня 2, но пока (чтобы не вносить слишком много изменений в очень сложный код, который я унаследовал) я попробую ваше второе предложение. На самом деле я пытался передать структуру в качестве входных данных, но мне не удалось заставить ее работать. Как только я определяю данные в рабочей области модели (как на картинке выше), как передать их в S-функцию?   -  person Huckleberry Febbo    schedule 20.01.2016
comment
В Simulink существует очень четкое различие между сигналом (который подается в блок через входной порт) и параметром (который задается в диалоговом окне блока). Ваш DATA_HMMVW является параметром. Дважды щелкните блок S-Function и введите имя переменной в строке S-Function Parameters диалогового окна.   -  person Phil Goddard    schedule 20.01.2016
comment
Фил, спасибо за помощь. Я снова обновил свой пост, чтобы ответить на ваш комментарий. В принципе, я устал делать то, что вы уже предложили, но это выдавало мне ошибку.   -  person Huckleberry Febbo    schedule 20.01.2016
comment
Похоже, вы должны использовать «NumInputs = 1». Для ошибки, связанной с производной при t=0, вам нужно будет показать нам (некоторые из) вашего кода, в частности: как на самом деле вызывается функция производных и что она ожидает.   -  person Phil Goddard    schedule 20.01.2016
comment
Спасибо за вашу помощь в этом. К сожалению, я все еще изо всех сил пытаюсь сделать эту работу (я обновил свой пост с дополнительной информацией). Когда это будет решено, я постараюсь очистить этот пост.   -  person Huckleberry Febbo    schedule 25.01.2016
comment
Скриншот, который вы показываете, относится к флагу = 0. Как он выглядит для флага = 1?   -  person Phil Goddard    schedule 25.01.2016
comment
Я только что обновил его. Большое спасибо!   -  person Huckleberry Febbo    schedule 25.01.2016
comment
Покажите нам также изображение диалогового окна S-Function. Перечислены ли DATA_HMMVW в части параметров S-функции диалогового окна?   -  person Phil Goddard    schedule 26.01.2016
comment
Также обратите внимание, что этот параметр не является объектом Simulink.Parameters, который вы показываете как переменную Param в одном из ваших изображений. Это разные вещи (и объекты Simulink.Parameter не имеют ничего общего с вашей проблемой).   -  person Phil Goddard    schedule 26.01.2016
comment
Фил, большое спасибо. Вы поняли это! Я не настроил параметры своего блока. Я не уверен, как я пропустил это. Вы ответили на мой вопрос. Я хотел сделать четкую демонстрацию шагов, чтобы показать, как это сделать для всех, кто хотел бы сделать это в будущем. Должен ли я сделать это в своем исходном сообщении и удалить свой процесс отладки, или я должен поместить его в поле (Ответить на ваш вопрос)? Я просто не хотел брать на себя ответственность за это, потому что это ты понял. Спасибо!   -  person Huckleberry Febbo    schedule 26.01.2016


Ответы (1)


Настройка 1: загрузите данные как структуру в базовое рабочее пространство и запустите модель simulink.

clear;
clc;
close all
PlantName = 'untitled';
open(PlantName)
TFinal          = 10;
load DATA_HMMWV.mat
sim(PlantName, TFinal)

Настройка 2: S-функция уровня 1, которая вызывается в simulink

Настройка 3: Когда вы дважды щелкните эту модель, укажите структуру, которую вы хотели бы передать S-функции, как: введите здесь описание изображения

Настройка 4: ваши функции также должны иметь структуру:

function [sys,x0,str,ts,simStateCompliance]=system1(t,x,u,flag,DATA_HMMWV)

и любые другие функции, в которых вам нужна структура, например:

  case 1
sys = mdlDerivatives(t,x,u,DATA_HMMWV);

потом,

function sys = mdlDerivatives(t,x,u,DATA_HMMWV)

Итак, вы передали структуру S-функции уровня 1!

person Huckleberry Febbo    schedule 28.01.2016