Qt中使用TCP和MC协议与三菱Q系列PLC通信

作者:billy
版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处

前言

之前博主写过一篇通过 MX 插件与三菱PLC通信的文章,具体请参考:Qt使用 MX Component 插件与三菱PLC通信

使用 MX 插件有一个弊端,那就是 MX 插件提供的 COM 组件是 32 位的,如果是 64 位的编译器则无法使用。因为一些特殊因素的影响,我们的项目需要从 32 位转到 64 位,所以 PLC 通信这一块就不能再使用 MX 插件了。考虑到我们的 PLC 是三菱Q系列,所以博主选择了 MC 协议。

从三菱官网下载了协议文档,也从网上查找了一些资料,发现都是对 MC 协议的解析,也有一些已经实现了的第三方库,但是没有实际的代码可以参考,而且第三方库都是 VB、C# 的。于是,博主自己做了一个例子,在这里分享一下,希望对大家有所帮助。

三菱 MC 协议介绍

  1. 下载官方文档
    下载地址:网盘下载
    提取码:rx8g

为了方便初学者快速上手,博主标记了一些重要的页数,方便快速切换查看

  • 目录 6
  • 报文格式 40
  • 指令及子指令 59
  • 软元件 66
  • 通信示例 84
  1. MC 协议的功能
    外部设备(个人计算机、显示器等)可以通过 MC 协议来管理可编程控制器设备的数据通信,简单来说就是允许外部设备通过 MC 协议来读写 PLC 里的寄存器。

  2. 通信方式
    MC 协议的通讯方式有很多种:4C、3C、2C、1C、4E、3E、1E帧格式
    数据格式分为二进制格式和ASCII码格式:
    以二进制代码进行数据通信时,将2字节的数值从低位字节(L:位0~7)进行发送
    以ASCII代码进行数据通信时,将数值转换为ASCII代码4位(16进制数)后从高位进行发送
    博主选择的是最大众的:3E + 二进制格式

  3. 报文格式
    在这里插入图片描述

  • 头部 - 是以太网的帧头,通常自动被添加
  • 副头部 - 以3E帧为例,固定请求报文 50 00
  • Q头部 - 指定访问路径,以3E帧为例,解析如下:
    网络编号 - 上位访问下位,固定 00
    可编程控制器编号 - 上位访问下位,固定 FF
    请求目标模块I/O编号 - 固定 03 FF,十进制是 1023(二进制格式从低位开始,所以为 FF 03
    请求目标模块站号 - 上位访问下位,固定 00
  • 请求数据长 - 二进制格式两个数字为一个字,ASCII格式一个数字一个字(本例中14个字,为 0x000E,所以是 0E 00)
  • 监视定时器 - 等待时间(0000H(0): 无限等待;0001H~FFFFH(1~65535)(单位: 250ms))10 00 即 0x0010,十进制为 16,16 * 250ms = 4 秒
  • 请求数据 - 请求数据设置表示请求内容的指令等,解析如下:
    指令 - 批量读取 04 01,批量写入 14 01
    子指令 - 字单位(1个字=16位) 00 00,位单位 00 01
    起始软元件编号 - 58 1B 00 即 001B58,十进制为 7000
    软元件代码 - A8 代表 D点,90 代表 M点
    软元件点数 - 01 00 即 0x0001,十进制为 1
    写入数据 - 0C 00 即 0x00C,十进制为 12

在这里插入图片描述

  • 头部 - 是以太网的帧头,通常自动被添加
  • 副头部 - 以3E帧为例,固定响应报文 D0 00
  • Q头部 - 和请求中的Q头部完全相同
  • 响应数据长 - 02 00 即 0x0012,十进制为 2
  • 结束代码 - 00 00,0 代表正确,写入成功
  1. 指令及子指令
    最常用的指令:批量读取 04 01,批量写入 14 01
    在这里插入图片描述

  2. 软元件代码
    最常用的软元件代码:D点 A8,M点 90
    在这里插入图片描述

  3. 错误代码
    在这里插入图片描述

  4. 通信示例

  • 从地址 D100 开始依次写入 3 个软元件的值:
    50 00 00 FF FF 03 00 12 00 10 00 01 14 00 00 64 00 00 A8 03 00 95 19 02 12 30 11
    D0 00 00 FF FF 03 00 02 00 00 00

  • 读取地址 D100 开始连续 5 个软元件的值:
    50 00 00 FF FF 03 00 0C 00 10 00 01 04 00 00 64 00 00 A8 05 00
    D0 00 00 FF FF 03 00 0C 00 00 00 95 19 02 12 30 11 00 00 00 00

设置 PLC

  1. 下载 GX Works2
    下载地址:网盘下载
    提取码:2q5d

  2. 新建工程,选择自己的 PLC 型号,博主这里用的是Q系列的 Q03UDV
    在这里插入图片描述

  3. 设置 PLC 内置以太网参数
    在这里插入图片描述
    选择 TCP + MC 协议,如果需要和多个上位机通信,可以提供多个端口号
    在这里插入图片描述

  4. 测试 PLC 是否连接成功
    在这里插入图片描述

  5. 把配置写入 PLC
    在这里插入图片描述
    跳出弹窗,全部选择 “是”,写入完成之后需要给 PLC 断电重启

  6. 我的工程分享
    下载地址:网盘下载
    提取码:zxi9

在 Qt 中的应用

  1. 在 pro 中添加网络模块
    使用 TCP 需要在 pro 文件中添加 network 模块:
    QT += network

  2. 核心代码

初始化,绑定信号槽

// init
network = new QTcpSocket(this);
timeout = 1000;

connect(network, &QTcpSocket::connected, [](){ qDebug() << "Connected to PLC successfully !" << endl; });
connect(network, &QTcpSocket::disconnected, [](){ qDebug() << "Disconnected from plc !" << endl; });
connect(network, &QTcpSocket::stateChanged, [](QAbstractSocket::SocketState socketState){
    qDebug() << "SocketState changed: " << socketState;
});
connect(network, &QTcpSocket::readyRead, [&](){ readData(); });

通过 ip 地址和端口号连接 PLC

network->connectToHost(ui->ip->text(), ui->port->text().toInt());
network->waitForConnected(timeout)

按照 MC 协议发送数据给 PLC

QString head = "50 00 00 FF FF 03 00";
QString length;
QString timeout = "10 00";
QString command = "01 14";
QString subCommand = "00 00";
QString address = convert10216(ui->address->text().toInt(), 6);
QString soft = ui->comboBox->currentIndex() == 0 ? "A8" : "90";
QString count = convert10216(ui->length->text().toInt(), 4);

QString data = timeout + " " + command + " " + subCommand + " " + address + " " + soft + " " + count + " " + str;
QString temp = data;
QRegExp regExp("[^a-fA-F0-9]");
temp.replace(regExp, "");
int len = temp.length()/2;
length = convert10216(len, 4);

QString ret = head + " " + length + " " + data;

QByteArray array = QByteArray::fromHex(ret.toLatin1());	// 使用 16 进制格式
network->write(array);
network->waitForBytesWritten();
network->flush();

接收 PLC 的响应

QByteArray array = network->readAll();
QString ret = array.toHex().toUpper();
  1. 效果展示
    在这里插入图片描述

其他请参考

  • 29
    点赞
  • 157
    收藏
    觉得还不错? 一键收藏
  • 14
    评论
三菱Q03UDV是一款先进的PLC设备,支持多种通讯协议,其包括Modbus RTU协议。Modbus RTU是一种常用的串行通讯协议,用于在不同设备之间进行数据交换。 要实现三菱Q03UDV与电能表的通讯,首先需要确保电能表支持Modbus RTU协议,并且具备串口通讯功能。接下来,需要进行以下步骤来进行通讯的设置和配置: 1. 配置三菱Q03UDV的串口参数:在PLC的程序,确定使用的串口号、波特率、数据位、停止位等参数。这些参数需要与电能表的通讯参数保持一致。 2. 设置Modbus RTU通讯协议:在PLC的程序,将Modbus RTU通讯协议与特定的功能码相关联。根据电能表所支持的功能码,可以读取/写入寄存器、读取/写入线圈等操作。 3. 通过读取/写入数据进行通讯:在PLC程序使用相应的指令来读取/写入电能表的数据。例如,使用读取寄存器的指令来获取电能表的电压、电流、功率等信息,并将这些数据存储到PLC的内存。 通过以上步骤的设置和配置,三菱Q03UDV与电能表将可以进行Modbus RTU协议的通讯。在PLC的程序,可以根据需要实现读取电能表数据、监控电能表状态、控制电能表操作等功能。同时,可以根据实际需求进行数据的解析和处理,以便进行更加灵活和智能的控制。电能表的通讯功能可以为能源管理、远程监控、自动化控制等领域的应用提供便利。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值