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');