我们想通过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() # 断开连接并准备重新连接
这段代码做了以下改进:
- 错误处理与重试 :
-
使用
try-except
块捕获Snap7Exception
异常,以便在连接或通信失败时优雅地处理。 -
实现了一个重试机制,在连接失败时尝试最多
max_retries
次重新连接到 PLC,并在每次尝试之间等待retry_interval
秒。 - 日志记录 :
-
使用
logging
模块将连接尝试、错误和成功消息记录到文件 (plc_connection.log
) 中,以便于调试和监控。 - 代码结构 :
- 将连接逻辑与数据读写逻辑分离,使代码更易读和维护。
- 注释 :
- 添加了更多注释来解释代码的功能和逻辑。
其他改进建议 :
- 动态IP地址 : 如果你的PLC的IP地址可能会改变,可以考虑使用DHCP或mDNS等方法动态获取IP地址,并在代码中实现相应的逻辑。
-
信号处理
: 使用
signal
模块捕获KeyboardInterrupt
信号,以便在用户按下 Ctrl+C 时优雅地退出程序。 - 看门狗 : 可以添加一个看门狗机制,定期检查 PLC 连接状态,并在连接断开时尝试重新连接。
希望这些改进能够帮助你建立一个更健壮的 PLC 连接程序!
标签:python,tcp,raspberry-pi From: 42643340