FileStreamReaderLibは、OMRON社のNX/NJ向けのファイルリーダーライブラリです。 このライブラリのファイルリーダー(FileStreamReader)は、パラメータとして渡したバッファの書き込み可能バイト数が指定した閾値を超える度にファイルからデータを読み込みます。 バッファは、RingBufferLibを使用します。 RingBufferLibは、BYTE型配列を対象とするリングバッファの実装です。 RingBufferLibの実装は、バッファへの読み書きの主体がそれぞれ1つである時に限り、ロックを使用しなくてもマルチタスクに使用することができます。 FileStreamReaderはその特性を引き継ぎます。 また、バッファとしてRingBufferLibを使用する他のプログラムと柔軟に組み合わせることができます。
以下は、三つ組のREAL値で構成する値をファイルから読み出します。 バッファの容量はファイルサイズより小さく、指定した閾値に従って適時、ファイルから読み出されます。
IF P_First_Run THEN
DATA_FILE_PATH := '/points.bin';
POINTS_NUM := 2000;
READ_BUFFER_INTERVAL := 1;
END_IF;
IF P_First_Run THEN
// Setup the data buffer.
RingBuffer_init(Context:=iDataBufferContext,
Buffer:=iDataBuffer);
// Setup the reader.
FileStreamReader_configure(Context:=iFileReaderContext,
Activate:=TRUE,
Path:=DATA_FILE_PATH,
ReadThreshold:=(SizeOfAry(iDataBuffer) / 2));
// REAL * 3
POINTS_SIZE := 12;
END_IF;
CASE iState OF
// Generates points.
0:
iPointsGenerator.Path := DATA_FILE_PATH;
iPointsGenerator.Num := POINTS_NUM;
iPointsGenerator.Execute := TRUE;
Inc(iState);
1:
IF iPointsGenerator.Done OR iPointsGenerator.Error THEN
iPointsGenerator.Execute := FALSE;
Inc(iState);
END_IF;
// Start streaming points from the data file.
2:
iOk := TRUE;
iFileReader.Enable := TRUE;
Inc(iState);
3:
RingBuffer_read(Context:=iDataBufferContext,
Buffer:=iDataBuffer,
Out:=iBinPoints,
Size:=POINTS_SIZE,
ReadSize=>iBinPointsSize);
IF iBinPointsSize > 0 THEN
AryByteTo(In:=iBinPoints[0], Size:=iBinPointsSize, OutVal:=iPoints);
iReadPointX := iPoints[0];
iReadPointY := iPoints[1];
iReadPointZ := iPoints[2];
AryByteTo(In:=iGenePoints[iGenePointsHead], Size:=POINTS_SIZE, OutVal:=iPoints);
iGenePointX := iPoints[0];
iGenePointY := iPoints[1];
iGenePointZ := iPoints[2];
iGenePointsHead := iGenePointsHead + POINTS_SIZE;
iOk := iOk AND iReadPointX = iGenePointX;
iOk := iOk AND iReadPointY = iGenePointY;
iOk := iOk AND iReadPointZ = iGenePointZ;
iWaitTick := READ_BUFFER_INTERVAL;
Inc(iState);
ELSIF FileStreamReader_isEOF(Context:=iFileReaderContext) THEN
iState := iState + 2;
END_IF;
4:
Dec(iWaitTick);
IF iWaitTick < 1 THEN
Dec(iState);
END_IF;
// Finish streaming points.
5:
FileStreamReader_deactivate(Context:=iFileReaderContext);
iFileReader.Enable := FALSE;
Inc(iState);
END_CASE;
iPointsGenerator(GenerateData:=iGenePoints);
iFileReader(Context:=iFileReaderContext,
BufferContext:=iDataBufferContext,
Buffer:=iDataBuffer);
FileStreamReaderの機能は、ストリーミングデータ処理を支援するRingBufferLibに多分に依存しています。 しかしながら、RingBufferLibはこのような機能を実現するために、特別な機構を有しているわけではありません。 リングバッファの振る舞いに必要とする情報だけから実現しています。 そのため、仮にRingBufferLibが使用できなくなったとしても、それを再実装することは誰にでも可能です。
このプロジェクトの使用には、以下の環境が必要です。
| Item | Requirement |
|---|---|
| コントローラ | NX or NJ |
| Sysmac Studio | 最新版を推奨 |
このプロジェクトは、以下の環境で構築しています。
| Item | Version |
|---|---|
| コントローラ | NX102-9000 Ver 1.64 |
| Sysmac Studio | Ver.1.62 |
ライブラリ(FileStreamReaderLib.slr)は以下の手順で使用します。
-
lib/RingBufferLib.slrをプロジェクトで参照する -
FileStreamReaderLib.slrをプロジェクトで参照する -
プロジェクトをビルドしてエラーが無いことを確認する
いずれのライブラリも名前空間を使用しています。
プロジェクト内の識別子と名前空間の衝突が生じていないことを確認します。
Sysmacプロジェクト(FileStreamReaderLib.smc2)は例示プログラムを含み、以下の手順で使用します。
-
プロジェクトの構成を使用環境に合わせる
コントローラの型式を合わせます。 -
コントローラでプログラムを動作させる
プログラムをコントローラに転送して動作させます。
コントローラはSDカードを使用できる状態にします。 -
生成したデータとファイルから読み出したデータが一致していることを確認する
動作確認はシミュレータでもできます。 シミュレータで実行する場合、シミュレータの仮想SDフォルダ(C:\OMRON\Data\SimulatorData\CARD\Memory001)にデータファイルを作成します。