简介:KEPServer作为工业数据采集与交换的核心软件,其主备冗余、MySQL双向读写、后台服务及地址填写等问题常令自动化工程师困扰。这份doc文档正是针对上述场景的完整配置笔记,面向工业现场工程师、系统集成商及KEPware初学者,以实际案例讲解从ODBC 32位驱动配置到通道、设备、标记三层建模的完整流程。资源共1个doc文件,压缩包约1.9MB,虽体量不大但内容紧凑,从原理到实践系统涵盖西门子S7-1500连接、MySQL数据表映射与写入、Data logger数据映射、基于Link Tag的MySQL反控PLC,以及主备切换、后台服务启停和地址值录入规范等高频痛点。文档不仅说明操作步骤,还给出固定表与动态表选择、触发器条件、网络适配器与端口配置等关键细节,便于读者对照实操排错,规避常见配置陷阱。目前已有728人学习浏览,适合需要快速落地KEPServer项目或排查配置异常的技术人员,能有效缩短上手周期。
1. 主备、双向读写、后台服务全压在一套KEPServerEX里:它到底是什么
如果手头正管着一条产线,大概率经历过这样的场景:半夜设备报警,远程一看,OPC通道断了,PLC里的数据停更,操作员对着空白画面干瞪眼。这不是协议没配好,更多时候是KEPServerEX本身没有做冗余,也没有把数据链路拆开。KEPServerEX不是普通的数据采集工具,它在工业现场的角色是「统一数据枢纽」——上面接SCADA、MES、MySQL数据库,下面接西门子S7系列PLC,中间还能自己做主备切换。这份资源的核心就是把三件事彻底讲透:主备通道怎么搭才不丢数、MySQL和西门子PLC之间怎么双向读写不冲突、地址怎么填才能让OPC Item精准命中。适合谁看?正在部署KEPServerEX、被主备切换坑过、或者被数据库写不进数据卡了两天的人,读完能直接落地。
2. 主备架构:通道冗余与故障切换的三个关键设定
2.1 主备不是两台电脑装同一个软件就行
很多人以为主备就是两台机器一样装KEPServerEX,然后主挂了备机顶上。实际运行起来会发现,备机永远在报错,或者主备切换后客户端连不上。核心问题在于:KEPServerEX的主备是基于「通道级冗余」,不是「服务级冗余」。也就是说,备机不是等主机挂了才启动采集,它是从一开始就和主机同时采集数据,只是不对外提供服务。这样客户端在切换时拿到的数据是连续的,不会出现中间断层。
部署主备前先明确一件事:主备两台机器的Windows用户名和密码必须一致,且KEPServerEX服务必须用同一个域账号或本地账号运行。这是最容易忽略的第一步,两台机器如果用不同的本地账号,备机的OPC UA端点会不断报认证失败,主备切换永远切不过去。
主备架构还要网络上说通。主机和备机之间有一条专用的心跳链路,最好用独立的物理网卡,不要和采集PLC的网卡混在一起。心跳断了,两台机器都会认为自己是主,结果就是客户端同时连上两台,数据双写,现场乱套。常见的做法是用一条直连网线做主备心跳,IP段随便设一个,比如192.168.9.1和192.168.9.2,只要和业务网段不冲突就行。
2.2 通道属性里设置冗余:选项、优先级与数据同步
在KEPServerEX里新建通道时,连接类型选OPC UA,然后双击通道属性,最关键的三个设置是:
- 冗余选项:设为「主备冗余」,备机通道会自动进入待命状态
- 冗余优先级:主机设为1,备机设为2,数字小的优先成为主
- 数据同步方式:推荐「运行时同步」,备机持续从PLC取数但不对外发布
具体操作时右键「通道」菜单,新建通道,在「冗余」选项卡里勾选启用,然后填入对端机器的IP和端口。主机的对端填备机IP,备机的对端填主机IP。端口默认用opcua的端口,比如49420,这个要固定住,两台机器的防火墙都要放行这个端口。
数据同步这块,KEPServerEX的机制是主机把采集到的数据实时镜像到备机的缓存里。备机即使在待命状态,它的内存里也有一份和主机完全一致的数据快照。这样一旦心跳断开或者主机宕机,备机直接接管对外服务,客户端感知不到切换过程。如果选「切换时同步」,备机平时不采集,只在切换那一刻去PLC批量读一遍,那切换耗时可能长达几十秒,对连续生产来说不可接受。
提示:备机必须和主机配置完全相同的通道、设备、标签,连Tag的名称和地址都不能差一个字符。备机的PLC连接参数(IP、机架号、槽号)也必须和主机一致,否则切换后地址指向错误设备,数据全乱。
2.3 客户端连接备用服务器:DNS名还是IP直连
主备模式下,客户端(比如SCADA或MES)连接服务器时,不建议写死IP。常见做法是给两台机器配置同一个虚拟服务名,在DNS里做映射,客户端只认服务名。主机宕机后,手动或自动把DNS指向备机IP,客户端无需改任何配置就能重新连上。
另一种更方便的做法:客户端直接配置两个OPC UA端点,一个主一个备,客户端库支持「故障转移」。比如用Kepware的ClientAce库,把Endpoint配置成一个数组,主端点优先,连接失败后自动尝试备端点。实测下来,这种方式的切换时间大约在5到15秒之间,取决于客户端库的重试间隔设置。建议把重试间隔设到2秒,超时设到5秒,这样整体切换最长不超过15秒。
切换时有一个坑:备机的OPC UA端点如果用的是端口号相同但IP不同的地址,客户端的会话Session会失效,必须重新建会话。所以客户端的重连逻辑里要包含重新创建Session和Subscription的步骤,不能只重连Transport连接。否则会出现「连接是通的,但数据不更新」的假象。
3. 西门子S7系列PLC:地址填写与双向读写链路
3.1 设备驱动选择:Siemens SIMATIC S7协议族的边界
KEPServerEX访问西门子PLC,设备驱动选型直接决定后续地址能不能通。S7-200要用S7-200驱动,S7-300/400用S7-400驱动(向下兼容S7-300),S7-1200/1500则用S7-1500驱动。这个不能想当然混用。尤其是S7-1200,如果选成S7-400驱动,能连上但读写不稳定,偶发超时,排查起来极其痛苦。
驱动选好之后,设备属性里的两个关键参数:
- 连接类型:PG(编程器)还是HMI连接。S7-1200/1500必须在PLC组态里勾选「允许来自远程对象的PUT/GET访问」,否则KEPServerEX连不上
- 机架号和槽号:S7-300固定在0号机架2号槽,S7-400看实际组态,S7-1200/1500在多数固件版本下不需要填机架槽号,填0即可
还有超时参数。默认的通信超时是5秒,在PLC程序扫描周期长或者网络负载高的情况下,读请求容易超时。我一般会调到10秒,重试次数保持默认的3次。超时设太长会导致故障检测变慢,主备切换时备机要等更久才能接管,所以10秒平衡性较好。
3.1 地址填写:S7地址从符号名到绝对地址的映射规则
地址填写是这份资源里最容易被轻视的部分。KEPServerEX的S7驱动支持两种地址形式:绝对地址和符号地址。绝对地址的格式是:
- I0.0(输入位)
- Q1.2(输出位)
- DB10.DBW0(数据块字)
- DB10.DBX2.0(数据块位)
- M0.0(位存储,也叫标志位)
- MW0(字存储,16位)
写入时的格式密码:区分DBW和DBX。DBW是字地址,按16位为一组;DBX是位地址,精确到某一位。比如DB10.DBW0表示数据块DB10的第0和第1字节组合成的字,DB10.DBX2.0表示DB10的字节2的第0位。地址写错一个字符,驱动直接报Tag类型不匹配,不会帮你自动修正。
S7-1200/1500的符号地址用法:驱动支持直接填PLC变量表里的符号名,比如填「Motor_A_Status」也可以,但要求驱动在项目组态时能正确解析符号表。更稳的做法是统一用绝对地址,在DBC文件里做点位对照表。因为符号地址一旦PLC程序里改了变量名,KEPServerEX这边的Tag会全部失效,排查时你会以为是驱动坏了,其实是名字对不上了。
3.2 双向读写:读链路与写链路的分离原则
双向读写听起来简单——读就是轮询,写就是下发。但实际工程里最容易出问题的是「写操作和读操作共用同一个通道」。KEPServerEX的驱动是单线程轮询模型,如果通道里有一个设备正在处理写入事务,它会阻塞同一通道中所有其他设备的读取。所以双向读写的最佳实践是:一个通道跑读,一个通道跑写,两个通道指向同一台PLC,驱动都选同一个S7协议。
通道A用于连续读取PLC的状态数据,扫描周期设为100ms;通道B只做写入,扫描周期设为0(不主动轮询)。写入通过驱动的事件触发机制完成,不需要周期性扫描。这样即使写入缓慢,也不会拖慢读取链路。SCADA那边读的是通道A的Tag,写的时候调通道B的Tag,互不干扰。
写链路要特别注意数据类型的严格匹配。PLC里的MW0如果是16位有符号整数,KEPServerEX里Tag类型就得选Short,你如果选成Word,写入的值超过32767会被截断或直接写失败。实际项目里遇到过:上位机写了一个负值给PLC,PLC程序里用的是无符号数,结果读回来变成65535减去那个数的绝对值,整个逻辑乱套。所有写入PLC的Tag,数据类型必须从PLC符号表里原样带过来,不要凭感觉选。
4. MySQL双向读写:连接字符串、存储过程与事务边界
4.1 MySQL连接配置:ODBC连接器与驱动版本匹配
MySQL和KEPServerEX之间走的不是TCP直连,而是通过ODBC驱动桥接。驱动建议用Oracle发布的8.0系列ODBC Connector,不要系统自带的MySQL ODBC 5.x老版本。5.x和8.0在连接池管理和字符集处理上差异很大,实测5.x在长时间运行后连接池崩溃的概率明显更高。ODBC驱动装好后,在系统中配置一个DSN(数据源),配置项里关键填三项:
- Server:MySQL所在机器的IP,不要填127.0.0.1,除非MySQL就在本机
- Database:目标数据库名
- Character Set:必须设utf8mb4,否则写入中文备注会变问号
DSN配置好后,KEPServerEX里新建数据源时,类型选ODBC,然后选中刚才建立的DSN。这里有个坑:DSN的用户名密码不要直接写进连接字符串里,KEPServerEX支持在数据源属性里单独填User ID和Password,这样连接字符串里不会明文暴露密码,日志里也看不到。
4.2 写入MySQL:自定义脚本与批次处理的性能取舍
KEPServerEX的MySQL写入有两种方式:一种是直接用系统内置的「ODBC」数据源绑定Tag做实时写入;另一种是配合脚本(C#或VBScript)把数据攒到一批再写入。实时写入简单直接,但生产环境如果每秒钟有几十上百个数据点要入库,单条INSERT会把数据库连接拖垮。
推荐的方式是存储过程。先在MySQL里建一个存储过程用于插入数据,比如:
CREATE PROCEDURE sp_insert_plc_data( IN p_tag_name VARCHAR(100), IN p_tag_value FLOAT, IN p_quality INT, IN p_timestamp DATETIME ) BEGIN INSERT INTO plc_data (tag_name, tag_value, quality, collect_time) VALUES (p_tag_name, p_tag_value, p_quality, p_timestamp); END;然后在KEPServerEX的脚本里写一个定时任务,每5秒批量执行一次存储过程,把缓存里的数据一次性写入。这样数据库的压力从高频小事务变成低频大事务,同时脚本里必须做异常处理,任何一个Tag写入失败都不能影响整批数据,只要把失败的数据单独记录下来就好。
4.3 从MySQL读回PLC:轮询与主动推送的时序控制
从MySQL读数据回PLC的场景常见于配方下发。系统从MES里取配方数据,然后写到PLC。这里的核心问题是:KEPServerEX的Tag轮询机制和数据库「主动推送」之间的时序冲突。如果你把配方的查询逻辑写在KEPServerEX的事件脚本里,遇到PLC请求时去查询数据库,很可能PLC扫描周期已经结束了,数据还没查出来,PLC那边读到的还是旧配方。
常见做法是把配方数据先缓存到KEPServerEX的Tag里,比如配方值1到配方值10,上位机或者外部服务先把数据库里的配方写入这10个Tag,然后置位一个「配方更新完成」标志位。PLC程序看到这个标志位置1后,从这10个Tag读取配方值。KEPServerEX只负责把Tag里的值映射到PLC寄存器,数据库到Tag的过程由外部服务或脚本完成。这样时序可控,不会出现PLC读到一半数据被覆盖的问题。
双向读写必然要面对「同一份数据,PLC也在改,MySQL也在改」的冲突。实践中的处理原则:方向必须分清主从。PLC的实时数据永远以PLC为源,往MySQL单向同步;配方和工艺参数以MySQL为源,往PLC单向下发。严禁两条链路对同一批Tag做同时双向写。如果确实有双写需求,必须在PLC程序里做最后写入优先的判断逻辑,而不是全靠外部调度。
提示:MySQL事务的隔离级别默认是REPEATABLE READ,KEPServerEX的脚本在多线程环境下对同一个数据源做并发读写时,偶发「锁等待超时」错误。在MySQL的my.ini里把事务隔离级别改成READ COMMITTED,可以有效减少锁竞争。
5. 后台服务与常驻配置:把KEPServerEX变成无人值守的采集站
5.1 Windows服务模式:从桌面程序到系统服务的转换
KEPServerEX安装后默认以桌面应用的方式运行,但生产环境不可能一直有人登录Windows桌面。正确的做法是把KEPServerEX作为Windows服务运行。安装包自带服务注册工具,在安装目录下找到KepServiceConfig.exe,用它把KEPServerEX注册为系统服务,设置自动启动,然后重启一次机器确认服务能正常拉起。
服务模式下的登录账号,必须是有「作为服务登录」权限的账号。本地System账号虽然方便,但没有网络权限,无法访问远端MySQL和PLC。所以要用一个专门的服务账号,给它配置好网络访问权限、防火墙规则和ODBC DSN的用户映射。账号密码变了,需要同步更新服务配置,否则服务会启动失败,这个点运维必须写进交接文档。
服务状态监控:不能只看Windows服务管理器里显示「正在运行」就算完事。实际运行中常见的情况是服务进程没死,但内部线程已经卡死,数据完全不更新。所以要配置一个看门狗脚本,定时检查KEPServerEX的OPC UA端点是否响应,比如每30秒发一次Read请求,超过3次无响应就重启服务进程。
5.2 开机自启与意外崩溃后的自动拉起
开机自启做好还不够,崩溃后的自动拉起同样重要。Windows服务的恢复选项在「服务属性 → 恢复」标签页里配置:
- 第一次失败:重新启动服务
- 第二次失败:重新启动服务
- 后续失败:重新启动计算机
- 重置失败计数:1天(避免短时间内反复重启导致的多重故障)
具体设置时,「重新启动服务」的延迟时间建议设为30秒。太短了服务还没完全释放端口,重启会失败;太长了会延误数据恢复。同时勾选「重新启动计算机」前,要先确认这台机器上所有运行脚本都已经具备断电自恢复能力,否则机器重启后KEPServerEX起来了,但其他配套脚本还瘫着,一样抓瞎。
KEPServerEX自身还有一个「项目自动保存」机制,在工具选项里设置自动保存间隔,建议每30分钟保存一次项目文件。崩溃重启后,服务会加载最近一次保存的项目配置,尽量保证通道、标签、数据源配置不丢失。
5.3 实战排查:后台服务常见问题的定位路径
问题一:服务显示「正在运行」但数据不更新。
原因排查顺序:先看Windows事件日志里有没有OPC UA端点异常的记录;再进KEPServerEX管理界面看通道状态是否为「Connected」;最后用OPC UA客户端工具直接连服务端点测试。八成是PLC侧通信握手失败,服务进程认为通道还活着,实际上PLC早断了。解决:在通道属性里启用「通道诊断」,开启心跳检测,PLC断开后通道会在5秒内识别为Failed,并触发主备切换。
问题二:MySQL数据写入一段时间后变慢并报连接超时。
原因排查:ODBC连接池满了。KEPServerEX对每个数据源默认维护一定数量的连接,长时间运行后连接可能被MySQL服务器强制断开,但ODBC驱动没有感知,复用这些死连接导致等待超时。解决:在DSN配置里设置连接空闲超时和回收周期,把连接池的最大空闲连接数调小。MySQL那边也要调整wait_timeout,比ODBC的空闲超时设得更大一些。
问题三:主备切换后客户端数据流中断。
原因排查:客户端没有重新创建ONS订阅。前面已经说过,主备切换会改变会话端点,客户端必须重新走一遍「检测主端点→建会话→建订阅→注册Tag」的流程。如果客户端库不支持自动断线重连,就在客户端做一个心跳判断,30秒内没收到新数据就强制重连整个UA连接。
6. 最后落地:从日志验证到上线验收的完整检查清单
配置做得再好,不经过系统验证就上线,迟早出事故。我的习惯是在每次改完KEPServerEX配置后,都走一套完整的验证流程。这个流程花不了多少时间,但能挡住绝大多数隐性故障。
第一步,用KEPServerEX自带的「OPC Quick Client」工具连接本机服务,确认所有Tag都能读到数据。这个工具看着简陋,但它能告诉你每个Tag的真实质量戳(Quality)。正常运行的Tag质量戳应该是Good,如果出现Uncertain或者Bad,说明通信链路不稳定,不要急着往上层查,先在这一层把问题解决掉。重点检查写入操作:用一个临时Tag写入一个测试值,确认PLC程序里的对应地址数值发生变化,再改回来。
第二步,检查MySQL定时任务的写入情况。在数据库里写一个查询语句,确认最近10分钟内有没有新增记录。这个查询不要手动在navicat里查完就算,我一般会写成一个存储过程脚本,自动化检查每个小时的数据条数波动,超过阈值就触发告警。写入链路的数据量和业务逻辑要能对得上,比如PLC扫描周期是100ms,一个生产节拍下应当写入多少条记录,偏差超过20%就说明链路有断点。
第三步,断网测试主备切换。把主机的采集网线拔掉,观察备机是否在预期时间内接管服务。我实测下来,配置正确的主备系统切换时间通常控制在10秒以内。重点关注客户端是否自动重连成功,以及重连后数据是否从断点继续而不是从头再来。切换完成后把网线插回主机,确认主机恢复后能自动回到待命状态,而不是和备机抢主。这一步很多人在实际生产环境里不敢做,但恰恰是跳过这一步,才会出现真故障时切不过去的惨剧。
第四步,观察后台服务的日志输出。KEPServerEX的日志文件默认路径在安装目录下的Logs文件夹中。重点过滤以下关键词:Channel Failed、Device Read Timeout、Connect Failed、Data Type Mismatch。每发现一条,务必弄清原因再继续下一步。日志里有冗余的警告信息不要嫌多,它会在关键时刻帮你定位真正的故障点。
最后分享一个从血泪里总结的习惯:每次修改KEPServerEX的项目配置前,先把当前可用的项目文件完整备份一份,命名带上日期和时间。配置改坏了,还能一键还原;没有备份,就只能凭记忆重配,那种感觉经历过一次就不想再来。从那以后我每次改配置前都强制走一遍备份流程,在验证通过之前,旧的备份文件不删除,并且新项目启用前至少做48小时的试运行观察。希望帮到你。
本文还有配套的精品资源,点击获取