エクセルファイルで定​義された条件を読み込​み、Simulink​モデルを吐き出すこと​ができますか?

10 views (last 30 days)
初心者で申し訳ありません。
添付エクセルファイル「Flag_set」の読み込みをして、
①:1行目のセルにある名前のRAMを確保し、
②:入力した信号が表の〇印のあるA列の数字と一致した場合①で作られたRAMに「1」をセットする
というSimulinkモデルを自動で作成する方法がありますでしょうか?
作成されたモデルのイメージは添付の「Flg_set_model」の様な感じです。

Accepted Answer

Atsushi Ueno
Atsushi Ueno on 23 Oct 2021
Edited: Atsushi Ueno on 25 Oct 2021
  • R2021aモデルを開けずサムネイルしか見てませんが、やりたい事は出来てると思います
  • RAMの数は表のサイズに応じて変動します
  • RAM入出力はData Store Read/Writeブロックを使いました(サムネから明らかなので)
  • MATLAB Functionに真理値表のコードを書きました(色々試した結果)
  • (候補①StateflowのTruth Table⇒ライセンスも無く、この質問に対しては試さなかった)
  • (候補②Combinatorial Logicブロック⇒コード生成に適する。ビット縛りの難が有った)
%% 添付エクセルファイル「Flag_set」の読み込み
flag_set = readtable('Flag_set.xlsx');
flag_num = size(flag_set, 2) - 1; % B列以降(Flg**)の数
flag_name = flag_set.Properties.VariableNames; % 1行目のセルにある名前
for i = 2:flag_num + 1
flag_set.(i) = ismember(flag_set{:,i},'〇'); % 〇:True(1), 他:False(0)
end
flag_array = table2array(flag_set) - 0; % tableを数値行列に変換
%% Simulinkモデルを自動で作成する
modelname = 'Flg_set_model';
open_system(new_system(modelname));
% ②:入力した信号が表の〇印のあるA列の数字と一致した場合①で作られたRAMに「1」をセットする
% (MATLAB Functionブロック内にコードを書く)
add_block('simulink/User-Defined Functions/MATLAB Function', ...
[gcs '/MATLAB Function'], 'position',[250, 170, 320, 170 + numel(flag_name) * 50]);
block = find(sfroot, '-isa', 'Stateflow.EMChart', 'Path', [gcs '/MATLAB Function']);
str = ['function [' strjoin(flag_name(2:end)) '] = f(x)', 10, ...
' t = ', mat2str(flag_array), ';', 10, ...
' idx = find(t(:,1) == x, 1); % 重複は無いものとする', 10, ...
' idx = idx(1); % 重複が無い事を明示する為に追記', 10];
for i = 2:flag_num + 1
str = [str ' ' flag_name{i} ' = t(idx,' num2str(i) ');', 10];
end
str = [str 'end'];
block.Script = str;
for i = 1:flag_num + 1 % ①:1行目のセルにある名前のRAMを確保
add_block('simulink/Signal Routing/Data Store Memory', ...
[gcs '/' flag_name{i}], 'DataStoreName', flag_name{i}, ...
'position',[500, 100+i*50, 550, 130+i*50]);
if i == 1 % A列のPhaseのみData Store Readブロック
add_block('simulink/Signal Routing/Data Store Read', ...
[gcs '/' flag_name{i} ' Read'], 'DataStoreName', flag_name{i}, ...
'position',[100, 270+i*50, 150, 300+i*50]);
add_line(gcs, [flag_name{i} ' Read/1'], 'MATLAB Function/1', 'autorouting', 'on');
else % B列以降のFlg*はData Store Writeブロック
add_block('simulink/Signal Routing/Data Store Write', ...
[gcs '/' flag_name{i} ' Write'], 'DataStoreName', flag_name{i}, ...
'position',[400, 100+i*50, 450, 130+i*50]);
add_line(gcs, ['MATLAB Function/' num2str(i-1)], [flag_name{i} ' Write/1'], 'autorouting', 'on');
end
end
save_system(modelname);
close_system(modelname);
  5 Comments
利元 河合
利元 河合 on 25 Oct 2021
ご教示ありがとうございました。
やりたい事がすべて確認でき、解決いたしました。

Sign in to comment.

More Answers (0)

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!