PDA

查看完整版本 : [求助]S函数中能否调用M函数


yuer981211
2008-12-22, 11:37
我现在写了一个S-FUNCTION
里面调用了一些M函数,当把S函数的名字写入S—FUNCTION块的时候
总是出现
??? SWITCH expression must be a scalar or string constant.

Error in ==> HSV at 32
switch flag,

不知道该如何处理了,请教大家了
AreaCXJTFT等都为M函数,如果我调用方式出现错误,请指出阿,:biggrin: :biggrin:
程序如下:
看着很麻烦,其实就是判断区域Area后,根据Area的值选择输出的计算方式:




function [sys,x0,str,ts]=HSV(t,x,u,flag)
switch flag,

case 0
[sys,x0,str,ts] = mdlInitializeSizes; % Initialization

case 3
sys = mdlOutputs(t,x,u); % Calculate outputs
case { 1, 2, 4, 9 }
sys = []; % Unused flags

otherwise
error(['Unhandled flag = ',num2str(flag)]); % Error handling
end;

function [sys,x0,str,ts] = mdlInitializeSizes
sizes = simsizes;
sizes.NumContStates= 0;
sizes.NumDiscStates= 0;
sizes.NumOutputs=7;
sizes.NumInputs=2;
sizes.DirFeedthrough=0;
sizes.NumSampleTimes=1;
sys = simsizes(sizes);
str = [];
ts = [-1 0];
function sys = mdlOutputs(t,x,u)
P=u(1);
Tamp=u(2)+273.15;
if (273.15<=Tamp<=1073.15) &( 0.007<=P<=100)
if (273.15<=Tamp<=623.15)
Pst=Ps(Tamp);
Pb12=Pst;
if P>=Pb12
Area=1;
else
Area=2;
end
elseif (623.15<Tamp<863.15)
Pb23=P23(Tamp);
Pst=Ps(Tamp);
if (623.15<Tamp<647.096)
if P==Pst
Area=4;
elseif (Tamp==647.096)&(P==22.064)
GV=0.003106;
Area=4;
end
elseif P<Pb23
Area=2;
else
Area=3
end
else (863.15<=Tamp<=1073.15)
Area=2;
end
else
return
end

switch Area,
case 1
PS=16.53; %1区基本方程3.1中压力常数,MPa
TS=1386; %1区基本方程3.1中温度常数,K
GH=1;
GS=1;
GV=1;
LH=TS*R0*(TS/Tamp)*AreaARr(P,Tamp);
LS=R0*((TS/Tamp)*AreaARr(P,Tamp) -AreaAR(P,Tamp));
LV=TS*R0*AreaARY(P,Tamp)/(PS*1000);
subArea=1;
case 2
TS=540; %TS=540K
PS=1; %PS=1Mpa
LH=1; %2_过热蒸汽区中水的比焓不计算
LS=1; %2_过热蒸汽区中水的比熵不计算
LV=1; %2_过热蒸汽区中水的比容不计算
if P<=10
GH=R0*T0*(TS/Tamp)*AreaBaH(P,Tamp);
GS=R0*AreaBaS;
GV=R0*T0*(P/PS)*AreaBaV(P,Tamp);
else
GH=R0*T0*(TS/Tamp)*AreaBaH(P,Tamp);
GS=R0*AreaBaS;
GV=R0*T0*(P/PS)*AreaBaV(P,Tamp);
end
subArea=2;
case 3
TS=647.096; %TS=647.096K
LH=1;
LS=1;
LV=1;
GH=R*TS*(AreaCTFT(P,Tamp)+AreaCDFD(P,Tamp));
GS=R*(AreaCTFT(P,Tamp)-AreaCF(P,Tamp));
GV=AreaCV(P,Tamp);
subArea=3;
case 4
LH=R*T*(AreaCNDTFT(P,Tamp)+AreaCNDDFD(P,Tamp));
LS=R*(AreaCNDTFT(P,Tamp)-AreaCNDF(P,Tamp));
LV=AreaCNDV(P,Tamp);
GH=R*T*(AreaCXJTFT(P,Tamp)+AreaCXJDFD(P,Tamp));
GS=R*(AreaCXJTFT(P,Tamp)-AreaCXJF(P,Tamp));
GV=AreaCXJV(P,Tamp);
subArea=4;
otherwise
return
end
sys=[LH,LS,LV,GH,GS,GV,subArea];

anbcjys
2008-12-23, 08:02
你这个问题用不到s函数 另外检查一下你的语句 有些有问题 不是m语言 你说的那个没有试过 感觉不可以 不过你放到s函数里面试试