☰
KepServer主备+MySQL双向读写+后台服务:工业数据采集与冗余方案
2026/10/6 9:21:23 网站建设 项目流程

简介:围绕KEPServer的工业数据采集与互通场景,这份资料专门面向需要实现MySQL与西门子PLC双向读写的自动化工程师、实施人员,也适合正在规划KEPServer冗余架构的技术运维。内容从软件安装前的32位ODBC驱动配置讲起,系统梳理通道、设备、标记三层核心结构,并逐一演示连接MySQL、连接S7-1500 PLC、Data logger数据映射、MySQL反向控制PLC等关键操作;同时补充了主备切换、后台服务停止、地址值录入规范等工程落地时容易踩坑的细节,并配有基于实际面板的排错提示,适合作为现场调试速查手册。包体共1个doc文档,仅1.9MB,虽非视频或源码,但章节分明、步骤完整,覆盖从环境准备、连接配置到反向联调的大部分必备知识点,目录中还对地址值录入、主备切换、后台服务三块单独做了补充说明,方便快速定位。已有728人学习,尤其适合正在部署KEPServer冗余项目或需要打通工业数据库与PLC双向数据链路的读者,可对照章节逐步操作,快速上手并显著缩短调试时间。

1. KepServer 主备 + MySQL 双向读写:一套方案把冗余、IO 与地址映射全打通

做 SCADA 和 PLC 上位项目的人,对 KepServer(KEPServerEX)都不陌生。但真正把"kepserver 的主备""mysql 与西门子双向读写""后台服务""地址填写"这些词串起来做成一套能稳定投产的架构,现场返工的人不少。这标题表面是四个功能点,实际是一条完整的数据链路:西门子 S7-1500 或 S7-200 SMART 的 IO 值进 KepServer,KepServer 做主备冗余保证上位机永远有数据读,MySQL 做历史存储和配方下发,整个服务以 Windows 后台服务方式 7×24 运行。适合正在做设备数据采集、SCADA 改造、MES 对接的集成商和工厂信息化工程师。你不需要一开始就把所有功能搭全,但必须知道每个环节的原理和参数边界,否则上线之后每一处都是玄学。

2. KepServer 主备冗余:先理解心跳和角色,再动手配置

主备不是"两台电脑一起跑",而是两台机器装同一个 KepServer,一台对外提供服务,另一台在旁监听。常见做法是购买 Kepware 的 Redundancy(冗余)授权,在插件管理器里启用。注意,这个授权是按主备两个许可证算的,别只买一个。

2.1 主备协同原理:谁来切换、怎么知道对方挂了

KepServer 主备的工作方式:主服务器(Primary)和备用服务器(Secondary)各自运行同一份项目配置,两者之间通过网络端口互相发心跳包。主服务器正常时,客户端只连主服务器;当主服务器宕机、网络断、或服务进程停止,备机能感知到主服务器心跳超时,就切换成活动状态,接管客户端连接。

关键点:切换动作通常由客户端发起。KepServer 的冗余插件不强制要求备机主动抢占,而是通过"客户端在连接失败后去连备机"来实现。所以你在上位机(如 Wonderware、WinCC、自研 OPC UA 客户端)里要配置两个服务器地址:主和备。备机一直在监听,但不主动对外广播自己可用,直到确认主服务不可用。

那谁判断心跳超时?主要靠 Redundancy 插件内部的心跳线程。主备之间默认心跳间隔常见是 1000ms 一包,超时 3 次判定对方离线。我一般会把心跳间隔调到 500ms,重连次数保持 3 次,这样切换大概在 1.5 秒内完成。如果你用 PLC 做上位机数据源,切换超过 2 秒就可能引起下位机报警,所以别拿默认值直接用。

2.2 项目复制与冗余授权:备机必须和主机抢到同一份配置

主备配置第一步不是改参数,而是把项目文件完全同步。常见做法:在主服务器上建好后,导出项目(比如 .opf 或 .pff 文件),在备机上导入。导出的文件包含通道、设备、标记、数据库连接等全部配置。注意:备机导入后不能直接运行,需要改成冗余配置。

具体步骤:

  1. 在主服务器上安装 KepServer,激活授权,至少包含 Redundancy 插件。
  2. 在 Administration Console 里点 Project Properties,把 Redundancy 功能勾上,选择当前角色为 Primary,并填写对方主机名或 IP 和通信端口。
  3. 在备用服务器上执行同样步骤,角色选 Secondary,指向主服务器。
  4. 两边检查项目版本一致。用 KepServer 自带的项目比较功能,或手动核对标记数。
  5. 把两台机器加入同一个 Windows 域或工作组,关闭防火墙,或给 KepServer 进程和服务端口放行。

这里最容易翻车的是"备机并没有执行项目同步,而是手动改标记",结果主备标记库不一致,切换后数据全是坏的。我的血泪经验是:每次改完项目后,都从主服务器导出再导入到备机,绝不做手改。

无论你用的是老版 4.x 还是新版 6.x,这套配置逻辑不变。区别只在界面叫 Redundancy 还是 High Availability,参数入口基本一样。

2.3 主备切换的 4 个关键参数:心跳间隔、重连次数、切换阈值、等待时间

配置界面里的参数名字可能随版本有差异,但核心就这几个,都藏在 Redundancy 插件属性里。

参数常见设置作用
心跳间隔(Heartbeat Interval)500~1000 ms主备互发心跳包的频率,越小探测越快,但占用带宽
最大断连次数(Missed Heartbeats)3 次连续收不到心跳达到该次数即认为对方离线
切换延迟(Switch Delay)0~1000 ms确认故障后等待的时间,防止误切换
撤销切换(Rollback Time)600 s,按现场需求主服务器恢复后多少秒重新夺回主动地位

不要一味把切换延迟设为 0。我在两个车间见过因为网线松动导致主备反复切换、PLC 连接被频繁抢占,最后把切换延迟调到 500ms,问题才稳定下来。主备切换不是越快越好,而是要"该切才切"。

完成角色和参数设置后,验证方法很简单:在客户端(KepServer 自带的 Quick Client 或 OPC UA 客户端)连接主服务器,然后到主服务器机器上停掉服务,观察客户端是否断线重连到备机,数据是否正常。如果备机没有接上,去 Windows 事件日志里看 Redundancy 插件的报错,通常是日志同步失败或端口不通。

3. MySQL 与西门子双向读写:从 ODBC 驱动到 SQL 语句的完整链路

KepServer 本身不直接"连接"MySQL,它靠 ODBC 或 ADO.NET 这类数据库桥接技术。西门子 PLC 的数据要写进 MySQL,或者 MySQL 里的配方要下发到 PLC,都需要配置一条从通道到数据库的链路。很多人在这里被绕晕,是因为把"读数据库"和"写数据库"当成同一个功能。实际上 KepServer 把它们分开了:读取数据库用 ODBC 客户端驱动,写入数据库用 SQL 数据日志记录器。

3.1 为什么用 ODBC 做桥梁:KepServer 连接 MySQL 的三种常见做法

常见做法有三种:一是用 KepServer 自带的 ODBC Client 通道,它把一个 SQL 查询结果映射为一组标记(Tag),相当于把数据库表"读"进内存,再绑定到 PLC 地址。二是用 SQL Data Logger 插件,它把 PLC 的实时标记按周期写入 MySQL,实现"PLC 到 MySQL"。三是自己在外部写一个服务,用 OPC UA 连 KepServer,再操作 MySQL。第三种最灵活,但多一层网络依赖,且要自己维护进程。

我一般用前两种组合,因为配置都在 KepServer 里,不依赖外部程序,故障排查也用同一套日志。需要提醒的是,ODBC Client 和 SQL Data Logger 都是独立授权插件,没有安装前你在通道列表中看不到对应入口。

3.2 最小可用的 MySQL 环境准备:驱动、DSN 与建表

先装 MySQL ODBC 驱动。KepServer 如果是 32 位进程,就要装 32 位驱动并建 32 位 DSN,别直接装系统 64 位完事。检查方式:运行C:\Windows\SysWOW64\odbcad32.exe(这是 32 位 DSN 管理器),在里面添加 MySQL ODBC 驱动,配置好服务器地址、用户名、密码和数据库名。

建议建表时把字符集设为 utf8mb4,避免后面中文乱码。以下是我常用的测试表结构:

CREATE TABLE plc_data ( id INT AUTO_INCREMENT PRIMARY KEY, tag_name VARCHAR(64) NOT NULL, tag_value FLOAT NULL, write_flag TINYINT DEFAULT 0, update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, UNIQUE KEY idx_tag (tag_name) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

这个表有两个用途:tag_value用于把 PLC 值写进来,write_flag用于做下发标记。表字段类型要和 KepServer 的标记类型对得上,否则写入时驱动会报"列类型不匹配"。

然后配置 DSN,名为mysql_plc。在命令提示符里可以用以下命令测试连接是否通:

isql mysql_plc root password -v

isql是 unixODBC 自带的测试工具,在 Windows 上如果装了 MySQL ODBC 驱动也会有类似工具。能出现Connected!说明 ODBC 链路没问题。接下来才去 KepServer 里建通道。

3.3 把 MySQL 数据写入 PLC:只读查询 + 高级标签绑定

在 KepServer 中新建通道,类型选择 ODBC Client,指定 DSN 为mysql_plc。然后在设备下新建一组标签,每个标签的地址就是你写的 SQL 查询结果。

例如,要从plc_data表中读取tag_name = 'Temperature'的值:

SELECT tag_value FROM plc_data WHERE tag_name = 'Temperature' AND write_flag = 0;

KepServer 的 ODBC Client 会把这个结果当作一个只读标记。要下发到西门子 PLC,你还需要在 Advanced Tags(高级标签)里建立一个绑定:源是 ODBC 标记,目标是 S7 通道里的 DB 地址。我一般这样做:

  1. 建一个 S7-1500 通道(驱动选 Siemens S7-1200/1500),建立设备,填好 PLC 的 IP。
  2. 在 S7 设备下新建目标标记,比如DB1_REAL_0,地址写DB1,REAL0。
  3. 在 Advanced Tags 下新建绑定,源选 ODBC 的Temperature,目标选DB1_REAL_0,传输方向选"从数据库到 PLC",触发方式选"改变时"或"周期刷新"。

这样 MySQL 里的值一旦变化,KepServer 会自动把值写到 S7 的 DB1.DBD0 里。配方下发就是这么做的:上层系统改一张配方表,现场 PLC 收到新值。

注意,ODBC 查询是主动拉取还是被动等待,取决于你在 ODBC Client 设备属性里的"扫描周期"。默认是每个扫描周期执行一次查询。如果你希望查询只在调用时执行,就把 Scan 改成 On Demand。

3.4 把 PLC 数据写入 MySQL:SQL 数据记录器的配置要点

PLC 到 MySQL 方向,用 SQL Data Logger 插件。在 KepServer 管理界面右侧找到 SQL Data Logger,新建一个数据日志记录器,选择数据源为已经定义好的标记,配置写入频率和连接字符串。

最简单的配置:在记录器里选择你要记录的 PLC 标记,比如DB1_REAL_0、M0_0,插件会按你设置的间隔生成 insert 语句。需要自己改 SQL 时,可以选择直接写入模式,例如:

INSERT INTO plc_data (tag_name, tag_value) VALUES ('Temperature', @DB1_REAL_0@);

这里@DB1_REAL_0@是 KepServer 的占位符,它会被实时值替换。要注意写入间隔别太短,一般 1 秒写入一次就够,太频繁会把 MySQL 的磁盘 IO 打满,也会影响现场网络。批量写入模式更推荐,插件的 Batch 参数设成 10 或 50 条,减少事务开销。

参数说明:在记录器属性里,Data Collection Group 默认是 500ms 采集一次,Flush Interval 是 5 秒落库一次。我用现场经验建议采集周期 1s,落库周期 5s,Batch Size 10 到 50,这样 MySQL 压力较小,也方便出报表。如果你的 PLC 通讯周期很快但数据变化不大,可以加 Deadband(死区)过滤,只在变化超过 0.1 时才写入,能省不少磁盘空间。

4. 让 KepServer 成为后台服务:开机自启、账户权限与服务验证

现场电脑不可能每次都登录桌面去手动启动 KepServer。KepServer 安装后默认会注册一个 Windows 服务,但很多人不知道服务跑起来和"在桌面打开应用"是两回事,也不知道用什么账户跑,结果重启机器后服务没起来,或者启动后 OPC 客户端连不上。

4.1 KepServer 自带的 Windows 服务:找到它、设置自动启动

在开始菜单搜索 services.msc,打开服务管理器,找到名称类似KEPServerEX或KepServer的服务。右键属性,把启动类型改为"自动(延迟启动)"。延迟启动有好处:等网络、数据库依赖服务都起来后再启动 KepServer,不容易加载失败。如果现场要求开机立刻可用,那就设自动,但要考虑依赖服务。

用命令行也一样,管理员权限的 CMD 里执行:

sc config "KEPServerEX" start= delayed-auto sc start "KEPServerEX"

注意双引号里服务名要和你机器上的一致。如果服务没注册或名称不对,可以用sc query state= all | findstr -i kep来找。别把服务名猜错,否则就是"服务不存在"报错。

关于项目加载:KepServer 服务启动时,会加载它最后使用的项目文件。默认情况下这就是你最后在管理界面保存的项目。如果要指定项目路径,可以在服务启动参数里配置,或者在 KepServer 管理界面的 Application Settings 里设置 Startup Project。我一般会在项目完全稳定后,把项目文件复制到一个固定目录(比如D:\SCADA\Kepware\Projects),不让用户随便改。

4.2 服务账户与项目路径:本地系统与指定账户的区别

服务默认可能用"本地系统账户"(Local System)运行,它能访问本地文件,但在访问网络共享 MySQL 或 Windows 域资源时会没有权限。如果你的 MySQL 在另一台机器上,连接串里带了用户名密码,一般不受影响;但如果 MySQL 启用了 Windows 身份认证,或者要写网络共享路径的日志文件,就必须指定一个域账户。

我的做法是创建一个专用 Windows 账户svc_kepware,密码永不过期,把它加入本机普通用户组,并授予对项目目录和日志目录的读写权限。然后在服务属性的"登录"页签,选择该账户并输入密码。改完账户后一定要重启服务:

sc stop "KEPServerEX" sc start "KEPServerEX"

改账户后启动失败是最常见的。失败原因通常不是账户权限本身,而是"该账户没有批处理登录权限"。需要在本地安全策略里给svc_kepware分配"作为批处理作业登录"权限。这个坑我遇到不下三次,下面避坑章节会细说。

4.3 用命令行确认服务状态:sc 与 tasklist 的检查套路

后台服务出问题时,先看服务状态,再看进程,最后看日志。按这个顺序查:

sc query "KEPServerEX" tasklist /svc /fi "imagename eq KepService.exe"

sc query输出STATE: 4 RUNNING就是正常。tasklist能确认服务进程对应的 PID 和它加载的服务关系。如果服务状态是STOPPED,再查一下事件日志:

wevtutil qe System /q:"*[System[(ProviderName='Service Control Manager')]]" /c:10 /rd:true /f:text

这条命令取最近 10 条系统日志,能看到服务启动失败的 Windows 错误。KepServer 自己的应用日志则在安装目录的 Logs 文件夹下,文件命名类似KepServer.log。查日志时先找 Memory 和 Startup 关键词,能很快定位到是项目文件损坏、ODBC DSN 找不到还是授权过期。

服务验证的完整步骤:重启 Windows 后不要登录任何桌面,直接用远程桌面或别的机器用 OPC UA 客户端访问这台机器的服务端口。能读到 PLC 数据,就说明后台服务完全正常。如果读不到,登录本机看桌面图标是不是已经自动起来了、服务是不是还在。

4.4 服务运行时的管理界面:GUI 不在,配置在哪改

KepServer 服务在后台运行时,通常在桌面看不到日常的配置窗口。很多人以为服务模式就不能改配置,其实是没找到入口。你仍然可以打开 KepServer 的配置客户端,它能连到本机服务所在的项目实例,进行在线修改。修改保存后,正在运行的服务会热加载一部分配置,但涉及通道、设备这类底层变更,还是建议重启服务。

我习惯把 KepServer 的配置快捷方式放到现场工程师的桌面,同时在服务管理器里把启动类型固定为自动。这样即使有人没登录系统,服务也在跑;有人要改配置,直接打开配置客户端连上去就行。后台服务加上合理权限,才能算真正接管了现场。

5. 避坑:主备、MySQL 双向读写与后台服务的 5 个典型排障记录

这部分是我这几年干工业集成踩出来的。每一项都有实打实的现象、原因和解决办法,你按这个思路排,能少走不少弯路。

5.1 主备切换后,备机始终连不上 S7-1500

现象:主服务器停了,客户端切换到备机,但备机能读到的 PLC 数据全是坏的,或者通讯质量显示 0。 原因:S7-1500 的 S7 协议虽然支持多连接,但连接数有限;主备两台 KepServer 同时去建立 S7 连接,备机的主动连接被 PLC 拒绝,或者备机以为自己是主,两边的连接参数冲突。 解决:在备机对应通道的设备属性里,把 Redundant 连接模式设好,并给 PLC 侧连接资源加多。更稳妥的方式是让备机在非活动状态下不主动发起连接,等角色变化后再连。具体到 S7-1200/1500,可把 Connection 选项改为被动(由 PLC 发起连接),但这样需要 PLC 程序里配合,不是所有项目都接受。我的实用方法是:给主备都用同一个 PLC IP 写连接,但开启 KepServer 冗余插件后,备机不要勾选 Connect Immediately,让它等到角色变化后再连接。

5.2 MySQL DSN 找不到:32 位与 64 位驱动错位

现象:在 KepServer 里选 ODBC 通道后,下拉列表里没有你建好的 MySQL 数据源,或者运行时日志报Data source name not found and no default driver specified。 原因:KepServer 是 32 位进程,它只能看到 32 位的 ODBC DSN。你如果在 64 位系统的 ODBC 数据源管理器里建的 DSN 是 64 位的,KepServer 根本看不到。 解决:打开C:\Windows\SysWOW64\odbcad32.exe(32 位管理器),重建 MySQL DSN。装驱动时也选 32 位版,连接串里尽量写Driver={MySQL ODBC Unicode Driver},DSN 和连接串二选一,DSN 失败时连接串能绕过。这条是最典型的"系统看着正常但软件用不了"的坑。

5.3 MySQL 写入的汉字全变问号

现象:PLC 里的字符串标签写到 MySQL 后,中文字符全部变成??。 原因:表字符集和连接字符集不一致。KepServer 通过 ODBC 写入的 utf8 数据,到了 MySQL 连接层被转成了 latin1,存储层又没能转回来。 解决:建表时用utf8mb4,同时 ODBC 连接串或 DSN 设置里加charset=utf8mb4。如果用了连接串,像这样:

Driver={MySQL ODBC Unicode Driver};Server=192.168.1.50;Database=scada;Option=16384;charset=utf8mb4;

Option=16384是启用客户端字符集自动转换。改完以后,重启 KepServer 服务让驱动重新加载,再测试写入。另外注意:西门子 S7 字符串标签默认是 ANSI 编码的,如果你的 PLC 里存的是 GB2312 字节,KepServer 读出来是字节数组,写进 MySQL 前要先在 KepServer 侧做编码转换。这属于 PLC 程序侧的工作,别指望 MySQL 自动认。

5.4 服务开机启动,但 OPC UA 客户端先于服务连接失败

现象:Windows 重启后,KepServer 服务自动启动了,但现场的 OPC UA 客户端显示连接超时。手动打开 KepServer 界面再重启后,客户端又好了。 原因:服务启动序和客户端启动序冲突,更常见的是 KepServer 服务启动时因为 ODBC、网络初始化慢,服务进程已经启动但通道还没全部就绪。或者服务登录账户没有读取本地 OPC UA 证书的权限,导致 UA 端点没监听。 解决:先把服务启动类型改成自动(延迟启动),给服务留系统服务启动的时间。再查 OPC UA 监听端口,用netstat -ano | findstr 49320看 49320 端口(KepServer UA 默认端口)有没有 LISTENING。如果服务进程在但端口没开,多半是证书或防火墙问题。把 Windows 防火墙里 KepServer 进程和 49320/TCP 全部放行。还有一招:把 OPC UA 客户端的信任服务器证书提前导入,避免首次握手时因为无交互被拒。

5.5 地址填对但读到全是 0:数据类型匹配问题

现象:在 KepServer 里给西门子 PLC 填地址,比如DB1,REAL0,能读到值但全是 0,而 PLC 监控里明明有数据。 原因:数据类型没对上。PLC 的 DB 里如果定义的是 32 位浮点,KepServer 的标记类型却是 Word 或 Short,那读出来的低位/高位就被截断了,显示 0 或乱跳。 解决:先查 PLC 的 DB 定义,确认偏移量和类型;再在 KepServer 标记属性里选择对应的数据类型。DB1,REAL0对应 32 位浮点,DB1,INT4对应 16 位整数。如果还是 0,检查字节顺序(Byte Order),西门子默认大端,ODBC 或 OPC 隧道有时会改成小端。把设备属性里的 Byte Swap 设为 None,或尝试调换一档,看数值是否变化。

6. 西门子地址填写:寄存器映射、数据类型与一条验证命令

地址填写是整个方案里最琐碎也最容易被轻视的一环。KepServer 对接不同系列的西门子 PLC,地址格式有差异:S7-200 SMART 常用M0.0、VW0,S7-1200/1500 多用 DB 块寻址。

6.1 KepServer 里西门子地址的通用写法

常见格式如下表,我按 S7-1200/1500 通道说明:

PLC 地址含义KepServer 地址写法数据类型说明
DB1 里的 32 位浮点,偏移 0DB1,REAL0REAL(浮点)对应 DBD0
DB1 里的 16 位整数,偏移 4DB1,INT4INT(有符号字)对应 DBW4
DB1 里的布尔,字节 1 第 2 位DB1,X1.1BOOL对应 DBX1.1
输入映像区 I0.0I0.0BOOL数字量输入
输出映像区 Q0.0Q0.0BOOL数字量输出
标志位 M0.0M0.0BOOL内部位
数据字 MW10MW10WORD16 位无符号

记住:DB1,REAL0里的 0 是字节偏移,不是位偏移。很多新人在 DB1 第 4 字节处放一个浮点数,却填了DB1,REAL1,实际偏移 1 字节会错位。校验方法:用 PLC 编程软件看 DB 块的 Offset 列,严格按那列填。

6.2 地址填写的验证顺序:从 Quick Client 到实际 IO

填完地址先别急着连上位机,用 KepServer 自带的 Quick Client 做一个最小验证:

  1. 在 Quick Client 里添加你要测试的标记,比如channel1.device1.DB1_REAL_0。
  2. 右键 Read,看数据是否和 PLC 监视窗口一致。
  3. 如果是输出类地址,尝试 Write 一个测试值,再回到 PLC 端看有没有变化。

如果 Quick Client 数据正常,地址填写就没有问题。后面接 MySQL 双向还是接 OPC UA 客户端,都是同一套地址。我还习惯用一条命令确认通讯链路,在命令行工具里可以用 OPC UA 的读取测试(如果已配置 UA 端点):

curl -k -X POST https://localhost:49320/ua/read -H "Content-Type: application/json" -d "{\"nodeId\":\"ns=2;s=channel1.device1.DB1_REAL_0\"}"

这个不是标准接口,具体端点以你的配置为准,别把它当成通用命令。更通用的做法是,在 KepServer 管理界面把标记丢进 Simulator 驱动,用模拟值验证地址绑定关系是否对,再切换回真实设备。

6.3 我的习惯与收尾

我做每个项目前都画一张"地址-类型-用途"映射表,贴在现场电脑屏幕边。主备、MySQL 双写、后台服务,所有配置都依赖这张表。地址填错的代价不只是读了 0,可能是把别的配方值写到错误的 DB 里,导致设备动作错误。这几年见过不少事故,都是"看起来地址对,实际类型错了"。

最后说一个习惯:所有关键配置改完,都导出一份项目备份,放在与项目同名的目录里,文件名带日期。比如Kepware_Project_20260615.opf。KepServer 的主备切换、MySQL 写错、服务起不来的问题,有备份就有后悔药。希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询