2016-01-19 1 views
0

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

% Общий вид синтаксисе S-функции MATLAB является: % [СИС, Х0, УЛ, TS, SIMSTATECOMPLIANCE] = SFUNC (T, X, U, FLAG, P1, ..., Pn)

Я предпочел бы передать единую структуру, включающую все мои параметры. Я загрузил эти данные в модели рабочей области, как: enter image description here

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

функции [SYS, х0, ул, TS, simStateCompliance] = system1 (т, х, и , флаг, DATA_HMMWV)

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

также

with the Simulink looking like:

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

enter image description here

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

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

и я получаю эту ошибку: enter image description here

Кроме того, вы уверены, что DATA_HMMWV является параметром? Это выглядит несколько иначе, чем Param в этом окне: enter image description here

NEW :::: 1/25/2016

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

enter image description here

Если код продолжает (с флагом = 1) получаем: enter image description here

Если код продолжает работать, он падает с этой ошибкой: enter image description here

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

% функции SYS = mdlDerivatives (т, х, и, DATA_HMMWV)

SYS = DATA_HMMWV.g;

% конечный mdlDerivatives

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

+1

Вы действительно должны писать S-функцию уровня 2, а не S-функцию уровня 1. Для синтаксиса уровня 1 ваша переменная 'P1' должна быть тем же типом данных, что и переменная, которую вы передаете, поэтому просто передавайте ее в виде ввода. (Для S-функций уровня 2 вам нужно научиться использовать объекты шины.) –

+0

Фил, большое спасибо за ваши предложения. Я рассмотрю S-функцию уровня 2, но пока (чтобы избежать внесения слишком большого количества изменений в очень сложный код, который я унаследовал), я попробую ваше второе предложение. Я действительно пытался передать структуру в качестве входных данных, но я не смог заставить ее работать. Как только я определяю данные в рабочей области модели (как в моем изображении выше), как я могу передать ее в S-функцию? –

+1

В Simulink существует очень четкое различие между _signal_ (который подается в блок через входной порт) и _parameter_ (который указан в диалоговом окне блока). Ваш параметр «DATA_HMMVW» является параметром. Дважды щелкните по блоку S-Function и введите имя переменной в строке S-Function Parameters диалогового окна. –

ответ

0

Setup 1: Загрузка данных в виде структуры в базовой рабочей области и запустить Simulink модель

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

установки 2: level 1 S-function that is being called in simulink

Setup 3: При двойном щелчке на этой модели, укажите структуру, которую вы хотели бы передать S-функции как: enter image description here

Настройка 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) 

Теперь вы прошли strucure на уровень -1 S-функция!

Смежные вопросы