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

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

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

Whileは多くの言語で使われるコントロール構造であり、特定の条件が満たされる限り一連の命令を繰り返し実行します。

エスケープ処理

エスケープ処理とは、一連の文字や一文字に対して、一定の規則に従って別の意味を適用する処理過程です。

Python

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

Q&A

1回答

1050閲覧

得られる値が変わったら処理を変えたい

ken248

総合スコア24

while

Whileは多くの言語で使われるコントロール構造であり、特定の条件が満たされる限り一連の命令を繰り返し実行します。

エスケープ処理

エスケープ処理とは、一連の文字や一文字に対して、一定の規則に従って別の意味を適用する処理過程です。

Python

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

0グッド

0クリップ

投稿2021/06/30 01:22

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が読み込めていることを確認できます。

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

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

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

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

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

guest

回答1

0

PLC().readDM(351,1) が文字列を返すはずはありませんので、"00003"と比較すれば常にelseに行きます。
intの3と比較しましょう。

投稿2021/06/30 01:48

ppaul

総合スコア24670

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

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

ken248

2021/06/30 01:51

返答ありがとうございます。 DM351 = PLC().readDM(351,1) print(DM351) print(type(DM351)) で実行すると MainThread: start connected 00003 <class 'str'> となるので文字列にしています。 帰ってきたものを一度intにしたほうが良いのでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

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

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

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問