WTR10-E 湿度・温度センサー - RS485 Modbus-RTU

温度・湿度を連続測定したい場所はたくさんありますから、 適度な精度、使い易さ、手頃な価格のセンサがほしくて、 Amazon で見付けた KKmoon RS485温度湿度 トランスミッタ RS485 Modbus-TRU データ ロガー 無線 温度 センサ 温度湿度モニタを試してみることにしました。

Amazon の表示では「KKmoon RS485温度湿度 トランスミッタ RS485 Modbus-TRU データ ロガー 無線 温度 センサ 温度湿度モニタ」 となっていますが、現品に添付されている中国語と英語の至極簡単な説明書によれば、 下記の仕様になっています。

  電源 DC 10-30 V
  電力 <= 0.1 W
  センサ Sensirion SHT20
  湿度 0〜100 +-3 %RH
  温度 -40〜125 +-0.3 ℃
  インタフェース RS485(Modbus-RTU) (Address 1-63, default 1)
        2400, 4800, 9600, 19200 (default 9600), 8 data + 1 stop
  サイズ 65 x 46 x 28.5 mm

SENSIRION SHT2xはよく知られた I2C インタフェースのローコスト版で、 メイン基板からの熱的干渉を防ぐように少し浮かせて実装してあります。

ここまでは良いのですが、問題は

  1) Modbus-RTU で使う方法(仕様)がわからない
  2) Modbus の slave adress や baudrate の設定方法がわからない
ことでした。つまり、どう使うのかがわかりません。

OEM 元と見られる Shandong Renke Control Technology Co., Ltd. の英文ページのリンクは使えないし、 ここにも何も書かれていないようです。

いろいろ調べているうちに、 RS-WS-N01-5 Thewalltemperatureandhumiditytransmitteroperationinstruction (Type485) を見付けました。 同じメーカーのバリエーション品と思われます。 試しに、ここに書かれている仕様

  Function Code: 0x03 (Read Holding Register)
  Origin Address: 0x00 0x00 (Register Address)
  Data Length: 0x00 0x02 (2 word)
に従って、 Holding Register の最初の 2 バイトを読み出す Modbus コマンド
  0x01 0x03 0x00 0x00 0x00 0x02 0xC4 0x0B
を RS485 で送ってみると、ちゃんと応答が得られました。

最初の 1 byte が slave address (default) の 1、 次の 0x03 は Modbus の Read Holding Register コマンド (Function)、 次の 0x00 0x00 がレジスタのアドレス、 その後の 0x00 0x02 は読み出すデータの長さ(word 数)、 最後の 0xC4 0x0B は CRC です。

WTR10-E からの応答は 9 byte で、例えば

  0x01 0x03 0x04 0x02 0x92 0xFF 0x9B 0x5A 0x3D
といったものですが、この場合は 3 byte 目の 0x04 がデータの長さ (byte 数) 4, 5 byte 目の 0x02 0x92 は 2 byte 符号付き整数の 0x0292 (10 進表示の 658) 6, 7 byte 目の 0xFF 0x9B は 2 byte 符号付き整数の 0xFF9B (10 進表示の -101) で、実測値を 10 倍した数値が湿度、温度の順に送られてきます。 この例では、それぞれ、65.8 %RH, -10.1 ℃です。

これでデータは読めるようになりましたが、 複数台使う場合は slave address の設定が必要です。

いろいろ調べてもわからないので、 ケースの隙間から見える DIP S/W で設定するのかもしれないと、 ナイフの刃先をケースの溝に入れて蓋を開け、 試行錯誤の結果、下記のような設定法を見出しました。

       A1  A2  A3  A4  A5  A6  A7  A8  <-- 基板のシルク印刷
   +---------------------------------+
   |ON                           DIP |
   |   .   o   o   o   o   o   o   . | <-- DIP Switch
   |   o   .   .   .   .   .   .   o |
   |   1   2   3   4   5   6   7   8 |
   +---------------------------------+
       <--- address --->   <-speed->

 DIP Switch の ON 側が論理 0、OFF 側が 1 になります。Baudrate (speed) の設定は

 6  7  8
 -------
 1  0  0   2400 bps
 0  1  0   4800 bps
 0  0  1   9600 bps
を確認できましたが、添付文書にある 2400, 19200 は実現できませんでした。 添付説明書の間違いではないかと思います。

注 - Modbus

Modbus は PLC (Programmable Logic Controller) 向けに策定された 古くからのシリアル通信プロトコルで、産業用電子機器の接続用(Field Bus)で、 最も使われているものの一つです。 プロトコルの詳細は Modbus等、たくさんありますので、 始めてのかたは、そちらをご覧ください。

コンピュータでアクセスする場合は、今なら、MOXA の Serial Device Server などで、 Ethernet に変換して使うのが良いでしょう。

この方針で書いたサンプルプログラムを付けておきます。

サンプルプログラム

平林 浩一, 2019-09