# Hyper Terminal -> C#



## Joerg123 (5 Dezember 2008)

Hallo,

ich möchte aus einem Omron ZFX-Controller (Kamera) Messwerte über die Ethernet-Schnittstelle auslesen.
Mit Hyper Terminal habe ich schon eine Verbindung aufgebaut und wenn ich 'MEASURE' eingebe triggere ich die Kamera und bekomme den Messwert angezeigt. Die Technik funktioniert also!
Frage: Wie muss ich in C# 2008 auf die Ethernet-Schnittstelle zugreifen damit ich die Messwerte wie im Hyper Terminal angezeigt bekomme?

 Grübel


----------



## sue port (5 Dezember 2008)

hola joerg123,

ich würde da in richtung dll gehen.
kannst ja mal probieren mit z.b.
aglink v deltalogic,...

greetinx


sue


----------



## Rainer Hönle (5 Dezember 2008)

Ich würde mal schauen, auf welche IP-Adresse und welchen Port und mit welchem Protokoll (TCP oder UDP) Hyperterminal auf die Kamera zugreift. Dann die entsprechende Klasse von .net verwenden und gemäß den obigen Daten parametrieren. Ich gehe jetzt einfach mal davon aus, dass der PC Client und die Kamera Master ist. Nach einem erfolgreichen Verbindungsaufbau den Text 'MEASURE' schicken und die erhaltenen Daten anzeigen. Dies sollte, wenn Hyperterminal das Ganze anzeigt, reiner Text sein. 
BTW: AGLink wird nicht funktionieren, das dort die Siemens-SPezialprotokolle abgehandelt werden.


----------



## Joerg123 (5 Dezember 2008)

Hmmmm,

also mir würde eigentlich helfen wenn ich wüsste wie Hyper Terminal auf Ethernet zugreift, theroetisch könnte ich doch die Befehle übernehmen, denn mit Hyper Terminal funktioniert es ja.


----------



## Joerg123 (5 Dezember 2008)

Rainer Hönle schrieb:


> Ich würde mal schauen, auf welche IP-Adresse und welchen Port und mit welchem Protokoll (TCP oder UDP) Hyperterminal auf die Kamera zugreift. Dann die entsprechende Klasse von .net verwenden und gemäß den obigen Daten parametrieren. Ich gehe jetzt einfach mal davon aus, dass der PC Client und die Kamera Master ist. Nach einem erfolgreichen Verbindungsaufbau den Text 'MEASURE' schicken und die erhaltenen Daten anzeigen. Dies sollte, wenn Hyperterminal das Ganze anzeigt, reiner Text sein.
> BTW: AGLink wird nicht funktionieren, das dort die Siemens-SPezialprotokolle abgehandelt werden.



Hallo,
HyperTerminal greift mit (TCP/IP(WinSock)) Port 23 auf den Controller zu.
Woran erkenne ich wer Master und wer Slave ist??


----------



## Rainer Hönle (5 Dezember 2008)

Joerg123 schrieb:


> Hmmmm,
> 
> also mir würde eigentlich helfen wenn ich wüsste wie Hyper Terminal auf Ethernet zugreift, theroetisch könnte ich doch die Befehle übernehmen, denn mit Hyper Terminal funktioniert es ja.



Es geht hier nicht nur um Befehle. Über Ethernet muss (bei TCP) zuerst eine Verbindung aufgebaut werden. Danach können die "Befehle" gesendet werden. Bei einem Telefon macht es ja auch Sinn zuerst zu wählen und nicht gleich zu reden.


----------



## Rainer Hönle (5 Dezember 2008)

Joerg123 schrieb:


> Hallo,
> HyperTerminal greift mit (TCP/IP(WinSock)) Port 23 auf den Controller zu.
> Woran erkenne ich wer Master und wer Slave ist??


Der Client baut die Verbindung zum Server auf, ist also aktiv. Dies wird hier der Fall sein. Einfach mal die Doku der Winsock-Klasse (oder wie die heißt) von .net studieren. Mit diesen Parametern sollte (fast) alles klar sein.


----------



## Joerg123 (5 Dezember 2008)

Hallo, das scheint ja einfacher zu sein wie ich dachte, habe mit folgendem Code fehlerfrei Verbindung aufgebaut und anscheinend auch irgendwelche Daten bekommen, damit komme ich erst einmal weiter, Vielen Dank!!

class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Versuch zu verbinden");
            TcpClient t = new TcpClient("192.168.202.250", 23);

            Console.WriteLine("Verbindung aufgebaut! Warte auf Stream...");
            Stream str = t.GetStream();

            Console.WriteLine("Stream erhalten ... Ende!");
            t.Close();
        }
    }


----------



## Joerg123 (5 Dezember 2008)

So, nun bekomme ich 50 aufeinanderfolgende Messwerte in der Console angezeigt, Juhu  

static void Main(string[] args)
        {            
            TcpClient t = new TcpClient("192.168.202.250", 23);

            StreamReader sr = new StreamReader(t.GetStream());

            for (int i = 0; i < 50; i++)
            {
                Console.WriteLine("Wert Nr. {0}:{1}",i+1,sr.ReadLine());
            }

            sr.Close();
            t.Close();
        }


----------



## Rainer Hönle (5 Dezember 2008)

Na also, war doch gar nicht so schwer ;-)


----------



## Joerg123 (5 Dezember 2008)

Im Nachhinein ist es halt immer leicht  

Nur da ich letztens ein paar Stunden gebraucht hab um über Ethernet mit einer S7 zu kommunzieren, hab ich bei diesem Projekt wieder mit ein paar Stunden Arbeit gerechnet. Aber anscheinend gibt es doch noch Industrieunternehmen die Standart-TCP Kommunikation unterstützen (Omron). Bei Siemens arbeite ich mit libnodave.



Nochmal vielen Dank für die Tipps!


----------



## Joerg123 (8 Dezember 2008)

Hallo,

habe jetzt noch einmal ein kleines Problem mit der Kommunikation zur Omron-Kamera. So lange das Netzwerkkabel gesteckt ist funktioniert alles wunderbar, doch starte ich die Anwendung wenn das Kabel nicht gesteckt ist versucht die Software minutenlang eine TCP-Verbindung aufzubauen! 
*Gibt es eine Möglichkeit diese Zeit zu verkürzen, so dass ich bereits nach kurzer Zeit 'Verbindungsfehler' melden kann??*

Mein Code an der Stelle ist entweder:

TcpClient tcp = new TcpClient("192.168.202.241",23);

oder:

TcpClient tcp = new TcpClient();
tcp.Connect("192.168.202.241",23);

dass ganze jeweils in einem Try/Catch-Block. Jedoch dauert es immer mehrere Minuten bis ich die Exception bekomme.

Gruß Jörg


----------



## Thomas_v2.1 (8 Dezember 2008)

Beim .Net TcpClient kann man wohl für ein Connect kein Timeout angeben.
Bleibt nur der Umweg über die etwas aufwändiger zu programmierenden asynchronen Sockets:

http://msdn.microsoft.com/en-us/library/bbx2eya8(vs.71).aspx

Warum lässt du dir die Werte denn nicht einfach mittels Telnet in eine Datei schreiben?

Gruß


----------



## Joerg123 (9 Dezember 2008)

Thomas_v2.1 schrieb:


> Warum lässt du dir die Werte denn nicht einfach mittels Telnet in eine Datei schreiben?
> 
> Gruß



Wie meinst du das? Gibt es dafür fertige Programme??


----------



## Joerg123 (9 Dezember 2008)

Hallo,

also der Kunde möchte gerne einen PC bei den Anlagen stehen haben wo er auch einen aktuellen Status der Anlagen einsehen kann. Im Endeffekt werden von fünf Kameras gleichzeitig Daten eingelesen, da ich nicht weiß von welcher Anlage als nächstes Daten kommen mache ich Multi-Threading. So lange alle Netzwerkverbindungen 'OK' sind funktioniert alles wunderbar, ich kann die Anwendung schliessen und öffnen, alles wunderbar. 
Sobald aber eine Netzwerkverbindung nicht OK ist, funktioniert scheinbar auch alles, nur beim schliessen der Anwendung blockiert anscheinend der Thread, der noch versucht eine Netzwerkverbinung aufzubauen dass korrekte Schliessen der *.exe-Datei im Task-Manager unter den Prozessen. Auch nach mehreren Minuten ist die *.exe noch vorhanden. Versuche schon mit Thread.Abort-Befehlen die 'hängenden' Threads abzuwürgen, aber ohne Erfolg.
Wie gesagt es funktioniert alles prima so lange alle Netzwerkverbindungen 'OK' sind. Davon kann ich aber im Dauerbetrieb nicht ausgehen, da es immer mal vorkommen kann dass eine Anlage nicht produziert und somit ausgeschaltet ist.

Ich hoffe ihr habt mein Problem verstanden, vielleicht hat ja jemand noch einen Guten Tipp was ich anders machen kann!

Gruß Jörg


----------



## Thomas_v2.1 (9 Dezember 2008)

Joerg123 schrieb:


> Wie meinst du das? Gibt es dafür fertige Programme??


Telnet ist fast so etwas wie Hyperterminal. Kannst ja mal eine Eingabeaufforderung starten und "telnet" eintippen.
Also damit könntest du auch eine Netzwerkverbindung zu deinem Server herstellen.

Aber wenn der Kunde die Daten auch in einem Programm dargestellt haben möchte fällt das sowieso flach.

Sollen die Daten nur in eine Textdatei geschrieben werden ginge das auch mit einer Batch-Datei die im Hintergrund abläuft.
Hier mal ein Beispiel:
Anstatt Telnet wird plink genutzt (kann außer Telnet auch SSH). Bei erfolgreicher Verbindung werden in eine Datei mit aktuellem Zeitstempel als Dateiname die empfangenen Daten geschrieben. Nach 100 Fehlversuchen bricht es aber ab.


```
rem ###################################################
rem # Schreib die von plink empfangenen Daten in      #
rem # eine Datei mit dem aktuellen Zeitstempel.       #
rem # Bei jeder neuen Verbindung wird eine neue Datei #
rem # geschrieben. Anzahl der Wiederholversuche bis   #
rem # Programmende einstellbar (100)                  #
rem ###################################################
@echo off
set /a errcount=0
:loop
set datum=%date:~-4%%date:~-7,2%%date:~-10,2%
set stunde=%time:~0,2%
if %time:~0,2% GTR 9 goto stundeOK
set stunde=0%time:~1,1%
:stundeOK
set zeit=%stunde%%time:~3,2%%time:~6,2%
set filename=C:\Temp\data_%datum%_%zeit%.txt
plink -telnet 192.168.1.1 -P 9000 > %filename%
rem # echo Plink returned: %ERRORLEVEL%
rem # Datei von 0 KB Groesse loeschen
for %%F in (%filename%) do set size=%%~zF 
if %size% EQU 0 (del %filename%)
set /a errcount=%errcount%+1
if %errcount% GEQ 100 (goto :exit)
goto :loop
:exit
@echo on
echo Maximale Anzahl an Verbindungsversuchen erreicht
```


----------

