ADSにおける変数名による変数の値へのアクセス(単一スレッドのみ有効,マルチスレッドの参照本論文のコメント)

10895 ワード

倍福が提供するTwinCAT ADSのライブラリのC(C++)インタフェースでは、PLCの変数にアクセスできる方法は2つあります.アドレスによってアクセスし、変数名によってアクセスします.アドレスによってアクセスするコードは以下の通りです.
...
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;