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:
- Variablenname
- Datentyp
- Länge
- Adresse (IndexGroup / IndexOffset)
- Kommentar
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);
}