Matlab脚本创建simulink模型

本文介绍如何用simulink脚本全自动创建simulink模型。

先列举一些用到的函数:

new_system(name)   %创建系统
save_system(sys,newsys)  %保存系统sys,其中newsys是路径
open_system( model_name ) %参数填全路径名
find_system(model_name)
add_block(source,dest)  %增加模块,通常source用库浏览器看到模块的路径
delete_block(blockArg)  %从系统中删除指定的模块
add_line(sys,out,in)  %在sys中从out连线到in

具体效果参见下面例子

Save_Path = 'C:\code\';
Model_Name = 'test';
open_system( new_system(Model_Name));
save_system(Model_Name, [Save_Path Model_Name '.slx']);
add_block('simulink/Sources/Pulse Generator', [Model_Name '/Pulse1']);
add_block('simulink/Sources/Pulse Generator', [Model_Name '/Pulse2']);
add_block('simulink/Logic and Bit Operations/Logical Operator', [Model_Name '/LogicOperator1']);
add_block('simulink/Commonly Used Blocks/Out1', [Model_Name '/Out1']);
add_line(Model_Name, 'Pulse1/1', 'LogicOperator1/1');
add_line(Model_Name, 'Pulse2/1', 'LogicOperator1/2');
add_line(Model_Name, 'LogicOperator1/1', 'Out1/1');

运行得到的模型如下图

 布局可能会乱。add_block也没有指定位置的参数。当然可以通过get_param([Model_Name '/Pulse1'], 'Position')查看位置参数,用的是Windows默认坐标系,即左上角是原点,向右是x轴,向下是y轴。然后通过set_param设置位置参数进行布局。

封装子系统的关键是把子系统看成1个模块,注意在子系统中加线格式为

add_line([Model_Name '/subsystem1'], 'In1/1', 'LogicOperator1/1');

完整的封装子系统例子如下

Save_Path = 'C:\code\';
Model_Name = 'test';
open_system( new_system(Model_Name));
save_system(Model_Name, [Save_Path Model_Name '.slx']);
add_block('simulink/Ports & Subsystems/Subsystem', [Model_Name '/subsystem1']);
add_block('simulink/Sources/Pulse Generator', [Model_Name '/Pulse1']);
add_block('simulink/Sources/Pulse Generator', [Model_Name '/Pulse2']);
add_block('simulink/Logic and Bit Operations/Logical Operator', [Model_Name '/subsystem1/LogicOperator1']);
add_block('simulink/Commonly Used Blocks/In1', [Model_Name '/subsystem1/In2']);
add_line([Model_Name '/subsystem1'], 'In1/1', 'LogicOperator1/1');
add_line([Model_Name '/subsystem1'], 'In2/1', 'LogicOperator1/2');
add_line(Model_Name, 'Pulse1/1', 'subsystem1/1');
add_line(Model_Name, 'Pulse2/1', 'subsystem1/2');

封装子系统

如果想要封装一些已存在的模块,用下列代码

bh1 = add_block(...);
bh2 = add_block(...);
bh3 = add_block(...);
blocksHandle = [bh1,bh2,bh3];
Simulink.BlockDiagram.createSubsystem(blocksHandle ,'Name','subsystem');

或者整个子系统内部模块再封装为子系统

Save_Path = 'C:\code\';
Model_Name = 'test';
open_system( new_system(Model_Name));
save_system(Model_Name, [Save_Path Model_Name]);
add_block('simulink/Ports & Subsystems/Subsystem', [Model_Name '/subsystem1']);
add_block('simulink/Sources/Pulse Generator', [Model_Name '/Pulse1']);
add_block('simulink/Sources/Pulse Generator', [Model_Name '/Pulse2']);
add_block('simulink/Logic and Bit Operations/Logical Operator', [Model_Name '/subsystem1/LogicOperator1']);
add_block('simulink/Commonly Used Blocks/In1', [Model_Name '/subsystem1/In2']);
delete_line([Model_Name '/subsystem1'], 'In1/1', 'Out1/1');
add_line([Model_Name '/subsystem1'], 'In1/1', 'LogicOperator1/1');
add_line([Model_Name '/subsystem1'], 'In2/1', 'LogicOperator1/2');
add_line([Model_Name '/subsystem1'], 'LogicOperator1/1','Out1/1');
add_line(Model_Name, 'Pulse1/1', 'subsystem1/1');
add_line(Model_Name, 'Pulse2/1', 'subsystem1/2');
handle = Simulink.findBlocks( [Model_Name '/subsystem1'] );
Simulink.BlockDiagram.createSubsystem(handle, 'Name', 'sub');

运行仿真

运行simulink模型仿真的语句为

simOut = sim(model)

返回类型是Simulink.SimulationOutput 对象,包含错误信息。

查找信号线

Save_Path = 'C:\code\';
Model_Name = 'test';
open_system( [Save_Path Model_Name '.slx'] );

X = get_param([Model_Name '/Subsystem'] , 'LineHandles');
X.Inport(1,1)
Y = get_param( X.Inport(1,1) , 'ObjectParameters');
src = get_param( X.Inport(1,1) , 'SrcBlockHandle');
des = get_param( X.Inport(1,1) , 'DstBlockHandle');

如果把LineHandles换成PortHandles,也可以类似查找连线的模块。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值