当前位置: 首页 > 网络知识

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

时间:2026-01-27 08:40:35

在倍福提供的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[]=; 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[]=; 7 AdsSymbolInfoByName nameInfo = ; 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 << nameInfobLength; 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 TwinCAT3中的变量回调函数的时间戳读取方式
下一篇:Beckhoff TwinCAT3中通过PLC修改Coe参数的例程
Qt 倍福(Beckhoff)
  • 英特尔与 Vertiv 合作开发液冷 AI 处理器
  • 英特尔第五代 Xeon CPU 来了:详细信息和行业反应
  • 由于云计算放缓引发扩张担忧,甲骨文股价暴跌
  • Web开发状况报告详细介绍可组合架构的优点
  • 如何使用 PowerShell 的 Get-Date Cmdlet 创建时间戳
  • 美光在数据中心需求增长后给出了强有力的预测
  • 2027服务器市场价值将接近1960亿美元
  • 生成式人工智能的下一步是什么?
  • 分享在外部存储上安装Ubuntu的5种方法技巧
  • 全球数据中心发展的关键考虑因素
  • 英特尔与 Vertiv 合作开发液冷 AI 处理器

    英特尔第五代 Xeon CPU 来了:详细信息和行业反应

    由于云计算放缓引发扩张担忧,甲骨文股价暴跌

    Web开发状况报告详细介绍可组合架构的优点

    如何使用 PowerShell 的 Get-Date Cmdlet 创建时间戳

    美光在数据中心需求增长后给出了强有力的预测

    2027服务器市场价值将接近1960亿美元

    生成式人工智能的下一步是什么?

    分享在外部存储上安装Ubuntu的5种方法技巧

    全球数据中心发展的关键考虑因素