Zugriff per Variablenname

Alle Daten, die ADS-Geräte nach Außen zur Verfügung stellen, sind in IndexGroups und IndexOffset organisiert. Eine IndexGroup kann man sich als Tabelle vorstellen, wobei jeder Eintrag über den IndexOffset angesprochen wird. Die TwinCAT-SPS verfügt z. B. über IndexGroups in denen die Variablen abgelegt sind, die zum Ein-/Ausgangs- oder Merkerbereich gehören. Außerdem stehen in der TwinCAT-SPS IndexGroups zur Verfügung, mit denen Systemfunktionen angesprochen werden können.

Für das Beispielprogramm sind die IndexGroups ADSIGRP_SYM_HNDBYNAME und ADSIGRP_ SYM_VALBYHND von Bedeutung. Über die IndexGroup ADSIGRP_SYM_HNDBYNAME wird von einer SPS-Variablen, die namentlich genannt wird, ein Handle angefordert. Mit Hilfe dieses Handles und der IndexGroup ADSIGRP_SYM_VALBYHND kann auf die Variable zugegriffen werden. Als IndexOffset wird der Handle der Variablen übergeben.

Download: sample09-c-ads-dll-readbyname.zip

#include <iostream.h>
#include <windows.h>
#include <conio.h>

// ADS headers
#include "c:\twincat\adsapi\tcadsdll\include\tcadsdef.h"
#include "c:\twincat\adsapi\tcadsdll\include\tcadsapi.h"

using namespace std;

void main()

  long      nErr, nPort; 
  AmsAddr   Addr; 
  PAmsAddr  pAddr = &Addr; 
  ULONG     lHdlVar, nData; 
  char      szVar []={"MAIN.PLCVar"}; 

  // Open communication port on the ADS router
  nPort = AdsPortOpen();
  nErr = AdsGetLocalAddress(pAddr);
  if (nErr) cerr << "Error: AdsGetLocalAddress: " << nErr << '\n';
  pAddr->port = AMSPORT_R0_PLC_RTS1;

  // Get the handle of the PLC-variable  
  nErr = AdsSyncReadWriteReq(pAddr, ADSIGRP_SYM_HNDBYNAME, 0x0, sizeof(lHdlVar), &lHdlVar, sizeof(szVar), szVar);
  if (nErr) cerr << "Error: AdsSyncReadWriteReq: " << nErr << '\n';
  do 
  { 
    // Read the value of a PLC-variable, via handle 
    nErr = AdsSyncReadReq( pAddr, ADSIGRP_SYM_VALBYHND, lHdlVar, sizeof(nData), &nData ); 
    if (nErr) 
      cerr << "Error: AdsSyncReadReq: " << nErr << '\n'; 
    else 
      cout << "Value: " << nData << '\n'; 
    cout.flush(); 
    if (nData > 10)
    { 
      // Write the value of the PLC variable to 0 
      nData = 0; 
      nErr = AdsSyncWriteReq(pAddr, ADSIGRP_SYM_VALBYHND, lHdlVar, sizeof(nData), &nData); 
      if (nErr) cerr << "Error: AdsSyncWriteReq: " << nErr << '\n';
    }
  }
  while ( _getch() == '\r');  // Get next value with ENTER-button

  // Release the handle of the PLC-variable
  nErr = AdsSyncWriteReq(pAddr, ADSIGRP_SYM_RELEASEHND, 0, sizeof(lHdlVar), &lHdlVar); 
  if (nErr) cerr << "Error: AdsSyncWriteReq: " << nErr << '\n';

  // Close the communication port
  nErr = AdsPortClose(); 
  if (nErr) cerr << "Error: AdsPortClose: " << nErr << '\n';
}