時刻歴データ(タイムテーブル)の使い方

OpenModelica

時刻歴データ(タイムテーブル)の使い方を(忘備録も兼ねて)記載していきます.シンプルに数値を手入力する方法とデータファイルをパス指定する方法の2種類を説明します.

タイムテーブル・クラスの場所

時刻歴テーブルを利用するには「TimeTable」および「CombiTimeTable」を使います.Modelica Base Library の Modelica>Blocks>Sources の配下にあります.

タイムテーブル・クラスの場所

 

データを手入力する場合

「TimeTable」および「CombiTimeTable」は,両方とも時刻歴データ(タイムテーブル)を使う際に利用されるクラスですが,まずは最初に「TimeTable」クラスを使ってシンプルにデータを手入力する方法を紹介します.

TimeTableクラスを使う

TimeTableクラスを新しく作ったモデル上に,GUIでドラッグ&ドロップします.

TimeTableモデル

 

Modelicaモデルの新規作成は下記から

モデルを新規作成する時には初めにパッケージ作成をやるとよい(OpenModelica)
OpenModelicaで自分のモデルを新しく作成していく際,最初に「パッケージ」を作っておくと,煩雑にならずに利便性が高いです.パッケージとはModelicaの「クラス」(※追記)の一つで,フォルダのような役割をしています. 新規パッケー...

 

下記にTimeTableのパラメータを表示しました.項目がシンプルでわかりやすいです.

TimeTableパラメータ

 

たとえば下記のような時刻歴テーブルを作成したい時は・・・

excelグラフ1

 

tableのところに下記のように入力します.列の区切りは「,(カンマ)」行の区切りは「;(セミコロン)」です.スペースはなくても構いません.

[0,0; 1,0; 3,2; 5,2]

TimeTable手入力

 

シミュレーションのセットアップをクリックして,終了時間を下記のように10秒にします.シミュレートにチェックが入っているのを確認してOKを押します.他は特に触る必要ありません.

シミュレーションのセットアップ

 

テーブルの出力変数「y」のチェックボックスをチェックすると,下記のようにテーブルデータが出力されているのが分かります.

TimeTableの出力結果

 

データファイルをパス指定して使う場合

上記のようなシンプルなテーブルの場合は手入力で構いませんが,センサーの計測値のような大きなデータを入力したい時は,この書き方だと手間がかかって大変です.(Dymolaなどの商用ソフトはexcelをそのままダイアログ上で,直接貼り付ける機能が備わってますが)オープンソースのOpenModelicaにはそのような便利な機能は付いていませんので,データが大きい時はデータファイルの格納先をパス指定する方法を使います.

 

CombiTimeTableを使う

データテーブルをパス指定する場合は CombiTimeTable を使用する必要があります.

CombiTimeTableモデル

 

CombiTimeTableはTimeTableクラスを拡張させたものです.TimeTableと同様に手入力でのデータ指定にもファイルパス指定にも両方に対応しています.また下記に示すようにデータ間の内挿・外挿なども指定できるようになっています.またTimeTableクラスは時刻に対して一つのデータのみ適用しましたが,CombiTimeTableは2個以上の複数のデータが設定できますので,ベクトル値の入力などにも便利です(後ほど説明します).

CombiTimeTable(パラメータ表示)

 

CombiTimeTableのきほん:データが一つのとき(例:◯行 x 2列)

データファイルを準備する

まず参照するデータファイルを作成しましょう.Modelicaは matファイルとtxtファイルを読み込む事ができます.ここではexcelからコピーして簡単に作成できるtxtファイルを作ります.例として下記のようなexcelのグラフを準備しました.A列を0.1刻みで0~10秒,B列は=SIN(A列)としてSinカーブを描かせています.

excelでSinカーブ

データファイルを作成するには,excel上でデータを範囲コピーして(Windowsのメモ帳などを開いて)テキストファイルにそのまま貼り付ければよいです.

 

データファイルの書式

データファイルの書式は下記に従ってください.

  • 1行目に「#1」と入力します.(→ これは決まりだと思ってください)
  • 2行目に,浮動小数点の型(倍精度はdouble,単精度はfloat)とデータ名を記載します.
    • doubleは浮動小数点の型
    • tab1はテーブル名で (101,2) はデータの大きさ(→ 行数と列数)
    • #This is a Sin-Curve.はコメント
  • 3行目以降に,データを貼り付けていきます.

上記の excelのSinカーブのサンプルを下記に示します(3秒以降は省略).

#1
double tab1(101,2) #This is a Sin-Curve.
0	0
0.1	0.099833417
0.2	0.198669331
0.3	0.295520207
0.4	0.389418342
0.5	0.479425539
0.6	0.564642473
0.7	0.644217687
0.8	0.717356091
0.9	0.78332691
1	0.841470985
1.1	0.89120736
1.2	0.932039086
1.3	0.963558185
1.4	0.98544973
1.5	0.997494987
1.6	0.999573603
1.7	0.99166481
1.8	0.973847631
1.9	0.946300088
2	0.909297427
# (以降は省略)
ここではexcelをそのまま貼り付けたので,各数値はタブで区切られていますが,データファイルの区切り文字はスペース,カンマ,セミコロンのいずれも使用できます.
注意点としてデータファイルはASCIIまたはUTF-8でエンコードする必要があるとの事です.(私の環境ではShift JISでも動作しましたが..)

 

ファイルパス指定の切替

上記のCombiTimeTableにデータファイルのパス指定をするには,まずtableOnFileを「True」にします.すると下記のように手入力のtable欄がグレーアウトされて手動→パス指定に切り替わります.

手入力とファイル指定の切替

 

テーブル名の指定

tableName(テーブル名)を入力します.(今回の場合は「tab1」になります)

"tab1"

 

ファイル名の指定

fileName(ファイル名)を入力します.例えばファイル名が「data.txt」で,C直下の「temp」フォルダに置いた場合,下記のようになります.ダブルクォーテーションマークも忘れずに.

"C:/temp/data.txt"
Windowsのエクスプローラーからパスをコピーをすると,パスの区切り文字は円マーク(¥)になりますので,パスの区切り文字を半角スラッシュ(/)に変換してください.

 

以上から,入力欄は下記のようになります.

tabNameとfileNameの項目

※ また参考までに,下記のようにModelica URI形式で記載する方法もあります.Modelicaライブラリのインストール場所を参照します.(あまり使う機会は少ないと思うので気にしなくてOK)
"modelica://Modelica/Resources/data.txt"

 

実行結果の表示

以上の結果を実行すると,下記のように表示されます.

CombiTimeTableの出力結果

 

CombiTimeTable(応用1):データが複数のとき(例:◯行 x 4列)

データファイルを準備する

参照するデータファイルは,先程のグラフ(A列を0.1刻みで0~10秒,B列は=SIN(A列) )に振幅をそれぞれ1.2倍,0.5倍したC列とD列を追加しました.

excelで3個のSinカーブ

 

データファイルの書式

複数のデータを読み込む場合は,2行目のテーブルサイズの列の大きさを変更します.今回は時刻データ入れて全部で4列あるので「4」となります.

#1
double tab1(101,4) #This is three sin-curves.
0	0	0	0
0.1	0.099833417	0.1198001	0.049916708
0.2	0.198669331	0.238403197	0.099334665
0.3	0.295520207	0.354624248	0.147760103
0.4	0.389418342	0.467302011	0.194709171
0.5	0.479425539	0.575310646	0.239712769
0.6	0.564642473	0.677570968	0.282321237
0.7	0.644217687	0.773061225	0.322108844
0.8	0.717356091	0.860827309	0.358678045
0.9	0.78332691	0.939992292	0.391663455
1	0.841470985	1.009765182	0.420735492
1.1	0.89120736	1.069448832	0.44560368
1.2	0.932039086	1.118446903	0.466019543
1.3	0.963558185	1.156269823	0.481779093
1.4	0.98544973	1.182539676	0.492724865
1.5	0.997494987	1.196993984	0.498747493
1.6	0.999573603	1.199488324	0.499786802
1.7	0.99166481	1.189997773	0.495832405
1.8	0.973847631	1.168617157	0.486923815
1.9	0.946300088	1.135560105	0.473150044
2	0.909297427	1.091156912	0.454648713
# (以降は省略)

 

そしてもう1点,CombiTimeTable の columns の箇所を「2:4」としてください.

2:4

CombiTimeTableのColumns

 

実行結果の表示

以上の結果を実行すると,下記のように複数のデータが表示されました.

CombiTimeTableの結果表示(複数データ)

 

CombiTimeTable(応用2):複数テーブル(例:◯行 x 2列 x 2データ)

データファイルの書式

また一つのファイルに複数のテーブルを記載する事ができます.下記のようなファイルの場合,tableNameを “tab1″,”tab2″と使い分ける事で,複数のテーブルが一つのファイル中に記載できます.

#1
double tab1(6,2)   # comment line
  0   0
  1   0
  1   1
  2   4
  3   9
  4  16
double tab2(4,2)   # another comment line
  0   0
  2   0
  2   2
  4   8

 

モデル上で連結するには

一般的なモデルの場合

一般的なモデルでCombiTimeTableを利用する際は,接続する際にCombiTimeTableの「出力値の成分」を指定してください.

一般的なモデル

例えば ◯列x2行のテーブルの場合,combiTimeTableは1つしか出力しませんが,出力変数yは配列になっていますので,[1]と指定してやる必要があります.

一般的なモデル(結合時のダイアログ)

 

マルチボディモデルの場合

マルチボディモデルの場合は,各要素と結合するには3次元すべての成分の入力が必要です.よって必ず ◯列x4行 のタイムテーブルが必要になります.

マルチボディモデル

conneectする際は,下記のように[:]と[:]のままで(お互いの全成分を)接続してください.

マルチボディモデル(結合時のダイアログ)

 

データファイルの書式

たとえばx成分だけ与えたい場合でも,y成分とz成分の値も必要ですので,データファイルは下記のように3列目と4列目に0を入力します.

#1
double tab1(101,4) #This is three sin-curves.
0	0	0	0
0.1	0.099833417	0	0
0.2	0.198669331	0	0
0.3	0.295520207	0	0
0.4	0.389418342	0	0
0.5	0.479425539	0	0
0.6	0.564642473	0	0
0.7	0.644217687	0	0
0.8	0.717356091	0	0
0.9	0.78332691	0	0
1	0.841470985	0	0
1.1	0.89120736	0	0
1.2	0.932039086	0	0
1.3	0.963558185	0	0
1.4	0.98544973	0	0
1.5	0.997494987	0	0
1.6	0.999573603	0	0
1.7	0.99166481	0	0
1.8	0.973847631	0	0
1.9	0.946300088	0	0
2	0.909297427	0	0
# (以降は省略)

 

 

TimeTableクラス → CombiTimeTableクラスへ変更するには

最後に,すでにTimeTableクラスで作成されているモデルのタイムテーブルを,CombiTimeTableに変更したい場合は,作り直さなくても,下記のようにスクリプト上で少々修正するだけでOKです.(connect文に[1]をつけるのをお忘れなく)

# TimeTableモデル
model model01
    Modelica.Blocks.Sources.TimeTable timeTable(table=[0,0; 1,0; 3,2; 5,2]);
    Modelica.Blocks.Interfaces.RealOutput y;
equation
    connect(timeTable.y, y);
end model01;
# CombiTimeTableモデル
model model02
    Modelica.Blocks.Sources.CombiTimeTable CombitimeTable(table=[0,0; 1,0; 3,2; 5,2]);
    Modelica.Blocks.Interfaces.RealOutput y;
equation
    connect(CombitimeTable.y[1], y);
end model02;

 

以上データテーブルの設定の仕方を説明しました.データの外挿・内挿については,別の機会に説明したいと思います.よろしくお願い致します.

日本機械学会 機械力学・計測制御部門 1Dモデリング研究会(A-TS 10-42)主査 / 物流機器製造業の開発部門に勤務/「1DCAEによるモデリング」について大学・学会等で講義・講演を行っている/1DCAE.com運営者/技術士(機械部門)/ 博士(工学)

田尻 明子をフォローする
OpenModelica
この記事が気に入ったら
いいね!しよう
最新情報をお届けします。
田尻 明子をフォローする
タイトルとURLをコピーしました