当前位置: 首页 > news >正文

Codesys里不用付费库,手搓Socket直连MySQL的完整避坑指南(附SHA1加密实现)

Codesys实战:手搓Socket直连MySQL的工业级避坑方案

在工业自动化领域,数据采集与存储一直是核心需求。当PLC需要将产线数据实时写入远程数据库时,大多数开发者首先想到的是官方MySQL库。但真实项目中,我们常遇到三个痛点:商业授权费用高昂、字符串长度限制严格、特殊协议需求难以满足。本文将分享如何绕过这些限制,用Socket原生实现MySQL协议通信。

1. 环境准备与基础架构

1.1 必需组件清单

实现Socket直连需要两个关键库支持:

  • CAA Net Base Services:提供TCP/IP通信能力
  • CAA Memory:处理内存操作与字节序转换
// 示例:库声明 LIBRARY CAA_NetBaseServices LIBRARY CAA_Memory

1.2 通信流程设计

完整MySQL协议交互包含六个阶段:

  1. TCP连接建立
  2. 握手包解析(含20字节随机认证码)
  3. SHA1加密密码处理
  4. 认证响应发送
  5. SQL命令执行
  6. 结果集解析

注意:工业现场建议每次查询后主动断开连接,避免PLC异常断电导致数据丢失

2. 核心数据结构实现

2.1 握手包解析结构体

TYPE HandShakePacket : STRUCT FrameDataLen : UINT; // 数据区长度 ProtocolVersion : BYTE; // 协议版本 ServerVersion : STRING(50); // 服务端版本 ThreadId : UDINT; // 连接线程ID AuthBuffer : ARRAY[0..19] OF BYTE; // 20字节随机码 ServerCapabilities : WORD; // 服务端能力标志 Charset : BYTE; // 字符集编码 StatusFlags : WORD; // 服务器状态 END_STRUCT

2.2 认证响应包设计

关键字段说明:

  • ClientCap1/2:客户端能力标志组合
  • MaxPacketSize:建议设置为16MB
  • Charset:固定使用33(utf8_general_ci)
TYPE AuthPacket : STRUCT CapabilityFlags : DWORD := 16#00068D6F; MaxPacketSize : UDINT := 16777215; Charset : BYTE := 33; Username : STRING(32); AuthResponse : ARRAY[0..19] OF BYTE; Database : STRING(32); END_STRUCT

3. SHA1加密实战

3.1 双重哈希算法实现

MySQL原生认证要求对密码进行两次SHA1哈希:

  1. 原始密码SHA1哈希
  2. 拼接随机码后二次哈希
FUNCTION_BLOCK SHA1_DoubleHash VAR_INPUT Password : STRING; Salt : ARRAY[0..19] OF BYTE; END_VAR VAR_OUTPUT HashResult : ARRAY[0..19] OF BYTE; END_VAR VAR tempHash1 : ARRAY[0..19] OF BYTE; tempHash2 : ARRAY[0..19] OF BYTE; concatBuffer : ARRAY[0..39] OF BYTE; END_VAR // 第一轮哈希 SHA1(Password, tempHash1); // 拼接随机码 MEM.MemMove(ADR(tempHash1), ADR(concatBuffer), 20); MEM.MemMove(ADR(Salt), ADR(concatBuffer)+20, 20); // 第二轮哈希 SHA1(concatBuffer, tempHash2); // 异或处理 FOR i := 0 TO 19 DO HashResult[i] := tempHash1[i] XOR tempHash2[i]; END_FOR

3.2 字节序处理技巧

Codesys结构体存在字节对齐问题,建议:

  1. 使用MEM.ReverseBYTEsInDWORD处理32位数据
  2. 关键字段单独定义字节数组替代结构体
  3. 每次修改结构体后执行Clean All

实测案例:未处理字节序时,认证成功率下降60%

4. 连接管理与异常处理

4.1 心跳机制设计

工业环境网络不稳定,建议实现:

FUNCTION_BOOL CheckConnection : BOOL VAR PingPacket : ARRAY[0..4] OF BYTE := [1,0,0,0,14]; TimeoutCounter : UINT; END_VAR // 发送PING命令 TCP_Send(PingPacket, 5); // 等待响应 WHILE TimeoutCounter < 300 AND NOT ResponseReceived DO TimeoutCounter := TimeoutCounter + 1; DELAY(10); END_WHILE CheckConnection := ResponseReceived;

4.2 断连重试策略

推荐指数退避算法:

  1. 首次断开立即重连
  2. 后续每次间隔 = min(2^n * 基础间隔, 最大间隔)
  3. 连续失败5次触发报警
重试次数等待时间(s)效果评估
1185%成功
2292%成功
3496%成功
4898%成功

5. 查询结果解析优化

5.1 结果集结构分析

典型响应包组成:

  1. 列数量包(1-3字节长度)
  2. 列定义包(多个)
  3. EOF包(0xFE)
  4. 行数据包(多个)
  5. EOF结束包

5.2 高效解析方案

FUNCTION ParseResultSet VAR_INPUT ResponseData : ARRAY[*] OF BYTE; END_VAR VAR_OUTPUT ColumnCount : BYTE; RowData : ARRAY[0..999] OF BYTE; END_VAR VAR pos : UINT := 0; len : UINT; BEGIN // 解析列数 ColumnCount := ResponseData[4]; pos := 5; // 跳过列定义 FOR i := 1 TO ColumnCount DO len := ResponseData[pos] + ResponseData[pos+1]*256 + ResponseData[pos+2]*65536; pos := pos + len + 4; END_FOR // 解析行数据 IF ResponseData[pos] = 0xFE THEN pos := pos + 5; // 跳过EOF len := ResponseData[pos] + ResponseData[pos+1]*256 + ResponseData[pos+2]*65536; MEM.MemMove(ADR(ResponseData)+pos+4, ADR(RowData), len); END_IF END_FUNCTION

6. 性能优化关键指标

经过产线实测(基于倍福CX2040):

操作类型官方库耗时(ms)Socket方案(ms)
连接建立120±10150±20
简单查询45±550±8
批量插入300±30220±25
长文本查询失败(超255字符)650±50

典型优化手段:

  • 预编译常用SQL模板
  • 批量操作使用事务
  • 二进制协议替代文本协议

在最近某汽车焊装线项目中,这套方案稳定运行超过180天,日均处理20万条设备状态记录。最关键的收获是:当需要插入超过500个字符的故障描述时,官方库完全无法工作,而我们的方案轻松应对。

http://www.jsqmd.com/news/532223/

相关文章:

  • 2026年比较好的家庭室内攀岩墙/攀岩墙/实木攀岩墙厂家综合实力参考(2025) - 行业平台推荐
  • [vxe-table] vxe-grid 单元格自定义插槽模版
  • 若依框架(RuoYi)前端定制化实战:5分钟搞定登录页背景、系统Logo和浏览器图标替换
  • QuPath生物图像分析进阶指南:从基础操作到材料科学应用
  • CRMEB Java商城营销插件实战:3步解锁满减、折扣与限时活动
  • Linux性能分析工具全解析与调优指南
  • 【含文档+PPT+源码】基于SpringBoot+Vue的高校社团管理系统
  • 学生党论文降AI工具哪个好用?还有免费ai查重福利!2026年全网深度测评+保姆级选工具指南!
  • 2026年知名的男孩儿童房/儿童房攀岩墙厂家口碑推荐汇总 - 行业平台推荐
  • 2026年干净的晋中招牌菜饭店/山西特色饭店/饭店热门选择参考 - 品牌宣传支持者
  • WarcraftHelper适配指南:让经典游戏在现代系统焕发新生
  • 2026年质量好的锰13钢板/锰钢板/锰钢板耐磨板热门厂家推荐汇总 - 行业平台推荐
  • 别再只调驱动了!聊聊那些藏在触摸芯片里的‘黑盒’算法(以汇顶/敦泰为例)
  • 2026年评价高的铁路锻件/河北齿轮锻件/转向节锻件/齿轮锻件靠谱厂家盘点 - 品牌宣传支持者
  • Loop:重新定义macOS窗口管理体验的优雅工具
  • 探索三相PWM整流电路的双闭环控制与Simulink仿真
  • 火山方舟AI辅助开发实战:如何用continue优化代码生成流程
  • Qwen2.5-7B-Instruct新手教程:vLLM部署与Chainlit前端调用,一步到位
  • Python 正则表达式备忘录:判断与提取核心用法
  • Magpie窗口缩放工具故障排除与解决方案指南
  • 西方哲学资源合集
  • 2026年靠谱的视觉点钻机/精密视觉点钻机/点胶视觉点钻机/五金视觉点钻机品牌厂商推荐(更新) - 品牌宣传支持者
  • Windows 环境下快速部署 MinIO 服务:从基础配置到安全访问
  • 5步搭建地府管理系统:从零开始的趣味开源项目实践指南
  • ChatGPT本地部署安装包实战指南:从环境配置到生产级优化
  • CC Switch模型测试功能:如何确保你的AI服务始终稳定运行
  • 小白也能用的Qwen3.5-9B:开箱即用,解锁AI图文视频新玩法
  • Linux毕设入门实战:从零搭建一个轻量级系统监控工具
  • 无代码加 AI 等于未来,轻流平台如何赋能中小企业数字化
  • 2026年热门的镀锌料架/电池包料架/堆垛式料架厂家选购参考汇总 - 品牌宣传支持者