センサ・シリーズ 温度②温度調節器 その2 Modbusで読み書き
使用環境
|
●オムロンE5CN-H
設定をしたり読み出す変数エリアの一部を、
デジタル調節計 通信マニュアル SGTD-737B
からピックアップします。
2バイトのアドレス | パラメータ名 | 値 |
---|---|---|
0x2000(8192) |
現在の温度 PV パネルのLEDの表示されている数値 |
温度入力:各センサの指示範囲に従う |
0x2103 |
目標値 |
目標値リミット下限値~目標値リミット上限値 |
0x2c00(11264) |
入力種別。 センサの種類 |
0x0000 (0):Pt (−200.0~850.0℃/−300.0~1500.0 ゚ F) ... |
0x2c0f(11279) | PV 小数点表示 | 0x0000(0):OFF 0x0001(1):ON |
0x300d(12301) | PV 表示色切り替え |
0x0000(0):橙 ... |
読み出すのはすべての変数エリアからできます。しかし、書き込むには複数の条件があります。
◆制御動作中の設定エリア0と制
目標値(0x2103)は設定エリア0、PV 表示色切り替え(0x300d)は設定エリア1です。
◆デフォルトで通信書込が禁止状態です。動作指令で「通信書込を許可」を実施します。
●プログラム1 ファンクション3
modbus_tkとpyserialライブラリを利用します。pip3でインストールします。どちらもPCのプログラムでも使っていました。
pip3 install pyserial
pip3 install modbus_tk
現在の温度を読み出します。マニュアルには、温度のフォーマットは説明されていませんが、パネルの表示と1桁違うので、10で割りました。
import serial import modbus_tk.defines as cst from modbus_tk import modbus_rtu PORT = '/dev/ttyUSB0' Address = 2 e5cn_h = modbus_rtu.RtuMaster(serial.Serial(port=PORT, baudrate=9600, bytesize=8, parity='N', stopbits=1, xonxoff=0)) e5cn_h.set_timeout(1) A1 = e5cn_h.execute(Address, cst.READ_HOLDING_REGISTERS, 0x2000, 1) print(A1[0]/10,'`C') |
実行結果です。
●プログラム2 ファンクション6
0x300d(12301)を読み出すと1(現在の温度を表示する7セグメントLEDの表示は赤色 )でした。これを緑色に変更します。
最初に、動作指令で「通信書込を許可」を、つぎに、「設定エリア1移行」を実施します。そして0x300dに2を書き込むと緑色に変更されます。このままでは変更途中状態になるので、ソフト・リセットをかけます。ソフト・リセット後も「通信書込を許可」は継続されました。
動作指令は、書き込み変数アドレスが0x0000で、出力値は「指令コードとパラメータ」の組み合わせです。今回関係ある指令の内容は次のとおりです。
指令の内容 | 指令コード | パラメータ |
---|---|---|
通信書込 | 0x00 | 0x00:OFF(禁止)デフォルト 0x01:ON (許可) |
ソフト・リセット | 0x06 | 0x00 |
設定エリア1移行 | 0x07 | 0x00 |
プログラムです。
import serial import modbus_tk.defines as cst from modbus_tk import modbus_rtu PORT = '/dev/ttyUSB0' Address = 2 e5cn_h = modbus_rtu.RtuMaster(serial.Serial(port=PORT, baudrate=9600, bytesize=8, parity='N', stopbits=1, xonxoff=0)) e5cn_h.set_timeout(1) e5cn_h.execute(Address, cst.WRITE_SINGLE_REGISTER, 0x0000, output_value=0x0001) e5cn_h.execute(Address, cst.WRITE_SINGLE_REGISTER, 0x0000, output_value=0x0700) print('write 0x300D ') e5cn_h.execute(Address, cst.WRITE_SINGLE_REGISTER, 0x300D, output_value=2) A1 = e5cn_h.execute(Address, cst.READ_HOLDING_REGISTERS, 0x300D, 1) print('read 0x300D ', A1[0]) e5cn_h.execute(Address, cst.WRITE_SINGLE_REGISTER, 0x0000, output_value=0x0600) |
パネルには、通信書込の許可を示す「CM
●プログラム3 ファンクション6
目標値を変更します。デフォルトは0です。パネルでは、現在の温度PVの下に表示されています。
「通信書込を許可」は先ほど実行したので、そのまま許可された状態です。先ほどソフト・リセットをしたので、設定エリアはデフォルトの0に戻っているようです。目標値は設定エリア0です。
プログラムです。
import serial import modbus_tk.defines as cst from modbus_tk import modbus_rtu PORT = '/dev/ttyUSB0' Address = 2 e5cn_h = modbus_rtu.RtuMaster(serial.Serial(port=PORT, baudrate=9600, bytesize=8, parity='N', stopbits=1, xonxoff=0)) e5cn_h.set_timeout(1) # e5cn_h.execute(Address, cst.WRITE_SINGLE_REGISTER, 0x0000, output_value=0x0001) print('write 0x2103 ') e5cn_h.execute(Address, cst.WRITE_SINGLE_REGISTER, 0x2103, output_value=0x1aa) A1 = e5cn_h.execute(Address, cst.READ_HOLDING_REGISTERS, 0x2103, 1) print('read 0x2103 ',A1[0]) e5cn_h.execute(Address, cst.WRITE_SINGLE_REGISTER, 0x0000, output_value=0x0600) |
目標値は(2の補数)*10で設定します。0x1aaは426なので、パネルには42.6と表示され、ヒータをONするOUT1の表示が出て、℃が点滅します。
●パナソニックKT-7ファンクションは、読み出しの03と書き込みの06がサポートされています。
2バイトのアドレス | パラメータ名 | 値 |
---|---|---|
0x0001 |
設定値(SV 目標値) |
温度 |
0x0080 |
PV(入力)値読み取り |
温度 |
0x0044 |
入力種類選択。 センサの種類 |
0x0000:K(-200~1370℃)デフォルト ... |
0x001a | 小数点位置選択 | 0x0000:XXXX (小数点なし) 0x0001:XXX.X(小数点以下1桁) 0x0002:XX.XX(小数点以下2桁) 0x0003:X.XXX(小数点以下3桁) |
●プログラム4 ファンクション3
E5CN-Hとともに、現在の温度を読み出します。二つの読み出し命令を連続して実行すると、2番目の温度読み出しが正常ではなかったので、100msの間隔をあけました。
import time import serial import modbus_tk.defines as cst from modbus_tk import modbus_rtu PORT = '/dev/ttyUSB0' e5cn_hAddress = 2 KT7Address = 1 master = modbus_rtu.RtuMaster(serial.Serial(port=PORT, baudrate=9600, bytesize=8, parity='N', stopbits=1, xonxoff=0)) master.set_timeout(10) A1 = master.execute(e5cn_hAddress, cst.READ_HOLDING_REGISTERS, 0x2000, 1) print(A1[0]/10,'C') time.sleep(0.1) A1 = master.execute(KT7Address, cst.READ_HOLDING_REGISTERS, 0x0080, 0x001) print(A1[0]/10,'C') |
実行結果です。E5CN-Hの熱電対は室内、KT-7の熱電対の先端は、室外に出した状態です。
●プログラム5 ファンクション6
入力種類選択(0x0044)を使って、0x0000:K(-200~1370℃)と0x0001:K(-199.9~400.0℃)を変更します。
読み出した温度の表示は小数点第1位までで変わりませんが、パネルの表示が変更されます。左が0x0001、右が0x0000です。
import time import serial import modbus_tk.defines as cst from modbus_tk import modbus_rtu PORT = '/dev/ttyUSB0' e5cn_hAddress = 2 KT7Address = 1 master = modbus_rtu.RtuMaster(serial.Serial(port=PORT, baudrate=9600, bytesize=8, parity='N', stopbits=1, xonxoff=0)) master.set_timeout(10) A1 = master.execute(e5cn_hAddress, cst.READ_HOLDING_REGISTERS, 0x2000, 1) print(A1[0]/10,'C') time.sleep(0.1) master.execute(KT7Address, cst.WRITE_SINGLE_REGISTER, 0x0044, output_value=0x0001) time.sleep(0.1) A1 = master.execute(KT7Address, cst.READ_HOLDING_REGISTERS, 0x0080, 0x001) print(A1[0]/10,'C') |