Modbusの利用 (16) WAGO 750-842②ディジタル出力

 WAGO 750-842にディジタル出力750-512モジュールを追加しました。2チャネルあり、230Vacもしくは30Vdcまでの負荷を駆動できます。

 接続は次の順番です。

  • 750-842 TCPインターフェース
  • 750-512 2チャネル・リレー出力
  • 750-600 終端

 電源は、DINレールに取り付けられるアマゾンで入手した24V-1.7A電源を用意しました。

アドレス

 750シリーズは、接続した順にアドレスが振られます。750-512を1個だけ接続したので、スレーブ・アドレスは0x0000です。ディジタル入出力は、16ビット単位でアクセスし、750-512はLSBから2ビットでチャネル指定ができます。

  0b0000 0000 0000 00xx

●プログラム

 write_single_registerで16ビットを書き込みます。以下の動作を繰り返します。動作の確認は、確認用緑のLEDの点灯と、リレーの動作音です。

  • 最初 '0'を書き込んで、二つのリレーをOFFにする
  • '2'は、DO2をONにDO1をOFFにする
  • '1'は、DO1をONにDO2をOFFにする
  • '3'は、DO1、DO2共にONにする

from pyModbusTCP.client import ModbusClient
import time
 
SERVER_HOST = "192.168.111.24"
SERVER_PORT = 502
 
c = ModbusClient()
c.host(SERVER_HOST)
c.port(SERVER_PORT)
c.open()
 
while 1:
    c.write_single_register(0, 0)
    print('----')
    time.sleep(3.14)
    c.write_single_register(0, 2)
    time.sleep(3.14)
    print('====')
    c.write_single_register(0, 1)
    time.sleep(3.14)
    c.write_single_register(0, 3)
    print('+++++')
    time.sleep(3.14)

アナログ・ユニットを追加でつなぐ①

 アナログの熱電対モジュールを追加します。ディジタル・モジュールの後ろに追加できます。

  • 750-842 TCPインターフェース
  • 750-512 2チャネル・リレー出力
  • 750-469 2AI 熱電対
  • 750-600 終端

 出力と入力はそれぞれ0x0000からアドレスが振られます。

  • 750-469 2AI 熱電対 0x0000
  • 750-512 2チャネル・リレー出力 0x0000

プログラム

 入力と出力のアドレスは、別個に振られるので、どちらも0x0000です。

from pyModbusTCP.client import ModbusClient
import time
 
SERVER_HOST = "192.168.111.25"
SERVER_PORT = 502
 
c = ModbusClient()
c.host(SERVER_HOST)
c.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)

 実行中の様子です。

アナログ・ユニットを追加でつなぐ②

 アナログの電圧入力モジュール750-479を追加します。熱電対のアナログ・モジュールの後ろに追加できます。

  • 750-842 TCPインターフェース
  • 750-512 2チャネル・リレー出力
  • 750-469 2AI 熱電対(入力)
  • 750-479 2AI DC±10V、差動入力
  • 750-600 終端

プログラム

 アナログ入力が二つになりました。したがって、アドレスは次のように振られます。熱電対のモジュールは2チャネルなので、それぞれにアドレスが振られます。ディジタル出力は0x0000のままで変化しません。

  • 750-469 2AI 熱電対  0x0000
  • 750-479 2AI DC±10V、差動入力  0x0002

from pyModbusTCP.client import ModbusClient
import time
 
SERVER_HOST = "192.168.111.25"
SERVER_PORT = 502
 
c = ModbusClient()
c.host(SERVER_HOST)
c.port(SERVER_PORT)
c.open()

WAGO750_469InputAddr = 0x0000
WAGO750_479InputAddr = 0x0002
WAGO750_512OutputAddr = 0x0000 # read back 0x0200

def s16(x):
    return -(x & 0b1000000000000000) | (x & 0b0111111111111111)
 
while 1:
    regs469 = c.read_holding_registers(WAGO750_469InputAddr, 1)  #reg_addr,number of registers to read 
    print(float(regs469[0])/10.0, '`C')
    
    regs479 = c.read_holding_registers(WAGO750_479InputAddr, 1)  #reg_addr,number of registers to read
    r = s16(regs479[0])
    print(round((float(r)/32768*10.0),6), 'V')

    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)

 実行している様子です。

●アナログ・ユニットを追加でつなぐ③

 熱電対の2番目にK型センサを追加しました。また、アナログ入力2チャネルの入力を1kΩでショートしました。したがって、それぞれのチャネルのスレーブ・アドレスは、次のようになります。

  • 750-469 2AI 熱電対  TC1;0x0000、TC2;0x0001
  • 750-479 2AI DC±10V、差動入力 AI1;0x0002、AI2;0x0003

from pyModbusTCP.client import ModbusClient
import time
 
SERVER_HOST = "192.168.111.25"
SERVER_PORT = 502
 
c = ModbusClient()
c.host(SERVER_HOST)
c.port(SERVER_PORT)
c.open()

WAGO750_469InputAddr =   0x0000
WAGO750_469_2InputAddr = 0x0001
WAGO750_479InputAddr =   0x0002
WAGO750_479Input_2Addr = 0x0003
WAGO750_512OutputAddr =  0x0000 # read back 0x0200

def s16(x):
    return -(x & 0b1000000000000000) | (x & 0b0111111111111111)
 
while 1:
    regs469 = c.read_holding_registers(WAGO750_469InputAddr, 1)  #reg_addr,number of registers to read 
    print(float(regs469[0])/10.0, '`C')

    regs469 = c.read_holding_registers(WAGO750_469_2InputAddr, 1)  #reg_addr,number of registers to read 
    print(float(regs469[0])/10.0, '`C')
    
    regs479 = c.read_holding_registers(WAGO750_479InputAddr, 1)  #reg_addr,number of registers to read
    r = s16(regs479[0])
    print(round((float(r)/32768*10.0),6), 'V')

    regs479 = c.read_holding_registers(WAGO750_479Input_2Addr, 1)  #reg_addr,number of registers to read
    r = s16(regs479[0])
    print(round((float(r)/32768*10.0),6), 'V')
    
    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)

 実行中の様子です。