今回はシーメンスの時間データタイプについて説明します。シーメンスのPLCはいくつの時間タイプが用意しており、それぞれは少し違いがあります。まずこれらの違いを話し、そのあと時間に関連する命令などを紹介します。
Data Type
DATE
DATEは日付の符号なしの整数として保存します。中には年、月、日が入っています。日付けが一番古いなのは01-01-1990です。(実際は16#0000がはいっています。)
データのFormatはこうです:
- Length
- 2Bytes
- Format
- IEC date(Y-M-D)
- Range
- D#1990-01-01からD#2169-06-06まで
- Example
- D#2009-12-31
- DATE#2009-12-31
TOD(TIME_OF_DAY)
TODは32BITのDWORDとして時間を保存します。中にmsあり、初期値は”一日の始まり”つまり0:00hです。
- Length
- 4Bytes
- Format
- TOD(h:m:s:ms)
- Range
- TOD#00:00:00:0000からTOD#23:59:59:999まで
- Example
- TOD#10:20:30:400
- TIME_OF_DAY#20:11:49:231
LTOD(LTIME_OF_DAY)
LTODは32BITのDWORDとして時間を保存します。TODと比べて中にmsだけでなくusまであり、初期値は”一日の始まり”つまり0:00hです。
- Length
- 8Bytes
- Format
- LTOD(h:m:s:ms.us)
- Range
- LTO#00:00:00:000000000からTOD#23:59:59:999999999まで
- Example
- LTOD#10:20:30:400_241_512
- LTIME_OF_DAY#20:11:49:231_512_201
DATE_AND_TIME(Date and time of day)
DT(Date and time of day)は時間の情報をBCD Formaとして保存されます。
- Length
- 8Bytes
- Format
- Date and time(yy:mm:dd:hh:mm:ss:ms)になります。
- Range
- DT#1990-01-01-00:00:00:0000から2089-12-31:23:59:59:999まで
- Example
- DT#2008-10-25-08:12:34.567,
- DATE_AND_TIME#2008-10-25-08:12:34.567
- 構造
- Byte0
- 年
- 0-99
- BCD#90=1990
- BCD#0=2000
- BCD#89=2089
- Byte1
- 月
- BCD#1-12
- Byte2
- 日
- BCD#1-31
- Byte3
- 時
- BCD#0-23
- Byte4
- 分
- BCD#0-59
- Byte5
- 秒
- BCD#0-59
- Byte6
- ms
- BCD#00-999
- Byte7(MSB)
- msの符号
- BCD0-9
- Byte8(LSB)
- 何曜日
- BCD#1-7
- BCD#1=日曜日
- BCD#7=土曜日
- Byte0
Example
ここでDTの変数を一つを作って、長さ8Byteの配列に格納にします。
結果はこの通り、
0=20、2020年です。
1=11、11月です。
2=30、30日です。
3=22、22時です。
4=11、11分です。
5=12、12秒です。
6=85、854msの”85”です。
7=42、4は854msの”4”、2は火曜日のことです。
LDT(DATE_AND_LTIME)
LDT(DATE_AND_LTIME)は時間の情報を保存し、msでなく、Nanoseconds単位で保存。
- Length
- 8Bytes
- Format
- Date and time(yy:mm:dd:hh:mm:ss..Nanoseconds))になります。
- Range
- LDT#1990-01-01-00:00:00:000000000から2262-04-11-23:47:16.854775807まで
- Example
- LDT#2008-10-25-08:12:34.567
Example
DTL(DATE_AND_LTIME)
DTLは時間を12BytesのBCDとして保存します。
- Length
- 12Bytes
- Format
- Date and time(yy:mm:dd:hh:mm:ss.Nanoseconds)になります。
- Range
- DTL#1970-01-01-00:00:00.0から2262-04-11-23:47:16.854775807まで
- Example
- DTL#2008-12-16-20:30:20.250
- 構造
- Byte0-1
- 年
- 1970-2262
- Byte2
- 月
- 1-12
- Byte3
- 日
- 1-31
- Byte4
- 何曜日
- 1(日曜)から7(土曜)まで
- Byte5
- 何時
- 0-23
- Byte6
- 分
- 0-59
- Byte7
- 秒
- 0-59
- Byte8-11
- Nanoseconds
- 0-999999999
- Byte0-1
Example
ここでDTLの変数を一つを作って、長さ12Byteの配列に格納にします。
結果はそのとおり、
Byte0,1=7E4=2020年
Byte1=0B=11月
Byte2=0C=12日
Byte3=05=木曜日
Byte4=0D=13時
Byte5=18=24分
Byte6=19=25秒
Byte7-9=3ADE68B1=987654321 Nanosecondsです。
Local Time・System time
シーメンスの時間単位を扱うときはLocal TimeとSystem time、その2つどうして出てきますね。うん?なにが違うの?と思う人も多いですが、一言いうと、System Timeはタイムゾーン設定と関係ない(UTC offsetは0)で、Local Timeはあなたが設定したTime Zoneに影響されいます。
タイムゾーン設定
PLC>Device Configurationをクリック。
Properties>General>Time of day>Local TimeでTime Zoneを設定することができます。
System Time設定
次はSystem Timeの時間設定を行うところを説明します。
PLCにOnlineし、Online & diagnsticsをクリック。
Functions>Set Timeで”System Time”を設定することができます。
Take from PG/PCならいま自分のパソコンの時間をApplyします。
Take from PG/PCのCheckboxを外すとそのまま数字入力になります。
PLCの時間読み
せっかくですので、PLCからのLocal TimeとSystemを読み、そしてその時間差を求めるプロクラムを作成します。
Local Time読み
RD_LOC_Tという命令を使い、出力したい時間のFormatは好きなように選べます。
では今回はDTLにしますね。
System Time読み
RD_SYS_Tという命令を使います、出力したい時間のFormatは好きなように選べます。
Local Timeと比較したいから、ここで先と同じくDTLにしますね。
次は、まず2つとったの時間あ同じかどうかをCheckしてみます。
ここでT_COMPという命令があります。
比べたい変数のTypeを選べることができます。
そしてどんな比較するのかも選べますね。EQは同じ、GTはIN1がIN2より大き…など。
最後はT_DIFFという命令を使って2つの時間の差を求めます。
結果
RD_LOC_TをとRD_SYS_Tを使って、いまの時間が読めますね。
そして、もちろんLocal Timeの時間とSystem Timeの時間が違いますので1つ目の比較のOUTはFalseですね。しかし、2つ目の比較はLocal TimeがSystem Timeより”先”なので、OUTがTrueになります。
最後、2つの時間差を求めることって、大体9時間くらいかな?~
日本タイムゾーンはGMT+9ですからねー
はーい、お疲れ様です。