Simulink Support Package for Raspberry Pi ⑦ Modbus/TCP 熱電対
Simulink Support Package for Raspberry PiのブロックNetworkにあるModbusを動かします。Modbusは工業用で使われるフィールド・バス規格の一つです。RS485を使うModbus/RTUとイーサネットを媒体に使うModbus/TCPがあります。ここではModbus/TCPを使います。
●Modbus/TCPサーバを用意
PLCのWAGO 750-842はETHERNETバス・コントローラで、アナログ入出力やディジタルI/Oを追加して利用できます。通信は、Modbus(TCP, UDP)プロトコルをサポートしています。
こちらの記事で利用しています。
Modbusの利用 (15) WAGO 750-842①熱電対
接続は次のようにしました。
- 750-842 TCPインターフェース
- 750-469 2AI 熱電対
- 750-512 ディジタル出力(2チャネル、リレー出力)
- 750-479 アナログ入力(2チャネル差動)
- 750-600 終端
電源は、DINレールに取り付けられるアマゾンで入手した24V電源を2系統用意しました。PLCは、本体動作用とI/O用は別々の電源を用います。
750-469には、Kタイプの熱電対を+TC1(1)/-TC1(2)につなぎ、TC2には何もつないでいません。モジュールのLED-Dは断線を示す赤色のLEDが点灯しています。
●Pythonで動作確認
IPアドレスの振り方は、次の記事を参照してください。192.168.111.25を振りました。
Modbusの利用 (13) WAGO 750-342①IPアドレスを振る
最初に、ライブラリをインストールします。利用環境はWindows10のコマンドプロンプトです。
pip install pymodbustcp
TCP/IPで接続した後、熱電対の温度を読み込み、ディジタル出力のリレーを動かします。リレーはメカニカルなので、動作音がします。
from pyModbusTCP.client import ModbusClient
import time
SERVER_HOST="192.168.111.25"
SERVER_PORT=502
c = ModbusClient(SERVER_HOST, port=SERVER_PORT)
c.open()
WAGO750_469InputAddr = 0x0000
WAGO750_512OutputAddr = 0x0000 # read back 0x0200
while 1:
regs = c.read_holding_registers(WAGO750_469InputAddr, 1) #reg_addr,number of registers to read
print(float(regs[0])/10.0, '`C')
c.write_single_register(WAGO750_512OutputAddr, 0)
print('----')
time.sleep(3.14)
c.write_single_register(WAGO750_512OutputAddr, 2)
time.sleep(3.14)
print('====')
c.write_single_register(WAGO750_512OutputAddr, 1)
time.sleep(3.14)
c.write_single_register(WAGO750_512OutputAddr, 3)
print('+++++')
time.sleep(3.14)
プログラムをwago01.pyで保存します。実行例です。
●Simulink その1
TCP/IP、port502で接続をします。
そのあとModbusブロックで読み出します。
TCP/IP Serverブロックです。接続だけを行います。
Modbus TCP/IP Master Readブロックの内容です。
IPアドレス、Function、レジスタのアドレスを指定します。Modbusの規約では、Holding Registerにデータが入っていることが多いです。
読み出した値は1nt16なので、Data Type Coversionブロックでfloat(double)に変換します。
読み出した値は温度を10倍した整数値なので、Gainブロックで1/10します。
●Simulink その2
温度が一定以上になったら、Modbus/TCPで送信してディジタル出力をONにします。出力には何もつながないでも、動作確認用のLEDの点灯で確認ができます。
25℃以上と28℃以上の二つのブロックを追加しました。
それぞれの書き込みブロックの内容です。FunctionはWrite Multiple Coilsを使いました。
●実行
温度の読み出しは、今までと同じく「監視と調整」をクリックして実行していました。
しかし、出力側のブロックを追加すると、熱電対の先端を指でつまんでも温度表示が上がりません。
右側の「ビルド、展開起動」を一度実行した後は、リアルタイムに温度は上がり、出力も正常になりました。
これらの違いが何であるかを理解できていません。