首页 > 其他分享 >Qt ADS中通过变量名访问变量的值

Qt ADS中通过变量名访问变量的值

时间:2023-08-04 09:12:06浏览次数:28  
标签:Qt ADSIGRP targetAddr hostNetId SYM lHdlVar hostPort 变量名 ADS

在倍福提供的TwinCAT ADS的库的C(C++)接口中,有两种方式可以访问到PLC中的变量:根据地址访问、根据变量名访问
根据地址来访问的代码如下:

1 ...
2 QString hostNetId = "192.168.12.51.1.1";
3 int hostPort = 851;
4 AmsAddr targetAddr = createAddr(hostNetId, hostPort); //这个createAddr是我自己写的,作用是把数据填充进到结构体中。
5 
6 //下面这个512952就是我要访问的那个变量的地址
7 unsigned short data = 3;
8 qDebug() << AdsSyncWriteReq(&targetAddr, 0x00004020, 512952, 2, &data);
9 qDebug() << AdsSyncReadReq(&targetAddr, 0x00004020, 512952, 2, &data) << "D0:" << data;

根据变量名来访问的代码如下:

 1 ...
 2 QString hostNetId = "192.168.12.51.1.1";
 3 int hostPort = 851;
 4 AmsAddr targetAddr = createAddr(hostNetId, hostPort); //这个createAddr是我自己写的,作用是把数据填充进到结构体中。
 5 
 6   ulong lHdlVar;
 7   char szVar[]={"GVL_GuleImage.Glue_Site"};
 8   int nErr = AdsSyncReadWriteReq(&targetAddr,
 9                                   ADSIGRP_SYM_HNDBYNAME,
10                                   0x0,
11                                   sizeof(lHdlVar),
12                                   &lHdlVar,
13                                   sizeof(szVar),
14                                   szVar);//创建句柄
15 
16     //    short readInt = 0;
17     //    short writeInt = 0;
18     //    nErr = AdsSyncWriteReq(&targetAddr,ADSIGRP_SYM_VALBYHND,lHdlVar, 2, &writeInt); //写
19 
20     //    nErr = AdsSyncReadReq(&targetAddr, ADSIGRP_SYM_VALBYHND, lHdlVar, 2, &readInt); //读
21     
22     //    nErr = AdsSyncWriteReq(&targetAddr,ADSIGRP_SYM_RELEASEHND,0,sizeof(lHdlVar),&lHdlVar);//释放句柄

此外,由于根据变量名得到句柄然后访问的方式,貌似相对来说会比较慢,而且无法实现对某个变量进行监听(注册回调函数)。所以个人觉得更加好的办法是通过变量名读取到该变量的地址,然后再根据其地址来操作会更加方便一点,代码如下(注意前面用的参数是ADSIGRP_SYM_HNDBYNAME,用于获取句柄;现在用的是ADSIGRP_SYM_INFOBYNAME,用于获取信息):

 1 ...
 2 QString hostNetId = "192.168.12.51.1.1";
 3 int hostPort = 851;
 4 AmsAddr targetAddr = createAddr(hostNetId, hostPort); //这个createAddr是我自己写的,作用是把数据填充进到结构体中。
 5 
 6 char szVar[]={"GVL_GuleImage.Glue_Site"};
 7 AdsSymbolInfoByName nameInfo = {0};
 8 int nErr = AdsSyncReadWriteReq(&targetAddr,
 9                                 ADSIGRP_SYM_INFOBYNAME,
10                                 0x0,
11                                 sizeof(nameInfo),
12                                 &nameInfo,
13                                 sizeof(szVar),
14                                 szVar);
15 qDebug() << nErr << nameInfo.indexGroup << nameInfo.indexOffset << nameInfo.cbLength;
16         
17 unsigned short data = 3;
18 qDebug() << AdsSyncWriteReq(&targetAddr, nameInfo.indexGroup, nameInfo.indexOffset, 2, &data);
19 qDebug() << AdsSyncReadReq(&targetAddr, nameInfo.indexGroup, nameInfo.indexOffset, 2, &data) << "D0:" << data;

 

标签:Qt,ADSIGRP,targetAddr,hostNetId,SYM,lHdlVar,hostPort,变量名,ADS
From: https://www.cnblogs.com/ybqjymy/p/17604989.html

相关文章

  • pycharm配置QtDesigner
    一、安装需要的库pipinstallpyqt5pipinstallpyqt5-tools 二、配置QtDesigner 配置 QtDesignerName:QtDesignerGroup:QtProgram:C:\python\venv\Lib\site-packages\qt5_applications\Qt\bin\designer.exeWorkingdirectory:$ProjectFileDir$ 配置 PyUICNa......
  • iTOP-STM32MP157开发板一键烧写 QT 程序到开发板
    1根据上一小节设置好编译套件后,打开自己的qt工程,然后点击qtcreator里面的项目,把编译器切换成上一章节设置好的的编译器,如下图所示:2然后打开要编译的QT代码的pro文件,在里面添加以下代码,这俩行代码的意思是说把编译的可执行程序下载到开发板的/opt目录下并执行。target.pa......
  • MQTT:轻量级消息传输协议在物联网中的应用
    随着物联网技术的发展,越来越多的设备需要进行实时通信和数据交换。在这样的背景下,MQTT(MessageQueuingTelemetryTransport)作为一种轻量级的消息传输协议,逐渐成为物联网领域的热门选择。本文将介绍MQTT协议的基本概念、特点以及在物联网中的应用,同时通过代码实例演示如何使用MQTT......
  • python使用mqtt
    一、安装mqtt服务器安装对应的软件:https://www.emqx.io/zh/downloads推荐使用docker安装默认账号和密码:admin、public 二、编写代码消息发布程序importtimeimportjsonimportpsutilimportrandomfrompaho.mqttimportclientasmqtt_clientbroker='127.0.0.1......
  • Qt+GDAL开发笔记(二):在windows系统msvc207x64编译GDAL库、搭建开发环境和基础Demo
    前言  上一篇使用mingw32版本的gdal,过程曲折,为更好的更方便搭建环境,在windows上msvc方式对于库比较友好。<br>大地坐标简介概述  大地坐标(Geodeticcoordinate)是大地测量中以参考椭球面为基准面的坐标,地面点P的位置用大地经度L、大地纬度B和大地高H表示。原理  当点在......
  • iTOP-RK3588开发板Ubuntu 系统交叉编译 Qt 工程-命令行交叉编译
    使用源码rk3588_linux/buildroot/output/rockchip_rk3588/host/bin/qmake交叉编译QT工程。最后烧写编译好的buildroot镜像,将编译好的QT工程可执行程序在buildroot系统上运行。交叉编译QT工程如下所示,首先进入QLed的工程目录下。然后使用以下命令交叉编译QT工程,如下......
  • Qt中QString的arg()函数
    Qt中QString的arg()函数使用记录大致有如下3种用法:(1)arg(str1,str2,str3)其中一次可替换参数个数最多为9个,举例如下 输出为"123456789%10%11"要想全部替换,只需要接在后面继续使用一个.arg(“10”,“11”)即可也就是第二种方式(2)arg(str1).arg(str2).arg(s......
  • Qt+GDAL开发笔记(二):在windows系统msvc207x64编译GDAL库、搭建开发环境和基础Demo
    前言  上一篇使用mingw32版本的gdal,过程曲折,为更好的更方便搭建环境,在windows上msvc方式对于库比较友好。 大地坐标简介概述  大地坐标(Geodeticcoordinate)是大地测量中以参考椭球面为基准面的坐标,地面点P的位置用大地经度L、大地纬度B和大地高H表示。原理......
  • linux mqtt 安装配置
    安装sudoaptinstallmosquitto配置密码用户sudomkdir-p/etc/mosquitto/configsudotouch/etc/mosquitto/config/pwfile.confsudomosquitto_passwd-b/etc/mosquitto/config/pwfile.confqq123456配置文件qtimes@AIBox-01-01-m:~$cat/etc/mosquitto/mosquitto.......
  • MQTT 订阅者(异步)代码解读
    一、问题引入官方给出了MQTTClient的异步订阅的例子,对于消息的订阅就无需讲究什么同步了。二、解决过程2-1MQTT订阅者程序流程第一步:创建客户端LIBMQTT_APIintMQTTAsync_create(MQTTAsync*handle,constchar*serverURI,constchar*clientId, intpersistence_t......