简介:这份文档面向工业自动化工程师、PLC编程调试人员及工控通信初学者,系统讲解KEPServer与西门子S7-1200 PLC建立通信连接的完整过程,解决不同品牌设备与PLC之间数据交互、远程监控与控制的实操问题。资源为单一docx文档,压缩包约7.43MB,内容以图文步骤说明为主,配合TIA Portal V17的界面截图逐项讲解。文档从测试环境搭建切入,涵盖在博途中新建项目、添加非优化访问的全局DB块并定义4个变量、编译后获取偏移地址、在防护与安全中开放PUT/GET通信访问、设置PLC地址为192.168.10.201等关键配置,再到KEPServer中新建Siemens TCP/IP Ethernet通道、添加S7-1200设备、按偏移地址建立标签映射,最后利用Quick Client同步写入并回读变量值以验证通信质量。读者可据此掌握通道、设备、标签三层配置逻辑及常见通信失败排查思路。目前已有2492人学习下载,适合需要打通上位机与PLC数据链路的技术人员参考。
1. 从 DB 块偏移地址到 OPC 标签:S7-1200 与 KEPServer 通信链路拆解
PLC 程序明明在线跑着,上位机就是读不到值——这是 KEPServer 接 S7-1200 最常见的开局。问题通常不在 KEPServer 界面点错哪一处,而在这条链路上有四个串联环节必须同时成立:KEPServer 的 Siemens TCP/IP Ethernet 驱动发起 S7 通信、PLC 的 102 端口正常响应、CPU 的 PUT/GET 服务放行远程读写、DB 块的绝对偏移地址与标签地址严格对齐。任意一环不成立,Quick Client 里看到的都是一个 Bad,而不是一句明确的错误提示。
这套组合的典型场景是:Windows 工控机上装 KEPServer 做数据汇聚,向下采 S7-1200 的 DB 变量,向上给 SCADA、MES 或自研程序提供 OPC 接口。适合需要在 TIA Portal V17 与 KEPServer 之间打通数据通道的上位机开发者、自动化工程师,也适合只是想临时验证几个变量读写的人。下面按 TIA Portal 侧配置、KEPServer 建通道加设备、标签地址映射与验证、批量维护与转发的顺序拆开讲,每一步都给出可对照的参数。
2. TIA Portal V17 侧的三个前置开关
PLC 侧配置错一处,后面 KEPServer 怎么点都白搭。这一章要落地的只有三件事:DB 块改成非优化访问、防护与安全里放行 PUT/GET、网络参数与上位机同网段。
2.1 非优化块访问为什么是硬性前提
TIA Portal 新建的全局 DB 块默认勾选"优化的块访问"。优化访问模式下,变量按数据类型在内部重排存储,编译器不承诺固定绝对地址,外部客户端拿DB1.DBX0.0去寻址,读到的可能是另一个变量,也可能直接被拒绝。
操作路径:项目树中右键目标 DB 块 → 属性 → 属性标签页 → 取消勾选"优化的块访问" → 确定 → 重新编译。编译完成后,DB 块打开时会多出一列"偏移量",这就是后续 KEPServer 地址的唯一依据。
注意:改成非优化后,PLC 程序里按符号名访问的语句不受影响,但一旦再调整变量声明顺序,偏移地址会整体变化,KEPServer 侧标签必须同步修改。
2.2 四个变量的地址规划与对齐规则
假设按下面的声明顺序在 DB 块里建四个变量,编译后偏移量如下:
| 变量名 | 数据类型 | 编译后偏移量 | KEPServer 地址 | KEPServer 数据类型 |
|---|---|---|---|---|
| btnStart | Bool | 0.0 | DB1.DBX0.0 | Boolean |
| btnStop | Bool | 0.1 | DB1.DBX0.1 | Boolean |
| setValue | Int | 2 | DB1.DBW2 | Short |
| runSpeed | Real | 4 | DB1.DBD4 | Float |
Bool 只占 1 位,两个 Bool 挤在字节 0 里;Int 必须从偶数字节起算,所以自动跳到字节 2;Real 占 4 字节,紧接其后落在字节 4。如果声明顺序里再插入一个 Bool,Int 的起始字节可能被推到 4 甚至更后。所以别手算,编译后照着"偏移量"列抄。
2.3 放行 PUT/GET 并核对网络参数
设备组态中选中 PLC → 属性 → 常规 → 防护与安全 → 连接机制 → 勾选"允许来自远程对象的 PUT/GET 通信访问"。这个选项关闭时,KEPServer 的设备状态可能显示已连接,但所有标签读出来都是 Bad,非常容易被误判成地址写错。
网络侧保持下表参数一致,掩码相同、网关可留空:
| 角色 | IP 地址 | 子网掩码 | 通信端口 |
|---|---|---|---|
| KEPServer 所在工控机 | 192.168.10.31 | 255.255.255.0 | 动态 |
| S7-1200 CPU | 192.168.10.201 | 255.255.255.0 | 102 |
在下载程序之前,先在工控机的 PowerShell 里把链路确认一遍,比在 KEPServer 里反复重建设备高效得多:
# 1. 确认与 PLC 二层可达,丢包为 0 才继续 ping 192.168.10.201 # 2. 确认 S7 通信端口 102 处于监听状态,TcpTestSucceeded 应为 True Test-NetConnection -ComputerName 192.168.10.201 -Port 102 # 3. 列出本机在该网段的网卡与 IP,KEPServer 建通道时要按这块网卡选 Get-NetIPAddress -AddressFamily IPv4 | Where-Object { $_.IPAddress -like "192.168.10.*" }第二步返回 False 时,先查 Windows 防火墙的出站规则和物理链路,不要动 KEPServer。第三步的意义在于:多网卡机器上如果 KEPServer 通道选错了网卡,流量会从另一块网卡出去,表现为设备一直连不上,而 ping 又是通的。
配置改完,编译无错后下载到 CPU,转至在线模式,确认四个变量的当前值在监控表里能正常显示。这一步是后面所有验证的基线。
3. KEPServer 通道与设备创建:Siemens TCP/IP Ethernet 参数逐个过
通道和设备是两层结构:通道对应一种驱动协议和一块网卡,设备对应一台具体 PLC。名字取得规范一点,后面 OPC 节点 ID 会好看很多。
3.1 新建通道向导每一页在设什么
右键"连接性" → 新建通道,进入向导。各页设置项与影响如下:
| 向导页面 | 设置项 | 建议值 | 影响 |
|---|---|---|---|
| 通道类型 | 驱动协议 | Siemens TCP/IP Ethernet | 决定后续可选的设备型号 |
| 通道名称 | Channel name | 如 S7_1200_Line | 会出现在 OPC 节点 ID 里 |
| 网卡选择 | Network Adapter | 192.168.10.31 对应的网卡 | 选错会导致设备永远连不上 |
| 写优化 | Write Optimization | 保持默认 | 影响连续写操作的合并方式 |
| 其余页面 | 扫描速率、降级设置 | 全部保持默认 | 建完可在通道属性里改 |
向导中间的名称、网卡两页需要动手选,后面几页直接下一页到底即可。通道建好后,在通道属性里还能改"扫描速率",默认 100 毫秒对普通监控够用。
3.2 添加 S7-1200 设备时的型号、IP 与 TSAP 参数
选中刚建的通道,右侧窗口点"添加设备",或者右键通道 → 新建设备。关键设置只有三个:
设备型号选 S7-1200;IP 地址填 192.168.10.201;端口保持 102。其余页面保持默认,包括 TSAP 相关的机架与槽位参数。
这里有个高频坑:S7-1200 与 S7-1500 没有物理机架槽位的概念,驱动里的 Rack 填 0、Slot 填 1(对应 TSAP 03.01)是固定套路。有人从 S7-300 的配置经验照搬过来改成 Slot 2 或 3,结果设备状态直接报连接失败。只有走 CP 通信模块或多机架组态时才需要动这两个值。
注意:设备建好后,通道和设备的状态列应显示 Connected。如果长期停在初始状态,先回第 2 章的网卡与端口检查,而不是重建通道。
3.3 标签地址语法与 CSV 批量导入
KEPServer 的 S7 地址由 DB 块号、数据类型标识、偏移量三部分组成,和 TIA 侧的偏移量列一一对应。下面是四种常用类型的写法:
Tag Name,Address,Data Type,Scan Rate btnStart,DB1.DBX0.0,Boolean,100 btnStop,DB1.DBX0.1,Boolean,100 setValue,DB1.DBW2,Short,100 runSpeed,DB1.DBD4,Float,100手工建标签时,在标签组上右键"新建标签",逐个填名称、地址、数据类型即可。变量超过二三十个就别手点了,用 CSV 导入更快。稳妥做法是先在标签组上右键选择导出,生成一份 CSV 模板,看清它的列定义行格式,再照模板填内容后导入。KEPServer 的 CSV 首行不是普通表头,直接手写经常解析失败。
参数对应关系要记牢:DBX后面跟字节和位号,Boolean 类型必须带.0这样的位号,只写DB1.DBX0会被判为非法地址;DBW是 16 位,对应 PLC 的 Int、Word;DBD是 32 位,对应 Real、DInt。Scan Rate 是扫描周期,单位毫秒,50 到 100 对常规监控足够,设太短只会白白增加 CPU 通信负载。
4. Quick Client 读写验证与连接失败的分层排查
标签建完不代表通了,Quick Client 是把链路一次性验证清楚的地方。它同时显示值、质量和时间戳三列,排查全靠这三列。
4.1 质量列的含义与对应排查方向
| 质量值 | 含义 | 优先排查项 |
|---|---|---|
| Good | 读写正常 | 无需处理 |
| Bad | 请求被拒绝或地址无效 | DB 块是否非优化、PUT/GET 是否勾选 |
| Bad,带地址错误码 | 地址越界或语法不合法 | 偏移量是否超出 DB 实际长度 |
| Uncertain | 首次读取尚未完成 | 等待一个扫描周期,或检查 PLC 是否在 RUN |
| 设备层无质量列 | 设备根本未连接 | 网卡选择、IP、102 端口 |
点开具体标签的 Diagnostics,能看到最后一次错误码,比看质量列本身有用得多。
4.2 同步写入并在 TIA 侧回读确认
在 Quick Client 中选中某个变量,右键 → 同步写入,输入值后点 OK。写 Boolean 时接受 TRUE/FALSE 或 1/0;写 Real 必须带小数点,输入1会被当成整数拒绝或截断。
写完立刻回到 TIA Portal 的在线监控表看 DB 块,btnStart应该变成 TRUE。逐个把四个变量都写一遍,PLC 侧全部同步变化,说明这条链路读写双向都正常。
注意:同步写入是立即下发,不经过扫描周期排队。自动化脚本里频繁调用会明显增加总线负载,批量写入建议改用异步写。
4.3 用 Python OPC UA 客户端做批量回归
界面点一次只能验一个变量。标签多的时候,用 OPC UA 客户端跑一遍更快,也方便以后做成巡检脚本:
from opcua import Client # KEPServer 默认 OPC UA 端点,端口以 OPC UA Configuration 里的实际配置为准 ENDPOINT = "opc.tcp://192.168.10.31:49320" # 要写入的变量,值类型必须与标签数据类型匹配 TAGS = { "btnStart": True, # Boolean "btnStop": False, # Boolean "setValue": 120, # Short,传 int "runSpeed": 45.5, # Float,必须传 float } client = Client(ENDPOINT) client.connect() try: for name, value in TAGS.items(): # 节点 ID 格式:ns=2;s=通道名.设备名.标签名 node = client.get_node(f"ns=2;s=Channel1.Device1.{name}") node.set_value(value) print(name, "->", node.get_value()) finally: client.disconnect()逻辑很直白:连上端点后按标签名拼节点 ID,写入再回读比对。参数上有三个地方容易错。端点端口 49320 是 KEPServer 的 OPC UA 默认值,改过配置就以实际值为准。ns=2是标签所在的命名空间索引,通常为 2,可在 OPC UA 客户端的地址空间里确认。通道名和设备名必须与第 3 章里建的一致,改过名字脚本就要跟着改。
4.4 按层排查而不是反复重建设备
设备连不上时,按物理层、PLC 侧、通道设备、标签四层往下查,比反复删掉设备重建有效:
- 物理层:ping 通不通,
Test-NetConnection的 102 端口是否 True。 - PLC 侧:CPU 是否 RUN,PUT/GET 是否真的勾选并下载进 CPU。
- 通道设备层:网卡选没选错,IP 与型号是否对应。
- 标签层:DB 号、偏移量、数据类型三项逐一比对。
绝大多数"连不上"停在前两层,第三层的网卡选错是隐蔽性最高的一种。
5. 标签批量维护与向 MQTT 转发的进阶用法
设备一旦稳定运行,真正花时间的不是建通道,而是后续维护:DB 块改了地址、标签数量从四个涨到四百个、上游系统要求用 MQTT 而不是 OPC。这几种情况都有省事的做法。
5.1 用导出改导入管住大批量标签
DB 块调整声明顺序后,偏移地址会整体位移,手工改标签基本等于重做。稳妥流程是:先在 KEPServer 里把标签组整体导出成 CSV,在表格软件里按行改 Address 列,再整体导入覆盖。导入前勾选删除同名旧标签的选项,避免新旧地址同时存在导致读到旧值。
注意:改地址前先停掉依赖这些标签的上位机采集任务,导入过程中标签会短暂进入 Bad 状态。
5.2 把标签发布到 MQTT 的两种做法
搜索里常有人问 kepserver 能不能对接 MQTT,答案是能,路径有两条。
一条是走自带的 IoT Gateway 组件:项目中新增 Agent,选择 MQTT 类型,填 Broker 地址与 1883 端口、Topic 前缀、发布格式选 JSON,然后把需要转发的标签逐条加进 IoT Item 列表,并设置每个 Item 的发布速率。这种方式的上限取决于 License,IoT Gateway 属于独立授权项,标准版里未必包含,动手前先确认授权列表。
另一条是加装 MQTT Client 驱动,让 KEPServer 直接作为 MQTT 客户端收发。适合需要双向控制的场景。
如果只是几个变量的临时验证,没必要折腾授权。第 4 章的 Python 脚本里改成paho-mqtt,定时读 OPC UA 节点再 publish,几十行就能跑通。
5.3 发布速率与扫描周期的匹配
转到 MQTT 后最容易忽略的一点是发布速率。IoT Item 的默认发布周期通常是 1000 毫秒,而标签扫描速率可能是 100 毫秒,两者不匹配时,中间九次扫描的值会被直接丢掉,Broker 拿到的只是抽样结果。做趋势或报警推送时,把发布周期设成扫描速率的整数倍,比如扫描 100 毫秒、发布 500 毫秒,既保住变化灵敏度,也不会把 Broker 的吞吐打满。
本文还有配套的精品资源,点击获取