2026年2月6日金曜日

AIと相談してコレクタで、持ち込みと持ち出しをRFID読み取りで記録してみた

簡単に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 件のコメント:

コメントを投稿