www.gusucode.com > mbcdesign 工具箱 matlab 源码程序 > mbcdesign/@conswitch/pslAddBlock.m
function hBlock = pslAddBlock(con, hSystem) %PSLADDBLOCK Add a Simulink block for the constraint to the given system % % HBLOCK = PSLADDBLOCK(CON, HSYSTEM) % % See also CONTWOSTAGE, CONBASE/PSLADDBLOCK, CONBASE/SLSETPARAMETERS. % Copyright 2005-2014 The MathWorks, Inc. % Load the library with the constraint blocks load_system('mbcSLConstraints'); numLocalInputs = length(getLocalIndices(con)); numGlobalInputs = length(getGlobalIndices(con)); % demux local inputs outerSys = getfullname(hSystem); delete_line(outerSys, 'Xin/1', 'switch/3'); add_block('built-in/Demux', [outerSys, '/SplitLocal'], 'Outputs', sprintf('[%d %d]', numLocalInputs, numGlobalInputs), ... 'Position', [150, 200, 155, 240]); add_block('built-in/Terminator', [outerSys, '/end'], ... 'Position', [200, 220, 220, 240]); add_line(outerSys, 'Xin/1', 'SplitLocal/1', 'autorouting', 'on'); add_line(outerSys, 'SplitLocal/1', 'switch/3', 'autorouting', 'on') add_line(outerSys, 'SplitLocal/2', 'end/1') % == Inside conswitchEval block == % add conswitchEval (Point-by-Point) template target = sprintf('%s/%s-%s', getfullname(hSystem), getName(con), class(con)); source = 'mbcSLConstraints/conswitchEval'; hBlock = add_block(source, target, 'MakeNameUnique', 'On', 'LinkStatus', 'None'); sys = getfullname(hBlock); % set parameters for conswitchEval block tol = con.Tolerance; operatingPoints = con.OpPoints; [numSites, switchFactors] = size(operatingPoints); set_param(sys, ... 'Userdata', struct('Sites', operatingPoints, ... 'Tol', tol, ... 'NSwitchFactors', switchFactors, ... 'NSites', numSites, ... 'NLocalInputs', numLocalInputs), ... 'UserDataPersistent','on',... 'MaskInitialization', 'xregmaskinitialization', ... 'Mask', 'on'); % == Inside conswitchEval/Constraints block == sysModels = [sys '/Constraints']; % Update NoConstraint to produce N+1 NaN's set_param([sysModels '/NoConstraint/MuxOutputs'], ... 'Inputs', num2str(numLocalInputs+1)); for i = 1:numLocalInputs+1 add_line([sysModels,'/NoConstraint'], 'Constant/1', sprintf('MuxOutputs/%d',i), ... 'autorouting', 'on'); end % Construct the splitter/reconstruction of outputs in conswitch subsystem ModelBlockRoom = 70; % amount of space given to each model % update demuxer with number of sites set_param([sysModels '/Demux'], ... 'Outputs', num2str(numSites+1), ... 'Position', [100 90 105 100+(numSites+1)*ModelBlockRoom]); % update OutputSelect selector block with number of sites set_param([sysModels '/OutputSelect'],'NumInputPorts', num2str(numSites+1), ... 'Position', [670 90 710 100+(numSites+1)*ModelBlockRoom]); % Wire up the default NoModel (no site hit) block % input to enable block add_line(sysModels, 'Demux/1', 'NoConstraint/Enable', 'autorouting', 'on'); % output to selector add_line(sysModels, 'NoConstraint/1', 'OutputSelect/2', 'autorouting', 'on'); % Create and wire up the constraints models for each site TopPos = 100+ModelBlockRoom; allConstraintModels = con.ConList; for n = 1:numSites % add Nth block thisConstraint = allConstraintModels{n}; % make the block for the constraint hInSys = i_MakeConstraintBlock(thisConstraint, sysModels, TopPos, n); InName = get(hInSys, 'Name'); % add lines for inputs to model add_line(sysModels, 'X/1', [InName, '/1'], 'autorouting', 'on'); add_line(sysModels, sprintf('Demux/%d', n+1), [InName, '/Enable'], 'autorouting', 'on'); % add line for output of model OutName = get(hInSys, 'Name'); add_line(sysModels, [OutName '/1'], sprintf('OutputSelect/%d', n+2), 'autorouting', 'on'); TopPos = TopPos + ModelBlockRoom; end % Make an enabled subsystem for the given constraint function hSubSys = i_MakeConstraintBlock(con, sysModels, TopPos, n) hSubSys = add_block('built-in/Subsystem', sprintf('%s/Constraint%d', sysModels, n), ... 'Position', [300 TopPos 400 TopPos+40]); ConBlockName = get_param(hSubSys, 'Name'); ConBlockPath = [get_param(hSubSys, 'Parent') '/' ConBlockName]; hCon = pslAddBlock(con, ConBlockPath); ConBlockName = get(hCon, 'name'); set_param(hCon, 'Position', [200 100 300 140]); % Input variable add_block('built-in/Inport', [ConBlockPath, '/X'], 'Position', [50 100 70 120]); add_line(ConBlockPath, 'X/1', [ConBlockName,'/1'], 'autorouting', 'on'); % Enabling block add_block('built-in/EnablePort', [ConBlockPath, '/Enable'], 'Position', [220 20 280 50]); % mux outputs add_block('built-in/Mux', [ConBlockPath,'/MuxOutputs'], ... 'Position', [370 100 375 140], 'Inputs', '2', ... 'DisplayOption', 'bar'); add_line(ConBlockPath, [ConBlockName,'/1'], 'MuxOutputs/1'); add_line(ConBlockPath, [ConBlockName,'/2'], 'MuxOutputs/2'); % outport add_block('built-in/Outport', [ConBlockPath, '/Out'], 'Position', [450 110 470 130]); add_line(ConBlockPath, 'MuxOutputs/1', 'Out/1');