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

发布时间 2023-08-04 09:08:39作者: 一杯清酒邀明月

在倍福提供的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;