Modbusの利用 (14) WAGO 750-342②アナログ値を読み取る

 ツールQModMasterを使ってWAGO 750-342にアクセスします。

アドレス

 Modbusのアクセスには、スレーブ・アドレスが必要です。WAGO 750-342本体にモジュールを取り付けると、その順にアドレスが動的に振られるようです。QModMasterを立ち上げて、TCP/IPの設定をします。IPアドレスは前回設定した192.168.111.24、ポートは標準の502です。

 Unit IDがアドレスです。'1'を設定しました。アナログ・ユニットのデータは、データシートによると保持レジスタに収納されています。2バイト(13ビット+符号)で、±10Vの入力電圧値は0x8000~0x7FFCの数値にスケーリングされます。

  •  0.0 0x0000
  • +1.0V 0x0CCC
  • -1.0V 0xF330

 オフセット(Start Address)は'0'に、アナログ・チャネルは2個のモジュールなのでNumber of Registersは'2'に設定しました。

 チャネル1にはTL431の出力(約2.5V)をつなぎ、チャネル2は解放です。上記の図のように、8177と23を読み出しました。フルスケールは±10Vなので、8177/2^15*10=2.4954Vです。

プログラム

 Windows10のコマンドプロンプトからアクセスします。

from pyModbusTCP.client import ModbusClient

SERVER_HOST = "192.168.111.24"
SERVER_PORT = 502

c = ModbusClient()
c.host(SERVER_HOST)
c.port(SERVER_PORT)
c.open()
regs = c.read_holding_registers(0, 1)  #reg_addr,number of registers to read

def s16(x): return -(x & 0b1000000000000000) | (x & 0b0111111111111111) r = s16(regs[0]) print(float(r)/32768*10.0, 'V')



 10~16行は、次のようにも書けます。

 regs[0] & pow(2,15)で、最上位ビットを見ます。
 '1'だったら負の数なので、~regs[0]でビット反転+1になるはずですが、そうなりません。& 0xffffすることで予想通りの結果が得られます。その数値に対してもう一度not演算をします。これでマイナス符号が付きます。

if regs[0] & pow(2,15) != 0:
    rr= ~(~regs[0] & 0xffff)  #reverse and +1 ,minus
else:
    rr= regs[0]
print(float(rr)/32768*10.0, 'V')