首页 > 编程问答 >不断自动搜索连接snap7

不断自动搜索连接snap7

时间:2024-08-02 15:22:11浏览次数:10  
标签:python tcp raspberry-pi

我们想通过wifi自动连接PLC。当树莓派启动并自动运行他的程序时。它应该是一个独立的树莓派,所以我们没有键盘或任何东西。我们通过 snap7 发送数据。 这可行,但如果 wifi 断开连接,我会收到此错误:“ISO:接收 TCP 期间发生错误:连接超时” 有时在程序开始时我们会收到此错误:“Snap7Exception:TCP:无法到达的对等点”

我的程序停止了,但我们应该有一些东西,以便我们的 wifi 再次重新连接而无需停止程序。我想我们需要一些东西来捕获我们的错误并在程序中使用它来尝试或其他东西。

此时我的程序:

import snap7
import struct
import time
from snap7.snap7exceptions import Snap7Exception
import re
from ctypes import c_int, c_char_p, byref, sizeof, c_uint16, c_int32, c_byte
from ctypes import c_void_p

client = snap7.client.Client()

db_number = 109

print('Press Ctrl-C to quit.')

while True:

    if client.get_connected() == False: 
        client.connect('192.168.5.2', 0, 1) #('IP-address', rack, slot)
        print('not connected')
        time.sleep(0.2)
    else:
        print('connected')

import snap7
import struct
import time
from snap7.snap7exceptions import Snap7Exception
import logging

# 设置日志记录
logging.basicConfig(filename='plc_connection.log', level=logging.INFO, 
                    format='%(asctime)s - %(levelname)s - %(message)s')

client = snap7.client.Client()

db_number = 109
ip_address = '192.168.5.2'
rack = 0
slot = 1

# 连接重试参数
max_retries = 10
retry_interval = 5

print('Press Ctrl-C to quit.')

while True:
    if not client.get_connected():
        logging.info("Attempting to connect to PLC...")
        for attempt in range(max_retries):
            try:
                client.connect(ip_address, rack, slot)
                if client.get_connected():
                    logging.info("Connection to PLC successful!")
                    break  # 连接成功,退出重试循环
                else:
                    logging.warning(f"Connection attempt {attempt+1} failed. Retrying in {retry_interval} seconds...")
                    time.sleep(retry_interval)
            except Snap7Exception as e:
                logging.error(f"Error connecting to PLC: {e}")
                time.sleep(retry_interval)
        else:
            logging.critical(f"Failed to connect to PLC after {max_retries} attempts. Exiting.")
            # 可以选择在此处退出程序或采取其他措施,例如发送警报
            # exit(1) 
    else:
        try:
            # 在此处添加你的PLC数据读取或写入代码
            # 例如:
            # data = client.db_read(db_number, start=0, size=4)
            # print("Data from PLC:", data)
            time.sleep(1)  #  避免循环过快
        except Snap7Exception as e:
            logging.error(f"Error communicating with PLC: {e}")
            logging.info("Attempting to reconnect...")
            client.disconnect()  # 断开连接并准备重新连接

这段代码做了以下改进:

  1. 错误处理与重试 :
  2. 使用 try-except 块捕获 Snap7Exception 异常,以便在连接或通信失败时优雅地处理。
  3. 实现了一个重试机制,在连接失败时尝试最多 max_retries 次重新连接到 PLC,并在每次尝试之间等待 retry_interval 秒。
  4. 日志记录 :
  5. 使用 logging 模块将连接尝试、错误和成功消息记录到文件 ( plc_connection.log ) 中,以便于调试和监控。
  6. 代码结构 :
  7. 将连接逻辑与数据读写逻辑分离,使代码更易读和维护。
  8. 注释 :
  9. 添加了更多注释来解释代码的功能和逻辑。

其他改进建议 :

  • 动态IP地址 : 如果你的PLC的IP地址可能会改变,可以考虑使用DHCP或mDNS等方法动态获取IP地址,并在代码中实现相应的逻辑。
  • 信号处理 : 使用 signal 模块捕获 KeyboardInterrupt 信号,以便在用户按下 Ctrl+C 时优雅地退出程序。
  • 看门狗 : 可以添加一个看门狗机制,定期检查 PLC 连接状态,并在连接断开时尝试重新连接。

希望这些改进能够帮助你建立一个更健壮的 PLC 连接程序!

标签:python,tcp,raspberry-pi
From: 42643340

相关文章

  • {Python} 有没有办法从函数中“提取”返回值变量并在其他地方使用它,而不调用原始函数?
    第一次在这里发帖。对python来说相对较新,我正在开发一个程序,它基本上是一个随机故事生成器,用于学习语言、发展技能并添加到我的投资组合中。我有一个主文件(最初启动该程序)、一个简介文件(对于介绍部分,获取用户名以及我试图“提取”user_name变量的位置),一个函数文件,其中包......
  • 为什么我在 Python 中的 Skip-Gram 实现会产生不正确的结果?
    我正在使用Python实现Word2Vec的Skip-Gram模型。然而,正如生成的嵌入及其可视化所示,我的模型似乎无法正常工作。这是嵌入的3D图的示例,它显示单词聚集在一起并重叠,因此很难区分它们:我怀疑问题在于我的实现而不是绘图函数。importnumpyasnpfromnltk.corpusimpor......
  • 基于SpringBoot的智能购房推荐系统-09040(免费领源码)可做计算机毕业设计JAVA、PHP、爬
    Springboot智能购房推荐系统摘 要近年来随着我国经济的高速发展,房地产业也随之蓬勃发展,尤其是最近国家新出台的房改政策。鼓励居民购房,这对房产公司无疑是一个极好的发展势头。尤为重要的是,近几年随着信息技术和电子商务的快速发展,许多企业都开发了自己房产信息软件。智......
  • Python 基础教学 - 开发规范
    Python基础教学-开发规范一、引言在Python编程中,遵循良好的开发规范是编写高质量、可维护代码的关键。本文将为您详细介绍Python开发中的一些重要规范,帮助您养成良好的编程习惯。二、代码布局缩进使用4个空格进行缩进,避免使用制表符。示例:ifTrue:p......
  • Python基础学习笔记(一)
    文章目录一、下载Python二、变量三、数据类型四、运算符五、语句六、容器类型七、函数function八、常用API九、面向对象类的创建:创建对象:实例成员:实例方法:类成员:静态方法:十、三大特征:封装、继承、多态十一、六大原则:Python基础学习笔记(二)一、下载Python官网:https......
  • 随机森林的可解释性分析(含python代码)
    随机森林的可解释性分析1.引言可解释性的重要性2.随机森林的原理2.1基本原理:2.2随机森林的实现3.随机森林的可解释性分析3.1特征重要性3.2特征重要性3.3SHAP值3.4部分依赖图(PDP)3.5交互特征效应3.6变量依赖图4.结论5.参考文献1.引言在机器学习领域,随机森林......
  • 【Python】模块
    1.模块的概念Python中有一种方法可以把定义放在一个文件里面,并在脚本或者解释器的交互实例中使用它们。这样的文件被称作Python的模块。2.自定义模块在Python中,自定义模块有两个作用,一个作用是规范代码,让代码更容易阅读;另一个作用是方便其他程序使用已经编写好的代码,提高开......
  • 计算机毕业设计-基于python的房屋租赁系统【源码+文档+PPT】
    精彩专栏推荐订阅:在下方主页......
  • 基于python高考志愿填报辅助系统【源码+文档+PPT】
    精彩专栏推荐订阅:在下方主页......
  • nb python 语法
    在bytesized32的开源代码里面看到了一个玄学内容。whileTrue:try:stream=call_gpt(stream=True,model=model,messages=messages,**kwargs)pbar=tqdm(stream,unit="token",total=kwargs.get("max_tokens",8*1024),leave=......