Hallo,
also wie die Implementrierung unter Visual Basic aussieht, kann ich dir nicht sagen. Ich programmiere nur in C++.
Ich bilde in meinen C++-Programmen immer die Funktion einer SPS nach. D.h. ich lese zunächst das PAE ein (das sind eben irgendwelche Eingänge, Merker, usw.) Dann folgt die eigentliche Programmbearbeitung. Zum Schluss schreibe ich dann das PAA, gebe also die VKE's auf die Ausgänge oder Merker. Um das ganze unkompliziert hinzukriegen, habe ich die Funktionen für ADS, die es von Beckhoff ja gibt in eine Klasse verpackt. Diese Klasse (CEingabeausgabe) definiert für die Datentypen bool, int, float, und long folgende Methoden:
- Zustand von der Hardware einlesen
- Get- und Set-Methoden
- Zustand auf Hardware ausgeben
Man kann die Funktionen natürlich auch verwenden, ohne sie zusammen in eine Klasse zu verpacken. Das ist im folgenden Programm z.B. bei den Funktionen zum Öffnen und Schließen des ADS-Ports der Fall.
Hier mal ein Beispielprogramm
void main()
{
//Ether-CAT - Variablen
long nErr, nPort;
AmsAddr Addr;
PAmsAddr pAddr = &Addr;
//Benutzervariablen
CEingabeausgabe Eingang00;
CEingabeausgabe Eingang01;
CEingabeausgabe Ausgang00;
CEingabeausgabe Ausgang01;
CEingabeausgabe Analogeingang1;
CEingabeausgabe Analogausgang1;
CEingabeausgabe Analogeingang2;
CEingabeausgabe Analogausgang2;
//Schleife, die das ständige Wiederholen des Programms sicherstellt
while (1 == 1)
{
// 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;
//PAE einlesen
Eingang00.ADSEinganglesenbool(pAddr, 0xF021, 0x190, 0x1);
Eingang01.ADSEinganglesenbool(pAddr, 0xF021, 0x191, 0x1);
Analogeingang1.ADSEinganglesenint(pAddr, 0xF020, 0x64, 0x2);
Analogeingang2.ADSEinganglesenint(pAddr, 0xF020, 0x66, 0x2);
//Hier muss die Programmlogik hin!
//PAA schreiben
Ausgang00.ADSAusgangschreibenbool(pAddr, 0xF031, 0x194, 0x1, Ausgang00.Getboolwert() );
Analogausgang1.ADSAusgangschreibenint(pAddr, 0xF030, 0x78, 0x2, Analogausgang1.Getintwert() );
// Close the communication port
nErr = AdsPortClose();
if (nErr) cerr << "Error: AdsPortClose: " << nErr << '\n';
}