QT 5.12.9 + VS 2019配置并实现与三菱Q系列PLC通讯(2)实现通讯

发布时间 2023-09-25 16:28:51作者: 一杯清酒邀明月

  之前已经完成了软件的安装,接下来要通过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即可。