如何通过TCP Socket连接MariaDB为S7-1200 PLC实现INSERT操作?
S7-1200通过TCP Socket连接MariaDB执行INSERT的可行性与实现要点
完全可以通过TCP Socket实现S7-1200与MariaDB的INSERT操作,核心原因是MariaDB兼容MySQL的TCP通信协议,只要在PLC端实现该协议的握手、认证、SQL执行流程即可。以下是具体实现的关键要点:
1. 必须掌握MariaDB/MySQL的TCP协议核心流程
MariaDB的TCP通信遵循MySQL协议,核心步骤如下:
- 连接建立:通过
TCON功能块建立与MariaDB服务器(默认端口3306)的TCP连接 - 握手阶段:服务器会主动发送握手包,包含版本号、随机认证字符串、服务器能力标识等信息,PLC需要解析这些参数
- 认证阶段:PLC构造认证响应包,其中密码需要按照
mysql_native_password算法加密(SHA1(SHA1(明文密码)) XOR SHA1(随机数+SHA1(SHA1(明文密码)))),并携带用户名、目标数据库名等信息发送给服务器 - SQL执行:认证通过后,发送
COM_QUERY命令包,携带INSERT语句的明文(注意编码匹配),服务器执行后返回结果包
2. S7-1200端的具体实现步骤
- TCP连接维护:使用西门子标准的
TCON、TSEND_C、TRCV_C功能块管理Socket连接,处理连接断开后的重连逻辑 - 协议解析与构造:
- 用
TRCV接收服务器的握手包,提取16字节随机数等关键字段 - 实现SHA1哈希算法(可通过第三方ST代码或功能块),按照MySQL认证规则计算密码密文
- 按照MySQL数据包格式(3字节长度+1字节序列号+ payload)构造认证包和SQL命令包,通过
TSEND发送
- 用
- 结果校验:接收服务器返回的执行结果包,解析是否存在错误码,确认INSERT操作成功
3. 常见问题与避坑指南
- 密码加密错误:这是登录失败的最常见原因,必须严格按照
mysql_native_password的逻辑实现哈希计算,不能直接发送明文密码 - 数据包格式错误:每个MySQL数据包的头部必须是3字节的小端序长度+1字节的序列号,payload长度必须与头部声明一致
- 字符编码不匹配:确保PLC发送的
INSERT语句编码与MariaDB数据库的编码(如UTF-8)一致,避免乱码导致SQL执行失败 - 超时处理:设置合理的
TRCV超时时间,避免因服务器响应慢导致PLC报错
4. 简化实现的替代方案
如果手动实现MySQL协议成本过高,可以考虑:
- 中间件中转:在局域网内部署一台PC或嵌入式设备,运行自定义服务(如Python/Java编写),S7-1200通过简单TCP协议发送待插入的数据,中间件负责与MariaDB交互并返回结果
- 第三方功能块:部分工业自动化厂商提供兼容MariaDB/MySQL的通信FB,可直接集成到S7-1200项目中,省去协议开发的工作量
内容的提问来源于stack exchange,提问作者AlexMacabu
相关产品推荐
相关产品推荐

