PLCからデータの読み込みを行いたいです。
データの読み込み開始のタイミングをDM351に1が入ったときにしたいです。
それ以外はDM351に3が入っています。
1に変わって2秒後には3に戻ります。
while分の書き方が間違っているのは明確なのですが、
どのような条件にすればよいかわからず、ご教示いただきたいです。
どうぞよろしくお願いいたします。
python
1import logging 2import socket 3import csv 4import time 5import codecs 6import datetime 7 8#RD or RDS MR(DM)100.U(.S) n\r 9dir_name = 'C:/Users////PLC/' 10today = datetime.date.today() 11 12class PLC: 13 logging.basicConfig(level=logging.DEBUG, format='%(threadName)s: %(message)s') 14 host_ip = '192.168.0.10' # PLCのIPアドレス 15 host_port = 8501 16 17 18 logging.debug('start') 19 client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 20 # socket.AF_INETでip4を使うことを指定。socket.SOCK_STREAMでTCPを使うことを指定。 21 22 client.connect((host_ip ,host_port)) # サーバーに接続(kv-7500にTCP接続/上位リンク通信) 23 print("connected") 24 25 def readCM(self, adrs): 26 comand = f"RDS CM{adrs}.U 6\r" 27 ascii_comand = PLC.client.send(comand.encode("ascii")) 28 self.response = PLC.client.recv(64) 29 self.response = self.response.decode("UTF-8") 30 self.response = self.response.replace("\n","") 31 self.year = self.response[3:5] 32 self.month = self.response[9:11] 33 self.day = self.response[15:17] 34 self.hour = self.response[21:23] 35 self.minute = self.response[27:29] 36 self.second = self.response[33:35] 37 #self.msecond = self.response[39:41] 38 self.response = self.year+ "/" + self.month + "/" + self.day + " " + self.hour + ":" + self.minute + ":" + self.second 39 #print(self.response) 40 return(self.response) 41 42 def readDM(self, adrs, count): 43 if adrs == 1000: 44 comand = f"RDS DM{adrs}.U {count}\r" 45 ascii_comand = PLC.client.send(comand.encode("ascii")) 46 self.response = PLC.client.recv(16) #10進数 byte型 47 self.response = self.response.decode("UTF-8")#10進数 str 48 49 #2連続文字列の時 50 self.response1 = self.response[:5] 51 self.response2 = self.response[6:] 52 print(self.response1) 53 self.response1 = hex(int(self.response1))#16進数 str 54 self.response2 = hex(int(self.response2)) 55 self.response1 = self.response1[2:]#0xの除去 56 self.response2 = self.response2[2:] 57 self.response1 = codecs.decode(self.response1, "hex") 58 self.response1 = str(self.response1,'utf-8') 59 self.response2 = codecs.decode(self.response2, "hex") 60 self.response2 = str(self.response2,'utf-8') 61 62 63 #16bit数字 64 else: 65 comand = f"RD DM{adrs}.U\r" 66 ascii_comand = PLC.client.send(comand.encode("ascii")) 67 self.response = PLC.client.recv(16) 68 self.response = self.response.decode("UTF-8") 69 self.response = self.response.replace("\n","") 70 self.response = self.response[:5] 71 return(self.response) 72 73 74DM351 = PLC().readDM(351,1) 75 76while DM351 == "00003": 77 #print(DM351) 78 #CM = PLC().readCM(700) 79 #print(CM) 80 81 if DM351 == "00001": 82 print(DM351) 83 print('1:read start') 84 #CM = PLC().readCM(700) 85 #print(CM) 86 DM1000 = PLC().readDM(1000, 100) 87 break 88 89 elif DM351 != "00003": 90 print('Change!!') 91 92 else: 93 print("else") 94 95else: 96 print(DM351) 97 print('whileループが正常に終了しました。') 98 99PLC().client.close()
上記のプログラムを動かすと
ずっと else が出力されます。
while以下を下記のように変更すると
python
1interval = 0.5 2for i in range(0, 20, 1): 3 DM351 = PLC().readDM(351,1) 4 print(DM351)
MainThread: start connected 00001 00001 00001 00003 00003
のように00001が読み込めていることを確認できます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/06/30 01:51