1. 项目概述
最近在工业自动化项目中,经常需要实现上位机与PLC的通讯功能。三菱R系列PLC作为工业现场的主流控制器,其SLMP协议(Seamless Message Protocol)通讯是项目开发中的常见需求。本文将基于QT框架,详细讲解如何实现与三菱R系列PLC的MC协议通讯。
这个Demo完整实现了TCP连接建立、数据帧构造、指令发送和响应解析的全流程。不同于官方文档的抽象描述,我会结合自己踩过的坑,分享实际项目中的经验技巧。无论你是刚开始接触工业通讯,还是需要快速实现一个可靠的PLC通讯模块,这个参考实现都能帮到你。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 核心原理解析
2.1 SLMP协议基础
SLMP协议是三菱电机为其自动化设备设计的通讯协议,基于TCP/IP实现。其核心特点包括:
- 采用客户端/服务器架构,PLC作为服务器端
- 默认使用8888端口(可配置)
- 数据帧包含固定格式的头部和可变长度的数据区
- 支持位元件和字元件的读写操作
协议帧基本结构如下:
code复制| 头部(8字节) | 子头部(4字节) | 指令数据区 |
其中头部包含协议标识、数据长度等信息,子头部则定义了超时设置等参数。
2.2 通讯流程设计
完整的通讯流程包含以下关键步骤:
- TCP连接建立:与PLC建立稳定的网络连接
- 指令帧构造:按照协议规范组装二进制数据
- 数据发送:通过套接字发送指令帧
- 响应接收:等待并接收PLC返回的数据
- 数据解析:提取有效信息并处理
3. 环境准备与工程配置
3.1 开发环境搭建
推荐使用以下开发环境:
- QT 5.15或更高版本(LTS版本更稳定)
- Windows/Linux均可(本文示例基于Windows)
- 三菱GX Works3(用于PLC参数配置)
在QT项目的.pro文件中需要添加网络模块:
code复制QT += network
3.2 PLC参数配置
在开始编码前,务必确保PLC已正确配置:
- 使用GX Works3连接PLC
- 进入"参数"→"PLC参数"→"内置以太网端口设置"
- 启用TCP通信功能
- 设置IP地址(与开发机同一网段)
- 确认SLMP端口号(默认为8888)
4. 核心代码实现
4.1 TCP连接管理
创建QTcpSocket对象并实现连接管理:
cpp复制// 在类定义中添加成员变量
QTcpSocket *m_plcSocket;
// 初始化连接
void PLCCommunicator::connectToPLC(const QString &ip, quint16 port)
{
m_plcSocket = new QTcpSocket(this);
connect(m_plcSocket, &QTcpSocket::readyRead, this, &PLCCommunicator::onDataReceived);
m_plcSocket->connectToHost(ip, port);
if(!m_plcSocket->waitForConnected(3000)) {
qWarning() << "Connection failed:" << m_plcSocket->err
