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