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

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

Akzeptierte Antwort

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

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (0)

Community Treasure Hunt

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

Start Hunting!