Friedrich-List-Platz 1, 01069 Dresden ~ PF 120701 ~ 01008 Dresden ~ Tel.(0351) 462 3383 ~ Fax (0351) 462 2175 Praktikum Computersystemtechnik Versuch C6 Prozess-Steuerung mittels IP 1 Allgemeine Hinweise Dieses Praktikum wird in Gruppen von 3 Teilnehmern durchgeführt. Die Aufgaben zur Versuchsvorbereitung sind als Hausaufgaben schriftlich auszuführen. Sie sind Bestandteil des Protokolls und werden in die Bewertung des Versuches einbezogen. Jede Versuchsgruppe fertigt ein Protokoll an, welches innerhalb von 2 Wochen abzugeben ist (in Papierform oder als pdf). 2 Vorbereitungsaufgaben Überlegen Sie sich für jede im Versuch durchzuführende Aufgabe einen möglichen Lösungsweg und dokumentieren Sie diesen. Bereiten Sie den Quelltext der zu erstellenden Software weitestgehend vor. 2.1 ADAM-6051: Anschluss der Peripherie Zeichnen und dimensionieren Sie die jeweiligen Schaltungen, geben Sie ggf. die Dimensionierungsformeln an: Fakultät Elektrotechnik Hochschule für Technik und Wirtschaft Dresden University of Applied Sciences Prof. H. Kühn Digitale Eingänge: Welche externe Beschaltung ist bei Anschluss eines Tasters notwendig? Digitale Ausgänge: Welche externe Beschaltung ist vorzunehmen - zur Ansteuerung einer LED? - zur Ansteuerung eines Relais? Zähler: Welche externe Beschaltung bei Anschluss eines Schaltkreises der 74HCT-Serie? 2.2 MODBUS Lesen Sie die Unterlagen zum MODBUS-Protokoll Wie wird MODBUS über IP übertragen? Bereiten Sie ein Programm zum Ansprechen des ADAM-Moduls vor (für Versuchsaufgabe 3.1.3). Informieren Sie den Versuchsbetreuer vorab über den/die für Ihre Lösung jeweils erforderlichen Programme (Compiler etc.) Welche(r) Befehl(e) ist/sind allgemein nach MODBUS-Standard und speziell bei ADAM- 6051 erforderlich - zum Setzen eines einzelnen digitalen Ausgangs? - zum Setzen aller digitalen Ausgänge? - zum Einlesen aller digitalen Eingänge? - zum Einlesen der Zähler? 2.3 SNMP Erläutern Sie die Arbeitsweise von SNMP, insbesondere die Begriffe Manager und Agent Trap Get, GetNext und Set MIB Praktikum Computersystemtechnik Versuch C6 Prozess-Steuerung mit IP Seite 1
3 Versuchsdurchführung 3.1 Prozess-Steuerung über MODBUS 3.1.1 Inbetriebnahme ADAM-6051 Programme: Adv5KTCP.exe und Netzwerk-Sniffer Wie findet das Programm Adv5KTCP.exe vorhandene ADAM-Module? Wie beurteilen Sie das verwendete Verfahren? Konfigurieren Sie das IP-Protokoll des ADAM-Moduls Setzen Sie alle digitalen Eingänge des ADAM-6051 auf Digital Input Wozu dient die Funktion Datastream? Mit welchem Protokoll werden die Daten übertragen? 3.1.2 Funktionstest ADAM-6051 Programme: Adv5KTCP.exe und Adam.exe Testen Sie die Funktion der Eingänge, Ausgänge und Zähler mit der von Ihnen entworfenen externen Beschaltung 3.1.4 Modbus-Protokoll Programme: Adv5KTCP.exe und Ethereal.exe Welche(n) Befehl(e) verwendet das Programm zum Setzen eines einzelnen digitalen Ausgangs? zum Setzen aller digitalen Ausgänge? zum Einlesen aller digitalen Eingänge? zum Einlesen der Zähler? 3.1.3 Geschwindigkeit des ADAM-6051 Programme Adv5KTCP.exe, Adam.exe, Demo\Delphi40\6kReadDIO\*.exe und Netzwerk-Sniffer Messen Sie die Reaktionszeit des Moduls unter Nutzung verschiedener Programme Diskutieren Sie die Messergebnisse (insbesondere die Ursachen für die teils enormen Zeitunterschiede)! Welche Reaktionszeit erreichen Sie? (Eigenes Programm in C oder anderer Programmiersprache schreiben) Seite 2 Praktikum Computersystemtechnik Versuch 4 Prozess-Steuerung mit IP
Rumpf einer Beispiel-Applikation zur Ansteuerung ADAM-6051 in Visual C++ Neues Projekt in Visual-Studio 2005 erstellen ( Win32 Console Application ) Bibliothek Ws2_32.lib einbinden (Project/Properties/Configuration Properties/Linker/Input/Additional Dependencies) empfohlene Includes: stdio.h winsock2.h conio.h ctype.h Programmauszug: Winsock initialisieren WSADATA wsadata; int iresult = WSAStartup(2, &wsadata); if (iresult!= NO_ERROR)... Fehlerbehandlung Socket erzeugen (TCP-Socket) SOCKET MySocket; MySocket = socket(af_inet, SOCK_STREAM, IPPROTO_TCP); if (MySocket == INVALID_SOCKET)... Fehlerbehandlung IP-Adresse und Port des Servers sockaddr_in adam; adam.sin_family = AF_INET; adam.sin_addr.s_addr = inet_addr("99.99.99.99"); adam.sin_port = htons(9999); Verbindung mit Server herstellen if (connect(mysocket,(sockaddr*) &adam,sizeof(adam))==socket_error)... Fehlerbehandlung zu sendendes Modbus-Kommando int bytessent; Zahl der gesendeten Bytes int anzahlbytes =... Zahl der zu sendenden Bytes char sendbuf[99] =... Sendepuffer Senden des Kommandos bytessent = send( MySocket, sendbuf, anzahlbytes, 0 ); if (bytessent == 0)... Fehlerbehandlung Empfangen der Antwort int bytesrecv = SOCKET_ERROR; Zahl der empfangenen Bytes char recvbuf[99] = ""; Empfangspuffer while( bytesrecv!= SOCKET_ERROR ) { Warten auf Verbindungsende bytesrecv = recv( MySocket, recvbuf, strlen(recvbuf), 0 ); if ( bytesrecv == 0 WSAGetLastError() == WSAECONNRESET ) { printf( "Connection Closed.\n"); break; printf( "Bytes Recv: %ld\n", bytesrecv ); Aufraeumen WSACleanup(); printf(" Programm beendet\n Taste druecken! \n"); _getch(); Praktikum Computersystemtechnik Versuch C6 Prozess-Steuerung mit IP Seite 3
3.2. Netzwerkmanagement und Prozess-Steuerung über SNMP 3.2.1 SNMP-Funktionalität von Windows Installieren/Starten Sie unter WinXP die SNMP-Funktion (Agent) Fragen Sie unter Verwendung des Manager-Programms Informationen ab Erstellen Sie eine Übersicht, der mittels SNMP abfragbaren Informationen 3.2.2 SNMP-Funktionalität von Linux Installieren Sie die SNMP-Funktion (Agent) Fragen Sie unter Verwendung des Manager-Programms Informationen ab Erstellen Sie eine Übersicht, der mittels SNMP abfragbaren Informationen 3.2.3 SNMP-Funktionalität von Netzwerkhardware Wählen Sie zwei abzufragende Hardwarekomponenten aus (Switche, Router, Racküberwachung RMS, Netzwerkkarten etc.) Suchen Sie im Netz nach den erforderlichen MIB s Fragen Sie unter Verwendung des Manager-Programms Informationen ab Richten Sie das Versenden von Traps bei Alarmen ein Erstellen Sie eine Übersicht, der mittels SNMP abfragbaren Informationen 3.2.4 Gerätesteuerung mit SNMP Falls SNMP-Programm noch nicht installiert, dann vom Server herunterladen und in c:\programme\snmp entpacken Erläutern Sie den Inhalt der Fluke-45 MIB Testen Sie die serielle Verbindung zwischen PC und Fluke mittels Terminal-Programm (Hinweise: COM1 / 9600,8,n,1 / ohne Flusssteuerung / lokales Echo / Zeilenvorschub) Testen Sie die serielle Verbindung mittels eigenem Programm (in C oder anderer Programmiersprache schreiben) Starten Sie das SNMP-Programm für Fluke Lesen Sie Informationen vom Fluke-45 via SNMP von einem entfernten Rechner aus Konfigurieren Sie den Agent zum Versenden von Traps an mehrere Empfänger Testen Sie das automatische Trap-Versenden 4 Anhang Bedienungsanleitungen etc. für die verwendete Hard- und Software finden Sie im WWW Seite 4 Praktikum Computersystemtechnik Versuch 4 Prozess-Steuerung mit IP
Beispielprogramm zur Steuerung des Fluke45 / / / Programmfragment zur Ansteuerung der COM-Schnittstelle / / / #include <windows.h> #include <conio.h> #include <iostream> using namespace std; #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX_COM_PORTS 8 static HANDLE hcomfile[max_com_ports]; static BOOL bisopen [MAX_COM_PORTS]; ComOpen Nr : Nummer des Com-Ports (0=COM1 1=COM2...) Baud : Baudrate Parity : 0 = kein Parity Bit 1 = gerade 2 = ungerade 3 = immer 0 4 = immer 1 Stopbits: 0 = Ein Stopbit 1 = Ein/einhalb Stopbits 2 = Zwei Stopbits Bits : 0 = 7 Datenbits 1 = 8 Datenbits return : 0 = Fehler 1 = OK int ComOpen(unsigned Nr,int Baud,int Parity,int Stopbits,int Databits) { static const int ipmode[]={noparity,evenparity,oddparity,spaceparity,markparity; static const int ismode[]={onestopbit,one5stopbits,twostopbits; char cname[]="\\\\.\\com1"; HANDLE hfile; COMMTIMEOUTS sto; DCB sdcb; if(nr>=max_com_ports) if(bisopen[nr]) cname[7]='1'+nr; hfile= CreateFile(cName,GENERIC_READ GENERIC_WRITE,0,0,OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,0); if(hfile==invalid_handle_value) { hfile=0; memset(&sdcb,0,sizeof(sdcb)); sdcb.dcblength=sizeof(sdcb); sdcb.baudrate = Baud; sdcb.fparity = (Parity!=0)? TRUE:FALSE; sdcb.fbinary = TRUE; sdcb.parity = ipmode[parity]; sdcb.stopbits = ONESTOPBIT; sdcb.foutxctsflow = FALSE; sdcb.foutxdsrflow = FALSE; sdcb.fdtrcontrol = DTR_CONTROL_ENABLE; sdcb.fdsrsensitivity= FALSE; sdcb.fabortonerror = FALSE; sdcb.bytesize = (Databits)? 8:7; if(!setcommstate(hfile,&sdcb)) { CloseHandle(hFile); sto.readintervaltimeout = MAXDWORD; 0 ms Read-Timeout sto.readtotaltimeoutmultiplier = 0; sto.readtotaltimeoutconstant = 0; sto.writetotaltimeoutmultiplier= 1; sto.writetotaltimeoutconstant = 2; if(!setcommtimeouts((handle)hfile,&sto)) { CloseHandle(hFile); hcomfile[nr]=hfile; bisopen [Nr]=TRUE; return 1; 1*2 ms Write Timeout Ergibt 1 wenn eine Schnittstelle geöffnet wurde Praktikum Computersystemtechnik Versuch C6 Prozess-Steuerung mit IP Seite 5
ComClose int ComClose(unsigned Nr) { if(nr>=max_com_ports) if(!bisopen[nr]) CloseHandle(hComFile[Nr]); hcomfile[nr]=0; bisopen [Nr]=FALSE; return 1; ComRead Buffer : Buffer in dem die Zeichen gespeichert werden Max : Maximale Anzahl der zu lesenden Zeichen return : Anzahl der gelesenen Zeichen int ComRead(unsigned Nr,void *Buffer,int Max) { DWORD dwcount; if(nr>=max_com_ports) if(!bisopen[nr]) ReadFile(hComFile[Nr],Buffer,Max,&dwCount,0); return dwcount; ComWrite Count : Anzahl der zu sendenden Zeichen return : Anzahl der gesendeten Zeichen int ComWrite(unsigned Nr,void *Buffer,int Count) { DWORD dwcount; if(nr>=max_com_ports) if(!bisopen[nr]) WriteFile(hComFile[Nr],Buffer,Count,&dwCount,0); return dwcount; Main int main(int argc, char* argv[]) { char unsigned PORTNR; int j; FLUKE_RETURN[50]=""; printf ("Nummer des COM-Ports?\n(COM1=1, COM2=2): "); scanf ("%d", &PORTNR); PORTNR=PORTNR-1; if (ComOpen(PORTNR, 9600, 0, 0, 1)) { ComWrite(PORTNR,"*IDN?\r", 7); Sleep(350); Timer, da FLUKE45 Reaktionszeit benoetigt j = ComRead(PORTNR, &FLUKE_RETURN, 50); cout << "Antwort von FLUKE45:" << FLUKE_RETURN << endl; ComClose(PORTNR); else printf("could not open com-port!\n"); Seite 6 Praktikum Computersystemtechnik Versuch 4 Prozess-Steuerung mit IP