要让 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 编号写错、起始地址越界、数据类型不匹配等常见问题无关。只要错误码含
0x00000080或0x000000A0,且 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 configurationBlocks- ✅
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 → Properties → Attributes → 勾选 Standard block;取消勾选 Optimized block access |
| 下载后 PLC 无法启动(STOP 灯常亮) | 下载时未勾选 Hardware configuration,导致硬件配置与固件不匹配 |
重新下载,务必勾选 Hardware configuration |
Python 脚本能读不能写(db_read 成功但 db_write 报错) |
DB 块被设为“只读”(Read-only 属性启用) |
打开 DB → Properties → Attributes → 取消勾选 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临时切换为英文,避免因翻译差异导致选项遗漏。
八、故障自检流程图(纯文字描述)
“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 后重试脚本]

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