PCと ある機器をハブを介して接続し、modbus/tcpにて機器のレジスタに保存されてあるデータをPC上で取得しようとしています。
python
1 2mport socket 3import struct 4import time 5import codecs 6import sys 7import binascii 8import numpy as np 9 10def Get_realtime_value_spcfy_ch_num(Logger_IP_str, ch_nmbr_atHEX): 11 12 def hex_to_float(s): 13 if s.startswith('0x'): 14 s = s[2:] 15 s = s.replace(' ', '') 16 return struct.unpack('>f', binascii.unhexlify(s))[0] 17 18 TARGET_IP = Logger_IP_str 19 TARGET_PORT = 502 20 BUFFER_SIZE = 512 21 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 22 sock.connect((TARGET_IP, TARGET_PORT)) 23 sock.settimeout(3.0) 24 transactionId = 0000 25 protocolId = 0000 26 len = 6 27 unitId = 1 28 functionCode = 4 # Read Input Status ( 29 startRegister = ch_nmbr_atHEX 30 data = 2 # bit count 31 req = struct.pack(">3H 2B 2H", int(transactionId), int(protocolId), int(len), int(unitId), int(functionCode), int(startRegister), int(data)) 32 sock.send(req) 33 rec = sock.recv(BUFFER_SIZE) 34 sgnl_Tx=str(codecs.encode(req, "hex_codec")) 35 sgnl_Rx=str(codecs.encode(rec, "hex_codec")) 36 time.sleep(0.2) 37 finally: 38 39 sock.close() 40 41 42up_register=sgnl_Rx[-5:-2] 43 up_register+=sgnl_Rx[-2] 44 bottom_register=sgnl_Rx[-9:-5] 45 return float(hex_to_float(up_register+bottom_register)), up_register+bottom_register 46
上記コード内の関数” Get_realtime_value_spcfy_ch_num”を実行すると、下記のようなエラーが出力され値を取得できません。
File "get_realtime_value.py", line 39, in Get_realtime_value_spcfy_ch_num
rec = sock.recv(BUFFER_SIZE)
ConnectionResetError: [WinError 10054] 既存の接続はリモート ホストに強制的に切断されました。
補足
PCと機器は1:Nで通信を行なっており、特定の機器と通信を行うときのみに上記エラーが出力されて値を取得できません。
あなたの回答
tips
プレビュー