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

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

采纳的回答

Atsushi Ueno
Atsushi Ueno 2021-10-23
编辑:Atsushi Ueno 2021-10-25
  • 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 个评论
Atsushi Ueno
Atsushi Ueno 2021-10-25
コメントありがとうございます。回答のプログラムを訂正致します。
(MATLAB Function の中に書き込んだプログラムに直接”Flg**"と書き込むミスがありました)
利元 河合
利元 河合 2021-10-25
ご教示ありがとうございました。
やりたい事がすべて確認でき、解決いたしました。

请先登录,再进行评论。

更多回答(0 个)

Community Treasure Hunt

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

Start Hunting!