本文介绍如何用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,也可以类似查找连线的模块。