Data Unit Typeとは?
Data Unit Type(DUT)は一つの変数タイプの中に複数のタイプの変数含むことができます。多分自分のBlogをみたみんなさんなら何回もSiemensのプロジェクトの中に、User Data Typeを何回も使ったことがあると思います。今回はTwinCAT3でそのData Unit Typeをどう定義するか、なにか特徴があるかについて説明したいと思います。
では、いまあなたがいま装置のエラーメッセージを記録しようと考えています。これは記録しようとしてるデータですね。
eEventType:TcEventType; eErrorCode:UINT; sEventText:String(255); dtTimeStamp:DATE_AND_TIME; |
eEventTypeは記録するEventのClassで、Alarm,Warning,Info…などですね。
eErrorCodeは該当するeEventTypeのCodeですね。
sEventTextは該当するEventのテキストで、例えば”Motor1 Breaker OFF”などですね。
dtTimeStampは該当するEventの発生時間です。
記録したいメッセージの中身が定義しましたね。次はそのメッセージを100くらいたまりたいと考えています。方法がたくさんありますが、例えば各変数も長さ100の配列として宣言しましょうか。
eEventType:Array[1..100] of cEventType; eErrorCode:Array[1..100] of UINT; sEventText:Array[1..100] of String(255); dtTimeStamp:Array[1..100] of DATE_AND_TIME; |
悪くないです。が、あまりUser-Friendlyではないかな?と思っています。もしそのメッセージのタイプがプログラムの中に色々使ってるのであれば、すべてを一つ一つアップデートしないといけません。もちろん配列が4つがありますので、Loopingするときもこの4つもLoopする必要があります。
じゃ、なにかいい方法がありますか?Data Unit Typeとして定義すればよいじゃないしょうか?
Tyep: stEvent STRUCT eEventType:TcEventType; eErrorCode:UINT; sEventText:String(255); dtTimeStamp:DATE_AND_TIME; END_STRUCT END_TYPE; |
そしてそのData Unit Typeを配列として定義すればよいだと思います。Indexを変えれば自由アクセス可能です。
a:ARRAY[1..100] of stEvent; stEvent[2].eEventType:=…; stEvent[2].eErrorCode:=…; stEvent[2].sEventText:=…; stEvent[2].dtTimeStamp:=…; |
注意するのは、このDUTは”Global”的なものです。他の高級言語のようにLocal Typeを定義することができません。つまりプロジェクト中にはどこのプログラムにもそのDUTを流用することが可能です。
Example
まずDUTs>Add>DUTします。
DUTの名前を決めて、”Open”します。
このような画面が開きました。
E_EventTypeの変数を宣言したいですが、新規のプロジェクトではこのTypeがありません。Referencingを追加する必要があります。
ここではあなたのプロジェクトがどんなライブラリが参照されているかを設定することできます。
Add Libraryします。
E_EVENTを検索して選んで、OKします。
これでライブラリ追加OK、です。
次は各Elementを定義すればOK、です。
最後はPOUで定義します。
プログラムに応じて使います。
はーい、お疲れ様です。