質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

0回答

3136閲覧

[WinError 10054] python socket通信時のエラー

_jtr

総合スコア4

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2019/12/12 22:53

編集2019/12/12 22:54

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で通信を行なっており、特定の機器と通信を行うときのみに上記エラーが出力されて値を取得できません。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dodox86

2019/12/13 02:06 編集

「特定の機器」の方の挙動によるのですが、modbusのパケットとして不正な(特定の機器側が認識しない)ものになっているので特定機器側から切断しているかもしれません。特定機器側にとって正しいmodbusのパケットになっているか再度確認してみてください。(現時点ではそれ以上のことはコメントできません)
dodox86

2019/12/13 02:15

もしくは、「特定の機器」から受信はできているのだけど、特定機器側はレスポンスを送信したら自ら切断してしまうので、同時にConnectionResetError例外が起きてしまっている、とか。(WindowsのWinSock下でのpython socketプログラミングなので、どう動いているか不明瞭なところはあります)
coco_bauer

2019/12/13 02:35

「特定の機器と通信を行うときのみに上記エラーが出力」という事なので、『ConnectionResetError: [WinError 10054] 既存の接続はリモート ホストに強制的に切断されました』の原因は、その特定の機器の側にある可能性が高いと考えられます。modbus/tcpのパケットをモニタすると接続が切断される経緯が判るかもしれません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問