工业数据上云新思路:用CODESYS+AlongWu库把PLC数据存进MySQL数据库
工业数据上云实战基于CODESYS与AlongWu库的PLC-MySQL数据通道构建在工业4.0时代车间设备的实时数据已成为企业数字化转型的核心资产。传统SCADA系统虽然能实现数据采集但面对海量时序数据的存储与分析需求时往往显得笨重且扩展性不足。本文将介绍一种轻量级解决方案——通过CODESYS平台配合AlongWu开发的MySQL连接库直接将PLC运行时数据写入中心数据库构建从设备层到云端的短链路数据通道。1. 技术选型背景与方案优势工业现场的数据上云通常面临三大痛点协议异构性导致接入困难、高频数据冲击传统数据库性能、以及工业环境对稳定性的苛刻要求。相较于OPC UA等中间件方案CODESYSMySQL的直接存储模式具有以下差异化优势协议精简省去OPC Server中转环节降低系统复杂度存储自由MySQL表结构可完全自定义适配不同分析需求成本可控无需额外授权费用利用现有IT基础设施典型适用场景包括设备状态监控振动、温度等工艺参数生产计数与质量数据采集能源消耗数据的长期归档注意该方案适合数据点规模在2000点以内的应用超大规模部署建议采用时序数据库优化写入性能2. 环境搭建与库配置2.1 基础环境准备CODESYS版本3.5 SP16及以上支持第三方库动态加载MySQL服务器5.7或8.0版本建议配置# 关键参数调整my.cnf innodb_buffer_pool_size 2G max_allowed_packet 32M wait_timeout 28800网络要求PLC与MySQL服务器间需保持≤100ms的网络延迟开放TCP 3306端口建议通过VLAN隔离工业网络2.2 AlongWu库安装步骤从CSDN下载库文件约1.2MB在CODESYS开发环境中导入库{attribute qualified_only} LIBRARY AlongWu_MySQL_Lib验证库版本PROGRAM VersionCheck VAR stLibInfo : LibraryInfo; END_VAR LibraryGetInfo(LIBID_AlongWu_MySQL_Lib, stLibInfo);3. 核心功能模块详解3.1 连接管理Mysql_Open该功能块采用TCP长连接机制内部实现心跳保活。典型配置参数参数名类型示例值说明byte_ip1~4BYTE192,168,1,109MySQL服务器IP地址ui_portUINT3306端口号str_accountSTRINGalong数据库账号str_passwordSTRING123456密码建议加密存储连接状态机逻辑首次连接建立约需300-500ms断网后自动重试间隔为5秒连续3次失败触发BS_ERROR信号3.2 数据写入Mysql_ExecuteNonQuery针对工业数据特点推荐采用批量插入优化// 构造批量插入语句 str_sql : INSERT INTO sensor_data(timestamp,device_id,value) VALUES ; FOR i : 1 TO 50 DO str_sql : CONCAT(str_sql, (NOW(),, INT_TO_STRING(device_id), ,, REAL_TO_STRING(sensor_value), )); IF i 50 THEN str_sql : CONCAT(str_sql, ,); END_IF END_FOR性能对比测试结果基于Raspberry Pi 4B写入方式吞吐量(records/s)CPU占用率单条插入12018%批量50条210023%预处理语句180021%3.3 数据查询Mysql_QueryData结果解析的典型处理流程检查i_item_count获取返回数据项总数按列顺序解析buff_data二维数组类型转换示例// 解析第1行第2列的浮点数 sValue : REAL; MEM.MemMove(pSource: ADR(buff_data[1*20]), pDestination: ADR(sValue), uiNumberOfBytes: SIZEOF(REAL));4. 数据库设计最佳实践4.1 时序数据表结构CREATE TABLE plc_metrics ( id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY, ts TIMESTAMP(3) DEFAULT CURRENT_TIMESTAMP(3), device_id VARCHAR(32) NOT NULL, metric_name VARCHAR(64) NOT NULL, value DOUBLE PRECISION, quality TINYINT COMMENT 0bad,1good, INDEX idx_device (device_id, metric_name, ts) ) ENGINEInnoDB PARTITION BY RANGE (UNIX_TIMESTAMP(ts)) ( PARTITION p2023_q1 VALUES LESS THAN (UNIX_TIMESTAMP(2023-04-01)), PARTITION p2023_q2 VALUES LESS THAN (UNIX_TIMESTAMP(2023-07-01)) );4.2 性能优化技巧压缩传输对字符串型数据先进行BASE64编码// CODESYS端编码 str_encoded : BASE64_ENCODE(str_raw); // MySQL端解码 SELECT FROM_BASE64(column) FROM table;分表策略按设备类型或时间周期分表例如plc_data_202305 plc_data_2023065. 异常处理与监控5.1 错误恢复机制建议实现三级容错策略本地缓存网络中断时暂存数据到PLC的SD卡FILE_OPEN(backup.csv, a); FILE_WRITE(2023-05-01T14:23:45,DEV001,23.5); FILE_CLOSE();重试队列对失败操作进行指数退避重试报警上报通过MQTT发送异常事件到监控中心5.2 健康检查方案FUNCTION CheckMySQLHealth : BOOL VAR_INPUT ptHandler : POINTER; END_VAR VAR fbPing : Mysql_ExecuteNonQuery; arrCmd : ARRAY [0..1449] OF BYTE : SELECT 1; BEGIN fbPing(pt_handler:ptHandler, buff_sql:arrCmd); RETURN fbPing.bs_OK; END_FUNCTION实际项目中我们在汽车焊装车间部署该方案后实现了每分钟1.2万条设备数据的稳定入库相比传统SCADA历史数据库数据查询响应时间从秒级降至毫秒级。特别是在备件追溯场景中通过直接关联PLC数据与MES工单号使质量问题分析效率提升60%以上。