TOPに戻る

センサ・シリーズ 温度②温度調節器 その2 Modbusで読み書き

 使用環境
  • Raspberry Pi Raspberry Pi 4 Model B 2MB
  • OS Raspberry Pi OS(32ビット)5.4.72
  • Python3 3.7.3
  • pyserialライブラリ 3.4
  • modbus_tkライブラリ 1.1.1
  • エディタ Mu

オムロンE5CN-H

 設定をしたり読み出す変数エリアの一部を、

  デジタル調節計 通信マニュアル SGTD-737B

からピックアップします。

2バイトのアドレス パラメータ名
0x2000(8192)

現在の温度

PV パネルのLEDの表示されている数値

温度入力:各センサの指示範囲に従う

0x2103

目標値

目標値リミット下限値~目標値リミット上限値
0x2c00(11264)

入力種別。

センサの種類

0x0000 (0):Pt (−200.0~850.0℃/−300.0~1500.0 ゚ F)
0x0001 (1):Pt (−199.9~500.0℃/−199.9~900.0 ゚ F)
0x0002 (2):Pt (0.0~100.0℃/0.0~210.0 ゚ F)
0x0003 (3):JPt (−199.9~500.0℃/−199.9~900.0 ゚ F)
0x0004 (4):JPt (0.0~100.0℃/0.0~210.0 ゚ F)
0C00 2C00 入力種別 ※
0x0005 (5):K (−200.0~1300.0℃/−300.0~2300.0 ゚ F)
0x0006 (6):K (−20.0~500.0℃/0.0~900.0 ゚ F)
0x0007 (7):J (−100.0~850.0℃/−100.0~1500.0

...

0x2c0f(11279) PV 小数点表示 0x0000(0):OFF
0x0001(1):ON
0x300d(12301) PV 表示色切り替え

0x0000(0):橙
0x0001(1):赤
0x0002(2):緑

...

 読み出すのはすべての変数エリアからできます。しかし、書き込むには複数の条件があります。

◆制御動作中の設定エリア0と制御停止の設定エリア1があり、デフォルトが設定エリア0なので、設定エリア1の変数エリアを書き込むには、動作指令で「設定エリア1移行」を実施します。

 目標値(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)

 パネルには、通信書込の許可を示す「CMW」が表示され、PVの温度表示は赤色から緑色に変更されました。

プログラム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
 デバイス・アドレス(スレーブ・アドレス)は,0x00~0x5F(0~95)の範囲です。デフォルトの1のまま使います。

 ファンクションは、読み出しの03と書き込みの06がサポートされています。

 
 
 
2バイトのアドレス パラメータ名
0x0001

設定値(SV 目標値)

温度
0x0080

PV(入力)値読み取り

温度
0x0044

入力種類選択。

センサの種類

0x0000:K(-200~1370℃)デフォルト
0x0001:K(-199.9~400.0℃)
0x0002:J(-200~1000℃)
0x0003:R(0~1760℃)
0x0004:S(0~1760℃)
0x0005:B(0~1820℃)
0x0006:E(-200~800℃)
0x0007:T(-199.9~400.0℃)
0x0008:N(-200~1300℃)
0x0009:PL-Ⅱ(0~1390℃)
0x000A:C(W/Re5-26)(0~2315℃)
0x000B:Pt100(-199.9~850.0℃)
0x000C:JPt100(-199.9~500.0℃)
0x000D:Pt100(-200~850℃)

...

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')

連載 ラズパイ センサ・シリーズ

(1) 温度①確度±0.1℃ TMP117 その1 温度の読み出し

(2) 温度①確度±0.1℃ TMP117 その2 アラートの設定

(3) 温度①確度±0.1℃ TMP117 その3 アラートでLED点灯

(4) 温度①確度±0.1℃ TMP117 その4 アラートでリレー駆動

(5) 温度②温度調節器 その1 Modbusの設定

(6) 温度②温度調節器 その2 Modbusで読み書き

(7) 温湿度①SHT31 その1 測定準備