ADS中通过变量名访问变量的值(只对单线程有效,多线程的参考本文的评论)

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

...
QString hostNetId = "192.168.12.51.1.1";
int hostPort = 851;
AmsAddr targetAddr = createAddr(hostNetId, hostPort); //这个createAddr是我自己写的,作用是把数据填充进到结构体中。

//下面这个512952就是我要访问的那个变量的地址
unsigned short data = 3;
qDebug() << AdsSyncWriteReq(&targetAddr, 0x00004020, 512952, 2, &data);
qDebug() << AdsSyncReadReq(&targetAddr, 0x00004020, 512952, 2, &data) << "D0:" << data;

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

...
QString hostNetId = "192.168.12.51.1.1";
int hostPort = 851;
AmsAddr targetAddr = createAddr(hostNetId, hostPort); //这个createAddr是我自己写的,作用是把数据填充进到结构体中。

  ulong lHdlVar;
  char szVar[]={"GVL_GuleImage.Glue_Site"};
  int nErr = AdsSyncReadWriteReq(&targetAddr,
                                  ADSIGRP_SYM_HNDBYNAME,
                                  0x0,
                                  sizeof(lHdlVar),
                                  &lHdlVar,
                                  sizeof(szVar),
                                  szVar);//创建句柄

    //    short readInt = 0;
    //    short writeInt = 0;
    //    nErr = AdsSyncWriteReq(&targetAddr,ADSIGRP_SYM_VALBYHND,lHdlVar, 2, &writeInt); //写

    //    nErr = AdsSyncReadReq(&targetAddr, ADSIGRP_SYM_VALBYHND, lHdlVar, 2, &readInt); //读
    
    //    nErr = AdsSyncWriteReq(&targetAddr,ADSIGRP_SYM_RELEASEHND,0,sizeof(lHdlVar),&lHdlVar);//释放句柄

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

...
QString hostNetId = "192.168.12.51.1.1";
int hostPort = 851;
AmsAddr targetAddr = createAddr(hostNetId, hostPort); //这个createAddr是我自己写的,作用是把数据填充进到结构体中。

char szVar[]={"GVL_GuleImage.Glue_Site"};
AdsSymbolInfoByName nameInfo = {0};
int nErr = AdsSyncReadWriteReq(&targetAddr,
                                ADSIGRP_SYM_INFOBYNAME,
                                0x0,
                                sizeof(nameInfo),
                                &nameInfo,
                                sizeof(szVar),
                                szVar);
qDebug() << nErr << nameInfo.indexGroup << nameInfo.indexOffset << nameInfo.cbLength;
        
unsigned short data = 3;
qDebug() << AdsSyncWriteReq(&targetAddr, nameInfo.indexGroup, nameInfo.indexOffset, 2, &data);
qDebug() << AdsSyncReadReq(&targetAddr, nameInfo.indexGroup, nameInfo.indexOffset, 2, &data) << "D0:" << data;
  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
ADS POWER是一种多线程的技术。创建多线程可以在程序的任何地方调用pthread_create函数。该函数可以创建一个新线程并使其运行起来。参数包括线程标识符、线程属性对象、线程将执行的函数以及传递给该函数的参数。一个进程可以创建的线程数量取决于系统实现。通过创建多个线程,可以同时执行多个任务,提高程序的效率和性能。 引用和引用提供了关于创建线程的详细信息,包括函数参数和用法。Pthreads API还提供了一些特性,如线程调度、线程数据、互斥量的属性和优先级管理等。这些特性可以通过API函数来实现。 综上所述,ADS POWER是一种利用多线程技术来提高程序运行效率和性能的方法。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [POSIX 多线程程序设计](https://blog.csdn.net/liupenghui_200/article/details/82386493)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [Pthread:POSIX 多线程程序设计](https://blog.csdn.net/whuancai/article/details/17027795)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值