0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Unix時間をWindows時間に変換する

Posted at

OMRON PLC NX/NJの時刻データをC#で読み出すときにWindows時刻に変換する

PLC NXシリーズは1970-01-01 00:00:00からの経過時間を1ns毎にカウントした値を時刻としています
Windowsは1601-01-01 00:00:00からの経過時間を100ns毎にカウントした値を時刻としています

NX/NJ Windows
開始時間 1970-01-01 1601-01-01
インターバル 1ns 100ns

データ型対応表

NJ/NX Windows
DATE DateTime
DATE_AND_TIME DateTime
TIME TimeSpan
TIME_OF_DAY TimeSpan

DATE型、DATE_AND_TIME型

DateTime.AddTicksを使ってDateTime型に変換します
Unixの時刻型変数の値(カウント数)を1/100にして
Windowsの1970-01-01 00:00:00の時刻のカウント数に加算してWindowsの時刻型変数とします

private static DateTime UNIX_EPOCH = new DateTime(1970, 1, 1, 0, 0, 0, 0);

// PLCにあるDATE_AND_TIME型を含む構造体をCompoletでバイト配列に読み出す(例: Compoletの場合)
byte[] value = compolet1.ReadValiable("struct1");

// バイト配列のうちDATE_AND_TIME型のバイト位置からINT64で数値に変換して1ns単位を100ns単位に合わせる
// Unixの時刻型の基準位置からの経過時間としてValにセットする
ByteOffset = 0
DateTime val = UNIX_EPOCH.AddTicks(BitConverter.ToInt64(value, ByteOffset) / 100);
 

TIME型、TIME_OF_DAY型

private static DateTime UNIX_EPOCH = new DateTime(1970, 1, 1, 0, 0, 0, 0);

// PLCにあるDATE_AND_TIME型を含む構造体をCompoletでバイト配列に読み出す(例: Compoletの場合)
byte[] value = compolet1.ReadValiable("struct1");

// バイト配列のうちTIME型のバイト位置からINT64で数値に変換して1ns単位を100ns単位に合わせる
// Unixの時刻型の基準位置からの経過時間としてValにセットする
ByteOffset = 8
TimeSpan val = new TimeSpan(BitConverter.ToInt64(value, ByteOffset) / 100);

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?