业务逻辑:我要给plc传一个值a=7,我要去检验plc有没有收到这个值,如果没有收到这个值,我要再传一遍值,直到plc里真的收到这个值了
简洁版:循环发送值直到PLC接收到指定值为止
代码逻辑:一直发a的值给plc,检查plc有没有收到
import snap7
def check_plc_value(ip_address, value):
# Snap7连接PLC
plc = snap7.client.Client()
plc.connect(ip_address, 0, 1)
# 循环发送值直到PLC接收到指定值为止
while True:
# 发送值到PLC
plc.db_write(1, 0, [value])
# 读取DB块的值
db_data = plc.db_read(1, 0, 1)
db_value = snap7.util.get_int(db_data, 0)
if db_value == value:
# 当PLC接收到指定值时,退出循环
print("PLC received the value successfully.")
break
else:
# 当PLC没有接收到指定值时,继续发送值
print("PLC did not receive the value, sending again...")
# 断开连接
plc.disconnect()
import snap7
def connect_plc(ip_address):
# Snap7连接PLC
plc = snap7.client.Client()
plc.connect(ip_address, 0, 1)
return plc
def send_value_to_plc(plc, db_number, start_address, value):
# 将值写入DB块
plc.db_write(db_number, start_address, snap7.util.to_byte(value))
def check_value_received(plc, db_number, start_address, expected_value):
# 检查PLC是否收到了值
db_data = plc.db_read(db_number, start_address, 2)
received_value = snap7.util.get_int(db_data, 0)
return received_value == expected_value
# 使用示例
plc = connect_plc('192.168.1.100')
db_number = 1
start_address = 0
value = 7
while True:
# 将值写入PLC
send_value_to_plc(plc, db_number, start_address, value)
# 检查PLC是否收到了值
if check_value_received(plc, db_number, start_address, value):
print("PLC received the value successfully.")
break
else:
print("PLC didn't receive the value, retrying...")
While+if 循环逻辑
while True:
if condition:
# 这是if语句后面的缩进代码块
# 当条件为真时,这里的代码会被执行
# ...
# 如果条件为假,这里的代码不会被执行
# 这是if语句后面的代码块之外的代码
# 不管if语句的条件真假如何,这里的代码都会被执行
如果plc_config里面是有值的,那不会走到if这条,所以这里放break、continue、pass都不会走到

主要看plc_config是空的时候,当continue,就会一直循环if语句,不执行下面的

主要看plc_config是空的时候,当break,就会把if里面的走一遍,然后直接跳出while true,不会执行while true里面的下行代码了!

主要看plc_config是空的时候,当pass,就相当于没写,会执行while true下行代码

while循环中重连的逻辑
本身调用plc就在一个大循环中,里面套了一个snap7失去连接要重连3次的循环逻辑。
如果try的时候,成功了,就要break,跳出 while retries < max_retries:的循环,不然由于retries小于最大重试次数,它就会一直在try中循环,不下去,如果try报错,就会跳到except,就是把plc重连一下,然后重试次数+1,又会回到try,但只要try成功了,就会跳出循环,就可以执行下面的if语句了!
while self.is_running:
retries = 0
max_retries = 3
while retries < max_retries:
try:
plc_output = get_plc_data(PLC1, int(self.db))
print('connected PLC successfully and plc_output:', plc_output)
break
except Exception as e:
print(f"连接失败,等待重连:{e}")
retries += 1
time.sleep(2) # 等待 2 秒后重试
PLC1 = plc_connection(self.plc_ip)
if plc_output == 1 and is_executed == 0:
# to do...
1465

被折叠的 条评论
为什么被折叠?



