Zugriff auf ein Array in der SPS
Ein Array, welches sich in der SPS befindet, soll ausgelesen werden. Die Variable wird hierbei per Handle angesprochen. Die Funktion AdsSyncReadReq() wird die Länge des gesamten Arrays übergeben. Als Variable wird die Adresse des ersten Array-Elements verwendet.
Download: sample07-c-ads-dll-arrayaccess.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"
void main()
{
long nErr, nPort;
AmsAddr Addr;
PAmsAddr pAddr = &Addr;
unsigned long lHdlVar;
int nIndex;
short Data[10];
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;
// Fetch handle for the PLC variable
nErr = AdsSyncReadWriteReq( pAddr,
ADSIGRP_SYM_HNDBYNAME,
0x0,
sizeof(lHdlVar),
lHdlVar,
sizeof(szVar),
szVar);
if (nErr) cerr << "Error: AdsSyncReadWriteReq: " << nErr << '\n';
// Read values of the PLC variables (by handle)
nErr = AdsSyncReadReq(pAddr, ADSIGRP_SYM_VALBYHND, lHdlVar, sizeof(Data), &Data[0]);
if (nErr)
cerr << "Error: AdsSyncReadReq: " << nErr << '\n';
else
{
for (nIndex = 0; nIndex < 10; nIndex++)
cout << "Data[" << nIndex << "]: " << Data[nIndex] << '\n';
}
cout.flush();
_getch();
// Close communication port
nErr = AdsPortClose();
if (nErr) cerr << "Error: AdsPortClose: " << nErr << '\n';
}
SPS Programm
PROGRAM MAIN
VAR
PLCVar : ARRAY[0..9] OF WORD;
TP_1 : ARRAY[0..9] OF TP;
TOGGEL : BOOL;
nIndex : INT;
END_VAR
TOGGEL := NOT TOGGEL;
FOR nIndex := 0 TO 9 DO
TP_1[nIndex]( IN := TOGGEL, PT := t#1s);
IF (TP_1[nIndex].Q = 0) THEN
PLCVar[nIndex] := PLCVar[nIndex] + 1 + nIndex;
END_IF
END_FOR