VS2015+Qt+OpenCV+open62541开发过程(05_VS2015中使用OPCUA open62541通过Kepware读写PLC数据)

电脑要安装Kepware软件,此实验用的版本为KEPServerEX 6.3(安装后需要购买授权,不过有一段时间的试用期,不影响实验)

Kepsever作为OPC UA服务器与PLC建立通讯,在VS2015中编写OPC UA客户端与Kepsever服务器进行通讯,从而读写PLC的tag值。

使用open62541需要首先获得相关的源文件和头文件,获取过程比较复杂,这里参考了网上别人发的教程。

参考文章链接:https://www.cnblogs.com/eatfishcat/p/11147242.html

 按照以上文章介绍,将生成的open62541.h、open62541.c 拷贝到项目文件夹内

此外还需要所需lib包:WS2_32.Lib(opcua通讯用到的库,opcua使用socket通讯,需使用此库),添加#pragma comment(lib,"ws2_32.lib")  语句,有的文章说需要添加ws2_32.lib文件或ws2_32.dll到项目资源中,貌似影响不大

代码衔接上一篇,多了很多注释段,别介意) 

// test01.cpp : 定义控制台应用程序的入口点。

#include "open62541.h"  //open62541头文件,opcua开源库文件
#pragma comment(lib,"ws2_32.lib")  //opcua通讯用到的库,opcua使用socket通讯,需使用此库

#include "stdafx.h"
#include <iostream>
#include<windows.h>   //使用Sleep(1000)延时函数头文件
#include <stdio.h>
#include <process.h>
#include <conio.h>
#include "string.h"

//#include <opencv2/opencv.hpp>   //opencv头文件
//#include<opencv2/core.hpp>
//#include<opencv2/imgproc.hpp>
//#include<opencv2/highgui.hpp>
//#include<opencv2/videoio.hpp>

using namespace std;  //使用命名空间
//using namespace cv;

/*声明全局变量*/
//VideoCapture capture;
UA_Client *client = UA_Client_new();  //opcua客户端结构体,用于与PLC通讯
UA_StatusCode status;  //用于存放opcua客户端执行操作后的状态反馈
/*主函数*/
int main()
{
	/*Mat img;
	Mat hsv;
	Mat hsvsplit[3];
	cv::namedWindow("test", WINDOW_FREERATIO);
	cv::namedWindow("test1", WINDOW_FREERATIO);
	cv::namedWindow("test2", WINDOW_FREERATIO);
	cv::namedWindow("test3", WINDOW_FREERATIO);
	cv::namedWindow("test4", WINDOW_FREERATIO);*/

	client = UA_Client_new();  //创建opcua客户端
	UA_ClientConfig_setDefault(UA_Client_getConfig(client));  //设置客户端为默认配置
	status = UA_Client_connect(client, "opc.tcp://127.0.0.1:49320");  //连接服务器,此处连接KEPServer,URL可以通过任务栏KEPServer软件右键,“OPC UA配置”查看
																	  //判断opcua客户端连接状态
	if (status != UA_STATUSCODE_GOOD)
	{		
		cout << "Connect OPC UA Sever Failed" << endl;
		return 0;
	}
	else
	{		
		cout << "Connect OPC UA Sever Successful" << endl;
	}

	//
	//capture = VideoCapture(0); //打开摄像头
	//capture.set(CAP_PROP_FRAME_WIDTH, 2448);  // 设置图像宽度
	//capture.set(CAP_PROP_FRAME_HEIGHT, 2048);  // 设置图像高度
	//capture.set(CAP_PROP_FPS, 5);  // 设置帧率
	//if (!capture.isOpened())
	//{
	//	cout << "open camera failed." << endl;		
	//	capture.release();
	//	return 0;
	//}

	//
	//capture >> img;  //读取视频流中的一帧,写入img		
	//cv::cvtColor(img, hsv, COLOR_BGR2HSV);		
	//cv::split(hsv, hsvsplit);

	//cv::imshow("test", img);    //在窗口显示一张图片
	//cv::imshow("test1", hsv);
	//cv::imshow("test2", hsvsplit[0]);
	//cv::imshow("test3", hsvsplit[1]);
	//cv::imshow("test4", hsvsplit[2]);	

	//cv::waitKey(0);          //等待键盘按下,再执行后面的程序
	//destroyAllWindows();
	//capture.release();
	UA_Client_delete(client);  //释放opcua client
	return 0;
}

将OPC UA头文件及连接服务器语句添加到main程序中,调试有120个错误,原因是头文件位置不对,存在重复定义

将头文件语句放到最上边,调试编译还有26个错误,原因是调试选择的x64平台,使用x86平台即可。这个问题没有解决,因为使用的opencv4.5.4要求必须是64位,不过我们后面使用Qt框架,Qt框架是跨平台的,应该可以消除此类错误。

调试平台切换为x86

将头文件放到最上面,将opencv相关语句注释掉,只保留连接Kepsever服务器语句,调试后发现服务器连接失败

需要更改Kepsever相关的OPC UA配置

电脑右下角任务栏右键点Kepsever图标,点击OPC UA配置-安全策略点击“无”

Kepsever软件中项目属性-OPC UA-允许匿名登录点“是”

配置完后,重新初始化kepsever运行时,再在VS中调试运行,显示连接成功

在Kepsever中增加PLC tag点,尝试用VS编程读写kepsever默认建立的用于测试的“通道 1.设备 1.标记 2”标签

发现读取失败,原因是VS中标签名称不能用中文

自己建立通道标签进行测试,“test.test.OPC_test”,由于没有实际连接PLC,通道建立选择Simulator模拟

更改VS程序读写的tag点为“test.test.OPC_test”,运行成功,能够读写操作

测试代码:

// test01.cpp : 定义控制台应用程序的入口点。

#include "open62541.h"  //open62541头文件,opcua开源库文件
#pragma comment(lib,"ws2_32.lib")  //opcua通讯用到的库,opcua使用socket通讯,需使用此库

#include "stdafx.h"
#include <iostream>
#include<windows.h>   //使用Sleep(1000)延时函数头文件
#include <stdio.h>
#include <process.h>
#include <conio.h>
#include "string.h"

//#include <opencv2/opencv.hpp>   //opencv头文件
//#include<opencv2/core.hpp>
//#include<opencv2/imgproc.hpp>
//#include<opencv2/highgui.hpp>
//#include<opencv2/videoio.hpp>



using namespace std;  //使用命名空间
//using namespace cv;

/*声明全局变量*/
//VideoCapture capture;
UA_Client *client = UA_Client_new();  //opcua客户端结构体,用于与PLC通讯
UA_StatusCode status;  //用于存放opcua客户端执行操作后的状态反馈
/*主函数*/
int main()
{
	/*Mat img;
	Mat hsv;
	Mat hsvsplit[3];
	cv::namedWindow("test", WINDOW_FREERATIO);
	cv::namedWindow("test1", WINDOW_FREERATIO);
	cv::namedWindow("test2", WINDOW_FREERATIO);
	cv::namedWindow("test3", WINDOW_FREERATIO);
	cv::namedWindow("test4", WINDOW_FREERATIO);*/

	client = UA_Client_new();  //创建opcua客户端
	UA_ClientConfig_setDefault(UA_Client_getConfig(client));  //设置客户端为默认配置
	status = UA_Client_connect(client, "opc.tcp://127.0.0.1:49320");  //连接服务器,此处连接KEPServer,URL可以通过任务栏KEPServer软件右键,“OPC UA配置”查看
																	  //判断opcua客户端连接状态
	if (status != UA_STATUSCODE_GOOD)
	{		
		cout << "Connect OPC UA Sever Failed" << endl;
		return 0;
	}
	else
	{		
		cout << "Connect OPC UA Sever Successful" << endl;
	}

	UA_Variant value;  //opcua变量类型
	UA_Variant_init(&value);  //初始化,注意初始化后不能直接读取value.data的值,会导致内存指向错误,必须通过opcua读值或赋值后才能读取value.data
	long OPC_test=5;
	status = UA_Client_readValueAttribute(client, UA_NODEID_STRING(2, "test.test.OPC_test"), &value);
	if (status != UA_STATUSCODE_GOOD)
	{
		cout << "OPC UA read Failed" << endl;
		return 0;
	}
	else
	{
		cout << "OPC UA read Successful" << endl;
	}
	OPC_test = *(UA_UInt32*)value.data;
	cout << "OPC_test原值:" << OPC_test<< endl;

	OPC_test = OPC_test + 1;
	UA_Variant_setScalar(&value, &OPC_test, &UA_TYPES[UA_TYPES_UINT32]);  //将检测结果变量写入OPCUA变量
	status = UA_Client_writeValueAttribute(client, UA_NODEID_STRING(2, "test.test.OPC_test"), &value);  //将检测结果值写入PLC
	if (status != UA_STATUSCODE_GOOD)
	{
		cout << "OPC UA write Failed" << endl;
		return 0;
	}
	else
	{
		cout << "OPC UA write Successful" << endl;
	}

	status = UA_Client_readValueAttribute(client, UA_NODEID_STRING(2, "test.test.OPC_test"), &value);
	if (status != UA_STATUSCODE_GOOD)
	{
		cout << "OPC UA read Failed" << endl;
		return 0;
	}
	else
	{
		cout << "OPC UA read Successful" << endl;
	}
	OPC_test = *(UA_UInt32*)value.data;
	cout << "OPC_test更改后:" << OPC_test << endl;

	//
	//capture = VideoCapture(0); //打开摄像头
	//capture.set(CAP_PROP_FRAME_WIDTH, 2448);  // 设置图像宽度
	//capture.set(CAP_PROP_FRAME_HEIGHT, 2048);  // 设置图像高度
	//capture.set(CAP_PROP_FPS, 5);  // 设置帧率
	//if (!capture.isOpened())
	//{
	//	cout << "open camera failed." << endl;		
	//	capture.release();
	//	return 0;
	//}


	//
	//capture >> img;  //读取视频流中的一帧,写入img		
	//cv::cvtColor(img, hsv, COLOR_BGR2HSV);		
	//cv::split(hsv, hsvsplit);

	//cv::imshow("test", img);    //在窗口显示一张图片
	//cv::imshow("test1", hsv);
	//cv::imshow("test2", hsvsplit[0]);
	//cv::imshow("test3", hsvsplit[1]);
	//cv::imshow("test4", hsvsplit[2]);	

	//cv::waitKey(0);          //等待键盘按下,再执行后面的程序
	//destroyAllWindows();
	//capture.release();
	UA_Client_delete(client);  //释放opcua client
	return 0;
}

1.读取test点进行显示

2.变量加1,写入test点

3.再读取test点进行显示

总结:

1.open62541是OPC UA开源代码,虽然生成源文件和头文件需要下载源码和cmake,使用上比较麻烦,但只需要使用一次,生成后可以直接用,一劳永逸

2.在VS中选择x64平台会报错,选择x86平台可以用,应该是ws2_32.lib相关的库不支持64位,目前没有解决,继续后面的实验,看看用Qt后是否可以解决

3.在做OPC UA通讯实验前也实验了OPC DA读写OPC服务器成功了,但是DA的代码比较繁琐,环境配置也比较繁琐,这里就放弃DA,选用UA了。

4.kepsever的安全策略和允许匿名登录需要配置,如果不配置的话应该需要增加一下安全验证方面的代码,这里没有用到,所有直接将安全策略降为最低

5.VS中读取kepsever中点名称不能有中文

6.VS中建立的变量,与读取的OPC点数据类型注意对应

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: win10+vs2017+qt+opencv 是一种常用的开发环境组合,可以用于开发图像处理、计算机视觉等应用程序。其,win10 是操作系统,vs2017 是集成开发环境,qt 是跨平台应用程序开发框架,opencv计算机视觉库。这种组合可以提高开发效率,简化开发流程,同时也具有良好的兼容性和稳定性。 ### 回答2: Win10 vs2017 Qt OpenCV,其实是三个不同的对象,下面将它们逐一进行分析。 Win10,顾名思义,就是Windows 10操作系统的缩写。Windows是全球最为知名的操作系统之一,其在操作界面、软件支持、硬件厂商等方面具有较为广泛的应用和覆盖。Win10更是在基础操作系统的基础上,对界面、安全性、易用性、兼容性等方面进行了优化和改善,使其成为一个更为齐全且更易于使用的操作系统,目前得到了广泛的用户认可。 Vs2017,是Visual Studio的缩写,2017表示该版本发布的年份。Vs是由美国微软公司开发的一款用于软件开发的集成开发环境。Vs不仅包含了代码编写、调试、编译等方面的工具,还提供了一系列辅助开发技术,例如代码重构、版本管理、跨平台开发等等。Vs被广泛应用于Windows平台下的开发,除此之外也支持其他操作系统、开发语言以及开发模式等等,其本身也在持续地更新升级以适应日益变化的开发环境。 Qt,是一个跨平台的C++应用程序开发框架,也被称为“跨平台图形用户界面应用程序开发框架”。Qt是由挪威Trolltech公司于1991年开始开发的,旨在为开发人员提供高效的框架,并能够快速构建新的应用程序。Qt具有良好的可扩展性并提供丰富的开发API,使得其可以被用于开发桌面应用、移动应用、嵌入式应用等等。在跨平台方面,Qt提供了大量的平台支持,例如Windows、Linux、macOS、Android、iOS等等,极大地方便了开发人员的工作。 OpenCV,全称是“开源计算机视觉库”,是一套基于BSD许可协议的跨平台计算机视觉应用程序开发库,可用于开发实时的计算机视觉应用程序。该库广泛应用于学术研究、科研领域以及商业领域,其支持的领域也很广泛,例如目标检测、图像处理、运动跟踪、机器学习等等。OpenCV支持众多编程语言,例如C++、Python、Java等等,也可以被用于多种操作系统上,例如Windows、Linux、macOS等等。 从以上几个对象的简介来看,Win10、Vs2017、QtOpenCV分别是一款操作系统、一个开发工具、一个应用框架和一个开发库。它们是在不同的层面上为开发者和用户提供更好的工具和服务,目的是为了更好地完成软件开发的工作。不过在这些工具之间使用并不是互相排斥的,有时候我们也需要使用它们的组合,以便于完成某些特定的开发任务。 ### 回答3: Win10 VS2017 QT OpenCV是现今非常热门的开发环境,被广泛用于开发图形图像领域。 Win10是目前Microsoft推出的最新的操作系统,与之前的操作系统相比,更加注重用户体验,同时也更注重安全性和稳定性。Win10的更新速度很快,对开发环境与软件的兼容性比之前的版本都要更好。 VS2017是Microsoft推出的最新的开发IDE,它更加注重与异构工具链、云开发的集成,提高了团队合作的效率,同时提供了许多新的代码分析和调试工具,能够更准确地定位出现的错误。此外,VS2017也提供了用于跨平台开发的工具,非常适用于在Win10系统上进行开发QT是一个跨平台的C++开发框架, 其提供了丰富的GUI类库和工具。QT的特点是:跨平台,简单易用,一致性强,可定制化程度高。QT是一款免费的开源软件,因此十分受欢迎。在Win10系统上使用QT进行开发,可以帮助开发者快速地编写GUI应用程序。 OpenCV是一款流行的计算机视觉库,它提供了许多图像和视频处理的函数和算法。OpenCV可用于各大平台的开发,操作方便而深受开发者的青睐。OpenCV适用于Win10系统上,可以在QT环境使用,为开发者提供优雅高效的图像处理解决方案。 综上所述,在Win10系统使用VS2017作为开发IDE,配合QT进行GUI界面的实现与OpenCV进行计算机视觉处理,能够快速地搭建起强大的开发环境。Win10 VS2017 QT OpenCV的组合能够提高开发者的效率与开发程序的稳定性,并应用于图形图像领域的快速开发

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值