時刻歴データ(タイムテーブル)の使い方を(忘備録も兼ねて)記載していきます.シンプルに数値を手入力する方法とデータファイルをパス指定する方法の2種類を説明します.
タイムテーブル・クラスの場所
時刻歴テーブルを利用するには「TimeTable」および「CombiTimeTable」を使います.Modelica Base Library の Modelica>Blocks>Sources の配下にあります.
データを手入力する場合
「TimeTable」および「CombiTimeTable」は,両方とも時刻歴データ(タイムテーブル)を使う際に利用されるクラスですが,まずは最初に「TimeTable」クラスを使ってシンプルにデータを手入力する方法を紹介します.
TimeTableクラスを使う
TimeTableクラスを新しく作ったモデル上に,GUIでドラッグ&ドロップします.
Modelicaモデルの新規作成は下記から
下記にTimeTableのパラメータを表示しました.項目がシンプルでわかりやすいです.
たとえば下記のような時刻歴テーブルを作成したい時は・・・
tableのところに下記のように入力します.列の区切りは「,(カンマ)」行の区切りは「;(セミコロン)」です.スペースはなくても構いません.
[0,0; 1,0; 3,2; 5,2]
シミュレーションのセットアップをクリックして,終了時間を下記のように10秒にします.シミュレートにチェックが入っているのを確認してOKを押します.他は特に触る必要ありません.
テーブルの出力変数「y」のチェックボックスをチェックすると,下記のようにテーブルデータが出力されているのが分かります.
データファイルをパス指定して使う場合
上記のようなシンプルなテーブルの場合は手入力で構いませんが,センサーの計測値のような大きなデータを入力したい時は,この書き方だと手間がかかって大変です.(Dymolaなどの商用ソフトはexcelをそのままダイアログ上で,直接貼り付ける機能が備わってますが)オープンソースのOpenModelicaにはそのような便利な機能は付いていませんので,データが大きい時はデータファイルの格納先をパス指定する方法を使います.
CombiTimeTableを使う
データテーブルをパス指定する場合は CombiTimeTable を使用する必要があります.
CombiTimeTableはTimeTableクラスを拡張させたものです.TimeTableと同様に手入力でのデータ指定にもファイルパス指定にも両方に対応しています.また下記に示すようにデータ間の内挿・外挿なども指定できるようになっています.またTimeTableクラスは時刻に対して一つのデータのみ適用しましたが,CombiTimeTableは2個以上の複数のデータが設定できますので,ベクトル値の入力などにも便利です(後ほど説明します).
CombiTimeTableのきほん:データが一つのとき(例:◯行 x 2列)
データファイルを準備する
まず参照するデータファイルを作成しましょう.Modelicaは matファイルとtxtファイルを読み込む事ができます.ここではexcelからコピーして簡単に作成できるtxtファイルを作ります.例として下記のようなexcelのグラフを準備しました.A列を0.1刻みで0~10秒,B列は=SIN(A列)としてSinカーブを描かせています.
データファイルの書式
データファイルの書式は下記に従ってください.
- 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 # (以降は省略)
ファイルパス指定の切替
上記のCombiTimeTableにデータファイルのパス指定をするには,まずtableOnFileを「True」にします.すると下記のように手入力のtable欄がグレーアウトされて手動→パス指定に切り替わります.
テーブル名の指定
tableName(テーブル名)を入力します.(今回の場合は「tab1」になります)
"tab1"
ファイル名の指定
fileName(ファイル名)を入力します.例えばファイル名が「data.txt」で,C直下の「temp」フォルダに置いた場合,下記のようになります.ダブルクォーテーションマークも忘れずに.
"C:/temp/data.txt"
以上から,入力欄は下記のようになります.
"modelica://Modelica/Resources/data.txt"
実行結果の表示
以上の結果を実行すると,下記のように表示されます.
CombiTimeTable(応用1):データが複数のとき(例:◯行 x 4列)
データファイルを準備する
参照するデータファイルは,先程のグラフ(A列を0.1刻みで0~10秒,B列は=SIN(A列) )に振幅をそれぞれ1.2倍,0.5倍したC列とD列を追加しました.
データファイルの書式
複数のデータを読み込む場合は,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(応用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;
以上データテーブルの設定の仕方を説明しました.データの外挿・内挿については,別の機会に説明したいと思います.よろしくお願い致します.