之前已经完成了软件的安装,接下来要通过MX Component去实现PLC的直连功能。
首先,打开VS2019,新建项目,搜索qt,在出来的内容中选择QT Widgets Application,然后点击下一步。
在下一步中,输入项目名称,勾选名称“将解决方案和项目放在同一个文件夹”,然后点击创建。
之后会自动弹出QT配置框,一直下一步,然后点击finish即可生成解决方案。
在生成的解决方案中,会发现这其中是不包含三菱通讯头文件的,需要进一步的配置和添加。
由于QT并不能直接使用三菱的控件,因为这个空间是基于ActiveX的,在这里为了能让QT使用该空间,需要使用QT中的dumpcpp来生成源文件。
输入cmd,使文件夹进入QT安装文件夹中msvc2017-bin当中,双击VS当中的.ui文件,打开QT designer。(注意:如果双击打开后,会自动弹出,就点击.ui文件右键-打开方式-添加,找到自己安装软件的目录即可,然后设置为默认项,下次就可以双击启动了。)
接着上一步,打开QT designer后,拖入QAxWidget控件,右键-设置控件中找到对应的控件,复制UUID备用。
在开始打开的cmd当中,输入dumppcpp {···刚复制的那一串代码},然后回车就可以在bin文件中看到我们所需要的.h和.cpp文件啦。
之后,把这两个文件复制到项目文件夹中,就可以删除QT designer的QAxWidget控件了。
接下来,根据我们要实现的初步功能,布置按钮和对话框,并命名
保存QT designer,在VS中右键点击.ui,编译一下,文件,这样新定义的按钮等对象就可以在VS中直接使用了。
写入代码如下:
QtWidgetsApplication2.h
1 #include "QtWidgetsApplication2.h"
2
3
4 /*将窗体文字格式改为UTF-8*/
5 #if defined(_MSC_VER) && (_MSC_VER >= 1600)
6 # pragma execution_character_set("utf-8")
7 #endif
8
9
10 QtWidgetsApplication2::QtWidgetsApplication2(QWidget* parent)
11 : QMainWindow(parent)
12 {
13 ui.setupUi(this);
14 QTimer* update_time = new QTimer(this);
15 update_time->stop();
16 // 设置超时间隔
17 update_time->setInterval(5);
18 //setLED(ui.label_led1, 0, 16);
19 //setLED(ui.label_led2, 0, 16);
20 //Date_Update();
21
22
23 connect(ui.OpenButton, SIGNAL(clicked(bool)),this, SLOT(on_openButton_clicked()));
24 connect(ui.CloseButton, SIGNAL(clicked(bool)), this, SLOT(on_closeButton_clicked()));
25 }
26 void QtWidgetsApplication2::on_openButton_clicked() {
27 //填设置的逻辑站号和密码
28 myactive.SetActLogicalStationNumber(1);
29 myactive.SetActPassword("");
30
31 qDebug() << "myactive";
32 //通讯线路打开
33 iRet = myactive.Open();
34 qDebug("return:%x", iRet);
35
36
37 if (iRet == 0x00)
38 {
39 //可编程控制器CPU型号获取
40 iRet = myactive.GetCpuType(CpuName, lCpuType);
41 qDebug("return:%x CpuName:%s lCpuType:%d", iRet, qPrintable(CpuName), lCpuType);
42
43 //显示CPU型号
44 ui.CpuNameEdit->setText(szCpuName);
45 //setLED(ui.label_led1, 2, 16);
46 //实时刷新
47 qApp->processEvents();
48 QMessageBox::about(nullptr, "提示", "连接成功!");
49 //设置按键非使能
50 ui.OpenButton->setEnabled(false);
51 //设置按键使能
52 ui.CloseButton->setEnabled(true);
53
54 }
55 else
56 {
57 //setLED(ui.label_led1, 1, 16);
58 QMessageBox::about(nullptr, "提示", "无法打开端口!");
59 }
60 }
61
62 void QtWidgetsApplication3::on_closeButton_clicked() {
63
64 //通讯线路关闭
65 qDebug() << "close";
66 iRet = myactive.Close();
67 qDebug("return:%x", iRet);
68 //setLED(ui.label_led1, 0, 16);
69 //清空文本
70 ui.CpuNameEdit->clear();
71
72 //设置按键使能
73 ui.OpenButton->setEnabled(true);
74
75 //设置按键非使能
76 ui.CloseButton->setEnabled(false);
77
78 }
QtWidgetsApplication2.cpp
1 #pragma once
2
3 #include <QtWidgets/QMainWindow>
4 #include "ui_QtWidgetsApplication3.h"
5 #include "actutltypelib.h"
6 #include <QtWidgets/QMessageBox>
7 #include <QtWidgets>
8
9 class QtWidgetsApplication2 : public QMainWindow
10 {
11 Q_OBJECT
12
13 public:
14 //QtWidgetsApplication2(QWidget *parent = Q_NULLPTR);
15 explicit QtWidgetsApplication2(QWidget* parent = nullptr);
16 //~QtWidgetsApplication2();
17 void setLED(QLabel* label, int color, int size);
18
19 private slots:
20 //声明开启通讯按钮函数
21 void on_openButton_clicked();
22 //声明关闭通讯按钮函数
23 void on_closeButton_clicked();
24
25 private:
26 Ui::QtWidgetsApplication3Class ui;
27
28 ActUtlTypeLib::ActUtlType myactive;
29
30 QString CpuName;
31 qint32 lCpuType;
32 qint32 iRet;
33
34
35 };
mian.cpp
1 #include "QtWidgetsApplication2.h"
2 #include <QtWidgets/QApplication>
3 #include "actutltypelib.h"
4
5 /*将窗体文字格式改为UTF-8*/
6 #if defined(_MSC_VER) && (_MSC_VER >= 1600)
7 # pragma execution_character_set("utf-8")
8 #endif
9
10
11 int main(int argc, char *argv[])
12 {
13 QApplication a(argc, argv);
14 QtWidgetsApplication2 w;
15 w.show();
16 return a.exec();
17 }
之后运行就可以实现Q系列PLC的通讯功能了。自己只测试了Q系列PLC能够完成通讯并显示PLC型号,FX或者R系列按照原理来说也可以实现功能,但没有进行具体的测试了。(注意:需要先配置好MX component再进行通讯,本程序中MX component配置编号需为1)
新增:
编译时,如果提示 无法打开源程序<qaxobject.h>,就右键项目名-属性,在QT project中配置上ACTIVEQTC即可。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
· .NET 10 首个预览版发布,跨平台开发与性能全面提升
· 《HelloGitHub》第 107 期
· 全程使用 AI 从 0 到 1 写了个小工具
· 从文本到图像:SSE 如何助力 AI 内容实时呈现?(Typescript篇)
2022-09-25 常见的二十种软件测试方法详解(史上最全)
2022-09-25 什么是软件测试,软件测试究竟是做什么的
2022-09-25 软件测试基础知识 + 面试理论(超详细)
2022-09-25 55道软件测试精品面试题分享!内附答案!
2022-09-25 黑盒、白盒和灰盒测试的区别
2020-09-25 Qt Treewidget添加右键菜单