倍福ADS通信教程

介绍

TwinCAT3

TwinCAT3是Beckhoff推出的一款基于PC的控制器软件,简单理解是一套集成开发环境,里边有各种分析工具以及通信中间件;开发者可以很方便的用它来进行IPC和PLC之间的通信连接

ADS

倍福ADS(‌Automation Device Specification)‌是一个跨设备的网络通信协议(基于TCP/IP),‌依托TwinCAT提供的通信组件,它允许PLC、IPC之间进行数据分发、读写,支持同步、异步通信方式

环境搭建

VS2019

安装C++桌面开发组件

在这里插入图片描述

安装完Visual Studio版本信息页面如下

在这里插入图片描述

TwinCAT3

在使用ADS之前需要先安装TWinCAT3环境,我这里装的是V3.1.4024.55,属于TwinCAT3 Full版本,下载页面:https://www.beckhoff.com.cn/en-en/download/650023470

TwinCAT3 Full版本分XAR和XAE两部分,需要搭配Visual Studio版本使用

  • XAE:eXtended Automation Engineerin,XAE是基于Visual Studio作为开发环境,进行多种语言的编程和硬件组态
  • XAR:eXtended Automation Runtime,XAR是实时运行环境,对 TwinCAT 模块加载、执行、管理、实时运行与调用

TwinCAT3安装比较简单,勾选相应的组件,默认安装就可以了

在这里插入图片描述

Qt6.7.2

使用在线工具安装Qt6.7.2,第一次打开需要使用--mirror命令指定软件源

qt-online-installer-windows-x64-4.8.0.exe  --mirror https://mirror.nju.edu.cn/qt

Qt组件勾选

在这里插入图片描述

通信实验

操作流程

  1. VS2019 XAE新建PLC工程,配置工程,编译工程登入后可以查看PLC变量内存地址
  2. QtCreator新建C++ ADS Reader工程,根据PLC工程的IP和端口配置ADS连接
  3. QtCreator新建C++ ADS Writer工程,根据PLC工程的IP和端口配置ADS连接
  4. 在Reader进行数据读取操作,在Writer进行数据写入操作

PLC
编写PLC程序:定义BOOL、INT、REAL等3个变量类型数据

PROGRAM MAIN
VARboolVar1 AT%M*:BOOL;intVar2 AT%M*:INT;realVar3 AT%M*:REAL;
END_VAR

编译生成PLC应用并登入

在这里插入图片描述

打开Target Brownser查看变量内存地址分布

变量类型groupoffset
boolVar1BOOL0x40200x5DFF0
intVar2INT0x40200x5DFF2
realVar3REAL0x40200x5DFF4

PLC和C++之间变量大小对应关系

变量类型C++长度
BOOLbool1
INTint4
UINTunsigned int4
REALfloat4
LREALdouble8

Reader
建立ADS连接后读取指定地址(group + offset)的变量数据

#include <QCoreApplication>
#include <Windows.h>
#include "TcAdsDef.h"
#include "TcAdsAPI.h"int main(int argc, char *argv[])
{long      ret, port;AmsAddr   addr;bool byte;port = AdsPortOpen();ret = AdsGetLocalAddress(&addr);if (ret){qDebug() << "AdsGetLocalAddress : " << ret;}if (port == addr.port){qDebug() << "LocalAdsPort: " << port << " opened!";}else{qDebug() << "LocalAdsPort open failed!";}addr.port = 851;int time = 0;int indexGroup = 0x4020;float var;while (1){ret = AdsSyncReadReq(&addr, indexGroup, 0x5dff0, sizeof(bool), &byte);if(!ret) {qDebug() << "boolVar1 : " << byte;}ret = AdsSyncReadReq(&addr, indexGroup, 0x5dff2, sizeof(int), &time);if(!ret) {qDebug() << "intVar2 : " << time;}ret = AdsSyncReadReq(&addr, indexGroup, 0x5dff4, sizeof(float), &var);if(!ret) {qDebug() << "realVar3 : " << var;}Sleep(1000);}return 0;
}

Writer
建立ADS连接后往指定变量地址(group + offset)写入数据

#include <QCoreApplication>
#include <Windows.h>
#include "TcAdsDef.h"
#include "TcAdsAPI.h"int main(int argc, char *argv[])
{long      ret, port;AmsAddr   addr;bool byte = false;port = AdsPortOpen();ret = AdsGetLocalAddress(&addr);if (ret){qDebug() << "AdsGetLocalAddress : " << ret;}if (port == addr.port){qDebug() << "LocalAdsPort: " << port << " opened!";}else{qDebug() << "LocalAdsPort open failed!";}addr.port = 851;int time = 0;int indexGroup = 0x4020;while (1){byte = !byte;ret = AdsSyncWriteReq(&addr, indexGroup, 0x5dff0, sizeof(bool), &byte);time++;ret = AdsSyncWriteReq(&addr, indexGroup, 0x5dff2, sizeof(int), &time);float var = time * 0.9 + 3.14;ret = AdsSyncWriteReq(&addr, indexGroup, 0x5dff4, sizeof(float), &var);Sleep(1000);}return 0;
}

CMakeLists.txt

两个工程的CMake写法参考:需要include几个头文件(afxstr.h、TcAdsAPI.h、TcAdsDef.h、wingdi.h),然后链接TcAdsDll这个库

cmake_minimum_required(VERSION 3.14)project(QtADS LANGUAGES CXX)set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)find_package(QT NAMES Qt6 Qt5 REQUIRED COMPONENTS Core)
find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Core)include_directories(${CMAKE_SOURCE_DIR}/Include)link_directories(${CMAKE_SOURCE_DIR}/lib)add_executable(QtADS
main.cpp
)
target_link_libraries(QtADS Qt${QT_VERSION_MAJOR}::Core TcAdsDll)include(GNUInstallDirs)
install(TARGETS QtADSLIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
)

接口说明

  • 获取库版本号:AdsGetDllVersion
  • 打开通信端口:ADSPortOpen
  • 关闭通信端口:AdsPortClose
  • 获取本机地址:AdsGetLocalAddress
  • 获取错误信息:AdsGetLastError
  • 同步写:AdsSyncWriteReq
  • 同步读:AdsSyncReadReq
  • 设备通知回调:AdsSyncAddDeviceNotificationReq

开源库

介绍

Qt封装的ADS组件也能很方便地进行ADS通信,支持QADSBOOL、QADSDINT、QADSDWORD、QADSENUM、QADSLREAL、QADSSTRING及对应的数组类型,所有数据类型都要持有通信的网络端口信息、节点信息,都要定义相应的value、setValue方法,但目前还没有支持Qt6,但改一改的话也可以用,需要进行两处改动:

① 将QString::SkipEmptyParts改为Qt::SkipEmptyParts

QString::SkipEmptyParts

改为

Qt::SkipEmptyParts

② QByteArray insert成员报错时需要把成员变成QByteArray兼容类型,通过toLatin1函数来转换

QByteArray sendValue = QByteArray(adsSymbolSize(),'\0');
sendValue.insert(0,val);

改为

QByteArray sendValue = QByteArray(adsSymbolSize(),'\0');
sendValue.insert(0,val.toLatin1());

示例

以BOOL类型数据访问为例:QADSBOOL通过配置端口、网络信息、节点名称等信息来访问节点

QADSBOOL *value = new QADSBOOL(this, 851, "local", "localhost", "MAIN.bTestVar1", QADSPLCVariable::ON_DEMAND, 0);

QtADS库封装了value、setValue等接口来进行读写操作

value->value();
value->setValue(false);

参考

【1】https://tr.beckhoff.com.cn/pluginfile.php/44857/mod_resource/content/0/ADS%E9%AB%98%E7%BA%A7%E5%9F%B9%E8%AE%AD.pdf

【2】https://tr.beckhoff.com.cn/mod/folder/view.php?id=2058
【3】https://github.com/Framatome/QtADS

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

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

相关文章

WebRTC音视频开发读书笔记(六)

数据通道不仅可以发送文本消息, 还可以发送图片、二进制文件,将其类型binaryType属性设置成arraybuffer类型即可. 九\、文件传输 1、文件传输流程 &#xff08;1&#xff09;使用表单file打开本地文件 &#xff08;2&#xff09;使用FileReader读取文件的二进制数据 &#…

零基础学习Redis(5) -- redis单线程模型介绍

前面我们提到过&#xff0c;redis是单线程的&#xff0c;这期我们详细介绍一下redis的单线程模型 1. redis单线程模型 redis只使用一个线程处理所有的请求&#xff0c;并不是redis服务器进程内部只有一个线程&#xff0c;其实也存在多个线程&#xff0c;只不过多个线程是在处…

SparkSQL遵循ANSI标准

ANSI简介 ANSI Compliance通常指的是遵循美国国家标准学会&#xff08;American National Standards Institute, ANSI&#xff09;制定的标准。在计算机科学和技术领域&#xff0c;这通常涉及到数据库管理系统&#xff08;DBMS&#xff09;对于SQL语言的支持程度。 ANSI为SQL…

基于vue框架的爱学习分享平台ud317(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。

系统程序文件列表 项目功能&#xff1a;用户,学科分类,交流答疑,论坛交流,学习资料 开题报告内容 基于Vue框架的爱学习分享平台 开题报告 一、项目背景与意义 随着互联网技术的飞速发展&#xff0c;知识的获取与传播方式正经历着前所未有的变革。在线教育平台逐渐成为满足…

如何理解:进程控制

文章目录 前言&#xff1a;进程创建&#xff1a;进程终止&#xff1a;如何终止进程&#xff1f;进程等待非阻塞等待&#xff1a; 总结&#xff1a; 前言&#xff1a; ​ 对于前面的地址空间的学习&#xff0c;我们现在了解到原来所谓变量的地址其实是虚拟地址&#xff0c;该虚…

【数学建模备赛】Ep05:斯皮尔曼spearman相关系数

文章目录 一、前言&#x1f680;&#x1f680;&#x1f680;二、斯皮尔曼spearman相关系数&#xff1a;☀️☀️☀️1. 回顾皮尔逊相关系数2. 斯皮尔曼spearman相关系数3. 斯皮尔曼相关系数公式4. 另外一种斯皮尔曼相关系数定义5. matlab的用法5. matlab的用法 三、对斯皮尔曼相…

MySQL(二)——CRUD

文章目录 CRUD新增全列插入指定列插入插入查询结果 查询全列查询指定列查询查询字段为表达式表达式不包含字段表达式包含一个字段表达式包含多个字段 补充&#xff1a;别名去重查询排序条件查询 补充&#xff1a;运算符区间查询模糊查询NULL的查询 分页查询聚合查询聚合函数 分…

C++实现——红黑树

目录 1.红黑树 1.1红黑树的概念 1.2红黑树的性质 1.3红黑树节点的定义 1.4红黑树的插入操作 1.5红黑树的验证 1.6红黑树的删除 1.7红黑树与AVL树的比较 1.8红黑树的应用 1.红黑树 1.1红黑树的概念 红黑树&#xff0c;是一种二叉搜索树&#xff0c;但在每个结点上增加一个存储位…

Chat App 项目之解析(二)

Chat App 项目介绍与解析&#xff08;一&#xff09;-CSDN博客文章浏览阅读76次。Chat App 是一个实时聊天应用程序&#xff0c;旨在为用户提供一个简单、直观的聊天平台。该应用程序不仅支持普通用户的注册和登录&#xff0c;还提供了管理员登录功能&#xff0c;以便管理员可以…

初识指针4の学习笔记

目录 1>>前言 2>>字符指针变量 3>>数组指针变量 4>>函数指针变量 5>>函数指针数组 6>>回调函数是什么&#xff1f; 7>>结语 1>>前言 今天我会继续分享一些我做的笔记&#xff0c;以及我对指针的理解&#xff0c; 后续会…

Vue状态管理工具:vuex

目录 基本概念 使用步骤 核心概念 1.State 2.Getters 3.Mutations 4.Actions 5.Modules 辅助函数 基本概念 基础用法 基本概念 官方&#xff1a;Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式 库。它采用集中式存储管理应用的所有组件的状态&#xff0c;并以…

Android全面解析之context机制(三): 从源码角度分析context创建流程(下)

前言 前面已经讲了什么是context以及从源码角度分析context创建流程&#xff08;上&#xff09;。限于篇幅把四大组件中的广播和内容提供器的context获取流程放在了这篇文章。广播和内容提供器并不是context家族里的一员&#xff0c;所以他们本身并不是context&#xff0c;因而…

查找物理学领域文献的常用数据库

当我们查找文献时如果盲目去各个文献数据库查找不仅浪费时间和精力还不一定能找到自己需要的文献。我们需要对数据库有个简单的了解有方向的去寻找我们研究领域的文献资料&#xff0c;本文就向大家介绍一下查找物理学领域文献的数据库有哪些。 一、物理专业数据库&#xff08;…

Android平台无纸化同屏如何实现实时录像功能

技术背景 我们在做无纸化同屏的时候&#xff0c;好多开发者采集到屏幕、麦克风|扬声器数据&#xff0c;除了需要推RTMP出去&#xff0c;或者启动个轻量级RTSP服务&#xff0c;对外提供个拉流的RTSP URL&#xff0c;别的终端过来拉流&#xff08;小并发场景&#xff09;&#x…

vue3基础ref,reactive,toRef ,toRefs 使用和理解

文章目录 一. ref基本用法在模板中使用ref 与 reactive 的区别使用场景 二. reactive基本用法在模板中使用reactive 与 ref 的区别使用场景性能优化 三. toRef基本用法示例在组件中的应用主要用途对比 ref 和 toRef 四. toRefs基本用法示例在组件中的应用主要用途对比 ref 和 t…

基于Arch的轻量级发行版Archcraft结合内网穿透实现远程SSH连接

文章目录 前言1. 本地SSH连接测试2. Archcraft安装Cpolar3. 配置 SSH公网地址4. 公网远程SSH连接5. 固定SSH公网地址6. SSH固定地址连接 前言 本文主要介绍如何在Archcraft系统中安装Cpolar内网穿透工具,并以实现Windows环境ssh远程连接本地局域网Archcraft系统来说明使用内网…

高性能web服务器详解

一、Web服务的基础介绍 正常情况下单次web服务访问的流程简图&#xff1a; 1.1 Web服务介绍 这里介绍的是 Apache 和 NGINX 1.1.1 Apache 经典的Web服务端 Apache 起初由美国的伊利诺伊大学香槟分校的国家超级计算机应用中心开发 目前经历了两大版本分别是 1.X 和 2.X…

笔试练习day5

目录 游游的you题目解析解法方法一贪心方法二 腐烂的苹果题目解析例子1例子2解法多源BFS最短路径代码代码解析 JZ62 孩子们的游戏(圆圈中最后剩下的数)题目解析解法方法一模拟环形链表模拟数组模拟 方法二递推/递归/动态规划状态表示状态转移方程代码 感谢各位大佬对我的支持,如…

Mysql原理与调优-Mysql的内存结构

1.绪论 前面说过InnoDB每次查询数据或者更新数据&#xff0c;都是先以16kb的大小将数据读取到内存中&#xff0c;然后对内存中的数据页进行操作。为了减少磁盘IO&#xff0c;Innodb的会先单独的申请一块连续的空间&#xff0c;将从磁盘中的数据页缓存到这片内存中。这片内存就…

2D Inpainting 与NeRF 3D重建的多视角一致性问题

一 问题&#xff1a; NeRF依赖于输入图像的一致性。NeRF&#xff08;Neural Radiance Fields&#xff09;在生成三维场景时&#xff0c;依赖于从多个视角拍摄的输入图像之间的一致性来准确地推断场景的三维结构和颜色信息。 具体来说&#xff1a; 多视角一致性&#xff1a; Ne…