一杯清酒邀明月
天下本无事,庸人扰之而烦耳。
posts - 3121,comments - 209,views - 578万

在倍福提供的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;
复制代码

 

posted on   一杯清酒邀明月  阅读(488)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
· .NET 10 首个预览版发布,跨平台开发与性能全面提升
· 《HelloGitHub》第 107 期
· 全程使用 AI 从 0 到 1 写了个小工具
· 从文本到图像:SSE 如何助力 AI 内容实时呈现?(Typescript篇)
历史上的今天:
2022-08-04 Qt 生成dump文件及windbg调试(进阶版)
2022-08-04 Windows下的Qt编译器 - MinGW和MSVC的区别
2022-08-04 Qt MSVC与MinGW的区别
2022-08-04 Qt 建立带有子项目的项目,以及子项目之间的调用
2021-08-04 使用C#调用C++类库
2021-08-04 C# IntPtr类型
2021-08-04 C# 调用C++ dll string类型返回
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示