简介:这份文档面向工业自动化工程师、PLC调试人员及上位机通信初学者,系统讲解KEPServer与西门子S7-1200PLC建立通信连接的完整流程,可用于产线数据采集、远程监控与控制类项目的入门与实操参考。资源以TIA PORTAL V17为测试环境,从新建项目、添加全局DB块并设为非优化访问、编译生成偏移地址,到设备组态中开放PUT/GET通信访问、设置PLC的IP地址并下载在线,再依次完成KEPServer新建通道、选择Siemens TCP/IP Ethernet协议、添加S7-1200设备、配置标签映射,最后用Quick Client同步写入并回读验证变量,环节衔接清楚,便于对照排查通信失败的原因。压缩包共1个文件,为docx文档,约7.43MB,图文步骤配合说明,适合按图索骥地复现整套配置。目前已有2492人学习下载,可作为S7-1200与KEPServer通信的实操参考。
1. 从「PLC 有网口」到「上位系统能读点」:KEPServer 与 S7-1200 建链要解决的真问题
S7-1200 插上网线、上位机 ping 得通,很多人就默认数据能读了,结果在组态软件里建完连接一直报超时。横在中间的其实有三层东西:S7 协议基于 ISO-on-TCP 的 102 端口连接、PLC 侧对绝对地址访问的授权、以及 KEPServer 这一侧通道 / 设备 / 标签的三级模型。KEPServer 在这里扮演的是协议网关加 OPC 服务端——对上用 OPC DA、OPC UA 把数据吐给 SCADA、MES 和产线看板,对下用西门子 TCP/IP 驱动去读写 S7-1200 的 DB、M、I、Q 区。
适合的人群很具体:做产线数据采集、上位机组态、MES 对接的一线工程师,以及第一次把 1200 接进 KEPServer 的人。下面按「PLC 侧改什么 → KEPServer 侧怎么配 → 怎么验证 → 怎么扩到 MQTT」的顺序走一遍,每一步都给到可复制的参数、命令和地址写法。
2. S7-1200 侧的 4 项前置配置:IP、机架槽位、PUT/GET 与 DB 非优化访问
2.1 先确认 102 端口通不通,别只 ping 通就下结论
ping 通只说明 IP 层可达,S7 通信真正走的是 TCP 102 端口。用 PowerShell 直接测端口,比 ping 有价值得多:
# 目标 PLC 的 IP 换成现场实际地址 Test-NetConnection -ComputerName 192.168.0.1 -Port 102 -InformationLevel Detailed # 关注输出里两项: # TcpTestSucceeded : True 表示 102 端口可以建立 TCP 连接 # PingSucceeded : True 表示 ICMP 可达,二者要分开看TcpTestSucceeded 为 True,说明 PLC 的通信栈已经在监听;为 False 而 PingSucceeded 为 True,常见原因是中间有防火墙或路由 ACL 拦了 102,或者网线接在了只走办公网段的交换机口上。老一点的环境也可以用telnet 192.168.0.1 102,能连上就是黑屏不退出,连不上会直接报无法打开到主机的连接。
提示:S7-1200 的以太网口和上位机必须在同一网段,跨网段时先确认路由没有屏蔽 102。
- IP 与子网掩码:在 TIA Portal 的「设备组态 → 属性 → 以太网地址」里设固定 IP,不要依赖 DHCP,否则重上电后 KEPServer 侧的 Device ID 就对不上了。
- 端口:S7 通信固定用 102,不需要在 PLC 侧额外开放,也不需要单独启用某个服务。
2.2 PUT/GET 授权与「优化的块访问」,两个必须动手的开关
这两个设置是新手最容易漏掉的。S7-1200 默认不允许远程伙伴用 PUT/GET 方式读写,而 KEPServer 的西门子驱动正是走这条路。
操作路径(TIA Portal):
- 打开项目,选中 PLC,右键「属性」→「保护与安全」→「连接机制」。
- 勾选「允许来自远程伙伴的 PUT/GET 通信访问」。
- 找到要被采集的 DB 块,右键「属性」→「属性」标签页,取消勾选「优化的块访问」。
- 全编译后下载到 PLC。
第 3 步的原因值得说清楚:勾了「优化的块访问」的 DB 只保留符号信息,没有稳定的绝对偏移量,外部按 DB1.DBW0 这种绝对地址去读会失败,或者读到错位的数据。取消勾选后,DB 内每个变量才有固定的字节偏移,KEPServer 才能按地址寻址。改 DB 属性会触发下载,涉及在线运行的设备要挑停机窗口。
注意:改完 DB 属性如果没重新下载,PLC 里跑的还是旧结构,KEPServer 侧的表现是读数恒为 0 或者质量戳变 Bad。
2.3 机架槽位和连接资源,填错一个就连不上
KEPServer 新建设备时要填 Rack 和 Slot。S7-1200 / S7-1500 是 Rack 0、Slot 1;S7-300 是 Rack 0、Slot 2;S7-400 常见 Rack 0、Slot 2 或 3。把 1200 的 Slot 填成 2,结果就是连接超时或者驱动日志里反复报错。
连接资源也要顺带看一眼:TIA 里 PLC 属性 →「连接资源」页会列出最大连接数和当前占用情况。不同型号上限不一样,从个位数到十几都有。KEPServer 的一个 Channel 到同一台 PLC 通常只占一条 S7 连接,但如果你同时接了触摸屏、另一套组态软件、还有第三方采集程序,就要算总量,超了会表现为「时通时断」。
| KEPServer 侧字段 | S7-1200 侧对应值 | 说明 |
|---|---|---|
| Device ID | PLC 的 IP,如 192.168.0.1 | 与 TIA 里设的固定 IP 一致 |
| Port | 102 | S7 通信固定端口,不要改 |
| Rack | 0 | S7-1200 / 1500 固定为 0 |
| Slot | 1 | S7-1200 为 1,写 2 必失败 |
| Model | S7-1200 | 选错型号,地址解析会异常 |
| 优化的块访问 | 已取消勾选 | DB 拥有绝对偏移的前提 |
3. KEPServer 端新建 Siemens TCP/IP Ethernet 通道与 S7-1200 设备
3.1 建 Channel:驱动、网卡、写优化三个关键选择
路径:KEPServerEX 配置界面左侧树,右键「Connectivity」→「New Channel」→ 输入名称(比如 PLC_Line1)→ Device driver 选「Siemens TCP/IP Ethernet」→ 选择网卡 → 完成。
Channel 层参数不少,真正影响稳定性的就三个:
| 参数 | 推荐值 | 作用与调法 |
|---|---|---|
| Network Interface | 指向 PLC 所在网段的那块网卡 | 多网卡机器上选错,会一直连不上 |
| Write Optimization | Write only on change(默认) | 减少无谓写入;调试阶段可临时改 Always |
| Auto-Demotion | 启用,失败 3 次降级,降级 10000 ms | 断线后不打爆 PLC,恢复后自动回连 |
Auto-Demotion 值得单独说:不启用时,PLC 一断,驱动会按扫描周期持续重连,网络恢复的瞬间容易产生连接风暴,轻则报错刷屏,重则让 PLC 的通信资源被占满。启用后,连续失败 N 次的设备会被降级,按设定的时间间隔再试。产线上网络抖动频繁的场景,建议打开。
3.2 建 Device:IP、Rack/Slot 与扫描周期怎么填
右键刚建的 Channel →「New Device」,向导里逐项填:
- Name:建议带产线或工位前缀,比如 LINE1_STATION3,后面 OPC UA 节点路径就是由它拼出来的。
- Model:选 S7-1200,一定展开对应系列,别随手选成 S7-300。
- Device ID:PLC 的 IP 地址,填 IP 就行,不用带端口。
- 连接参数:Port 102、Rack 0、Slot 1。
- Scan Rate:设备级默认扫描周期,现场常用 100~1000 ms,高频点位在 Tag 上单独覆盖。
扫描周期不是越小越好。100 ms 意味着每秒 10 次请求,点位一多,PLC 的通信负载会明显上升。比较稳妥的做法是设备级给 1000 ms 打底,把真正需要快速响应的少数点位在 Tag 级设到 100~200 ms。
| 场景 | 设备级 Scan Rate | Tag 级覆盖 |
|---|---|---|
| 温度、液位等慢变量 | 1000 ms | 不覆盖 |
| 设备状态字、报警位 | 500 ms | 200 ms |
| 节拍计数、位置反馈 | 200 ms | 100 ms |
3.3 Tag 地址语法与 CSV 批量导入
KEPServer 的西门子 TCP/IP 驱动用绝对地址寻址,常用写法如下:
| 地址写法 | 对应 PLC 地址 | 建议数据类型 |
|---|---|---|
| DB1,X0.0 | DB1.DBX0.0 | Boolean |
| DB1,B0 | DB1.DBB0 | Byte |
| DB1,D0 | DB1.DBW0 | Short / Word |
| DB1,DW2 | DB1.DBD2 | DWord / Float |
| M0、M10.0 | M0、M10.0 | Word / Boolean |
| I0.0、Q0.0 | 输入输出区 | Boolean |
手动建十几个点还能接受,上百个点必须走导入。KEPServer 支持 Tag 的 CSV 导出与导入:先在设备下建一个点,右键「Export Tags」拿到模板,按列填好后「Import Tags」。用脚本生成比手敲可靠:
Tag Name,Address,Data Type,Scan Rate,Description,Scaling LINE1_TEMP01,DB10,D0,Short,1000,挤出机一区温度, LINE1_SPEED,DB10,DW2,Float,200,主机转速, LINE1_RUN,DB10,X0.0,Boolean,200,运行状态, LINE1_ALARM,DB10,X6.3,Boolean,200,急停报警,导入时几个容易踩的点:地址列不要带空格,数据类型要和 DB 里实际声明的类型一致(DB 里是 Real 就得选 Float,选成 DWord 读出来会是一个奇怪的大整数);Scan Rate 列留空表示沿用设备级设置。导入完成后打开某个 Tag 的属性页,KEPServer 会把地址语法反解一遍,能正常显示成 DB10、D0 这样的形式,说明格式被正确识别了。
4. 用 OPC Quick Client 与 OPC UA 客户端验证链路,并处理 5 类典型故障
4.1 OPC Quick Client 看 Value / Quality / Timestamp
KEPServer 菜单「Tools → Launch OPC Quick Client」。新建一个 OPC DA 连接,ProgID 选 Kepware.KEPServerEX.V6,连上后展开 Channel → Device,把 Tag 拖到右侧观察区。
三个字段各有含义:Value 是驱动解析后的值;Quality 是链路健康度,Good 表示读到了;Timestamp 是驱动更新该点的时间戳。Quality 长期 Bad,说明请求根本没成功,这时候别只盯着 Value 是不是 0。
| Quality 表现 | 含义 | 先查什么 |
|---|---|---|
| Good | 正常读写 | 无 |
| Bad | 请求失败 | 网线、102 端口、DB 偏移 |
| Uncertain | 有值但不可信 | 刚启动,或通信中断后的残留值 |
| 反复 Good / Bad 跳变 | 间歇性断链 | 连接资源耗尽、交换机、Auto-Demotion 设置 |
4.2 用 Python 走 OPC UA 再验一次
工程上更常见的消费端是 OPC UA。KEPServerEX 自带 OPC UA Server,默认监听 49320(生产环境记得改配置并启用认证)。用 asyncua 拉一个点:
import asyncio from asyncua import Client ENDPOINT = "opc.tcp://192.168.0.10:49320" # KEPServer 所在机器 IP + OPC UA 端口 NODE_ID = "ns=2;s=PLC_Line1.LINE1_STATION3.LINE1_TEMP01" # Channel.Device.Tag class Handler: def datachange_notification(self, node, val, data): print(node, val) async def main(): # KEPServer 的 OPC UA Server 默认允许匿名接入,无需账号密码 async with Client(url=ENDPOINT) as client: node = client.get_node(NODE_ID) value = await node.read_value() # 单次读取 print("value =", value) sub = await client.create_subscription(500, Handler()) # 500ms 采样间隔 await sub.subscribe_data_change(node) await asyncio.sleep(10) asyncio.run(main())代码逻辑:先用 endpoint 建立会话,get_node 用 NodeId 字符串定位到具体点位,read_value 做一次同步读;后半段是订阅模式,采样间隔 500 ms,比轮询省资源。参数上有两个容易搞错的地方——ENDPOINT 里的 IP 是 KEPServer 所在机器的地址,不是 PLC 的 IP;NODE_ID 的结构是 Channel 名 + Device 名 + Tag 名,中间用点分隔,前缀 ns=2 表示 KEPServer 的私有命名空间。连不上时先确认 OPC UA Server 有没有启用。
4.3 五类典型故障的定位顺序
| 现象 | 大概率原因 | 处理 |
|---|---|---|
| Device 一直转圈连不上 | Rack/Slot 填错,或 102 不通 | 改 Slot=1,先跑端口测试 |
| 能连上但所有点都是 Bad | PUT/GET 未勾选,或 DB 仍是优化访问 | 回 TIA 改两项并重新下载 |
| 部分点 Bad、部分 Good | 地址偏移写错、数据类型不匹配 | 对照 DB 声明逐个核对偏移 |
| 值正常但恒为 0 | 地址落在未使用的 DB 区,或偏移算错 | 用 PLC 监控表核对同一偏移 |
| 白天正常、夜班频繁断 | 连接资源被其他客户端抢占 | 看 PLC 的连接资源占用页 |
排查顺序建议固定成一条线:端口 → 通道与设备参数 → PUT/GET 与 DB 属性 → 地址偏移 → 数据类型。越往前越省时间,不要一上来就怀疑 KEPServer 本身有问题。
5. 让 KEPServer 的数据流向 MQTT:两条路径与批量建点的收尾技巧
标题外的热搜问题「kepserver 可以对接 mqtt 吗」,答案是可以,而且有两个方向完全不同的做法,选错方向会白折腾半天。
5.1 IoT Gateway:把采集到的点位发布到 Broker
这是最常见的用法。装好 KEPServerEX 的 IoT Gateway 插件后,配置界面会多出「IoT Gateway」节点,新增一个 Agent,传输方式选 MQTT,填 Broker 地址、端口、Client ID、用户名密码,再勾选要发布的 Tag。数据以 JSON 发出:
{ "timestamp": 1732500000000, "values": [ { "id": "PLC_Line1.LINE1_STATION3.LINE1_TEMP01", "v": 186.4, "q": true, "t": 1732500000000 }, { "id": "PLC_Line1.LINE1_STATION3.LINE1_RUN", "v": true, "q": true, "t": 1732500000000 } ] }id 是 Tag 的完整路径,v 是值,q 是质量位,t 是毫秒时间戳。发布周期在 Agent 的 Rate 里设,最小 100 ms,但现场通常拉到 1000 ms 更稳。这条链路是 PLC → KEPServer → Broker → 平台,KEPServer 站在生产端。
5.2 MQTT Client 驱动:把 Broker 当成数据源
另一个方向容易被混淆:KEPServerEX 里的「MQTT Client」是一个设备驱动,作用是让 KEPServer 作为 MQTT 客户端去订阅 Broker 上的主题,把收到的话题内容当作 Tag 读进来。它解决的是「现场已有 MQTT 数据,想统一收敛到 OPC UA」的问题。两者区别一句话:IoT Gateway 是往外推,MQTT Client 驱动是往里收。
5.3 批量建点的收尾技巧
点位上千的时候,CSV 手写不现实,用脚本按「基础偏移 + 步长」生成更可靠:
# 生成 KEPServer 可直接导入的 Tag CSV rows = ["Tag Name,Address,Data Type,Scan Rate,Description"] base = 0 # DB10 的起始字节偏移 for i in range(1, 33): # 32 路温度 rows.append(f"LINE1_TEMP{i:02d},DB10,D{base},Short,1000,温度通道{i},") base += 2 # Word 类型占 2 字节 with open("tags_line1.csv", "w", encoding="utf-8") as f: f.write("\n".join(rows))偏移累加用 2 字节一档,是因为 Word 类型占两个字节;换成 Float 就要按 4 字节步进。混用类型时,先按 DB 里声明的顺序把偏移表算准,再生成 CSV,否则导入后会出现「前半段正常、后半段全 Bad」。导入前先备份工程文件(File → Save As),导入失败能立刻回退。
导入完成后在 Quick Client 里全选点位反查一遍 Quality,确认没有成片的 Bad,再把 KEPServer 的 OPC UA 端点交给上层平台使用;这时候去核对 IoT Gateway 的发布主题,往往还能顺手发现几个漏配的 Tag。
本文还有配套的精品资源,点击获取