🔧

Simulinkで機械(電気)の系統図を作成し,費用を見積もる

に公開

はじめに

研究においてなにか新しい装置を製作するとき,概念設計や構想設計で費用の見積が必要な場合があります.
また,詳細設計に入る前の部品選定において各要素の繋がりを整理した系統図を作成し,費用を算出します.
その際に系統図の作成と部品リストの作成,価格の集計が必要となりますがこれを一元化できるソフトはたいてい有料であり,趣味や研究用途ではなかなか手が出しずらいものです.
また,各要素間の取り合い(シャフト径や端子形状など)を考慮しながら整理するのも大変です.
かといって最初からCADでモデリングに入るのは手直しの手間を考えると悪手です.
そこで,設定が柔軟に行えるSimulinkを系統図の作成や費用の算出に用いるCADのような用途にも使ってしまおうというのが本記事の趣旨です.
(MATLAB/Simulinkは有料では?という声もありますが,使える用途が多岐にわたり,趣味用途なら1万円と少しなので実質無料かと.学生であればもっと安かったり学校によっては無料ですので)

本記事でできること

  • 要素間の繋がりを示す系統図の作成
  • 系統図から部品リストの作成
  • 価格の集計
  • 機械要素と電気要素を一元化した図の作成

参考記事

Simulinkでやろうと思ったきっかけが,過去に同じようなことを制御盤設計で行っている方がいたことです.そちらも参考にしてください.

https://qiita.com/fumiya_sato/items/bd56e3c9194032404522

実例

題材

例として,下記のようなモータとシャフトとリンクで接続された機構を題材にします.
図にはないですが,モータは24Vのモータドライバで動作し,電源はコンセントとします.
alt text

要素の作成

Simulinkのsubsystemブロックを一つの要素とします.
例えば,モータの要素を作成することを考えます.
subsystemの名前をモータとし,中のoutportでシャフト径を記載します.
alt text

なお,好みですがsubsystem上で右クリック>書式設定>コンテンツプレビューのチェックを外すと,中身が見えなくなり,すっきりします.
また,シャフトなどの出す側はoutport,ホルダやナットなどはinportとした方がわかりやすいかと思います.

次に,モータのsubsystemを右クリックし,プロパティ>ブロック注釈とし,モータの型番やメーカー,価格を記載します.
この注釈を後で集計に使うので,全要素で統一しておいた方が楽です.

系統図の作成

同様にシャフトとリンクも作成します.
alt text

ここで,モータとシャフトをつなぐのにカップリングが必要なことが判明したので,追加します.
alt text

これで,機械要素の作成は完了です.
次に,モータの電気部分も追加していきます.
わかりやすいよう電気系統は赤色にしました.
alt text

これで今回のシステムの要素の書き出しと系統図の作成は完了です.
場合によってはケーブルも(特殊なものなどは)subsystemとすることも可能です.

部品リストの作成と集計

ここまでであれば冒頭のリンクの内容とあまり変わらないのですが,ここからがSimulinkで設計することの最大の見せ場です.
まず,今回作ったモデルを適当な名前('motorsystem.slx')で保存します.
つぎに,以下のコードを実行すると要素の一覧が取得できます.

% load_system('motorsystem.slx') %読み込みエラーがおきるとき
get_param('motorsystem','blocks')

alt text

各要素のモデル注釈は,各要素ごとに下記のコマンドで取得できます.

param = get_param('motorsystem/モータ','AttributesFormatString')

alt text

これでは要素が一つの文として繋がっているので,split関数を使って分割します.

split(param)

さらに,もう一度"="で分割すると,利用しやすい形になります.

t = split(split(param),{"="})

alt text

これを各要素に適用すれば,型番や価格を取得できます.

集計例

集計方法はいろいろあると思いますが,使いやすいのは一度構造体に格納し,そのあとtable形式にすることかと思います.

まず,構造体partsに要素を格納します.

load_system('motorsystem.slx')

partslist = get_param('motorsystem','blocks')
% 構造体
parts = struct;
for ii = 1:numel(partslist)
    partsname = partslist{ii,1};
    param = get_param(strcat('motorsystem/',partsname),'AttributesFormatString');
    param = split(split(param),{'='});% 分割'650'

    % 配列の要素を構造体にする
    parts(ii,1).name = partsname;
    for jj=1:height(param)
        parts(ii,1).(param{jj,1}) = param{jj,2}; % 1列目がフィールド名,2列目が値 
    end
end

次に,table形式に変換します.
なお,すべてcell配列の文字列になるので,数字を扱いたい場合は該当の列を変換する必要があります.

% tableの作成
partsTable = struct2table(parts);
% priceを数値型にする
for ii = 1:height(partsTable)
    partsTable.price{ii} = str2num(partsTable.price{ii});
end

すると,下記のようなtableができます.
これで系統図と部品リストと価格表の作成が一元化できています!

alt text

あとは,価格で集計したり,uniqueを用いてメーカのリストを取得したりすることができます.
(MATLABのtable操作はほかの言語と違う癖が強いので,ここまできたらexcelにコピペしてエクセルで処理するほうが使いやすい人もいるかと思います.)

% 集計例
% 価格合計
sum(cell2mat(partsTable.price))
% メーカーリスト
unique(partsTable.manufacturer)

alt text

以上で,系統図の作成と部品リストの作成,価格の集計ができました.

終わりに

最後の処理のところが少し手間に感じるかもしれませんが,一度作ってしまえば要素をつないでいくだけで処理は同じなので,使いまわしができます,
なお,set_paramでモデル注釈の書き換えも可能なので,まとめて価格の更新なども可能です.
今回のメリットは普段使い慣れたソフトで部品要素を一元管理できることなので,ぜひ活用してみてください.

Discussion