在qt中使用c++实现与Twincat3 PLC变量通信

这是一个只针对新手的教程,下载安装就不说了,我下的是TC31-Full-Setup.3.1.4024.66.exe是这个版本,其他版本应该问题不大。

先创建一个项目

选中SYSTEM,在右侧点击Choose Target(接下来界面跟我不一样没关系,因为是从已有的项目上截的图,像plc可能你们没有文件,后面会讲),选择Search,进去再选择Broadcast Search,选择你要的那个,你们可能没有那个“x”,“x”代表连接成功,接下来点击Add Route,取消勾选Secure ADS(本次用不到),输入密码(查了下,默认密码应该是1或者没有),点击ok,接下来应该就有“x”了,代表连接成功了,点击close,记住你设备对应地址,接下来在c++会用到,点击ok(说一下跳出什么提示都点是,后面也是)。

接下来编写pcl代码,右键PLC添加新项,选择Standard PLC Project,点击添加,这样plc下就会出来一堆文件,找到POUS文件,点击里面的MAIN,这样就可以编写plc程序了。

我这边定义了a,b,c,sum如图所示(我也是第一次写plc程序,稍微查了一下,这边上下两部分,上面是初始化变量区域,下面是逻辑运算区域),自己写入a,b,c的值,最后相加得到sum,右键点击你的plc文件名,再点击生成,编译完之后点击上方activate configuration,跳出提示框一直点ok/是,进入run mode,这里应该能看见你设备上的TC灯变成绿色,这样Twincat端的基本已经完成,现在写c++程序。

我这边使用qt编写c++程序(其他应该也可以),先创建一个c++程序,在.pro中添加ads的库与头文件的路径,路径按自己实际情况改。添加头文件#include <windows.h>,#include <TcAdsDef.h>
#include <TcAdsAPI.h>,严格根据这个顺序来,不然可能会报错,定义端口变量,AMS地址变量,端口地址变量,以及对应的用来接收你在pcl中定义变量的值的变量(这里我用short定义是因为pcl中int只有2字节,为了对应,c++中使用short定义),使用AdsPortOpen()函数打开ads端口通信,设置端口为851(默认端口),手动填写目标设备的AMSNETID,即上面让你们记得的那个地址(这里手动填写是因为我不知道啥原因自动填写有问题,感兴趣可以试试,就我注释掉那一部分)。

TEMPLATE = app
CONFIG += console c++17
CONFIG -= app_bundle
CONFIG -= qt

SOURCES += \
        main.cpp


INCLUDEPATH += $$quote(C:/TwinCAT/AdsApi/TcAdsDll/Include)

LIBS += $$quote(C:/TwinCAT/AdsApi/TcAdsDll/x64/lib/TcAdsDll.lib)

 

    long        nErr, nPort;//定义端口变量
    AmsAddr     Addr;//定义AMS地址变量
    PAmsAddr    pAddr = &Addr;//定义端口地址变量
    short       a,b,c;
    short       sum;

    nPort = AdsPortOpen();//打开ADS通讯端口
    // nErr = AdsGetLocalAddress(pAddr);
    // if (nErr) cerr << "Error:AdsGetLocalAddress:" << nErr << '\n';
    pAddr->port = 851;//TC3通讯使用的为851端口
    pAddr->netId.b[0] = 169; //手动填写目标设备的AMSNETID
    pAddr->netId.b[1] = 254;
    pAddr->netId.b[2] = 100;
    pAddr->netId.b[3] = 116;
    pAddr->netId.b[4] = 1;
    pAddr->netId.b[5] = 1;

通过AdsSyncWriteReq 函数,自行写入a,b,c的值,在Twincat中按下ctrl+q进入查找功能,输入browser,选择第一个就可以跳到Target Browser界面,可以查看变量的段地址和偏移地址,按图中写入代码,循环读取a,b,c,sum的值(看自己要求要不要循环读取),最后记得用AdsPortClose()函数关闭ads通信端口。

    //写入a的值cout << "a = ";cin >> a;nErr = AdsSyncWriteReq(pAddr,0x4020,0x8,0x2,&a);if (nErr) cerr << "Error : AdsSyncWriteReq:" << nErr << '\n';//写入b的值cout << "b = ";cin >> b;nErr = AdsSyncWriteReq(pAddr,0x4020,0x10,0x2,&b);if (nErr) cerr << "Error : AdsSyncWriteReq:" << nErr << '\n';//写入c的值cout << "c = ";cin >> c;nErr = AdsSyncWriteReq(pAddr,0x4020,0x18,0x2,&c);if (nErr) cerr << "Error : AdsSyncWriteReq:" << nErr << '\n';

do{//读取a的值nErr = AdsSyncReadReq(pAddr,0x4020,0x8,0x2,&a);if (nErr) cerr << "Error : AdsSyncReadReq:" << nErr << '\n';cout << a << endl;//读取b的值nErr = AdsSyncReadReq(pAddr,0x4020,0x10,0x2, &b);if (nErr) cerr << "Error : AdsSyncReadReq:" << nErr << '\n';cout << b << endl;//读取c的值nErr = AdsSyncReadReq(pAddr,0x4020,0x18,0x2,&c);if (nErr) cerr << "Error : AdsSyncReadReq:" << nErr << '\n';cout << c << endl;//读取sum的值nErr = AdsSyncReadReq(pAddr,0x4020,0x20,0x2,&sum);if (nErr) cerr << "Error : AdsSyncReadReq:" << nErr << '\n';cout << "sum = " << sum << '\n';cout << "--------------" << endl;cout << endl;Sleep(200);}while(1);

    nErr = AdsPortClose();
    if (nErr) cerr << "Error:AdsPortClose:" << nErr << '\n';

 回到plc端点击loin按钮,我是直接运行的,有些版本可能还要点在一下三角图案来运行,运行之后会自动跳出一个MAIN[Online]界面,可以看到初始值都为0,在qt中勾选上在终端中运行,接下来运行c++程序,可以看到我给a,b,c分别赋值1,2,3,最终得到sum为6,同时Twincat中的a,b,c,sum也跟着变化了(其实如果只有读取可以不按login也能成功,但如果你要写入一定要点login才能成功改变值)。

这是全部的源代码

#include <iostream>
//#include <conio.h>
#include <windows.h>
#include <TcAdsDef.h>
#include <TcAdsAPI.h>using namespace std;int main()
{long        nErr, nPort;//定义端口变量AmsAddr     Addr;//定义AMS地址变量PAmsAddr    pAddr = &Addr;//定义端口地址变量short       a,b,c;short       sum;nPort = AdsPortOpen();//打开ADS通讯端口// nErr = AdsGetLocalAddress(pAddr);// if (nErr) cerr << "Error:AdsGetLocalAddress:" << nErr << '\n';pAddr->port = 851;//TC3通讯使用的为851端口pAddr->netId.b[0] = 169; //手动填写目标设备的AMSNETIDpAddr->netId.b[1] = 254;pAddr->netId.b[2] = 100;pAddr->netId.b[3] = 116;pAddr->netId.b[4] = 1;pAddr->netId.b[5] = 1;//写入a的值cout << "a = ";cin >> a;nErr = AdsSyncWriteReq(pAddr,0x4020,0x8,0x2,&a);if (nErr) cerr << "Error : AdsSyncWriteReq:" << nErr << '\n';//写入b的值cout << "b = ";cin >> b;nErr = AdsSyncWriteReq(pAddr,0x4020,0x10,0x2,&b);if (nErr) cerr << "Error : AdsSyncWriteReq:" << nErr << '\n';//写入c的值cout << "c = ";cin >> c;nErr = AdsSyncWriteReq(pAddr,0x4020,0x18,0x2,&c);if (nErr) cerr << "Error : AdsSyncWriteReq:" << nErr << '\n';do{//读取a的值nErr = AdsSyncReadReq(pAddr,0x4020,0x8,0x2,&a);if (nErr) cerr << "Error : AdsSyncReadReq:" << nErr << '\n';cout << a << endl;//读取b的值nErr = AdsSyncReadReq(pAddr,0x4020,0x10,0x2, &b);if (nErr) cerr << "Error : AdsSyncReadReq:" << nErr << '\n';cout << b << endl;//读取c的值nErr = AdsSyncReadReq(pAddr,0x4020,0x18,0x2,&c);if (nErr) cerr << "Error : AdsSyncReadReq:" << nErr << '\n';cout << c << endl;//读取sum的值nErr = AdsSyncReadReq(pAddr,0x4020,0x20,0x2,&sum);if (nErr) cerr << "Error : AdsSyncReadReq:" << nErr << '\n';cout << "sum = " << sum << '\n';cout << "--------------" << endl;cout << endl;Sleep(200);}while(1);nErr = AdsPortClose();if (nErr) cerr << "Error:AdsPortClose:" << nErr << '\n';
}

 

以上就是在qt中使用c++实现与Twincat3 PLC变量通信全过程,本人也是第一次接触也是摸索了很久,希望能帮到大家。
如果要长时间接触倍福可以虚拟倍福学园自己学习一下https://tr.beckhoff.com.cn/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/web/81810.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

云原生微服务devops项目管理英文表述详解

文章目录 1.云原生CNCF trail map云原生技术栈路线图 2. 微服务单体应用与微服务应用架构区别GraphQLKey differences: GraphQL and REST 3.容器化&编排dockerKubernetesContainers and ContainerizationContainer Basics 4. DevOps & CI/CDTerms and Definitions 5.Ag…

pyside 使用pyinstaller导出exe(含ui文件)

第一步&#xff1a;首先确保安装好pyinstall&#xff0c;终端运行 pyinstaller -w main.py 生成两个文件夹 打开exe文件报错&#xff0c;问题是ui文件找不到 第二步&#xff1a;将ui文件复制到exe所在文件夹&#xff0c;打开成功 ![在这里插入图片描述](https://i-blog.csdni…

kerberos在无痕浏览器 获取用户信息失败 如何判断是否无痕浏览器

kerberos在无痕浏览器 获取用户信息失败 如何判断是否无痕浏览器 js 代码 其他地方用直接导入js getCurrentUserId 这是自己后端获取 域账号地址 我是成功返回200 //true普通浏览器 fasle 无痕浏览器 export const checkBrowserMode async () > {try {const response a…

HTML 计算网页的PPI

HTML 计算网页的PPI vscode上安装live server插件&#xff0c;可以实时看网页预览 有个疑问&#xff1a; 鸿蒙density是按照类别写死的吗&#xff0c;手机520dpi 折叠屏426dpi 平板360dpi <html lang"en" data - overlayscrollbars - initialize><header&…

华为OD机试真题——Boss的收入(分销网络提成计算)(2025A卷:100分)Java/python/JavaScript/C/C++/GO最佳实现

2025 A卷 100分 题型 本专栏内全部题目均提供Java、python、JavaScript、C、C++、GO六种语言的最佳实现方式; 并且每种语言均涵盖详细的问题分析、解题思路、代码实现、代码详解、3个测试用例以及综合分析; 本文收录于专栏:《2025华为OD真题目录+全流程解析+备考攻略+经验分…

<el-date-picker>组件传参时,选中时间和传参偏差8小时

遇到一个bug&#xff0c;不仔细看&#xff0c;都不一定能发现&#xff0c;bug描述&#xff1a;我们有一个搜索框&#xff0c;里面有一个时间选择器&#xff0c;当我使用<el-date-picker>时&#xff0c;我发现当我选择时分秒之后&#xff0c;显示都正常&#xff0c;但是当…

uni-app开发特殊社交APP

uni-app开发特殊社交APP 目录 1.展示APP功能 2.展示项目结构 3.关于我的GitHub 引言 博主最近自己在GitHub上面上传了一个关于社交软件的项目&#xff08;该项目早已开发完毕&#xff09;, 这个社交软件比较特殊, 被称之为blind-date&#xff0c; blind-date 是基于 uni-…

深入研究Azure 容器网络接口 (CNI) overlay

启用cni overlay 在通过portal创建aks的时候,在networking配置上,选中下面的选项即可启用。 通过CLI创建AKS 要创建具有 CNI 覆盖网络的 AKS 群集,需要在创建群集时指定 --network-plugin azure 和 --network-plugin-mode 覆盖选项。 还需要指定 --pod-cidr 选项来定义群…

Docker 部署项目

使用 Docker 部署项目是一个很好的选择&#xff0c;可以避免服务器环境不兼容的问题&#xff0c;并且能够实现一致性和可移植性。我会给你一个详细的步骤&#xff0c;帮你从零开始理解 Docker&#xff0c;最终在服务器上部署 Roop 项目。 1. 安装 Docker 首先&#xff0c;你需…

excel表格记账 : 操作单元格进行加减乘除 | Excel中Evaluate函数

文章目录 引用I 基础求和∑II Excel中Evaluate函数基于字符串表达式进行计算用法案例 :基于Evaluate实现汇率计算利润知识扩展在单元格内的换行选择整列单元格引用 需求: 基于汇率计算利润,调整金额以及进汇率和出汇率自动算出利润,已经统计总利润。 基于Evaluate实现汇率计…

vue+ts+TinyEditor 是基于 Quill 2.0 开发的富文本编辑器,提供丰富的扩展功能,适用于现代 Web 开发的完整安装使用教程

简介 TinyEditor 是基于 Quill 2.0 开发的富文本编辑器&#xff0c;提供丰富的扩展功能&#xff0c;适用于现代 Web 开发。具备模块化设计、轻量级架构和高度可定制化特性&#xff0c;支持多种插件扩展&#xff0c;满足不同场景需求。 核心特性 基于 Quill 2.0 的现代化架构模…

matlab实现激光腔长计算满足热透镜效应

激光腔长计算与热透镜效应补偿 在全固态激光器中&#xff0c;热透镜效应是一个重要的问题&#xff0c;因为它会影响激光的光束质量和输出功率。以下是如何计算激光腔长并考虑热透镜效应的方法&#xff0c;以及一些补偿技术。 1. 激光腔长计算 激光腔长的计算需要考虑激光晶体…

Science Robotics 具身智能驱动的空中物理交互新范式:结合形态和传感,与非结构化环境进行稳健交互

随着科技的飞速发展&#xff0c;无人机技术已从单纯的远程感知扩展到与环境的物理交互领域&#xff0c;为可持续发展目标的实现提供了新的可能性。传统的空中物理交互方法依赖于复杂的控制策略和精确的环境建模&#xff0c;尽管能够实现高精度操作&#xff0c;但其在非结构化自…

图神经网络在信息检索重排序中的应用:原理、架构与Python代码解析

现代信息检索系统和搜索引擎普遍采用两阶段检索架构&#xff0c;在人工智能应用中也被称为检索增强生成&#xff08;Retrieval-Augmented Generation, RAG&#xff09;。在初始检索阶段&#xff0c;系统采用高效的检索方法&#xff0c;包括词汇检索算法&#xff08;如BM25&…

List 源码翻译

List 源码翻译-jdk1.8 翻译来自 AI 大模型。 全部源码翻译下载 /** 版权所有 (c) 1997, 2014, Oracle 和/或其附属公司。保留所有权利。* ORACLE 专有/机密。使用受许可条款约束。*********************/package java.util;import java.util.function.UnaryOperator;/*** 有序…

Vscode 解决 #include <> 找不到的问题

本人遇到的情况, 使用 ROS 的过程中, 发现 #include <pcl/point_types.h> 不被 VScode 识别, 在 AI 的帮助下解决了该问题, 现总结如下: 1. 查看是否有相应的文件 Linux 下, point_types.h 的存储路径一般为: /usr/include/pcl-1.x (我的路径是 /usr/include/pcl-1.12)…

霹雳吧啦Wz_深度学习-图像分类篇章_1.1 卷积神经网络基础_笔记

深度学习-图像分类篇章 参考笔记 卷积神经网络 英文&#xff1a;Convolutional Neural Network&#xff0c;CNN雏形&#xff1a;1998年LeCun的LeNet5&#xff0c;第一个卷积神经网络包含&#xff1a; 卷积层&#xff1a;Convolutions下采样层&#xff1a;Subsampling全连阶层…

基于多模态脑电、音频与视觉信号的情感识别算法【Nature核心期刊,EAV:EEG-音频-视频数据集】

简述 理解情感状态对于开发下一代人机交互界面至关重要。社交互动中的人类行为会引发受感知输入影响的心理生理过程。因此&#xff0c;探索大脑功能与人类行为的努力或将推动具有类人特质人工智能模型的发展。这里原作者推出一个多模态情感数据集&#xff0c;包含42名参与者的3…

理解并解决高丢包率问题,构建清晰流畅的实时音视频通话

丢包作为数字通信中的重要干扰因素&#xff0c;常常潜伏在表面之下&#xff0c;却严重影响性能&#xff0c;将清晰的对话变的模糊不清&#xff0c;将连贯的演示变的断断续续。因此&#xff0c;对音视频通话相关应用的开发者来说&#xff0c;理解丢包率非常重要。 什么是丢包&am…