本スクリプトは、Excelファイルに記載されたブロック情報をもとに、Simulinkモデル内にブロックを自動生成するツールです。
手作業でブロックを配置する手間を削減し、統一されたフォーマットでブロックを作成できます。
仕様
- Excelファイルに「変数名」と「ブロックタイプ」を記載
※Inportブロックは、オプションとして[データ型の表示・サンプル時間の設定・端子次元の設定]が可能です。 - 記載された変数名・ブロックタイプに応じて、ブロックを生成
- 生成されたブロックを縦並びで配置(各ブロックは種類別にそれぞれ縦並びで生成)
※注意点‼︎
Inport・Outportブロックは同名の変数の場合生成エラーが発生します。
重複させないようにしましょう!
Excelファイルの形式(Ver2.0)
- ファイル名:
generate_simulink_blocks.xlsx
※任意の名称でOK - シート名:
Sheet1
←ここは変更しない様に! - 列構成:
A列
: 変数名B列
: ブロックタイプ(Inport, Outport, Goto, From, Read, Write,Constant)- C列: データ型 (入力した内容がそのまま反映されるため注意!)※Inport、Constantのみ
※Constantブロックの場合「test」という文字のみ有効:名前設定ロジックの変更を行います。 - D列: データ型の表示(注釈部分へデータ型を表示するかどうか)※Inportブロックのみ
- E列: サンプル時間 ※Inportブロックのみ (Ver2.0以降)
- F列: 端子次元 ※Inportブロックのみ(Ver2.0以降)
- G列: memo(スクリプトに影響しないただのメモ欄)
※値の入力は、3行目から!!(1行目はヘッダー、2行目は空白)
変数名 | データタイプ | データ型 (Inport と Constant) | データ型の表示 (Inportのみ) | サンプル時間 (Inportのみ) | 端子次元 (Inportのみ) | memo |
DataStoreRead_Block01 | Read | |||||
DataStoreWrite_Block01 | Write | |||||
Goto_Block01 | Goto | |||||
From_Block01 | From | |||||
Inport_Block01 | Inport | uint8 | true | |||
Outport_Block01 | Outport | |||||
Constant_Block01 | Constant | 値設定ver | ||||
Constant_Block02 | Constant | test | 名前設定ver |
MATLABスクリプト
MATLABのホームウィンドウから、「新規スクリプト」を作成し、下記のコードをコピペ
- Ver2.1
- Ver2.0
- Ver1.0
function generate_simulink_blocks(filename, modelName)
% generate_simulink_blocks
% Excelファイルに基づいてSimulinkモデルに指定されたブロックを自動生成します。
%
% 使用方法:
% generate_simulink_blocks('blocks.xlsx', 'your_model_name')
%
% 引数:
% filename - ブロック情報を記載したExcelファイル
% modelName - 操作対象のSimulinkモデル名
% ------------------------
% 設定
% ------------------------
% ブロックサイズ設定(種類ごとに異なるサイズ)
BLOCK_SIZES = struct(...
'Inport', [30, 14], ... % 幅30, 高さ14
'Outport', [30, 14], ... % 幅30, 高さ14
'Goto', [250, 28], ... % 幅250, 高さ28
'From', [250, 28], ... % 幅250, 高さ28
'Read', [250, 30], ... % 幅250, 高さ30
'Write', [250, 30], ... % 幅250, 高さ30
'Constant', [250, 28] ... % 幅250, 高さ28
);
% 基準座標の設定
positions = struct(...
'Inport', [ 75, 100], ...
'Outport', [ 215, 100], ...
'Goto', [ 400, 100], ...
'From', [ 700, 100], ...
'Read', [-600, 100], ...
'Write', [-300, 100], ...
'Constant', [1000, 100] ...
);
yOffset = 50; % 縦方向の間隔 35にするとコンパクトに生成可能
% ------------------------
% Excelファイルからデータを読み込む
% ------------------------
% ヘッダ行を含むテーブルとして読み込み
data = readtable(filename, 'Sheet', 'Sheet1', 'ReadRowNames', false);
% もし1行目がヘッダ行なら、下記のように2行目以降を取り出す
data = data(2:end, :);
% -----------------------------------------------------
% A列(B列)が空の行のみ削除して、C列が空でも削除しないようにする
% -----------------------------------------------------
requiredCols = [1, 2]; % A列=1, B列=2 が必須列
data = data(~any(ismissing(data(:, requiredCols)), 2), :);
% Simulinkモデルを開く (モデルが開いていない場合はここでロードされる)
load_system(modelName);
% ------------------------
% ブロック生成
% ------------------------
blockCounts = struct('Inport', 0, 'Outport', 0, 'Goto', 0, 'From', 0, 'Read', 0, 'Write', 0, 'Constant', 0);
for i = 1:height(data)
% 変数名(A列)とブロックタイプ(B列)を取得
aColRaw = data{i, 1};
blockType = data{i, 2};
% 文字列に変換してstrip
aColStr = strip(string(aColRaw)); % A列
blockType = strip(string(blockType)); % B列
% 空白セルや不正なデータをスキップ(必須列チェックは既に上で実施)
if strlength(aColStr) == 0 || strlength(blockType) == 0
continue;
end
% ブロックの基準座標とカウンタを取得
if isfield(positions, char(blockType))
basePosition = positions.(char(blockType));
count = blockCounts.(char(blockType));
% ブロックのサイズを取得(種類ごとに異なる)
if isfield(BLOCK_SIZES, char(blockType))
blockSize = BLOCK_SIZES.(char(blockType));
else
blockSize = [250, 30]; % デフォルトのサイズ
end
position = [
basePosition(1), ...
basePosition(2) + count * yOffset, ...
basePosition(1) + blockSize(1), ...
basePosition(2) + count * yOffset + blockSize(2)
];
% ブロック生成
switch char(blockType)
case 'Inport'
% C列: データ型
if width(data) >= 3 && ~ismissing(data{i, 3})
dataType = string(data{i, 3});
if strlength(dataType) == 0
dataType = "Inherit: auto";
end
else
dataType = "Inherit: auto";
end
% E列: サンプル時間
if width(data) >= 5 && ~ismissing(data{i, 5})
sampleTime = string(data{i, 5});
if strlength(sampleTime) == 0
sampleTime = "-1";
end
else
sampleTime = "-1";
end
% F列: 端子の次元
if width(data) >= 6 && ~ismissing(data{i, 6})
portDimensions = string(data{i, 6});
if strlength(portDimensions) == 0
portDimensions = "-1";
end
else
portDimensions = "-1";
end
newBlk = add_block('simulink/Sources/In1', ...
sprintf('%s/%s', modelName, char(aColStr)), ...
'Position', position, ...
'ShowName', 'on', ...
'Port', num2str(count + 1), ...
'OutDataTypeStr', char(dataType), ...
'SampleTime', char(sampleTime), ...
'PortDimensions', char(portDimensions));
% D列が true ならデータ型注釈を表示 (Inportのみ)
if width(data) >= 4 && ~ismissing(data{i,4})
flag = strip(string(data{i,4}));
if strcmpi(flag, 'true')
set_param(newBlk, 'AttributesFormatString', 'OutDataType = %<OutDataTypeStr>');
end
end
case 'Outport'
add_block('simulink/Sinks/Out1', ...
sprintf('%s/%s', modelName, char(aColStr)), ...
'Position', position, ...
'ShowName', 'on', ...
'Port', num2str(count + 1));
case 'Goto'
add_block('simulink/Signal Routing/Goto', ...
sprintf('%s/Goto_%d', modelName, count + 1), ...
'Position', position, ...
'GotoTag', char(aColStr), ...
'ShowName', 'off');
case 'From'
add_block('simulink/Signal Routing/From', ...
sprintf('%s/From_%d', modelName, count + 1), ...
'Position', position, ...
'GotoTag', char(aColStr), ...
'ShowName', 'off');
case 'Read'
add_block('simulink/Signal Routing/Data Store Read', ...
sprintf('%s/DataStoreRead_%d', modelName, count + 1), ...
'Position', position, ...
'DataStoreName', char(aColStr), ...
'ShowName', 'off');
case 'Write'
add_block('simulink/Signal Routing/Data Store Write', ...
sprintf('%s/DataStoreWrite_%d', modelName, count + 1), ...
'Position', position, ...
'DataStoreName', char(aColStr), ...
'ShowName', 'off');
case 'Constant'
% 仕様:
% - 定数値はA列を参照
% - C列がtrueの場合:定数値を0、ブロック名はA列に設定
% - D列がtrueの場合:データ型をブロック上に表示
% A列の値(文字列化)
aVal = aColStr;
% C列のフラグ(true/false)
cIsTrue = (width(data) >= 3 && ~ismissing(data{i,3}) && strcmpi(strip(string(data{i,3})), 'test'));
% D列のフラグ(true/false)
dIsTrue = (width(data) >= 4 && ~ismissing(data{i,4}) && strcmpi(strip(string(data{i,4})), 'true'));
% ブロック名と値の決定
if cIsTrue
% ブロック名:A列、値:0
constName = char(aVal);
showName = 'on';
constValue = '0';
else
% ブロック名:Constant_<n>、値:A列
constName = sprintf('Constant_%d', count + 1);
showName = 'off';
constValue = char(aVal);
end
newBlk = add_block('simulink/Sources/Constant', ...
sprintf('%s/%s', modelName, constName), ...
'Position', position, ...
'ShowName', showName, ...
'Value', constValue);
% D列がtrueならデータ型表示(OutDataTypeStrは既定のまま)
% if dIsTrue
% set_param(newBlk, 'AttributesFormatString', 'OutDataType = %<OutDataTypeStr>');
% end
otherwise
warning('不明なブロックタイプ: %s (行 %d)', char(blockType), i);
end
% カウンタを更新
blockCounts.(char(blockType)) = blockCounts.(char(blockType)) + 1;
else
warning('無効なブロックタイプ: %s', char(blockType));
end
end
% ------------------------
% モデルを保存
% ------------------------
save_system(modelName);
% ------------------------
% 総数とタイプ別の数を表示
% ------------------------
totalCount = sum(struct2array(blockCounts)); % 総数
fprintf('------------------------\n');
fprintf('生成されたデータの総数\n');
fprintf('総数: %4d\n', totalCount);
fieldsList = fieldnames(blockCounts);
for k = 1:numel(fieldsList)
fprintf('%s ブロック数: %4d\n', fieldsList{k}, blockCounts.(fieldsList{k}));
end
fprintf('ブロックの生成が完了しました!\n');
end
function generate_simulink_blocks(filename, modelName)
% generate_simulink_blocks
% Excelファイルに基づいてSimulinkモデルに指定されたブロックを自動生成します。
%
% 使用方法:
% generate_simulink_blocks('blocks.xlsx', 'your_model_name')
%
% 引数:
% filename - ブロック情報を記載したExcelファイル
% modelName - 操作対象のSimulinkモデル名
% ------------------------
% 設定
% ------------------------
% ブロックサイズ設定(種類ごとに異なるサイズ)
BLOCK_SIZES = struct(...
'Inport', [30, 14], ... % 幅30, 高さ14
'Outport', [30, 14], ... % 幅30, 高さ14
'Goto', [250, 28], ... % 幅250, 高さ28
'From', [250, 28], ... % 幅250, 高さ28
'Read', [250, 30], ... % 幅250, 高さ30
'Write', [250, 30] ... % 幅250, 高さ30
);
% 基準座標の設定
positions = struct(...
'Inport', [ 75, 100], ...
'Outport', [215, 100], ...
'Goto', [400, 100], ...
'From', [700, 100], ...
'Read', [-600, 100], ...
'Write', [-300, 100] ...
);
yOffset = 35; % 縦方向の間隔
% ------------------------
% Excelファイルからデータを読み込む
% ------------------------
% ヘッダ行を含むテーブルとして読み込み
data = readtable(filename, 'Sheet', 'Sheet1', 'ReadRowNames', false);
% もし1行目がヘッダ行なら、下記のように2行目以降を取り出す
% (Excelファイルの構造に合わせて調整してください)
data = data(2:end, :);
% -----------------------------------------------------
% A列(B列)が空の行のみ削除して、C列が空でも削除しないようにする
% -----------------------------------------------------
requiredCols = [1, 2]; % A列=1, B列=2 が必須列
data = data(~any(ismissing(data(:, requiredCols)), 2), :);
% Simulinkモデルを開く (モデルが開いていない場合はここでロードされる)
load_system(modelName);
% ------------------------
% ブロック生成
% ------------------------
blockCounts = struct('Inport', 0, 'Outport', 0, 'Goto', 0, 'From', 0, 'Read', 0, 'Write', 0);
for i = 1:height(data)
% 変数名とブロックタイプを取得
blockName = data{i, 1};
blockType = data{i, 2};
% 文字列に変換してstrip
blockName = strip(string(blockName));
blockType = strip(string(blockType));
% 空白セルや不正なデータをスキップ(必須列チェックは既に上で実施)
if strlength(blockName) == 0 || strlength(blockType) == 0
continue;
end
% ブロックの基準座標とカウンタを取得
if isfield(positions, char(blockType))
basePosition = positions.(char(blockType));
count = blockCounts.(char(blockType));
% ブロックのサイズを取得(種類ごとに異なる)
if isfield(BLOCK_SIZES, char(blockType))
blockSize = BLOCK_SIZES.(char(blockType));
else
blockSize = [250, 30]; % デフォルトのサイズ
end
position = [
basePosition(1), ...
basePosition(2) + count * yOffset, ...
basePosition(1) + blockSize(1), ...
basePosition(2) + count * yOffset + blockSize(2)
];
% ブロック生成
switch char(blockType)
case 'Inport'
% C列: データ型
if width(data) >= 3 && ~ismissing(data{i, 3})
dataType = string(data{i, 3});
if strlength(dataType) == 0
dataType = "Inherit: auto";
end
else
dataType = "Inherit: auto";
end
% E列: サンプル時間
if width(data) >= 5 && ~ismissing(data{i, 5})
sampleTime = string(data{i, 5});
if strlength(sampleTime) == 0
sampleTime = "-1";
end
else
sampleTime = "-1";
end
% F列: 端子の次元
if width(data) >= 6 && ~ismissing(data{i, 6})
portDimensions = string(data{i, 6});
if strlength(portDimensions) == 0
portDimensions = "-1";
end
else
portDimensions = "-1";
end
newBlk = add_block('simulink/Sources/In1', ...
sprintf('%s/%s', modelName, char(blockName)), ...
'Position', position, ...
'ShowName', 'on', ...
'Port', num2str(count + 1), ...
'OutDataTypeStr', char(dataType), ...
'SampleTime', char(sampleTime), ...
'PortDimensions', char(portDimensions));
% D列が true なら注釈を追加 (Inportのみ)
if width(data) >= 4 && ~ismissing(data{i,4})
annotationFlag = strip(string(data{i,4}));
if strcmpi(annotationFlag, 'true')
set_param(newBlk, 'AttributesFormatString', 'OutDataType = %<OutDataTypeStr>');
end
end
case 'Outport'
add_block('simulink/Sinks/Out1', ...
sprintf('%s/%s', modelName, char(blockName)), ...
'Position', position, ...
'ShowName', 'on', ...
'Port', num2str(count + 1));
case 'Goto'
add_block('simulink/Signal Routing/Goto', ...
sprintf('%s/Goto_%d', modelName, count + 1), ...
'Position', position, ...
'GotoTag', char(blockName), ...
'ShowName', 'off');
case 'From'
add_block('simulink/Signal Routing/From', ...
sprintf('%s/From_%d', modelName, count + 1), ...
'Position', position, ...
'GotoTag', char(blockName), ...
'ShowName', 'off');
case 'Read'
add_block('simulink/Signal Routing/Data Store Read', ...
sprintf('%s/DataStoreRead_%d', modelName, count + 1), ...
'Position', position, ...
'DataStoreName', char(blockName), ...
'ShowName', 'off');
case 'Write'
add_block('simulink/Signal Routing/Data Store Write', ...
sprintf('%s/DataStoreWrite_%d', modelName, count + 1), ...
'Position', position, ...
'DataStoreName', char(blockName), ...
'ShowName', 'off');
otherwise
warning('不明なブロックタイプ: %s (行 %d)', char(blockType), i);
end
% カウンタを更新
blockCounts.(char(blockType)) = blockCounts.(char(blockType)) + 1;
else
warning('無効なブロックタイプ: %s', char(blockType));
end
end
% ------------------------
% モデルを保存
% ------------------------
save_system(modelName);
% ------------------------
% 総数とタイプ別の数を表示
% ------------------------
totalCount = sum(struct2array(blockCounts)); % 総数
fprintf('------------------------\n');
fprintf('生成されたデータの総数\n');
fprintf('総数: %4d\n', totalCount);
fieldsList = fieldnames(blockCounts);
for k = 1:numel(fieldsList)
fprintf('%s ブロック数: %4d\n', fieldsList{k}, blockCounts.(fieldsList{k}));
end
fprintf('ブロックの生成が完了しました!\n');
end
function generate_simulink_blocks(filename, modelName)
% generate_simulink_blocks
% Excelファイルに基づいてSimulinkモデルに指定されたブロックを自動生成します。
%
% 使用方法:
% generate_simulink_blocks('blocks.xlsx', 'your_model_name')
%
% 引数:
% filename - ブロック情報を記載したExcelファイル
% modelName - 操作対象のSimulinkモデル名
% ------------------------
% 設定
% ------------------------
% ブロックサイズ設定(種類ごとに異なるサイズ)
BLOCK_SIZES = struct(...
'Inport', [30, 14], ... % 幅30, 高さ14
'Outport', [30, 14], ... % 幅30, 高さ14
'Goto', [250, 28], ... % 幅250, 高さ28
'From', [250, 28], ... % 幅250, 高さ28
'Read', [250, 30], ... % 幅250, 高さ30
'Write', [250, 30] ... % 幅250, 高さ30
);
% 基準座標の設定
positions = struct(...
'Inport', [ 75, 100], ...
'Outport', [215, 100], ...
'Goto', [400, 100], ...
'From', [700, 100], ...
'Read', [-600, 100], ...
'Write', [-300, 100] ...
);
yOffset = 35; % 縦方向の間隔
% ------------------------
% Excelファイルからデータを読み込む
% ------------------------
% ヘッダ行を含むテーブルとして読み込み
data = readtable(filename, 'Sheet', 'Sheet1', 'ReadRowNames', false);
% もし1行目がヘッダ行なら、下記のように2行目以降を取り出す
% (Excelファイルの構造に合わせて調整してください)
data = data(2:end, :);
% -----------------------------------------------------
% A列(B列)が空の行のみ削除して、C列が空でも削除しないようにする
% -----------------------------------------------------
requiredCols = [1, 2]; % A列=1, B列=2 が必須列
data = data(~any(ismissing(data(:, requiredCols)), 2), :);
% Simulinkモデルを開く (モデルが開いていない場合はここでロードされる)
load_system(modelName);
% ------------------------
% ブロック生成
% ------------------------
blockCounts = struct('Inport', 0, 'Outport', 0, 'Goto', 0, 'From', 0, 'Read', 0, 'Write', 0);
for i = 1:height(data)
% 変数名とブロックタイプを取得
blockName = data{i, 1}{1}; % A列: 変数名称
blockType = data{i, 2}{1}; % B列: ブロックタイプ (Inport, Outport, Goto, From, Read, Writeなど)
% 念のため前後スペースを除去しておく (文字列ゆれ対策)
blockName = strip(blockName);
blockType = strip(blockType);
% 空白セルや不正なデータをスキップ(必須列チェックは既に上で実施)
if isempty(blockName) || isempty(blockType)
continue;
end
% ブロックの基準座標とカウンタを取得
if isfield(positions, blockType)
basePosition = positions.(blockType);
count = blockCounts.(blockType);
% ブロックのサイズを取得(種類ごとに異なる)
if isfield(BLOCK_SIZES, blockType)
blockSize = BLOCK_SIZES.(blockType);
else
blockSize = [250, 30]; % デフォルトのサイズ
end
position = [
basePosition(1), ...
basePosition(2) + count * yOffset, ...
basePosition(1) + blockSize(1), ...
basePosition(2) + count * yOffset + blockSize(2)
];
% ----------------------------------------------------------------
% Inportブロックの型指定用データ(C列)を取得
% 未記載でも生成するようにする → 空なら 'Inherit: auto' を設定
% ----------------------------------------------------------------
if strcmp(blockType, 'Inport')
% C列が存在し、かつ欠損でなければ取り出す
if width(data) >= 3 && ~ismissing(data{i, 3})
dataType = data{i, 3}{1};
if isempty(dataType)
dataType = 'Inherit: auto'; % デフォルトのデータ型
end
else
% C列がなかった場合や欠損の場合も生成する
dataType = 'Inherit: auto';
end
else
% Inport以外は型指定しない (Outportなど)
dataType = '';
end
% ブロック生成
switch blockType
case 'Inport'
newBlk = add_block('simulink/Sources/In1', ...
sprintf('%s/%s', modelName, blockName), ...
'Position', position, ...
'ShowName', 'on', ...
'Port', num2str(count + 1), ...
'OutDataTypeStr', dataType);
% -------------------------------
% D列が true なら注釈を追加 (Inportのみ)
% -------------------------------
if width(data) >= 4 && ~ismissing(data{i,4})
annotationFlag = strip(data{i,4}{1});
if strcmpi(annotationFlag, 'true')
set_param(newBlk, 'AttributesFormatString', 'OutDataType = %<OutDataTypeStr>');
end
end
case 'Outport'
add_block('simulink/Sinks/Out1', ...
sprintf('%s/%s', modelName, blockName), ...
'Position', position, ...
'ShowName', 'on', ...
'Port', num2str(count + 1));
case 'Goto'
add_block('simulink/Signal Routing/Goto', ...
sprintf('%s/Goto_%d', modelName, count + 1), ...
'Position', position, ...
'GotoTag', blockName, ...
'ShowName', 'off');
case 'From'
add_block('simulink/Signal Routing/From', ...
sprintf('%s/From_%d', modelName, count + 1), ...
'Position', position, ...
'GotoTag', blockName, ...
'ShowName', 'off');
case 'Read'
add_block('simulink/Signal Routing/Data Store Read', ...
sprintf('%s/DataStoreRead_%d', modelName, count + 1), ...
'Position', position, ...
'DataStoreName', blockName, ...
'ShowName', 'off');
case 'Write'
add_block('simulink/Signal Routing/Data Store Write', ...
sprintf('%s/DataStoreWrite_%d', modelName, count + 1), ...
'Position', position, ...
'DataStoreName', blockName, ...
'ShowName', 'off');
otherwise
warning('不明なブロックタイプ: %s (行 %d)', blockType, i);
end
% カウンタを更新
blockCounts.(blockType) = blockCounts.(blockType) + 1;
else
warning('無効なブロックタイプ: %s', blockType);
end
end
% ------------------------
% モデルを保存
% ------------------------
save_system(modelName);
% ------------------------
% 総数とタイプ別の数を表示
% ------------------------
totalCount = sum(struct2array(blockCounts)); % 総数
fprintf('------------------------\n');
fprintf('生成されたデータの総数\n');
fprintf('総数: %4d\n', totalCount);
fieldsList = fieldnames(blockCounts);
for k = 1:numel(fieldsList)
fprintf('%s ブロック数: %4d\n', fieldsList{k}, blockCounts.(fieldsList{k}));
end
fprintf('ブロックの生成が完了しました!\n');
end
使用方法
パスを通しておく
- MATLABを起動
- 「パスの設定」をクリック
- 「サブフォルダーも追加」をクリック
- ダウンロードしたフォルダを選択
- パスの設定を保存
スクリプトを保存
- 上記のコードを
generate_simulink_blocks.m
という名前で保存します - 保存先は、作業ディレクトリ or Cドライブ直下にしてください
※それ以外でも問題ないが、わかりにくくなるため
Simulinkモデルを準備
- 空の新規モデル(.slxファイル)を作成します
- 例:
generate_models.slx
として保存
※良きせぬバグを防ぐため生成専用のモデルを用意し、そこに生成されたブロックをコピペで使用すること!
Excelファイルを準備
- 仕様どおりにExcelファイル(例:
)を作成し、データストア名とブロックタイプなどを記載し 保存。(保存し忘れると生成に反映されません)generate_simulink_blocks
.xlsx
※ファイルダウンロードも可能
スクリプトを実行
- MATLABコマンドウィンドウで以下を入力します
※'
‘とgenerate_simulink_blocks
.xlsx'generate_models
‘は適宜変更してください
generate_simulink_blocks('generate_simulink_blocks.xlsx', 'generate_models');
全て同一ディレクトリ内に保存してください!
結果を確認
- コマンドウィンドウに生成されたデータの総数が表示され、エラーがないか確認
- 指定したSimulinkモデルを開き、ブロックが生成されていることを確認
スクリプトの簡単な説明
- Excelデータの読み込み
readtable
を使用してExcelファイルを読み込み、データストア名とブロックタイプを取得- 値の入力は、3行目から!!(1行目はヘッダー、2行目は空白)
- 座標計算
- 各ブロックの
Position
を基準に、yOffset
を加算して縦方向に並べる - ブロックの種類ごとに分けて生成
- 各ブロックの
- ブロックの生成
- ブロックタイプに応じて
add_block
を使用し、適切なブロックを追加
- ブロックタイプに応じて
- エラー処理
- 不明なブロックタイプは警告を表示
- 生成したブロック数の表示
注意点
- モデルの保存前にバックアップを取ることをお勧めします
- Excelの列やシート名が異なる場合はコマンドを調整してください
6. よくある質問(FAQ)
Q1. 実行してもブロックが追加されません
- Excelのシート名が
Sheet1
になっているか確認してください。 - Simulinkモデルが保存されているか確認してください。
- コマンドを実行する際に、ExcelファイルとSimulinkモデルが同じフォルダにあるか確認してください。
Q2. 既存のブロックが削除されてしまうの?
- いいえ、このスクリプトは 既存のブロックには影響を与えず、新規ブロックを追加 します。
ただ、場合によっては不具合が発生する可能性があるので、空のモデルファイルを作って生成することを推奨します。
Q3. Inportの型が設定されていません
- Excelの C列 に適切なデータ型を記入してください。(例:
double
,int8
,uint16
) - 空欄の場合は 継承「
Inherit: auto
」 になります。
Q4. 追加のブロックタイプを増やしたい
- スクリプトの
BLOCK_SIZES
やpositions
に新しいブロックタイプを追加してください。
(少しコーディングの知識が必要です。)
動作確認済 バージョン
- MATLAB Simulink 2018b(9.5.0.1586782)64-bit