代码基本逻辑

业务逻辑:我要给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...

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值