简介:Kepserver连接MySQL的完整操作指南,面向工业自动化工程师、PLC调试人员及上位机开发者,解决OPC服务器与关系型数据库之间的数据打通问题。资源以一份PDF文档形式打包,体积仅3.89MB,内容覆盖MySQL安装、Navicat管理工具安装与激活、ODBC驱动选型(强调32位驱动)以及Kepserver与MySQL连接过程的逐步演示,并额外给出通过Excel向数据库导入数据的实操方法。文档从Kepserver的安装与破解讲起,包括服务停止、补丁覆盖等关键避坑点,再依次展开MySQL环境配置、Navicat授权激活细节,最后落到ODBC驱动配置与连接验证,适合需要从零搭建Kepserver数据采集链路的入门及中级用户。该资源已有2628人学习,步骤清晰、附带破解与排错提示,可直接按文档顺序操作,能显著减少自行摸索的时间成本。
1. Kepserver连接MySQL:OPC数据落到关系库的最后一公里
“Kepserver连接MySQL”这套流程我拆过很多遍,场景几乎都是一个模子:现场PLC、仪表把实时值送进KepserverEX,而上位机报表和MES要的是能按月检索的历史数据。Kepserver擅长做OPC采集,不擅长长期存储,MySQL在这种中小项目里反而是最顺手的落库选择。这套笔记适合刚接触数据采集的工程师,也适合给既有产线补历史库的运维。别急着装软件,先按“数据库侧准备→Kepserver侧配置→联调验证”的顺序来,中间穿插我踩过的坑:32位ODBC驱动、字符集、断线回补,都是会卡住你半天的点。
2. 数据库侧准备:MySQL、Navicat与32位ODBC三件套
2.1 MySQL服务端安装与初始账号
安装MySQL Community Server时,用MSI安装包选Custom,把Server本体、命令行客户端、Workbench组件都加到右侧。一路下一步,到了设置密码那一步,密码建议直接记在项目配置里,因为后面DSN、DataLogger、Navicat都要填。默认字符集这一项在安装向导里藏得比较深,常见做法是装完后在MySQL的my.ini里手动补上character-set-server=utf8mb4,否则默认latin1容易在写中文点位描述时变乱码。
先建库建表,我一般用下面这套:
CREATE DATABASE opcdata DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; USE opcdata; CREATE TABLE tag_history ( id INT AUTO_INCREMENT PRIMARY KEY, tag_name VARCHAR(100) NOT NULL, tag_value DOUBLE, quality TINYINT, ts DATETIME, KEY idx_ts (ts) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;tag_history是历史明细表,tag_name存Kepserver里的标签名,tag_value存数值,quality存OPC质量码,ts存采集时间。把ts放索引是因为报表基本都按时间范围查,没有索引会全表扫,数据量一上来查询就卡。如果之后点位多到百万级,可以把表改成按ts做分区,初版先不用追求这个。
再建一个专用账号,不要直接用root连Kepserver:
CREATE USER 'kepapp'@'localhost' IDENTIFIED BY 'Kep_2024_pw'; GRANT SELECT, INSERT, UPDATE, DELETE ON opcdata.* TO 'kepapp'@'localhost'; FLUSH PRIVILEGES;kepapp是给DataLogger和DSN用的应用账号,权限只限opcdata这个库。如果MySQL和Kepserver不在同一台机器,localhost要换成Kepserver所在机器的IP或主机名,同时MySQL的bind-address要放开,不能只监听127.0.0.1。我在现场见过用root账号建DSN然后密码泄露的情况,不要给Kepserver这种服务账号开全库权限,它只需要对历史表做增删改查。
2.2 Navicat与ODBC驱动版本
Navicat不是数据链路上的必要环节,但调试期非常省事。装好后直接连opcdata库,确认账号权限能用,顺便检查表结构和字符集。后面所有“有没有写进去”“时间对不对”的验证都在这里完成。
ODBC驱动是整条链路里最容易翻车的部分。KepserverEX 6.4是32位程序,它只会加载32位ODBC驱动。下载MySQL Connector/ODBC时,网页上一般有32位和64位两个MSI包,务必要选x86结尾的那个。装完后怎么确认位数对了?按Win+R打开odbcad32.exe,注意是C:\Windows\SysWOW64\odbcad32.exe这个32位管理器,不是System32下那个64位版本。在“驱动器”列表里能看到“MySQL ODBC”驱动才算装上。
可以用PowerShell做一个快速检查:
Get-Item "C:\Windows\SysWOW64\odbcad32.exe" Get-OdbcDriver | Where-Object { $_.Name -like "*MySQL*" }第一行确认32位管理器存在,第二行列出系统里所有MySQL相关ODBC驱动。如果只装了64位驱动,这里会看不到,Kepserver的DSN下拉框里也会是空的,这是新手最常踩的坑。项目里我统一只装32位驱动,不跟x64混装,X86和X64驱动并存时DSN文件位置是两个注册表路径,动不动就找不到,没必要给自己加戏。
2.3 从Excel点表倒出初始化数据
很多项目不是从零开始,手里已经有一份Excel点位表。用Navicat导入向导最快:菜单栏选“导入向导”,选Excel文件,再选目标库表,按列映射字段。Excel第一行是表头就勾选“跳过首行”,否则表头会被当成数据写进去。时间列在Excel里要先转成yyyy-mm-dd hh:mm:ss这种文本或自定义格式,否则导入到MySQL的DATETIME字段会变成NULL。
如果点位表经常更新,我更倾向用LOAD DATA做准备表,Navicat向导适合一次性导入,可重复性差。示例:
LOAD DATA LOCAL INFILE 'D:/init_plc_tags.csv' INTO TABLE tag_init FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n' IGNORE 1 LINES (tag_name, address, data_type, description);LOCAL关键字表示读客户端本地文件,需要MySQL客户端开启allowLoadLocalInfile;不开LOCAL就只能把文件放到服务端data目录,用绝对路径读,权限管理麻烦一些。tag_init可以临时建,导入后用INSERT SELECT拆到正式表。导入完先做一次空值诊断:
SELECT * FROM tag_init WHERE tag_name IS NULL OR address IS NULL;Excel导入的经典问题是数字列里混了文本,比如地址列某些单元格带前导空格或中文全角空格,导入后address就变NULL。这一步不清理,后面Kepserver标签核对会一直对不上。
3. Kepserver侧配置:从ODBC DSN到通道设备标签
3.1 先建系统DSN
Kepserver里的ODBC写库组件走的是Windows ODBC DSN,不是直接填IP端口连接串。所以开头要在Windows侧建系统DSN:控制面板→管理工具→ODBC数据源管理程序(32位)→系统DSN→添加→选MySQL ODBC驱动→填写服务器IP、端口3306、用户名kepapp、密码、数据库opcdata。字符集选项建议显式设为utf8mb4,不同驱动版本标签名不一样,有的是“Character Set”,有的是“Charset”,多翻一翻。
系统DSN和用户DSN的区别在权限。Kepserver服务经常跑在SYSTEM账户下,建用户DSN容易出现服务进程看不到DSN的情况,所以统一建系统DSN。批量部署时用命令行更高效:
odbcconf CONFIGSYSDSN "MySQL ODBC 8.0 Unicode Driver" "DSN=opc_dsn|SERVER=127.0.0.1|PORT=3306|DATABASE=opcdata|UID=kepapp|PWD=Kep_2024_pw|OPTION=3|CHARSET=utf8mb4"双引号里的驱动名必须和你安装的版本完全一致,装的是ANSI版就写ANSI,Unicode版就写Unicode,错了报错信息很迷惑。用odbcconf之后,建议还是去odbcad32.exe界面里点一下“测试”,能连通才能往下走。命令行适合重复部署,我自己在单机调试时还是用图形界面,看得见错误提示。
注意32位系统DSN在注册表的位置是HKLM\SOFTWARE\WOW6432Node\ODBC\ODBC.INI,如果你用脚本直接改注册表也要走这条路,不要写到64位路径下,否则Kepserver仍然看不到。
3.2 Kepserver通道、设备与标签
打开KEPServerEX 6.4,左栏项目树右键“新建通道”,通道类型根据PLC选择,常见的有Modbus TCP、Siemens、AB,测试阶段可以直接用Simulator仿真器。通道建完在通道下面新建设备,填PLC站号或IP地址。设备的地址映射要和PLC程序一致,否则标签读出来都是Bad质量码。
设备下面新建标签,标签名我习惯用英文大写加下划线,比如PRESSURE_01、TEMP_01。名字里的特殊字符和空格会让CSV导出、SQL查询、报表引用都变得很痛苦,不要给自己埋雷。标签的地址按驱动格式填,Modbus TCP就是400001这种寄存器地址,数据类型选Float、Word、Long,要和PLC里定义的类型一致,否则读出来的值解释错误。
导出标签的CSV结构大概是这样的:
Tag Group,Tag Name,Address,Data Type,Description Group1,PRESSURE_01,400001,Float,反应釜压力 Group1,TEMP_01,400003,Float,反应釜温度Kepserver本身不直接导入CSV建标签,但这个CSV是给后面Excel点表核对用的。把Kepserver导出的标签名和点位表Excel做对比,能快速发现地址漏配和类型不对。联调之前先在Quick Client里加几个标签,能读到实时值再继续,至少先排除通道和设备这一层的问题。
3.3 写库方式选型:DataLogger优先于自研客户端
Kepserver把数据写进MySQL有几种走法:自带DataLogger插件直接采集标签写库;自己写OPC DA/UA客户端读到值再INSERT;用第三方桥接组件。我在项目里优先用DataLogger,理由很简单:不用编程,断线缓存是现成的。自研客户端听起来灵活,实际上要处理OPC连接重连、数据库连接池、断线缓存、时间戳对齐,一套折腾下来比配DataLogger多花三五天,后期还是继续填坑。
DataLogger在KEPServerEX 6.4里是自带组件,配置的时候独立于主界面,新建任务、选数据源、映射字段。它本质上是订阅Kepserver的标签变化,然后按周期批量写入ODBC数据源。数据源就是刚才建的opc_dsn。这个组件的缓存机制让它在MySQL服务重启或者网络闪断时不会立刻丢数据,先写本地缓存文件,恢复后再回补,这部分第4章会展开。
一个容易被忽略的点:DataLogger任务名不要用中文和空格,配置完成后重启Kepserver服务,确认任务状态不是灰色,否则连接不生效。
4. 数据链路联调:DataLogger写库与参数调优
4.1 创建DataLogger任务并映射字段
DataLogger任务的入口在Kepserver管理界面里,新建任务后运行模式选“Log to ODBC”,数据源选opc_dsn,目标表选tag_history,然后把要采集的标签加进任务里。字段映射要手动指定,核心对应关系是标签名到tag_name、标签值到tag_value、采集时间到ts。DataLogger的配置文件导出后大概是这个结构:
<DataLoggerTask> <TagItem tag="Group1.PRESSURE_01" table="tag_history" column="tag_value" /> <TagItem tag="Group1.TEMP_01" table="tag_history" column="tag_value" /> </DataLoggerTask>tag属性是Kepserver里标签的完整路径,table是目标表,column是目标列。DataLogger本身不写XML,这是它可视化配置在底层的表达方式,理解这个结构有助于排查映射错误。关键一点:如果MySQL表里没有quality列,映射里就不要写;写了反而会在插入时报列不存在。
启动任务后等几十秒,在Navicat里跑:
SELECT ts, tag_name, tag_value, quality FROM tag_history ORDER BY ts DESC LIMIT 10;有行出现就是链路通了。如果表里空,先查看DataLogger的日志,日志级别调到Debug,能看到每次INSERT的SQL和报错信息。常见错误是ODBC驱动字符集不对导致中文标签名写入失败,还有字段类型不匹配,比如MySQL列是VARCHAR,标签值是Float,插入时会把数字当字符串处理,数字精度丢失但不报错,这个比较隐蔽。
4.2 刷新周期、批量提交与缓存设置
联调通了不等于能稳定跑。参数调优我一般按下面这张表来:
| 参数项 | 典型值 | 说明 |
|---|---|---|
| 刷新周期 | 1s 到 5s | 跟工艺要求匹配,太短会占用ODBC连接 |
| 批量条数 | 100 到 500 | 批量越大吞吐越高,但事务时间变长 |
| 重试间隔 | 10s 到 30s | MySQL重启后快速恢复连接 |
| 缓存目录 | D:/Kepvar/Cache | 不要放C盘系统盘 |
| 连接超时 | 10s | 数据库网络抖动时快速失败 |
刷新周期不是越小越好,现场曾经有人设了100ms,结果上千个标签把ODBC驱动跑爆,MySQL服务端连接数直接打满。常见做法是按工艺数据变化频率来,压力温度这种缓变量1s完全够,需要秒级记录的再单独开任务设500ms。批量条数设太大还有个坑:MySQL的max_allowed_packet如果默认值偏小,批量提交会报packet too large,需要去my.ini里调到64MB再重启服务。
数据库侧可以用这个命令看连接状态:
SHOW PROCESSLIST;正常应该看到几条来自DSN的kepapp连接,Command列为Sleep或者Query。如果连接数不断上涨然后TIME值很大,多半是应用程序连接没释放,检查DataLogger的连接串和批量提交配置。
4.3 Excel导入数据的另两条落地路径
Navicat导入向导适合一次性操作,但Excel点表会随着设备改造频繁更新。我一般会把点位Excel转成CSV,清理后LOAD DATA进一张临时表,再通过INSERT SELECT并入正式表。Kepserver导出的标签地址经常带前导空格,导入后先清理:
UPDATE tag_init SET address = TRIM(address) WHERE address LIKE ' %';TRIM只去掉普通空格,全角空格要去用REPLACE换成空字符。地址列如果是混合格式,地址变NULL就会对不上。历史Excel数据导入时,时间字段要标准化,不能靠肉眼:
UPDATE tag_history SET ts = STR_TO_DATE(ts_str, '%Y-%m-%d %H:%i:%s') WHERE ts IS NULL;ts_str是导入时暂存的文本列,转换失败会返回NULL,正好暴露哪些行格式有问题。导入完成后建议去重,同一个标签同一秒多写了两条会导致报表计数翻倍:
DELETE t1 FROM tag_history t1 JOIN tag_history t2 ON t1.tag_name = t2.tag_name AND t1.ts = t2.ts AND t1.id > t2.id;去重前先备份,我一般会先CREATE TABLE tag_history_bak AS SELECT * FROM tag_history;。操作完再建联合索引,查标签+时间的报表就快很多:
ALTER TABLE tag_history ADD INDEX idx_tag_ts (tag_name, ts);5. 避坑与常见问题:最容易出问题的是这五个环节
5.1 驱动位数与DSN位置不一致
现象:控制面板的“ODBC数据源管理程序”里能看到DSN,但Kepserver的DataLogger下拉框里死活选不到。
原因:KEPServerEX 6.4是32位进程,只能枚举32位ODBC数据源。64位管理器创建的DSN写在HKLM\SOFTWARE\ODBC\ODBC.INI,32位程序读的是HKLM\SOFTWARE\WOW6432Node\ODBC\ODBC.INI,两个注册表位置不互通。
解决:打开C:\Windows\SysWOW64\odbcad32.exe,在这个32位管理器里重建系统DSN。如果装了x64驱动,最好卸载掉或者至少不要让系统里只剩x64。确认列表用PowerShell:
Get-OdbcDsn | Where-Object { $_.Name -eq 'opc_dsn' }能看到opc_dsn并且DriverName里带“32-bit”字样就对了。验完再去Kepserver里重开DataLogger配置页,下拉列表立刻出现。
5.2 字符集导致的中文乱码和长度错误
现象:Excel导入后中文点表名变成“???”,Kepserver标签描述写进MySQL后乱码,或者INSERT报“value too long”。
原因:ODBC驱动未显式指定字符集,MySQL表是latin1,或者服务端character_set_server还是默认值。中文字符在latin1里被截断成一字节,字节数超过字段长度就报错。
解决:建库时统一用utf8mb4;DSN里把Charset设成utf8mb4;已经建好的表可以转换:
ALTER TABLE tag_history CONVERT TO CHARACTER SET utf8mb4;注意转换不能修复已经写入的乱码数据,乱码是字符集识别错误导致,转完还是那一堆问号,只能重新从数据源导入。所以导入前先确认Excel内容正常,别拿乱码点表反复试。
5.3 时间字段变成字符串导致排序错乱
现象:报表查询最新时间,结果2024开头的反而不是最新,像在排字典序。
原因:Excel时间列被导入成文本,目标列是VARCHAR而不是DATETIME,Navicat导入时按文本识别。DATETIME接收不了“2024/1/5 9:30”这种格式,会直接变NULL,而VARCHAR能接收,数据就有值但没法做时间函数。
解决:Excel里先选中整列,设置单元格格式为“自定义格式:yyyy-mm-dd hh:mm:ss”,再导入。已经导成字符串的,用STR_TO_DATE批量修:
UPDATE tag_history SET ts = STR_TO_DATE(ts_str, '%Y-%m-%d %H:%i:%s') WHERE ts_str IS NOT NULL;改完要把ts_str列删掉,后续程序别再用它排序。
5.4 DataLogger任务显示Running但没有数据
现象:DataLogger一直Running,Kepserver里标签能读到实时值,MySQL表里就是没有新增记录。
原因:目标表名或字段映射写错,ODBC账号没有INSERT权限,或者批量缓冲区还没刷新。DataLogger对部分错误不弹窗,只看状态根本看不出来。
解决:先手工INSERT验证权限:
INSERT INTO tag_history(tag_name, tag_value, ts) VALUES('PRESSURE_01', 1.23, NOW());能插进去说明表和账号没问题,问题在映射或任务配置。把日志级别调到Debug,看有没有SQL错误。临时把批量条数改成1,确认能落库,再调回100以上。如果手工INSERT也报权限错误,回到MySQL执行GRANT补权限。
5.5 OPC质量码坏值当真实数据写入
现象:表里大量0值,现场仪表实际是断开的,上位机显示Blad质量码。
原因:Kepserver把Bad质量码的标签值也当普通值交给DataLogger写入,DataLogger默认不判断质量码。
解决:DataLogger任务里能加质量过滤就加上,只采集Good质量码;要么把quality列写进来,后续查询过滤。我常用:
DELETE FROM tag_history WHERE quality IN (0, 128);quality是OPC质量码,192表示Good,128表示Bad,0表示未知,具体数值跟驱动实现有关。删除前先SELECT确认一下,别误删真实数值为零的好数据。这个情况在Modbus设备突然断电时非常典型,Kepserver里标签变灰,但DataLogger还会把断线前的最后一个值周期写入,数据库看起来像在正常走数。
6. 验证完整性的习惯:断线回补与最终核对
链路通不通,最终标准不是“MySQL里有没有数据”,而是“过程故障时数据能不能回补”。我每配置完一个采集任务,都要直接做一次断线测试。操作很简单:先把Kepserver的通道禁用五分钟,再恢复,然后到数据库里查这段时间的分布:
SELECT tag_name, COUNT(*) AS cnt, MIN(ts) AS start_ts, MAX(ts) AS end_ts FROM tag_history WHERE ts BETWEEN '2024-01-05 10:00:00' AND '2024-01-05 10:10:00' GROUP BY tag_name;如果DataLogger的缓存回补生效,这段五分钟窗口不该是空白。习惯上我会再看一个24小时分布:
SELECT DATE_FORMAT(ts, '%Y-%m-%d %H') AS hour_slot, COUNT(*) AS cnt FROM tag_history WHERE tag_name = 'PRESSURE_01' AND ts >= NOW() - INTERVAL 24 HOUR GROUP BY hour_slot ORDER BY hour_slot;只要某个小时段明显少于平均值,就说明那个时间段出现过采集中断且回补失败。查的时候先确认Kepserver通道本身有没有告警日志,再看DataLogger缓存目录的磁盘剩余空间。缓存目录放C盘是常见败笔,系统盘被日志和缓存塞满之后,DataLogger会先删旧缓存,历史数据还没写进MySQL就没了。
进阶一点的做法是在MySQL里建一张心跳表,让DataLogger每十秒写一条心跳值,而不是只依赖业务标签。这样断点出在采集还是写库,看心跳表立刻能判断。再往后就是性能优化,比如按月对历史表做分区,或者给quality列写完整质量码,做报警统计的时候不用回头翻OPC。
当初我在一个项目里排查丢数,查了半天才发现DataLogger缓存目录在C盘,系统盘剩余几百MB,旧缓存被自动清理,那几天的数据永久性丢了。从那以后我每次配置Kepserver落MySQL,都强制走一遍“先看ODBC位数与DSN、再核对字段映射、最后做断线回补测试”这三步。这个过程能提前暴露八成的坑,希望帮到你。
本文还有配套的精品资源,点击获取