DS Scriptはデータ準備作業で実施するバッチ処理やデータ加工のスクリプト作成・実行などを支援するスクリプト言語です。コマンドや変数を使った柔軟な処理をGUI操作で作成できます!今回はシンプルな項目のみの元データから、変数や条件分岐を使って項目「生産数」「サイクルタイム」を作る方法をご紹介します。サンプルデータやサンプルプログラムもあるのでぜひお手元でお試しください!
コマンドと変数
コマンド
DS Scriptにはスクリプト作成のための様々なコマンドが用意されています。ドラッグ&ドロップで配置しコマンドを組み合わせることで複雑な処理を簡単に記述できます。詳細は以下マニュアルをご覧ください。
変数
DS Scriptでは変数を使って効率よくスクリプトを作成することができます。例えば、データベース名やテーブル名を変数としてセットすることでメンテナンス性を向上させたり、テーブル型変数にSELECTした結果を格納しテーブル行数分処理を繰り返したりすることが可能です。詳細は以下マニュアルをご覧ください。
シナリオと加工の方針
項目「到着時間」「照度」のみのシンプルな元データを加工していきます。製品が照度センサー前を通過し照度が下がったタイミングで生産数をカウントし、前回生産数をカウントした際の到着時間からサイクルタイムを算出します。
方針
前回照度がない場合、前生産数カウント到着時間がない場合などデータの特性上、繰り返しと条件分岐は以下のように行います。
スクリプト作成
事前準備
サンプルの元データをダウンロードし任意のフォルダに配置します。
SQL Executorで以下SQLを実行し任意のデータベースに空のテーブル「受信データ_中間テーブル」「受信データ」を作成します。
CREATE TABLE 受信データ_中間テーブル (
到着時間 TIMESTAMP,
照度 NUMERIC(18,0));
CREATE TABLE 受信データ (
到着時間 VARCHAR,
照度 NUMERIC(18,0),
前生産数カウント到着時間 TIMESTAMP,
前回照度 NUMERIC(18,0),
生産数 NUMERIC(18,0),
サイクルタイム NUMERIC(18,0));
続いて以下のマニュアルと画像を参考に「受信データ_中間テーブル」の仮想テーブルを作成します。
スクリプト作成と実行
以下のようにスクリプトを作成します。
- 「受信データ_中間テーブル」にはセンサーデータが随時追加されるため追加モードでインポートしています。(20行目)
- 「受信データ」には「受信データ_中間テーブル」内のすべてのデータを加工してインポートするため、処理開始時にすべてのデータを削除しています。(32行目)
SET() {
//全体で使う変数セット
$VAR_db_Name = "TEST";
$VAR_SRC_table_Name = "受信データ_中間テーブル";
$VAR_DST_table_Name = "受信データ";
$VAR_vtb_Path = "C:\\DrSum57\\Server\\samples\\vtb\\";
$VAR_vtb_Name = "受信データ_中間テーブル";
$VAR_file_Path = "C:\\受信データ.csv";
$VAR_ProductNumFlag = 0;
}
CONNECT($VAR_db_Name) {
}
EXECUTE_DS_CMD() {
//「受信データ_中間テーブル」にCSV追加インポート
($RESULT1, $STD1)
= dwtab_import ${VAR_db_Name} ${VAR_SRC_table_Name} ${VAR_vtb_Path} ${VAR_vtb_Name} ${VAR_file_Path} "" 0 2 1 ""
}
SET_FROM_QUERY() {
//「受信データ_中間テーブル」のデータをテーブル型変数にセット
@VAR_TABLE
= select 照度, 到着時間 from ${VAR_SRC_table_Name};
}
EXECUTE_DS_CMD() {
//「受信データ」のデータを削除
($RESULT2, $STD2)
= dwtab_delete ${VAR_db_Name} ${VAR_DST_table_Name};
}
FOREACH (@VAR_TABLE, FOREACH_ROW_COUNT) {
CASE {
//1行目のみ前回照度NULLでINSERT
WHEN ($FOREACH_ROW_COUNT == 1) {
SQL($_SQL_AUTO_COMMIT_ON) {
INSERT INTO ${VAR_DST_table_Name} VALUES ("${VAR_TABLE_到着時間}", ${VAR_TABLE_照度}, NULL , NULL , NULL , NULL);
}
SET() {
//照度を変数「前回照度:PreValue」にセット
$VAR_PreValue = $VAR_TABLE_照度;
}
}
ELSE {
CASE {
//前回照度が300より大きく、今回の照度が100より小さいなら生産数1としてINSERT
//生産数1カウント初回のみ前生産数カウント到着時間NULL、サイクルタイムNULLでINSERT(「生産数フラグ:ProductNumFlag」で条件分岐)
WHEN ($VAR_PreValue > 300 && $VAR_TABLE_照度 < 100 && $VAR_ProductNumFlag == 0) {
SQL($_SQL_AUTO_COMMIT_ON) {
INSERT INTO ${VAR_DST_table_Name} VALUES ("${VAR_TABLE_到着時間}", ${VAR_TABLE_照度}, NULL , ${VAR_PreValue} , 1 , NULL);
}
SET() {
//到着時間を変数「前生産数カウント到着時間:PreTimestamp」にセット
//生産数1初回以外の分岐に入るように変数「生産数フラグ:ProductNumFlag」をセット
$VAR_PreTimestamp = $VAR_TABLE_到着時間;
$VAR_ProductNumFlag = 1;
}
}
WHEN ($VAR_PreValue > 300 && $VAR_TABLE_照度 < 100 && $VAR_ProductNumFlag == 1) {
SQL($_SQL_AUTO_COMMIT_ON) {
INSERT INTO ${VAR_DST_table_Name} VALUES ("${VAR_TABLE_到着時間}", ${VAR_TABLE_照度}, "${VAR_PreTimestamp}" , ${VAR_PreValue} , 1 , DATEDIFF(SECOND,"${VAR_PreTimestamp}","${VAR_TABLE_到着時間}"));
}
SET() {
//到着時間を変数「前生産数カウント到着時間:PreTimestamp」にセット
$VAR_PreTimestamp = $VAR_TABLE_到着時間;
}
}
ELSE {
SQL($_SQL_AUTO_COMMIT_ON) {
INSERT INTO ${VAR_DST_table_Name} VALUES ("${VAR_TABLE_到着時間}", ${VAR_TABLE_照度}, NULL , ${VAR_PreValue} , NULL , NULL);
}
}
}
SET() {
//照度を変数「前回照度:PreValue」にセット
$VAR_PreValue = $VAR_TABLE_照度;
}
}
}
}
実際のサンプルプログラムはこちらからダウンロードできます。
以下の記事「ダウンロードしたdhnファイルを自社の環境に適用する方法」を参考に、スクリプト内のデータベース名($VAR_db_Name)や各種パス情報を自社の環境に合わせて変更してください。
その後、DS Scriptファイルをアップロードして実行します。
実行結果は以下のようになります。
さいごに
いかがでしたか?DS Scriptを利用することで、通常SQLでは実装が大変な処理内容も、GUI操作やコマンド・変数の利用で容易に記述できることをご理解いただけたのではないかと思います!
また今回は手動で実行しましたが、DS Scriptを定期的にバッチ実行することで、データ分析に必要なデータ加工処理からデータベースへの取り込みまでのデータ準備作業を自動化することが可能です。以下の記事もぜひご一読ください。