作者: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. 效果展示

其他请参考

  • GX Works3 设置 TCP + SLMP 与三菱FX5U通信

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

  1. C#PC与三菱Q系列PLC通信小实验中遇到的问题

    1.在线程中处理控件时报错. 在线程中想要对TextBox写入时,报错. 解决: this.Invoke(new MethodInvoker(delegate()                    ...

  2. 与三菱Q系列PLC-TCP通信(MC协议)学习总结

    2015/09/14 最近几天在做C#代码与三菱Q系列PLC TCP通信(MC模式)读写数据寄存器的功能,留此调试文档. 三菱Q系列PLC通信协议有很多种,本次选择了MC,MC内发送数据有ASCII方 ...

  3. 三菱Q系列PLC编程TCP Socket套接字程序

    三菱Q系列PLC编程TCP Socket套接字程序 用于和上位机通讯 支持掉线自动后自动重连 附详细注释和指令说明! 编号:969665940010231沉默物语

  4. 三菱plc与计算机无协议通讯,三菱FX系列PLC与计算机无协议通讯.doc

    三菱FX系列PLC与计算机无协议通讯 一.FX系列与计算机通信所用到的命令码: 命令命令码目标设备元件读取CMD??0X,Y,M,S,T,C,D元件写入CMD???1X,Y,M,S,T,C,D强迫ON ...

  5. 三菱plc与计算机无协议通讯,三菱FX系列PLC与计算机无协议通讯

    资 源 简 介 本文主要通过介绍PLC通讯的意义和三菱FX系列PLC的四种通讯方式,并重点介绍FX系列PLC与计算机无协议通讯,主要从无协议通讯的硬件.配线.数据寄存器设置.PLC与计算机无协议通讯的 ...

  6. 基于QT开发的使用OPC_UA与西门子1200,1500系列PLC通信的工业监控Demo

    目录 一,总体介绍 二,需要的软件 三,需要的硬件 四,QT程序代码 五,西门子PLC代码 一,总体介绍 先看一下图1-1的QT运行界面图,界面中服务器地址就是OPC_UA服务器地址,整个项目作用,就 ...

  7. 与三菱Q系列PLC通讯(tcp-ip)协议

    举例子说明读写方法:       1.读D100开始的连续的20个数据块,也就是读D100~D119的数据: 电脑读命令:  50 00 00 FF FF 03 00 0C 00 10 00 01 0 ...

  8. plc和pc串口通讯接线_三菱FX系列PLC与电脑之间串口RS232通讯协议简易解析

    本文介绍的 PC 与三菱 FX 系列 PLC 通信,是通过 PLC 的编程口与 PC 机的串口进行的,采用 SC-09 编程电缆作为计算机与 PLC 通信的连线.电缆的 9 芯 D 形插头连接在计算机 ...

  9. Qt中的TCP客户端编程

    文章目录 1 Qt中的TCP客户端编程 1.1 TCP客户端编程介绍 1.2 QTcpSocket的同步编程 1.3 QTcpSocket的异步编程 1 Qt中的TCP客户端编程 1.1 TCP客户端 ...

  10. QT -- TcpSocket实例,使用Qt中的tcp通信协议,构建客户端和服务端,实现局域网通信软件功能

    Qt中使用Tcp构建通信客户端实现聊天信息发送连接等 1.简介 2.项目创建和界面构建 1)流程图 2)项目构建 3)界面构建 3.代码设计 1)项目pro添加 2)客户端设计 a. clientwi ...

最新文章

  1. iOS下的类似Android的toast提示
  2. 浮点运算为什么不准?有人为0.30000000000000004建了个网站
  3. 计算机、数学、运筹学等领域32个重要算法
  4. 【数据竞赛】AI在垃圾分类中的应用小侃(海华大赛获奖者系列分享一)
  5. CAN总线的初步认识
  6. 【从上云到创新,视频云的新技术与新场景】
  7. linux red hat 安装svn
  8. nextcloud+nginx+mysql,Ubuntu搭建Nginx-Nextcloud环境
  9. 前端学习(3225):字符串形式
  10. Servlet 工程 web.xml 中的 servlet 和 servlet-mapping 标签
  11. 深度优先搜索(解题剑指Offer12、13)
  12. [Android] AudioEffect架构:从上层调用到底层音效驱动
  13. python双色球代码_python实现双色球随机选号
  14. chrome新版安装flash控件失败解决方法
  15. 身体指数bmi流程图_理想的身体脂肪百分比是多少?男女不同脂肪数据对照表
  16. 计算机调用计算器快捷键,Windows系统打开计算器的快捷键 计算器快捷键大全
  17. 电商平台商品详情API调用,获取SKU各类信息
  18. [Atlassian]JiraConfluenceCrowd配置SSO
  19. js 删除节点小案例
  20. 第一章 程序设计入门--算法竞赛入门经典

热门文章

  1. 瑞利 随机 matlab,matlab产生瑞利分布随机信号
  2. 杭州好玩景点攻略884
  3. 华为交换机vlan配置举例_一步步详解华为交换机配置实例,一看就会
  4. node-sails后台搭建
  5. 修复cdn服务器连接异,cdn服务器连接异常怎么处理
  6. 《阿里巴巴Java开发手册(正式版)》--安全规约
  7. 华为云空间兑换码在哪里找_华为云空间
  8. debug断点调试进不去
  9. 高考数学答题技巧及常用高中数学解题方法(含答案解析)
  10. python生成简单二维码_使用Python生成个性二维码