QT 5.12.9 +VS 2019配置并实现与三菱Q系列PLC通讯功能(1)软件的安装
之前已经完成了软件的安装,接下来要通过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
#include "QtWidgetsApplication2.h"
/*将窗体文字格式改为UTF-8*/
#if defined(_MSC_VER) && (_MSC_VER >= 1600)
# pragma execution_character_set("utf-8")
#endif
QtWidgetsApplication2::QtWidgetsApplication2(QWidget* parent)
: QMainWindow(parent)
{
ui.setupUi(this);
QTimer* update_time = new QTimer(this);
update_time->stop();
// 设置超时间隔
update_time->setInterval(5);
//setLED(ui.label_led1, 0, 16);
//setLED(ui.label_led2, 0, 16);
//Date_Update();
connect(ui.OpenButton, SIGNAL(clicked(bool)),this, SLOT(on_openButton_clicked()));
connect(ui.CloseButton, SIGNAL(clicked(bool)), this, SLOT(on_closeButton_clicked()));
}
void QtWidgetsApplication2::on_openButton_clicked() {
//填设置的逻辑站号和密码
myactive.SetActLogicalStationNumber(1);
myactive.SetActPassword("");
qDebug() << "myactive";
//通讯线路打开
iRet = myactive.Open();
qDebug("return:%x", iRet);
if (iRet == 0x00)
{
//可编程控制器CPU型号获取
iRet = myactive.GetCpuType(CpuName, lCpuType);
qDebug("return:%x CpuName:%s lCpuType:%d", iRet, qPrintable(CpuName), lCpuType);
//显示CPU型号
ui.CpuNameEdit->setText(szCpuName);
//setLED(ui.label_led1, 2, 16);
//实时刷新
qApp->processEvents();
QMessageBox::about(nullptr, "提示", "连接成功!");
//设置按键非使能
ui.OpenButton->setEnabled(false);
//设置按键使能
ui.CloseButton->setEnabled(true);
}
else
{
//setLED(ui.label_led1, 1, 16);
QMessageBox::about(nullptr, "提示", "无法打开端口!");
}
}
void QtWidgetsApplication3::on_closeButton_clicked() {
//通讯线路关闭
qDebug() << "close";
iRet = myactive.Close();
qDebug("return:%x", iRet);
//setLED(ui.label_led1, 0, 16);
//清空文本
ui.CpuNameEdit->clear();
//设置按键使能
ui.OpenButton->setEnabled(true);
//设置按键非使能
ui.CloseButton->setEnabled(false);
}
QtWidgetsApplication2.cpp
#pragma once
#include <QtWidgets/QMainWindow>
#include "ui_QtWidgetsApplication3.h"
#include "actutltypelib.h"
#include <QtWidgets/QMessageBox>
#include <QtWidgets>
class QtWidgetsApplication2 : public QMainWindow
{
Q_OBJECT
public:
//QtWidgetsApplication2(QWidget *parent = Q_NULLPTR);
explicit QtWidgetsApplication2(QWidget* parent = nullptr);
//~QtWidgetsApplication2();
void setLED(QLabel* label, int color, int size);
private slots:
//声明开启通讯按钮函数
void on_openButton_clicked();
//声明关闭通讯按钮函数
void on_closeButton_clicked();
private:
Ui::QtWidgetsApplication3Class ui;
ActUtlTypeLib::ActUtlType myactive;
QString CpuName;
qint32 lCpuType;
qint32 iRet;
};
mian.cpp
#include "QtWidgetsApplication2.h"
#include <QtWidgets/QApplication>
#include "actutltypelib.h"
/*将窗体文字格式改为UTF-8*/
#if defined(_MSC_VER) && (_MSC_VER >= 1600)
# pragma execution_character_set("utf-8")
#endif
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QtWidgetsApplication2 w;
w.show();
return a.exec();
}
之后运行就可以实现Q系列PLC的通讯功能了。自己只测试了Q系列PLC能够完成通讯并显示PLC型号,FX或者R系列按照原理来说也可以实现功能,但没有进行具体的测试了。(注意:需要先配置好MX component再进行通讯,本程序中MX component配置编号需为1)
新增:
编译时,如果提示 无法打开源程序<qaxobject.h>,就右键项目名-属性,在QT project中配置上ACTIVEQTC即可。
源码程序打包,有需要的话可以下载:
https://download.csdn.net/download/u014224136/85227359