Python脚本通过Snap7库连接S7-1200时PUT/GET权限被禁用的CPU属性开启

发布于 2026-03-17 00:31:26 · 浏览 3 次 · 评论 0 条

要让 Python 脚本通过 python-snap7 库成功对 S7-1200 PLC 执行 PUT(写入)和 GET(读取)操作,必须手动启用 CPU 的“允许从远程伙伴使用 PUT/GET 通信访问”属性。该设置默认为禁用,且不依赖于防火墙、IP 配置或 Snap7 版本——它是 S7-1200 硬件级的强制安全策略。以下为完整、可复现的操作指南。


一、确认问题现象(快速定位是否为此原因)

当 Python 脚本调用 client.write_area()client.read_area() 时出现以下任一报错,即高度指向此权限未开启:

  • Snap7Exception: CPU : Function not available (0x00000080)
  • Snap7Exception: CPU : Access denied (0x000000A0)
  • Snap7Exception: CPU : Object does not exist (0x00000090)(针对 DB 块编号正确但仍报错时)

⚠️ 注意:这些错误与 DB 块未下载、DB 编号写错、起始地址越界、数据类型不匹配等常见问题无关。只要错误码含 0x000000800x000000A0,且 PLC 在线、IP 可 ping 通、TIA Portal 能正常在线监控,则 99% 是此 CPU 属性未启用。


二、启用 PUT/GET 权限的完整步骤(TIA Portal V15.1 及以上)

1. 打开项目并进入设备配置

  • 在 TIA Portal 中打开包含 S7-1200 的项目.ap15.ap16 文件)。
  • 在项目树中,双击 Devices & Networks → 展开 PLC 节点 → 双击目标 S7-1200 设备(如 PLC_1)。

2. 进入 CPU 属性设置

  • 在设备视图右侧,切换到 Properties 标签页。
  • 左侧导航栏中,依次展开:
    Protection & Security → Access protection → Communication

3. 启用关键复选框

  • 找到选项:Allow PUT/GET communication from remote partners
  • 勾选该复选框(默认为未勾选)。
  • 此时下方会自动显示提示文字:
    "Enabling this option allows remote partners to read and write data using the PUT/GET instructions."

4. 保存并下载配置

  • 点击工具栏的 Save 图标(磁盘图标),确保属性已保存至项目。
  • 右键点击设备名称(如 PLC_1)→ 选择 Download to device...
  • 在下载对话框中,勾选:
    • Hardware configuration
    • Blocks
    • Transfer compatible blocks only(推荐,避免误删在线块)
  • 点击 Start download,等待状态变为 Download successful

✅ 验证要点:下载完成后,CPU 会自动重启一次(RUN 指示灯先灭后亮)。这是正常现象,表明新配置已加载。


三、为什么必须在硬件配置中设置?(原理说明)

S7-1200 的 PUT/GET 访问控制是固化在 CPU 固件中的底层通信门控机制,而非运行时软件开关。其本质是 CPU 对 ISO-on-TCP 协议第 27 号功能(Read/Write Data Block)的访问白名单策略:

  • 当该属性禁用时,CPU 在收到 SZL ID 0x0011, Index 0x0004(PUT/GET 使能状态查询)请求后,始终返回 0x00(禁用);
  • Snap7 在建立连接后,会主动发送此查询;若返回禁用,后续所有 PUT/GET 请求均被 CPU 硬件直接拒绝,并返回错误码 0x00000080
  • 此机制独立于:
    • Protection 标签页中的“CPU 访问级别”(那是针对 HMI/PG 的密码保护);
    • Firewall 设置(它只管控端口通断,不干预协议级指令授权);
    • Permitted IP addresses 列表(该列表仅用于 Web Server 或 FTP,对 PUT/GET 无效)。

因此,仅修改网络参数或 Python 代码无法绕过此限制


四、Python 脚本验证方法(无需额外库)

使用以下最小化脚本测试权限是否生效(需已安装 python-snap7>=1.12.0):

import snap7

client = snap7.client.Client()
try:
    client.connect('192.168.0.1', 0, 1)  # 替换为实际 PLC IP、机架号、插槽号
    print("✅ 连接成功")

    # 尝试读取系统信息(不依赖 PUT/GET,仅测试基础连接)
    info = client.get_cpu_info()
    print(f"CPU 型号: {info.ModuleTypeName.decode().strip()}")

    # 尝试读取 DB1 中 DBB0 字节(需确保 DB1 已创建且含至少 1 字节)
    data = client.db_read(1, 0, 1)
    print(f"✅ GET 成功,读取值: {data[0]}")

    # 尝试写入 DB1 中 DBB0 字节
    client.db_write(1, 0, bytearray([42]))
    print("✅ PUT 成功")

except Exception as e:
    print(f"❌ 失败: {e}")

finally:
    client.disconnect()
  • 若输出含 ✅ GET 成功✅ PUT 成功 → 权限已启用;
  • 若卡在 client.db_read() 并抛出 0x00000080 错误 → 权限未启用或 DB 不存在;
  • client.connect() 失败 → 检查 IP、网段、物理连接,与此权限无关。

五、常见误区与排查清单

现象 真实原因 正确解决方式
启用后仍报 0x000000A0(Access denied) DB 块未设置为“优化的块访问”关闭,或 DB 属性中“Standard block”未勾选 在 TIA Portal 中打开 DB → PropertiesAttributes → 勾选 Standard block取消勾选 Optimized block access
下载后 PLC 无法启动(STOP 灯常亮) 下载时未勾选 Hardware configuration,导致硬件配置与固件不匹配 重新下载,务必勾选 Hardware configuration
Python 脚本能读不能写(db_read 成功但 db_write 报错) DB 块被设为“只读”(Read-only 属性启用) 打开 DB → PropertiesAttributes取消勾选 Read-only
使用旧版 TIA Portal(V13/V14)找不到该选项 该属性在 V15.1 才正式引入;V14 及更早版本无此设置项 升级至 TIA Portal V15.1 或更高版本

🔑 关键结论:Allow PUT/GET communication from remote partners 是唯一必需且充分的设置项。其他任何操作(如关闭防火墙、添加 IP 白名单、修改 OB1)对此错误均无效。


六、安全提醒(生产环境必读)

启用 PUT/GET 后,任何能访问 PLC IP 的设备均可读写内存区域,存在严重安全风险:

  • 禁止在公网或未隔离网络启用此选项
  • 生产环境中,应配合以下措施
    • 将 PLC 与上位机置于独立 VLAN;
    • 在交换机端口启用 MAC 地址绑定;
    • 使用工业防火墙限制仅允许上位机 IP 的 TCP 102 端口入站;
    • 定期审计 PLC 日志(需启用 Diagnostics buffer 中的 Communication events)。

⚠️ 不建议在无人值守现场长期启用该选项。如需长期通信,请改用 S7 协议的安全替代方案(如 OPC UA over TLS + 用户认证)。


七、附:TIA Portal 界面文字对照表(多语言用户参考)

英文界面文本 中文界面文本(简体) 德文界面文本
Allow PUT/GET communication from remote partners 允许从远程伙伴使用 PUT/GET 通信访问 PUT/GET-Kommunikation von Remotepartnern zulassen
Standard block 标准块 Standardbaustein
Optimized block access 优化的块访问 Optimierte Blockzugriffe
Read-only 只读 Schreibgeschützt

💡 提示:若界面语言非英文,可通过 TIA Portal Options → Settings → General → Language 临时切换为英文,避免因翻译差异导致选项遗漏。


八、故障自检流程图(纯文字描述)

graph TD A[Python 脚本报 0x00000080 或 0x000000A0] --> B{PLC 是否在线?} B -->|否| C[检查网线、IP、子网掩码、网关] B -->|是| D{TIA Portal 中是否启用
“Allow PUT/GET communication...”?} D -->|否| E[按第二部分步骤启用并下载] D -->|是| F{DB 块是否为 Standard block?} F -->|否| G[DB 属性中勾选 Standard block] F -->|是| H{DB 是否被设为 Read-only?} H -->|是| I[DB 属性中取消勾选 Read-only] H -->|否| J[检查 DB 编号、地址偏移量、数据长度是否合法] E --> K[重新下载硬件配置] G --> K I --> K K --> L[重启 PLC 后重试脚本]

评论 (0)

暂无评论,快来抢沙发吧!

扫一扫,手机查看

扫描上方二维码,在手机上查看本文