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';
}