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默认限制外部访问,必须手动开启:
- 进入CPU属性的「保护与安全>连接机制」
- 勾选「允许从远程伙伴(PLC、HMI、OPC UA...)通过PUT/GET通信访问」
- 确认「允许来自远程对象的S7通信」处于启用状态
- 深度验证网络连通性:
- 用snap7自带工具测试:命令行执行
snap7cli -c <PLC_IP> <RACK> <SLOT>,看能否成功建立连接 - 排查防火墙:本地电脑防火墙要放行102端口TCP流量,PLC所在网段的交换机/防火墙也不能拦截102端口
- 用snap7自带工具测试:命令行执行
- 优化代码连接逻辑:你现在循环里每次都新建
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
相关产品推荐
相关产品推荐

