変数とは?
これから少しずつTwinCAT3がIEC61131-3のどんな部分を実装したのか話ししたいと思っています。この前、まず変数を話ししましょう。
変数とはなんですか?Wikiではすこく詳しい説明ありますが、簡単にいいますと変数はMemoryエリアでその中に値を保存されると、そしてそのMemoryエリアを人間が読めるの名前に置き換えて、プログラム中で使用するだと、私は思っています。人間が読めるの名前に置き換えのことは、つまり変数名ですね。その変数名はどうつけるかにより、プログラムの可読性が大きく変わります。
https://en.wikipedia.org/wiki/Variable_(computer_science)
Static?Dynamic?
変数を宣言するまえにData Typeを定義する必要がらいます。TwinCAT3はIEC61131-3にあるData Typeを提供しています。変数の宣言はVAR…END_VARの中にやります。
VAR bSw:Bool; bVar:Int; END_VAR |
もしPythonやJavascriptのプログラム経験がある方でいればわかると思いますが、それらの言語はDynamic Typeのプログラム言語で、Structure Text、IEC611311-3はStatic Typeのプログラム言語です。その2つはなにか違いますか?ざっくりいいますと、
- Dynamic はRuntime中にData Typeをチエックする、そしてStatic TypeはコンパイルするにCheckする
- Dynamic は変数定義するときにData Type指定する必要がないわりに、Static Typeは必要
Basic Data Type
さ、PLCの世界でどんなData-Typeがあるでしょうか。ここでまずよく使われる数値を表現ものを紹介します。
Type | Values | Memory | Example |
BOOL | False/True | 1Byte | Va1:Bool:=True; |
INT | -32768~32767 | 2Bytes | Var1:int:=100; |
UINT | 0-65535 | 2Bytes | Var1:UINT:=22; |
SINT | -128~127 | 1Bytes | Var1:SINT:=19; |
USINT | 0-255 | 2Bytes | Var1:USINT:=20; |
DINT | -2147483647 ~ +2147483647 | 4Bytes | Var1:DINT:=40002; |
UDINT | 0 ~4294967295 | 4Bytes | Var1:UDINT:=4000; |
LINT | –2^63~(2^63)-1 | 8Bytes | Var1:LINT:=2221111; |
ULINT | 0~(2^64)-1 | 8Bytes | Var1:ULINT:=2221111; |
BYTE | 0-255 | 1Bytes | Var1:BYTE:=16#22; |
WORD | 0-65535 | 2Bytes | Var1:WORD:=16#123; |
DWORD | 0 ~4294967295 | 4Bytes | Var1:DWORD:=16#2000; |
LWORD | 0~(2^64)-1 | 8Bytes | Va1r:LWORD:=16#22221; |
REAL | -3.402823e+38 ~3.402823e+38 | 4Bytes | Va1r:REAL:=3.14; |
LREAL | -1.7976931348623158e+308~ 1.7976931348623158e+308 | 8Bytes | Va1r:LREAL:=40.1123; |
基本のルールはこのようです。
そこで一つ便利な機能を紹介します。これはBitアクセスです。下記のようにVar1の4Bit目をアクセスすることが可能になります。ちなみに0からCount始まります。
文字列(String)
IEC61131-3では文字列基本ASCII-CODEべーすです。使用するMemoryはN+1Byteに書いていますが、その+1Byteは”NULL”です、これはENDですよ~のような感じですね。
Type | Values | Memory | Example |
STRING | ‘Hello World’ | 80+1Bytes | Va1:STRING:=’Hello World’; |
STRING(300) | ‘Hello World’ | 300+1Bytes | Var1:STRING(300):=’Hello World’; |
文字列(WString)
WStringはいわゆるWide StringでUNI CODE CharacterベースとUTF16 Encodingです。それを使えば英語以外の文字を保存することが可能です。そして最大文字数は変数内で保存された文字の種類によって変わります。(1~2Bytes)
Type | Values | Memory | Example |
WSTRING | ‘Hello World’ | 160+1Bytes | Va1:WSTRING:=”Hello World”; |
WSTRING(300) | “Hello World” | 600+1Bytes | Var1:WSTRING(300):=”Hello World”; |
時間(Time)
この時間Typeはすこく便利だと私が思っています。それらのData Typeは人間にも寄っます、プログラムに組むときも簡単です。そのTIMEのTypeが様々な関数にも使われるんです。
Type | Values | Memory | Example |
TOD | D#2012-04-14 | – | t:TOD:=TOD#23:59:59.999; |
DATE | DATE#2013-05-09 | – | Var1:DATE:=D#2013-05-09; |
DATE_AND_TIME | DATE_AND_TIME#2013-05-09-00:00:00 | – | Var1:DATE_AND_TIME:=DT#2013-05-09-00:00:00; |
TIME | T#12h_15m | 4Bytes | Var1:TIME:=T#12h15m30s; |
LTIME | LTIME#1000d15h23m12s34ms2us44ns | 8Bytes | Var1:LTIME:=LTIME#1000d15h23m12s34ms2us44ns; |
Enum
最後紹介したいのはEnumです。
EnumはUserが定義できる一列の名前がある定数です。そのEnumerationを使うことによって直接に変数に”定数”を振り分けることができます。
Add>DUTをクリックします。
名前を定義し>Enumerationを選び、Openをクリックします。
このように定義できます。
EnumerationはDefault値0から始まります。もし値を指定したいのであれば…
そしてこのように直接に定義したFood Enumの要素を使うことできます。
はーい、お疲れ様です。