找回密码
 注册
关于网站域名变更的通知
查看: 301|回复: 2
打印 上一主题 下一主题

[仿真讨论] 请教Matlab关于S函数多输入和多输出的问题

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2022-8-19 16:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
要编写一个s函数,有两个输入,三个输出,输入为参考电流Is和电角度angle,输出为三相电流Ia,Ib,Ic,问:
1 A+ s" j: a7 j( }# a% N, m2 f1、函数的外部使用MUX模块将Is和angle连接起来一同接入s-function函数模块吗?8 ?% o! |# E4 |8 a- ^9 r) Z+ S
2、此函数的s-function parameter怎么设置?(Is和angle外部的子系统计算结果给定)/ ^2 n' Y" `9 w3 x
3、对于函数程序中的所涉及的五个参数如何声明?(我的这个老说我没定义Is)
! i# \3 j! {( Mfunction [sys,x0,str,ts] = test_0105(t,x,u,flag,Is,angle)
8 O) K7 e- J  S5 {% ], Y. v$ ~: [switch flag,% h6 D0 I1 ^# i/ l
case 0,
7 k# r$ F- O+ \( ][sys,x0,str,ts,Ia,Ib,Ic]=mdlInitializeSizes;
6 g* I) d9 l' i1 }6 g* acase 1,. H& T( c$ \' ^. \5 [
sys=mdlDerivatives(t,x,u);
; l5 D/ m9 G  q0 j% m  }( T4 {2 N
# W# g0 _/ A% l0 h! p8 T, |- h0 j0 jcase 2,
0 d) z! L0 U8 ~& R. A) p  v+ Fsys=mdlUpdate(t,x,u);
$ N; _4 o' t6 ~. A) Z% a9 L- p' |$ _8 A4 J, o! a# {
case 3,
) O, b. ^0 f; Z% Asys=mdlOutputs(t,x,u,Is,angle);0 k. J. f! T2 |  d: L

0 a, w1 {* I$ m6 n7 m3 |case 4,. }( F* u# w3 t" W( p1 X+ \* f
sys=mdlGetTimeOfNextVarHit(t,x,u);6 n- C" C4 }4 s' m
case 9,9 I. ^% e$ N; G8 \/ \
sys=mdlTerminate(t,x,u);( Z; R2 R# I8 X; @0 ]7 a

, W7 y  Q, r, y! e7 i. O9 qotherwise
+ @! e- V4 Q8 U5 Zerror(['Unhandled flag = ',num2str(flag)]);$ J: q6 p8 Y5 ^. z* {! ~( n9 v
end
/ k# H. Z6 b6 k6 h2 H, [4 {2 A, d: Lfunction [sys,x0,str,ts,Ia,Ib,Ic]=mdlInitializeSizes4 M4 S2 Q3 t- d4 [( |6 m4 F
sizes = simsizes;8 t/ D+ B% ?) {$ q# F( R
sizes.NumContStates = 0;
3 v5 ^" U- t# Q, S8 }sizes.NumDiscStates = 0;
3 F$ g" w+ a) Ssizes.NumOutputs = 3;8 C# F/ r( {) Z+ n) N
sizes.NumInputs = 2;/ [. C& n4 [/ A4 {( ]0 H
sizes.DiRFeedthrough = 1;2 X  m3 B. X# o6 F; r5 Q" c
sizes.NumSampleTimes = 1; % at least one sample time is needed  t- w" K  `; Z  [9 q. O# O1 M
sys = simsizes(sizes);' ^+ \9 H% l8 x$ t" o
function [Ia,Ib,Ic]=mdlOutputs(t,x,u,Is,angle)  y  M! Y( V: X
pos=angle-floor(angle/2/pi)*2*pi;9 [  [- w( _$ a+ r
if pos<pi/3% y% b, Z% H  t% ]. x" r
Ia=Is;Ib=-Is;Ic=0;/ Y+ u7 }) L, s( J" T: A) N
elseif pos<2*pi/3
" A9 T6 q8 v" c0 d5 ?) ^Ia=Is;Ib=0;Ic=-Is;
  S8 Y7 N# S2 m; Welseif pos<pi' ~/ ~2 H  g# b5 f
Ia=0;Ib=Is;Ic=-Is;
7 a4 p* T. T# q$ z8 U9 welseif pos<4*pi/3
* w& w7 F: z/ F. b- W: i( V& \Ia=-Is;Ib=Is;Ic=0;- r. p, p7 j, |( A" N4 l
elseif pos<5*pi/3
6 e- F* f4 U; o' gIa=-Is;Ib=0;Ic=Is;
. P; _* B, h1 \2 n* z" \" N8 gelse# P' J( `" ]. j: t& R7 i
Ia=0;Ib=-Is;Ic=Is;6 G( k, {( i' Z: @" |: A$ C
end6 ?$ ]5 S6 O0 S& b$ y4 }+ ]# S3 M

该用户从未签到

2#
发表于 2022-8-19 17:16 | 只看该作者
MATLAB 7.0/Simulink 6.0建模仿真开发与高级工程应用+ S' n0 d( |/ `: Y! d
simulink 动态系统与仿真基础
  S, t# Y. q) V6 y6 p0 [2 [) F这两本书讲S-FUN比较不错。可以看下。& v' d6 Y( w1 T
如果要深入学习S-FUN,只能去看MATLAB的帮助文档,没有其他的什么好办法。
: _! l7 }- o/ v, m/ ?3 H: p还有,用simulink的要点是尽量使用已有的系统提供的模块来构建自己所需的模块,虽然这样可能看上去使用的模块多,但是你自己编写的S-FUN在效率上肯定比不上系统提供的模块,所以还是组合比自己写好。
% ^4 ^' y( V! N* S9 X7 E- a4 G, l并且S-FUN只能编写单输入单输出的模块,局限太大。你还可以研究下Simulink Embeded Function,这个模块里面可以写代码,和MATLAB基本一样,而且支持生成多输入多输出系统。不过要版本高一点的Simulink才支持这个模块。* h3 H# d4 u8 V% u

该用户从未签到

3#
发表于 2022-8-19 17:38 | 只看该作者
再看看别人是怎么说的
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-7-21 03:54 , Processed in 0.125000 second(s), 23 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表