TR-73U 温度・湿度・気圧を測定・記録するデータロガー

1. 概要

T&Dのセンサ(測定器)は Windows 専用、通信プロトコルも非公開という印象があって、 FA (Factory Automation) や HA (home Automation) には不向きですから、 これまで使わなかったのですが、一部の機種は RS-232LAN(TCP/IP) 接続でも使えて、 通信プロトコル (TR-73 RS 通信仕様) も公開ということなので、 TR-73U(大気圧・温度・湿度)を試してみることにしました。

「TR-73 RS 通信仕様」だけでも、とりあえず必要なことはできるのですが、 内蔵電池の電圧の読み方等、一部わからないところを T&D のサービス部門に教えていただいて、 とりあえず FreeBSD で使えるようになりました。

TR-73Uは単3電池 1 つで、約 10 ヵ月動作するコンパクトなデータロガーで、 最大 8,000 データの記録が可能、 USB と COM(RS232) の通信ポートを持っていて、 実験してみると、2 つの通信ポートを同時に使うことができます。

通常のデータロガーとの違いは内蔵時計がないことで、 記録開始時刻を制御側のコンピュータから教えてもらい、 それを記録データに付加することで、 記録開始日時を残す設計になっています。 従って、マニュアル操作による記録だと日時データがありません。

それにしても USB で使えないのも不便ですし、 Windows 使用の強制、専用ソフト使用の強制(デバイスの使用法の非公開)も嫌いなので、 FreeBSD 用の USB プログラムを書いてみました。 hardware としては、東芝のマイクロコントローラ TMP86FS23AUG と Philips の USB コントローラ PDIUSBD12 の組合せになっています。

2. USB 通信プロトコルの解析結果

以下、「TR-73 RS 通信仕様」を手がかりに TR-73U の USB packet を調べて、 プロトコルを推測した結果です。

TR-73U は USB1.1 の Full-speed で動作し、End point 2BULK 転送で外部と通信します。 パケットサイズは 64 byte と 128 byte の2種類が使われ、コマンド(送信)パケット の構造は下記の構造と思われます。ハイフンにはさまれた数字はバイト数、 バイト順は little endian (最初が最下位バイト) です。

+---+---+---+---+-------+--------+
|C 0|0 0|F F|s s|n n n n|data ...| <- 64 byte packet
+-2-+-2-+-2-+-2-+---4---+-- 52 --+

+---+---+---+---+-------+--------+---- --------------------+
|C 0|0 0|F 0|s s|n n n n|0 0 0 ..|data ................... | <- 128 byte packet
+-2-+-2-+-2-+-2-+---4---+-- 52 --+------- 64 --------------+
C は 1 byte のコマンドで、その値は「TR-73 RS 通信仕様」の「コマンド表」 と一致します。

s s はコマンドパケットと応答パケットの対応を確認するための 2 バイト (16 bit) のシーケンス番号と思われますが、コマンド毎にインクリメントされます。 実際には、すべて 0 にしておいても問題ないようです。

0 は 0x00 (1 バイトの 0) ですが、 n n n n は 4 バイト (32 bit) のデータ長 (後に続く data のバイト数) になります。

data(データ) が 52 byte に満たない場合は、 次ぎのパケットに全データを入れるため、残りのスペースを 0x00 で埋めておきます。

data が 52 byte に収まらない場合は n n n n を 116 (0x74 0x00 0x00 0x00) にして 52 byte のデータ(受信時には無視する)を 0x00 で埋め、 次ぎの 64 byte パケット全体に送信すべき data を入れます。 116 という数字は最初のパケットの data 52 byte と、次ぎのパケットの data 64 byte の和になっています。

F F の意味は不明ですが、後に続くパケット数を意味しているようです。

データ長が 52 byte を越えるのはデバイス内部の設定テーブル(表)の読み書きと、 記録(log)データの読み出しだけです。

応答(受信)パケットの構造は下記になるようです。

+---+---+---+---+-------+--------+
|C 0|R 0|0 0|s s|n n n n|data ...| <- 64 byte packet
+-2-+-2-+-2-+-2-+---4---+-- 52 --+
Cs s はコマンドと応答の関係を確認できるように、 デバイスが受信したコマンドの値を入れます。 n n n n は 4 byte のデータ長 (byte 数)、R は通常
  0x06 .. 正常終了
  0x09 .. 記録中 (コマンドを無視)
が使われますが、記録データ転送時にはブロック番号を入れてきます。

バッテリ電圧は本来のデータを 100 倍にした値が戻ります。

data が 52 byte に収まらないときは、コマンドの 128 byte packet と同じように、n n n n を 116 (0x74 0x00 0x00 0x00) にして 52 byte のデータを 0x00 で埋め、 次ぎの 64 byte パケット全体に送信すべき data を入れます。

記録データは、1 データ 2 byte、1 レコード 3 データ (6 byte) の下記の形式です。

+---+---+---+
|T T|H H|P P|
+-2-+-2-+-2-+

  T T (温度), H H (湿度) は本来のデータに 1,000 を加えて 10 倍した値
  P P (気圧) は本来のデータを 10 倍した値

記録データを取り出す場合は、応答コマンドに続いて、64 byte に分割されたデータが 連続して送られてきますので、 0x34 (記録データ数取得)コマンドで止めるタイミングを見極めます。

以下、私が書いた RS-232 と USB による制御プログラムのソースコード を付けておきますが、 FreeBSD 以外に、最近は利用者の多い Linux (Ubuntu) でもテストしておきました。

コマンドとデータの内容については「TR-73 RS 通信仕様」を見てください。 0x5b (Sw ロック切替) など、TR-73U には実装されていないものもあるようです。

なお、Linux (ubntu) の場合は

sudo apt-get install libusb-dev

で /usr/include/usb.h をインストールした状態でコンパイルしてください。 libusb 自体は初期状態でインストールされるようですが、 開発用のヘッダは入っていないようです。 FreeBSD/NetBSD とは違って、 「自分でプログラミングするのは一部の人」という発想でしょうか。 そうだとしたら、インストール時点で 「あなたはプログラムを書きますか? それともアプリケーションを使うだけの人ですか ?」とか聞いて、 プログラム開発用ファイルを入れるかどうかの選択ができるようにしてほしいです。

USB に不案内の方には、 USBの通信プロトコル が良くまとまっています。 USB の規格自体はオープンですが、かなりのボリウムがありますから、 良い解説で概要を把握してから、規格書を読むほうが良いと思います。

3. FA, HA で使う場合と serial 接続の注意点

FAHAで自動化で使う場合は、 MOXAなどの RS-232 を LAN 変換するシリアルデバイスサーバーで LAN 収容するか、 USB を USB エクステンダーで延長することが多いと思います。

手持ちのデバイスでのテスト中に、 serial(RS232) 接続で MOXA DE-311 を使うと、 TR-73U が動作しないという問題に遭遇しました。 MOXA W2150 PLus だと正常に動作します。

この原因は TR-73U が RS-232 と完全な互換性がないためでした。 TR-73U の RS232 driver が電源を接続相手の DTR, RTS から取っていて、 その電圧が低いと正常に動かないのです。

DE-311 相手の場合は TxD, RxD, SG の 3 線のみ接続し、 DE-311 側は DTR - DSR, RTS - CTS を loop-back、 TR-73U の RTS - CTS, DTR - DSR は専用ケーブル内部で短絡されていますので、 SG と RTS, DTR 間に外部電源から DC 12V 程度を供給すると正常に動作します。 電流は 3 mA 程度です。

外部電源の電圧を変えてテストすると、 +5.8V でも動きますが、RS232 のラインモニタでは TR-73U の TxD 信号を検出できず、 +6.5V ならラインモニタでも正常に検出されました。

RS232 (CCITT V.28) では信号の閾値が +3V と -3V ですから、 DE-311 の +4.1V でも規格を満たしています。

平林 浩一, 2022.08.05