SPS-Variablendeklaration (statisch) auslesen

Dieses Beispiel beschreibt das Auslesen der statischen SPS-Symbole.

Download: sample10-c-ads-dll-readplcsymbolinfo.zip

Bei dem Zugriff auf die Variablendeklaration werden folgende Informationen übertragen:

Sämtliche oben aufgelisteten Information werden in einen Datenstream übertragen. Bevor dieser ausgelesen werden kann, wird mit dem ersten AdsSyncReadReq() die Länge ermittelt. Bei dem zweiten AdsSyncReadReq() werden die eigentlichen Daten übertragen. Die Variable pchSymbols ist ein Pointer, der auf diesen Bereich zeigt. In der FOR-Schleife wird für jede einzelne SPS-Variable der entsprechende Datenbereich in die Struktur pAdsSymbolEntry kopiert. In dieser Struktur sind die einzelnen Informationen der SPS-Variablen abgelegt. Die Makros PADSSYMBOLNAME, PADSSYMBOLTYPE und PADSSYMBOLCOMMENT vereinfachen das Auswerten dieser Daten.

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

// ADS headers
#include "C:\TwinCAT\AdsApi\TcAdsDll\Include\TcAdsDef.h"
#include "C:\TwinCAT\AdsApi\TcAdsDll\Include\TcAdsApi.h"

void main()
{
  long          nErr, nPort; 
  char          *pchSymbols = NULL; 
  UINT          uiIndex; 
  AmsAddr           Addr; 
  PAmsAddr          pAddr = &Addr; 
  AdsSymbolUploadInfo   tAdsSymbolUploadInfo; 
  PAdsSymbolEntry       pAdsSymbolEntry; 

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

  // Read the length of the variable declaration
  nErr = AdsSyncReadReq(pAddr, ADSIGRP_SYM_UPLOADINFO, 0x0, sizeof(tAdsSymbolUploadInfo), &tAdsSymbolUploadInfo);
  if (!nErr)
  {
      pchSymbols = new char[tAdsSymbolUploadInfo.nSymSize]; 
      assert(pchSymbols); 

      // Read information of the PLC-variable 
      nErr = AdsSyncReadReq(pAddr, ADSIGRP_SYM_UPLOAD, 0, tAdsSymbolUploadInfo.nSymSize, pchSymbols); 
      if (nErr) cerr << "Error: AdsSyncReadReq: " << nErr << '\n'; 

      // Print out the information of the PLC-variable 
      pAdsSymbolEntry = (PAdsSymbolEntry)pchSymbols; 
      for (uiIndex = 0; uiIndex < tAdsSymbolUploadInfo.nSymbols; uiIndex++)
      { 
        cout << PADSSYMBOLNAME(pAdsSymbolEntry) << "\t\t" 
             << pAdsSymbolEntry->iGroup << '\t' 
             << pAdsSymbolEntry->iOffs << '\t' 
             << pAdsSymbolEntry->size << '\t' 
             << PADSSYMBOLTYPE(pAdsSymbolEntry) << '\t' 
             << PADSSYMBOLCOMMENT(pAdsSymbolEntry) << '\n'; 
        pAdsSymbolEntry = PADSNEXTSYMBOLENTRY(pAdsSymbolEntry); cout.flush();
      }
  }
  else
  {
      cerr << "Error: AdsSyncReadReq: " << nErr << '\n'; 
  }
  getch();

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

  // Release the allocated memory
  if (pchSymbols) delete(pchSymbols);
}