センサ・シリーズ 温度②温度調節器 その1 Modbusの設定
PCのModbus/RTUのプログラムを作るときに使っていたUSB-RS485アダプタ(アマゾンで入手)をラズパイに挿します。ターミナルでls /devを実行すると、ttyUSBx(ttyUSB0が多い)が追加されています。このデバイスを利用してModbusのプログラムを作っていきます。
●温度調節器は工業機器
製造現場では、電気炉などが多く使われ、温度を上昇/一定にコントロールするために温度調節器がたくさん使われています。温度調節器は単独で使われることも、RS-485/RS-422/RS-232などのインターフェースを内蔵するタイプを使って、複数をまとめてコントロールすることもあります。
ここでは、そのような使いかたではなく、単に温度計の機能を使います。単純に今の温度を読み出すだけです。
RS-485は複数の温度調節器を数珠つなぎができ、業界標準のModbusプロトコルを使えば、数百m離れた場所の複数の温度も取得できます。接続は、2本の撚線を使うので敷設が簡便です。
多くの温度調節器では、各種熱電対、白金測温体、サーミスタなどに対応していますが、ここではセンサ自体を数m延ばして利用でき安価なK型熱電対をつなぎます。
●Modbusには3種類の規格がある
RS-485を利用するのはModbus/ASCIIとModbus/RTUですが、Modbus/RTUが一般的のようです。TCP/IP経由で利用するのがModbus/TCPです。Modbus/RTUのメッセージからCRC-16の2バイトを取り去っています。TCP/IPプロトコルにデータの健全性を担保したので不要になったからです。
日本では、規格に準拠と書かれていた場合、規格を100%満たしている場合と、規格の一部だけ似ているけど、独自規格の場合があります。規格を100%満たしていても、例えば、レジスタの種類や数はメーカ独自です。
●RS-485はModbus/RTU
通信には、次のパラメータの設定が必要です。
- ボーレート デフォルトは9600が多い。2400~19200bpsが選べる場合もある。
- データ・ビット 7もしくは8ビット。海外は8ビットが大半
- ストップ・ビット 「1、1.5、2」もしくは「1、2」から選択。海外は1が大半
- パリティ なし、偶数、奇数から選択。海外は「なし」が大半
海外製品は、「9600、8、1、なし」がデフォルトになっていることが多いです。逆に、日本製品では、そうなっていない場合があります。取扱説明書には書かれていないことも多く、確かめるには、パネルを操作し該当するパラメータを表示します。確認できないこともあるので、その時は、テクニカル・サポートに電話で確認しておきます。
●Modbus/RTUのおもな規格
RS-485は差動信号で通信します。2本のケーブル(ツイスト・ペア)を使います。日本の電話線は撚線ではないので、適していません。実験では、2本の単線を撚って使います。終端抵抗は、機器の両端に必要とされています。1m程度では信号の反射などの理由で通信ができないことはありません。取扱説明書には、120Ω前後の抵抗を取り付けるように書かれています。
信号の例です。
●デバイス・アドレス
Modbusでは、複数の機器(最大31台)が同じワイヤでつながっているので、識別するためにデバイス・アドレスが用いられます。メッセージを送るのがマスタで、今回はラズパイです。メッセージを受け取って温度などのデータを送るのがスレーブで、ほぼすべての個別製品は、購入時に'1'が設定されています。
デバイス・アドレスは、ライブラリやユーティリティによって次のように呼ばれます。
- アドレス
- スレーブ・アドレス
- Slave Addr
- Device
- Device Address
'1'を指定するとき、デバイス・アドレスは、0から始まるものと1から始めるものがあります。機器には'1'からふっていく仕様でも、'0'を指定できるメーカもあります。
モジュール製品の場合は、追加したモジュール順にデバイス・アドレスがふられる設定になっていることが多いです。最初のモジュールは'0'もしくは'1'から始まる製品が多いようです。
単純に順にふられる場合もありますが、入力と出力は別個の扱いになっていたり、アナログ機器はバイト単位、ディジタル入出力はビット単位など、会社や製品によってまったく異なるので、ドキュメントを読んで確認します。
●機能を表すファンクション
代表的なファンクションの例です。ファンクションとは、どのレジスタに対して読むのか書き込むのかをいくつか定義したものです。下記に示した例よりもっとたくさん規格ではきめられていますが、多くの製品では、下記のファンクションの一部だけが実装されています。
https://modbus.org/docs/PI_MBUS_300.pdf
ファンクションの01~04が読み出すときに、05と06、16は設定値を書き込むときに使われます。
温度などを読み出すときは、03もしくは04のどちらかが使われます。
ファンクションのコード | 機能名 | 機能 | 備考 |
---|---|---|---|
01 | Read Coil Status | スレーブのDOのON/OFFを読み出す | |
02 | Read Input Status | スレーブのDIのON/OFFを読み出す | |
03 | Read Holding Register | スレーブの保持レジスタの内容を読み出す | 装置によって大きく長さや内容は異なる |
04 | Read Input Register | スレーブの入力レジスタの内容を読み出す | |
05 | Force Single Coil | スレーブのDOをONもしくはOFFする | ONは0xff,0x00、OFFは0x00,0x00 |
06 | Preset Single Register | スレーブの保持レジスタの内容を変更する | |
16 | Preset Multiple Registers | スレーブの連続した複数の保持レジスタの内容を変更する | |
以下略 |
温度を読み出すときに使われるModbusの規格と、今回利用する温度調整器の名称を次に示します。03と04の使い分けは、メーカによってまちまちです。
ファンクション・コード | データのある場所の名称 | |
---|---|---|
規格 |
03 Read Holding Register もしくは04 Read Input Register |
「保持レジスタ」は40001からスタート。 もしくは「入力レジスタ」は30001からスタート |
オムロンE5CN-H | ファンクション・コード03の変数読み出し | 「設定データのアドレス」は0000からスタート |
パナソニックKT-7 | 機能コード03のスレーブの設定値,情報の読み取り | 「データ項目」は、0x0001からスタート |
●メッセージのフレーム
送るときの一つのパケットをメッセージと呼びます。前後にある「3.5 文字分」は、有効な信号が連続しない期間です。ライブラリなどを使うときには指定しなくてよく、「Address Function Data CRC」を用意します。
start | Address | Function | Data | CRC | End |
---|---|---|---|---|---|
3.5 文字分 | 8ビット | 8ビット | n * 8ビット | 16ビット | 3.5 文字分 |
これに対して、スレーブ・デバイスから応答メッセージがありますが、省略します。マスタがスレーブに対してメッセージを送るのを要求、その要求に対して返事を出すのが応答と呼びます。応答にはエラー・メッセージが送られることもあります。
Dataの中身は、規格では、要求時、データがある場所の指定:2バイト、指定した場所から何個を要求するか:2バイトです。応答時のDataは、データ・バイト数、データ1の上位バイト、データ1の下位バイト、データ2の上位バイト、データ2の下位バイト、...の順番です。
オムロンE5CN-Hの要求では、データがある場所の指定:2バイト、読み出したい設定データ数(2バイト・モード)です。応答時のDataは、読み出しデータのバイト数、読み出された設定データの値です。
2バイト・モードの場合のデータは0x2000のアドレスから始まります。0x2000はパネルに表示している測定温度です。設定データ数が一つのとき、0x0001を送ります。
Data = 0x20 0x00 0x00 0x01
応答は、
Data = 0x02 0x03 0xe8
です。0x02は送ってくるデータ・バイト数で、0x03e8(1000)は100℃です。フルに書くと次のデータの並びです。オムロンE5CN-Hのデバイス・アドレスは1の設定です。
Address | Function | Data | CRC |
---|---|---|---|
0x01 | 0x03 | 0x02 0x03 0xe8 | 0xb8 0xfa |
パナソニックKT-7の要求では、読み取りするデータ項目:2バイト、要求するデータ数:0x0001固定です。応答時のDataは、応答バイト数0x02(固定?)、データの値:2バイトです。データは0x0000のアドレスから始まります。0x0080はパネルに表示している測定温度です。
Data = 0x00 0x80 0x00 0x01
応答は、
Data = 0x02 0x00 0x64
です。0x02は送ってくるデータ・バイト数で、0x0064は100℃です。
●接続
オムロンE5CN-HのRS-485端子は、筐体にA、Bと書かれていますが、マニュアルには、A(-)、B(+)と書かれています。したがって極性が逆なので、通常の表記のAはオムロンE5CN-HのB端子へ、通常の表記のBはオムロンE5CN-HのA端子へつなぎます。
パナソニックKT-7のRS-485端子は、本体裏面(底)に電話の6ピン・ジャックがついています。通常の電話のように中央の2ピンに接続します。4番がA(-)、3番がB(+)です。したがって極性が逆なので、通常の表記のAはパナソニックKT-7のB端子へ、通常の表記のBはパナソニックKT-7のA端子へつなぎます。
温度調節器はどちらもAC100V用を入手したので、電源端子はAC100Vへつなぎます。熱電対も、それぞれ指定の端子につなぎました。
KT-7はDINレールに取り付けられる形状をしています。E5CN-HはオプションのY92F-52を追加で入手し、DINレールに取り付けました。
●機器の通信項目の設定
パナソニックKT-7は、パネルの操作から通信プロトコル選択で「Modbus RTU モード」を選択します。機器番号設定はデフォルトの1のまま、通信速度選択も9600のまま、パリティ選択はなしのnonE、ストップ・ビット選択は1のままにしました。
オムロンE5CN-Hは、パネルの操作から通信データの設定プロトコル選択で「Modbus」を選択します。通信ユニットNo.は1から2へ変更します。これはデバイス・アドレスのことです。通信速度は9600のまま変更しません。通信データ長と通信ストップ・ビットは、modbusを選択した時点で選べなくなっています。テクニカル・サポートに確認したら、固定値の「8ビット、ストップ・ビット1」でした。通信パリティはなしのNoneに設定します。電源を入れなおすと有効になります。
●ツール類
動作確認、接続確認のために次の二つを使いました。
qModMaster
CAS Modbus Scanner(Chipkin Automation Systems)