簡単にRFIDできるツールとして、マニカ コレクタがあります。
https://www.hayato.info/collector.htm
です。
とても簡単に始められるのは、もちろんですが、実はSQL文を実行することも、さらっと記載されています。
SQL文にコレクタが展開して埋め込むことができるのは、①タグID:ICタグの電子ID
②アンテナID:複数枚のアンテナをつなげた定置リーダーは何枚目で読んだか
③YYYYMMDD:年月日
④HHMMSS:時分秒
です。
注目なのは②です。定置リーダーは2枚から4枚のアンテナをつなげることができて、コレクタは何枚目で読んだのか分かるのです!
そこで、賢明な貴方は気が付くはずです。
方向の検出に使えるのでは?と。
そこで、AIに相談します。
「私はRFIDタグから①②③④を読み取れるソフトをPCで動かしています。データベースに情報を格納したいのですが、安価なものを紹介してください。」
回答を見ると、SQL Server Expressが良さそうだと思われました。
そこで、AIに質問します。
「アンテナが2枚あり、部屋の扉の外側と内側に取り付けてます。RFID読み取りタイミングで、何番目のアンテナで読んだかは識別できます。部屋に持ち込んだ、部屋から持ち出した、を知りたいです。データベースで方法はありますか?」
すると、
「テーブルを2つ作り、逐次読取り結果テーブルと持ち込み持ち出しを記録するテーブル、そしてトリガーを使用すれば出来ます。」
という回答なので、テーブル作成SQL文も作ってもらい、エラーが出たら報告して修正してもらい、と繰り返したら、できました!
コレクタのログ表示では逐次の読み取りが表示され、右のデータベース表示では、「IN」「OUT」が表示されます。
コレクタを使えば手軽に持ち出し/持ち込みが識別できることがわかりました。
仕掛けは機能したので、お客様に勧めるときは、見た目の相談もして、現場で使いやすくアレンジしましょう!
使用した機材は、ノートPCが1台、定置リーダーが1台、アンテナが2枚です。
AIに相談して作成したSQL文も紹介しますね。
【コレクタで実行するSQL文】
--コレクタの時刻文字列をSQL Server用の時刻文字列に変換してインサート。
INSERT INTO dbo.T_RFID (dt,id_ant, id_epc, yyyymmdd, hhmmss, desc_txt)
VALUES (
DATEADD(SECOND,
DATEDIFF(SECOND, CONVERT(time(0),'00:00:00'),
TRY_CONVERT(time(0), STUFF(STUFF('[HHMMSS]',3,0,':'),6,0,':'))),
TRY_CONVERT(datetime2(0), '[YYYYMMDD]', 112)
),
'[アンテナNO]',
'[タグID]',
'[YYYYMMDD]',
'[HHMMSS]',
'COLLECTOR'
);
【SQL Server Expressでテーブル作成】
USE [MANICA_01]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[T_RFID](
[auto_id] [int] IDENTITY(1,1) NOT NULL,
[dt] [datetime2](0) NULL,
[id_ant] [varchar](2) NOT NULL,
[id_epc] [varchar](96) NOT NULL,
[yyyymmdd] [varchar](8) NOT NULL,
[hhmmss] [varchar](6) NOT NULL,
[desc_txt] [varchar](14) NULL,
PRIMARY KEY CLUSTERED
(
[auto_id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
GO
USE [MANICA_01]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[T_DIRECT](
[auto_id] [int] IDENTITY(1,1) NOT NULL,
[id_epc_auto_id] [varchar](96) NOT NULL,
[direct] [varchar](4) NOT NULL,
[desc_txt] [varchar](14) NULL,
PRIMARY KEY CLUSTERED
(
[auto_id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
GO
【SQL Server Expressでトリガー作成】
USE [MANICA_01]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TRIGGER [dbo].[trg_T_RFID_to_T_DIRECT_5sec]
ON [dbo].[T_RFID]
AFTER INSERT
AS
BEGIN
SET NOCOUNT ON;
INSERT INTO dbo.T_DIRECT (id_epc_auto_id, direct, desc_txt)
SELECT
i.id_epc,
CASE
WHEN i.id_ant IN ('1','01') THEN 'IN'
WHEN i.id_ant IN ('2','02') THEN 'OUT'
ELSE 'IN'
END,
i.desc_txt
FROM inserted AS i
CROSS APPLY (
SELECT TOP (1)
r.auto_id,
r.dt
FROM dbo.T_RFID r
WHERE r.id_epc = i.id_epc
AND r.auto_id < i.auto_id -- 「直前」の候補に限定(重要ぴょん)
AND r.dt IS NOT NULL
ORDER BY r.auto_id DESC -- ここで降順ぴょん
) AS prev
WHERE
i.dt IS NOT NULL
AND DATEDIFF(SECOND, prev.dt, i.dt) BETWEEN 0 AND 8;
END;
GO
ALTER TABLE [dbo].[T_RFID] ENABLE TRIGGER [trg_T_RFID_to_T_DIRECT_5sec]
GO
【コマンドラインで「IN][OUT」表示】
「show_update.bat」の内容
@echo off
setlocal
:loop
sqlcmd -S .\SQLEXPRESS -d MANICA_01 -U manica_user -P "himitu" -W -Q "SELECT TOP (10) * FROM dbo.T_DIRECT ORDER BY auto_id DESC;"
echo ---- %date% %time% ----
timeout /t 3 /nobreak >nul
goto loop
ここで終わりです。
0 件のコメント:
コメントを投稿