You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python读取S7-1500 PLC遇'Unreachable peer'及'Address out of range'报错求助

S7-1500 PLC数据读取异常排查方案

一、解决'Unreachable peer'连接失败问题

  • 核对Rack和Slot参数:S7-1500的机架、槽位不一定是0和1,别直接沿用S7-300的配置。打开TIA Portal,找到目标CPU,查看属性里的「常规>设备组态>位置」,获取真实的Rack和Slot值。
  • 开启PLC的S7通信权限:S7-1500默认限制外部访问,必须手动开启:
    1. 进入CPU属性的「保护与安全>连接机制」
    2. 勾选「允许从远程伙伴(PLC、HMI、OPC UA...)通过PUT/GET通信访问」
    3. 确认「允许来自远程对象的S7通信」处于启用状态
  • 深度验证网络连通性:
    • 用snap7自带工具测试:命令行执行 snap7cli -c <PLC_IP> <RACK> <SLOT>,看能否成功建立连接
    • 排查防火墙:本地电脑防火墙要放行102端口TCP流量,PLC所在网段的交换机/防火墙也不能拦截102端口
  • 优化代码连接逻辑:你现在循环里每次都新建plc对象,容易耗尽连接资源。把plc = snap7.client.Client()移到循环外,或者每次连接后调用plc.disconnect()释放资源。

二、解决'Address out of range'地址越界问题

  • 检查DB块的访问设置:
    • 若DB块是「优化的块访问」,snap7无法直接通过偏移地址读取。在TIA Portal里修改DB块属性,取消「优化的块访问」,同时勾选「访问路径>允许来自外部的通过PUT/GET访问」
    • 确认DB块实际大小:在TIA Portal查看DB块的「信息>大小」,确保你要读取的偏移地址+读取长度不超过总字节数
  • 核对读取参数:调用snap7的db_read函数时,参数顺序是db_number, start_offset, read_length,别搞混顺序,且start_offset不能超出DB块的地址范围
  • 检查DB块权限:进入DB块属性的「保护」选项,确保没有设置禁止外部读取的权限

三、代码优化参考

你的现有代码缺少读取逻辑和资源释放,建议调整:

import snap7
from snap7.exceptions import Snap7Exception
import time

rack = 0
slot = 1

def profinet(plc_ip_address, rack, slot, r_db_number, Plant, Packet):
    plc = snap7.client.Client()  # 客户端对象只初始化一次
    while True:
        try:
            if not plc.get_connected():
                plc.connect(plc_ip_address, rack, slot, 102)
            # 示例:读取DB块中偏移0开始的10个字节
            data = plc.db_read(r_db_number, 0, 10)
            # 这里添加数据解析、处理逻辑
            print(f"读取到数据: {data}")
        except Snap7Exception as e:
            print(f"异常: {e}")
        finally:
            # 若需要持续连接可注释disconnect,否则每次读取后断开
            # if plc.get_connected():
            #     plc.disconnect()
            pass
        time.sleep(1)  # 添加延时,避免频繁请求

内容的提问来源于stack exchange,提问作者Thiwanka Gunasinghe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 21:40:24