Pythonプログラムで PLCのデータメモリの値を取得し
CSVファイルで保存するというコードを書いています。
★前提
PLCとPCをイーサネットで接続している
PLCデータメモリ【D1000】は【1】か【2】が格納されるようラダーを作成している。
1と2に変化するタイミングは1日2回(午前1回 午後1回)
1が格納されていてトリガーが入ると5分間 2が格納される その後また1が格納される仕様。
★プログラム概要
Pythonプログラムでは
PLC データメモリ【D1000】の値を常に取得し
D1000値が【2】になった時に【D0~D99】の値をCSV出力する
CSV出力後も D1000の値を常に取得し続ける
D0~D99 値取得タイムラグ 5分以内に取得できれば問題ないです。
というプログラムを作成したいです。
★困っている部分
「CSV出力後も D1000の値を常に取得し続ける」
という部分がうまくいきません
接続し続けていると 何かをきっかけに(?)
以下のエラーが発生します。
【後追記】※接続スタートから決まって 40秒後に以下のエラーが発生することが判明しました。
**例外が発生しました: OSError
[WinError 10048] 通常、各ソケット アドレスに対してプロトコル、ネットワーク アドレス、またはポートのどれか 1 つのみを使用できます。
**
実際のコードは以下の通りです。
どの部分を変更するべきでしょうか?
また調べる際の 検索ワード等 何かヒントを頂けると幸いです。
何卒よろしくお願い致します。
Python
1コード 2# プログラムの概要 データメモリの値をCSVファイルとして保存 3# データ保存の概要 PCの任意のフォルダ内に 日付フォルダを作成し 1.CSVというCSVファイルを作成 4 5import logging 6import os 7import socket 8import csv 9import time 10import codecs 11import datetime 12import tkinter.messagebox as mb 13import pandas as pd 14import traceback 15import sys 16 17# ・・・・・・・・・・・・・・・保存先を決めるプログラム・・・・・・・・・・・・・・・・・・・・・・・・・ 18# 今日の日付を取得 todayとする (フォルダ名に使用) 19 20today = datetime.date.today() 21 22# dir_name 日付フォルダを作成するフォルダのパス 23dir_name ='C:/Users/テスト/' 24 25# os.makedirs フォルダを作成////// 26os.makedirs(dir_name + str(today),exist_ok=True) 27# save_dir はCSVファイルを保存するフォルダのパス 28save_dir = 'C:/Users/テスト/'+ str(today) + "/" 29# ・・・・・・・・・・・・・・・保存先を決めるプログラム・・・・・・・・・完・・・・・・・・・・・・・・・・ 30 31 32# ・・・・・・・・・・・・・PLC接続先指定・・・・・・・・・・・・・・・・・・・・・・・・ 33 # PLCのIPアドレス Port番号 34host_ip = '192.168.30.100' 35host_port = 8501 36# ・・・・・・・・・・・・・PLC接続先指定・・・・・・・・・・・・・完・・・・・・・・・・・ 37 38 39# ・・・・・・16ビットを読み込む時の関数・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 40def readDM_16int(adrs): 41 #PLCへの接続 42 logging.basicConfig(level=logging.DEBUG, format='%(threadName)s: %(message)s') 43 logging.debug('start') 44 client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 45 client.connect((host_ip ,host_port)) # サーバーに接続 46 comand = f"RD DM{adrs}.U\r" 47 ascii_comand = client.send(comand.encode("ascii")) 48 #以下PLCから返ってきたresponceを任意の形に変換 49 response = client.recv(16) 50 response = response.decode("UTF-8") 51 response = response.replace("\n","") 52 response = response[:5] 53 return response 54# ・・・・・・16ビットを読み込む時の関数・・・・・・・・完・・・・・・・・・・・・・・・・・・・・・ 55 56 57 58# csvファイル(1.csv・・・・・・・・・・・・・・・・・・・ 59def to_csv_1(data_list): 60 with open(save_dir + '1.csv', 'a',encoding='utf-8', newline='') as f: 61 writer = csv.writer(f) 62 writer.writerow(data_list) 63# csvファイル・・・・・完・・・・・・・・・・・・・・ 64 65 66 67# まとめ関数 D//////////////////////////////// 68def D(statr,end,interval): 69 data_list = [] 70 for no in range(statr,end,interval): 71 DM = "DM" + str(no) 72 DM_res = readDM_16int(no) 73 dm = DM_res.strip() 74 data_lists = data_list.append(dm) 75 to_csv_1(data_list) 76# まとめ関数 D///////////////////////完///////// 77 78 79# D1000を監視 1 何もしない 2 CSV出力 80TF = False 81while True: 82 83 if readDM_16int(1000) == "00002" and TF == False: 84 D(0,100,1) 85 TF = True 86 elif readDM_16int(1000) == "00001": 87 TF = False 88 pass 89 else: 90 pass 91
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/10/03 23:54