ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Kepserver连接MySQL:OPC数据通过ODBC落库的完整配置与避坑指南

Kepserver连接MySQL:OPC数据通过ODBC落库的完整配置与避坑指南 简介针对需要将Kepserver采集数据写入MySQL数据库的工业自动化工程师这份PDF教程提供从零到一的完整对接方案。内容覆盖MySQL数据库安装、Navicat可视化管理工具的安装与破解、32位ODBC驱动配置以及Kepserver连接MySQL的详细操作流程并附有破解前停止服务、覆盖补丁等关键注意事项能有效规避文件占用与激活失败问题。资源包仅含1个PDF文件压缩后大小约3.89MB轻量便携适合随查随用。目前已有2627人学习使用说明该流程得到了较多实践验证。教程还同步讲解使用Excel将数据批量导入数据库的方法便于后续数据管理与测试整体步骤清晰、图文结合适合自动化集成、数据采集相关技术人员参考。1. Kepserver连接MySQL为什么在工业现场要把OPC数据落进关系库做产线数据采集的人迟早会撞上同一个问题Kepserver把PLC、DCS、仪表的数据都抓上来了实时画面里看得见可月底做报表、上MES、给老板看趋势图的时候数据还在Kepserver自己的日志里躺着导不出来。这时候最常见的解法是让Kepserver把数据写进一套数据库而MySQL因为免费、轻量、团队里随便谁都会两句成了中小产线最常被点名的那一个。这篇就是讲清楚怎么让Kepserver和MySQL打通从驱动选型、建表、ODBC配置到Kepserver里的数据记录器设置最后是你一定会遇到的时区、精度、锁表这些坑。适合谁看现场搞自动化、又要兼着搞IT的工程师还有做设备数据上云的乙方。新手能照着一步步点完熟手可以直接跳到第5章的避坑清单和最后一章的存储过程优化。2. 连接原理与选型ODBC驱动、Kepware架构与数据流2.1 OPC数据怎么走到MySQL驱动、DSN与写入链路先讲链路。Kepserver这边数据是分层组织的最上层是Channel通道Channel里挂Device设备Device下面才是Tag变量点。Tag的值来自OPC Server或者直接是模拟量、Modbus寄存器。要让这些值进MySQLKepserver自己不带原生的MySQL驱动它走的是Windows下的ODBC接口。数据流大概是OPC Server / PLC - Kepserver Channel/Device - Tag 实时值 - ODBC Data LoggerKepserver的插件 - MySQL Connector/ODBC 驱动 - MySQL 数据库表其中ODBC Data Logger是KepserverEx里的一个功能组件在项目树里右键就能添加。它做的事情很简单按设定的扫描周期把Tag的Value、Quality、Timestamp拼成一条SQL通过ODBC数据源写进MySQL表。也就是说你不需要自己写任何采集程序Kepserver全部代劳了。这套方案之所以在中小项目里最常见原因就三个。一是KepserverEx本身就是工业现场用得最广的OPC网关PLC侧不用动二是MySQL可以装在任意一台Windows或Linux服务器上不必和Kepserver同机三是ODBC驱动是标准接口以后想换SQL Server、PostgreSQL只需改DSN和表结构采集侧不用重做。2.2 驱动选型MySQL Connector/ODBC 5.3 还是 8.0连接MySQL驱动是关键选型点。MySQL官方提供的ODBC驱动有两个大版本5.3.x 和 8.0.x。我一般建议直接上8.0系列因为5.3对新的MySQL 8默认认证插件caching_sha2_password支持不完整经常出现连上了但是被拒绝的奇怪问题。如果你现场MySQL是5.7那5.3也能用但新装环境没理由选老驱动。另一个必须注意的点是位数。KepserverEx如果是64位进程ODBC驱动就必须装64位DSN也要在64位的ODBC管理器里建。很多人在这翻车装了个32位驱动Kepserver里配置半天一测试连接就报错。判断方法是打开odbcad32.exe看“驱动程序”标签页里有没有MySQL ODBC 8.0 Unicode Driver。Windows自带的ODBC管理器在C:\Windows\System32\odbcad32.exe是64位的C:\Windows\SysWOW64\odbcad32.exe是32位的别搞反了。驱动装完之后需要建一个DSN数据源名称。这个名字就是Kepserver配置ODBC Data Logger时要选的那个“连接字符串”。DSN里要写清楚的参数包括Server地址、端口3306、Database名、用户名、密码还有几个容易漏的——charsetutf8mb4防止中文乱码、zeroDateTimeBehaviorCONVERT_TO_NULL防止表里有0000-00-00时间值时报错、allowMultiQueriestrue如果你要在存储过程里做批量写入。3. MySQL侧准备建库、建表、ODBC驱动与连接测试3.1 安装并配置MySQL ODBC驱动Windows先去MySQL官网下载MySQL Connector/ODBC的Windows安装包注意区分32位和64位。Kepserver这边如果是64位就下载64位的msi安装包。安装过程一路Next装完在ODBC管理器里就能看到驱动。然后在“系统DSN”里点添加选MySQL ODBC 8.0 Unicode Driver填这几项Data Source Name比如MySQL_Kep这个名称待会在Kepserver里要用。TCP/IP ServerMySQL服务器的IP如果是本机填localhost或127.0.0.1。Port3306。User / Password专门给Kepserver建的账号不要用root。Database选你建好的数据库比如kep_data。填完后点Test看到“Connection successful”才算完。这里有个细节DSN里的字符集要在“Details”标签里设置默认Latin1不改的话写进去的中文Tag名都会变问号这是最常见的乱码源头。3.2 创建数据库、数据表与专用账号进MySQL命令行或Navicat执行下面的SQL。这段SQL我直接给出可复制的版本字段也按Kepserver的ODBC Data Logger习惯建好了。-- 建数据库指定utf8mb4中文不乱码 CREATE DATABASE IF NOT EXISTS kep_data DEFAULT CHARACTER SET utf8mb4 DEFAULT COLLATE utf8mb4_general_ci; USE kep_data; -- 明细数据表一条记录一个Tag的一个周期值 CREATE TABLE IF NOT EXISTS tag_history ( id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY, vhid INT UNSIGNED NULL, -- Kepserver内部变量句柄, 可空 tag_name VARCHAR(120) NOT NULL, -- Tag完整路径 tag_value DOUBLE NOT NULL, -- 数值 quality INT NOT NULL DEFAULT 192, -- OPC质量码, 192Good ts DATETIME NOT NULL, -- 采集时间戳 write_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, -- 写入时间 INDEX idx_tag_ts (tag_name, ts) ) ENGINEInnoDB; -- 专用账号, 只给DML权限, 不给DROP/ALTER CREATE USER IF NOT EXISTS kep_writer% IDENTIFIED BY Kep2024Write; GRANT SELECT, INSERT, UPDATE, DELETE ON kep_data.* TO kep_writer%; FLUSH PRIVILEGES;这里几个字段说明一下。tag_name存的是Kepserver里的完整Tag路径比如Channel1.Device1.Tag1这样以后做报表直接按这个字段分组就行。quality是OPC协议里的质量码值为192表示Good64表示Bad——如果发现一堆quality不是192说明现场链路有问题采集上来的数据不能盲信。ts是Kepserver打的时间戳write_time是MySQL自己的写入时间两个时间分开排查延迟时能看出是网络慢还是采集慢。注意不要用FLOAT存tag_value。Kepserver传上来的模拟量常常是小数点后三四位的压力、温度FLOAT只能精确到7位有效数字做累加和平均时会漂。用DOUBLE多占点空间但值是真的。3.3 用DSN验证连通性这一步很多人跳过但我强烈建议先做。建好DSN后用下面的Python脚本模拟Kepserver的写入方式验证MySQL表、账号、驱动三层都通。import mysql.connector # 用连接串而不走DSN验证TCP链路本身 conn mysql.connector.connect( host192.168.1.50, # MySQL服务器IP port3306, userkep_writer, passwordKep2024Write, databasekep_data, charsetutf8mb4 ) cur conn.cursor() # 模拟Kepserver的一条写入 sql INSERT INTO tag_history (vhid, tag_name, tag_value, quality, ts) VALUES (%s, %s, %s, %s, %s) cur.execute(sql, (1, Channel1.Device1.Pressure, 1.2345, 192, 2024-05-20 10:00:00)) conn.commit() cur.execute(SELECT COUNT(*) FROM tag_history) print(当前行数:, cur.fetchone()[0]) cur.close() conn.close()如果Python能写上一条Kepserver那边基本就稳了。常见异常是Authentication plugin caching_sha2_password报错这说明MySQL 8的默认认证插件和当前驱动不兼容。解决方式是新建账号时指定mysql_native_password或者升级ODBC驱动到8.0.27以上。还有Host xxx is not allowed to connect就是账号的host限制把kep_writer%改成允许网段别直接用root裸奔。4. Kepserver侧配置Channel、Device、日志文件与ODBC写入4.1 创建Channel与Device并绑定OPC ServerKepserver里要先把数据来源建好。打开KepserverEx Configuration左侧项目树右键“Channel”新建名称MySQL_Channel驱动类型看你现场数据从哪来。如果是接KEPServer自身的OPC UA Server选“OPC UA Client”如果直接接Modbus TCP设备选“Modbus TCP/IP Driver”。Channel建好后在Channel下右键新建Device。Device的名称会出现在Tag路径的第二段。关键参数是Device的IP地址和端口比如Modbus TCP默认502OPC UA默认可能是48010或62541按你设备的实际值填。然后到Device下面可以直接浏览来自OPC Server的Tag右键选择“Add Dynamic Tag”或者从OPC UA服务器里拖拽映射。这里建议把要落库的工艺测点全部显式建立别靠动态Tag——动态Tag虽然省事但一旦OPC Server断连Kepserver会把它标记成坏质量且不会自动重连恢复第二天早上过来看数据全是断的。4.2 启用ODBC客户端连接与日志数据表数据源建好后回到项目树根右键“Add ODBC Data Logger”。这个操作会生成一个日志插件节点下面要配置几部分。首先在ODBC Data Logger的属性页里选刚才建好的DSN名称MySQL_Kep填连接的用户名密码。这里有个很隐蔽的坑如果你在DSN里已经存了账号密码Kepserver的ODBC配置页还要求再填一次账号密码两处不一致时Kepserver会优先用配置页里的然后连不上。所以我的习惯是DSN里不存密码只在Kepserver里填这样只会有一种配置状态排错容易。其次设置“Table Layout”。ODBC Data Logger支持两种写入方式一种是直接把Tag值映射到表的列适合表结构固定另一种是用存储过程Kepserver把参数传进去由存储过程决定怎么落盘。常见做法是第一种因为你已经建好了tag_history表只需要把Tag和列做映射Tag的Value -tag_valueTag的Quality -quality系统时间戳System Timestamp-tsTag的完整名称 -tag_name可以在映射里选“Static Value”填固定值或者用“Tag Name”变量。4.3 写一个最小可用的写库配置下面是一组我实际在项目里用过的关键参数按KepserverEx 6.x的界面位置给出照抄基本能跑通。配置项推荐值说明Scan Ratems1000采集周期1000每秒一次别设500以下MySQL写入跟不上会积压Timestamp SourceSystem Timestamp用Kepserver的系统时间而不是设备时间Disable on Scan FailureFalse扫描失败不暂停避免一次错误导致永久停写Table ActionInsert只插入不更新Transaction Size100攒够100条批量提交减少MySQL提交开销Transaction Size这个参数最容易被忽略。默认1的话每秒100个Tag等于每秒100次独立连接提交MySQL的InnoDB线程会被拖垮。调成100之后Kepserver会在内存里攒批每攒满一条批量INSERT整体写库性能好很多。代价是异常断电时会丢最后不到100条的数据一般产线都能接受。配置完之后启动Kepserver的Runtime观察日志插件节点的状态变成绿色运行中。然后在命令行里连到MySQL执行下面这条SQL确认数据在流动SELECT tag_name, tag_value, quality, ts FROM kep_data.tag_history ORDER BY ts DESC LIMIT 20;如果能看到新记录一直刷出来而且时间戳是当前时间配置就成了。如果tag_value是0或者Null回Kepserver的Tag Viewer里看实时值多半是Tag路径映射错了。5. 连接MySQL避坑指南ODBC报错、时区与数据类型5.1 现象驱动报“Data source name not found”或者“Cant connect to MySQL Server”Kepserver的ODBC插件在配置完测试连接时最常见的报错就是找不到数据源或者端口连接失败。原因通常是三选一DSN建在了32位ODBC管理器里而Kepserver是64位MySQL服务没监听3306端口防火墙拦了。解决先确认DSN类型和驱动位数。再看my.ini里的bind-address如果是127.0.0.1远程MySQL是连不上的要改为0.0.0.0或具体网卡IP。最后放行防火墙端口。# MySQL服务器上确认监听状态 netstat -an | grep 3306 # 放行3306端口 firewall-cmd --permanent --add-port3306/tcp firewall-cmd --reload5.2 现象数据写进去了但时间戳比本地时间晚了8个小时Kepserver的System Timestamp是Windows本地时间但MySQL连接串里如果没有指定serverTimezoneJDBC/ODBC驱动会按服务器时区解释。如果你的MySQL和Kepserver不在同一台机器、且MySQL容器是UTC时区那么写入的时间戳就会整体偏移报表按小时统计时会出现整点错位。解决连接串里显式指定时区。在DSN的Details参数或Kepserver连接串中加上serverTimezoneAsia/ShanghaiuseSSLfalseallowPublicKeyRetrievaltrue这里顺带说useSSLfalse。MySQL 8默认要求SSL连接但ODBC驱动和老版本MySQL之间SSL握手经常不稳定出现SSL connection error。工业内网的数据链路加密需求没那么高直接把SSL关掉是省心做法。5.3 现象写入的浮点数变成一堆科学计数法精度还对不上Kepserver测点里有不少是设备直接传来的32位浮点比如压力变送器的量程是0到100MPa分辨率0.001。如果MySQL表的tag_value字段用FLOAT建表超过7位有效数字部分就丢了常见表现是1.2345001被记成1.2345或者数量级大了以后精度错乱。解决建表用DOUBLE。如果查询场景里要精确到指定小数用DECIMAL(12, 4)但要注意Kepserver写入的是DOUBLE转DECIMAL时四舍五入的规则在存储过程里可控直接INSERT则按MySQL的转换规则来。工业现场我建议要么DOUBLE全存查询时再ROUND要么在存储过程里先ROUND再写保持源头数据真实。另外观察quality列常态应该是192。如果连续出现Bad质量值比如192以下的数别看数据库了先排查现场PLC和Kepserver的连接那才是数据不准的根。5.4 现象Tag一多MySQL表锁死Kepserver Runtime运行几小时就挂这个最容易在数据量大的项目里发生。一个产线上百个测点Scan Rate设500ms每秒200条写入如果Transaction Size还是默认的1InnoDB每秒执行几百次独立提交磁盘小事务性能撑不住Kepserver的队列越积越多最终Runtime卡死。解决把Scan Rate降到1000msTransaction Size调到100表按时间做分区。分区方案我放在第6章。同时确认MySQL的innodb_flush_log_at_trx_commit设置——在工业采集这种允许丢失少量数据的场景设为2比1更快两条命令SET GLOBAL innodb_flush_log_at_trx_commit 2; SET GLOBAL sync_binlog 0;注意这两个是全局参数MySQL重启后失效要持久化需写进my.ini的[mysqld]段。5.5 现象连上了但增删改查都提示Table doesnt exist排查日志里如果出现这条别急着去MySQL看表名。先确认Kepserver ODBC Data Logger配置的Table Name是tag_history而不是kep_data.tag_history——带库名的写法在某些ODBC驱动下会被双引号包起来当成全名而表字真实的名字是后者导致找不到。解决方法很简单表名只写表名库名在DSN的Database字段里已经选中了。6. 进阶用法用存储过程做批量写入与数据归档6.1 存储过程与事件调度器的配合Kepserver自带的ODBC Data Logger解决了写入问题但半年之后硬盘上几十GB的明细表会成为MySQL的负担。我的习惯是不动Kepserver在MySQL里做线上归档明细表保留最近30天更早的按天汇总成小时平均值表既支撑报表又控制数据体积。先建聚合表再用事件调度器定期执行归档存储过程。USE kep_data; -- 按小时聚合表 CREATE TABLE IF NOT EXISTS tag_hourly_avg ( tag_name VARCHAR(120) NOT NULL, hour_ts DATETIME NOT NULL, avg_value DOUBLE NOT NULL, max_value DOUBLE NOT NULL, min_value DOUBLE NOT NULL, sample_count INT NOT NULL, PRIMARY KEY (tag_name, hour_ts) ) ENGINEInnoDB; -- 归档存储过程 DELIMITER $$ CREATE PROCEDURE proc_archive_1h() BEGIN INSERT INTO tag_hourly_avg (tag_name, hour_ts, avg_value, max_value, min_value, sample_count) SELECT tag_name, DATE_FORMAT(ts, %Y-%m-%d %H:00:00), AVG(tag_value), MAX(tag_value), MIN(tag_value), COUNT(*) FROM tag_history WHERE ts NOW() - INTERVAL 2 HOUR AND ts NOW() - INTERVAL 1 HOUR GROUP BY tag_name, DATE_FORMAT(ts, %Y-%m-%d %H:00:00) ON DUPLICATE KEY UPDATE avg_value VALUES(avg_value), max_value VALUES(max_value), min_value VALUES(min_value), sample_count VALUES(sample_count); END$$ DELIMITER ; -- 每小时跑一次 SET GLOBAL event_scheduler ON; CREATE EVENT IF NOT EXISTS e_archive_1h ON SCHEDULE EVERY 1 HOUR STARTS CURRENT_TIMESTAMP INTERVAL 1 HOUR DO CALL proc_archive_1h(); /antml 这里的事件调度器要打开event_schedulerMySQL默认不一定开启。如果归档过程想换成每天跑一次把EVERY 1 HOUR改成EVERY 1 DAY存储过程和事件的开销都很小不会影响Kepserver的实时写入。小时级别的聚合数据足够做产线效率分析、OEE计算和趋势图展示明细表则视需要按月清理可以再用一个事件删掉90天前的旧数据。 ### 6.2 验证数据完整性的SQL 最后运维阶段的数据校验比配置本身更容易被忽视。我每次接完一个新产线都会在第二天早上跑一遍这几条SQL确认过夜写入没有丢点、没有坏值 sql -- 1. 检查最近24小时每个Tag的写入条数, 应约等于 24*3600/采集周期 SELECT tag_name, COUNT(*), COUNT(DISTINCT ts) FROM tag_history WHERE ts NOW() - INTERVAL 1 DAY GROUP BY tag_name; -- 2. 检查坏质量占比 SELECT tag_name, COUNT(*) AS total_cnt, SUM(CASE WHEN quality ! 192 THEN 1 ELSE 0 END) AS bad_cnt FROM tag_history WHERE ts NOW() - INTERVAL 1 DAY GROUP BY tag_name;第二条SQL尤其值得关注。如果某个Tag的bad_cnt占比超过1%说明这个点位的现场信号不稳定Kepserver采集到的值不可信这时候优化MySQL不如优化现场的传感器接线和屏蔽。数据完整性的验证要在接入后第一周就固化下来别等月底做报表时才发现丢了半天的数。养成习惯后我现在每做一套KepserverMySQL的采集项目都会把上面这套SQL脚本留在现场的一台跳板机上交接时附上一段话配置做完只是开始先盯完整性和质量码一周再谈报表开发。希望帮到你。本文还有配套的精品资源点击获取
返回列表