Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Moxa NPort 5150 mit IPSerial auf Windows Server 2008 (https://www.delphipraxis.net/179312-moxa-nport-5150-mit-ipserial-auf-windows-server-2008-a.html)

MatRo 26. Feb 2014 06:32

Delphi-Version: XE

Moxa NPort 5150 mit IPSerial auf Windows Server 2008
 
Guten Tag,
wir versuchen im Moment unsere COM-Schnittstellen ans Netz zu bringen. Dafür nehmen wir den NPort 5150 von Moxa. Dieses Gerät ermöglicht es, die Daten der COM-Schnittstelle quasi als TCP-IP Dienst zu verwenden. Über Hyperterm kommen wir auch ohne Probleme auf das daran angeschlossene Gerät. Mit Delphi waren wir bisher leider nicht so erfolgreich. Es gibt ein Beispielprojekt welches leider auch überhaupt nicht funktioniert. Es scheitert direkt schon am Anfang:
Delphi-Quellcode:
nsio_init();
ip := Edit1.Text;
Val(Edit2.Text, pid, code);

ret := nsio_open(PChar(ip), pid, 3000);   // -2: Bad Parameter
Das sind die ersten Zeilen, es wird eine IP als ein null terminierter String übergeben, dazu der Port den wir auch mit Hyperterm getestet haben sowie der Timeout. Das nsio_open ist eine Methode aus der IPSerial.dll (wo wir auch verschiedene DLLs ausprobiert haben). Der Returncode ist -2 (Bad Parameter), ungültige Eingaben geben einen anderen Code zurück.

Ersteinmal die Frage: Hat jemand schonmal mit IPSerial bzw. eventuell auch NPort gearbeitet und einen Hinweis?
Wenn ihr noch nicht damit gearbeitet habt, kennt ihr Alternativen um über TCP-IP auf die COM-Schnittstelle (wie Hyperterm) zuzugreifen? Die Indy-Komponente haben wir schon ausprobiert, da kriegen wir auch was zurück aber leider ist das nicht brauchbar und unzuverlässig.

Beste Grüße
Matthias

Union 26. Feb 2014 06:42

AW: Moxa NPort 5150 mit IPSerial auf Windows Server 2008
 
Wie ist denn
Delphi-Quellcode:
nsio_open()
deklariert?

mkinzler 26. Feb 2014 06:56

AW: Moxa NPort 5150 mit IPSerial auf Windows Server 2008
 
Im Beispiel des Manuals (Seite 85) hat nsio_open() nur 2 Parameter.

Welches Delphi (Unicode?)

Union 26. Feb 2014 07:03

AW: Moxa NPort 5150 mit IPSerial auf Windows Server 2008
 
Auf jeden Fall steht dort
Code:
char
und nicht
Code:
wchar_t
. Deshalb wäre in Delphi > 2007
Delphi-Quellcode:
PAnsiChar
zu verwenden.

taveuni 26. Feb 2014 07:17

AW: Moxa NPort 5150 mit IPSerial auf Windows Server 2008
 
Mir ist nicht ganz klar was Ihr machen wollt.
Wir arbeiten seit Jahren mit Moxa N-Ports.

Es gibt zwei Anwendungen (Voraussetzung: Das Subsystem kann nur RS232 oder RS485).

1.
Ihr habt eine bereits entwickelte Software welche nur über RS232 kommunizieren kann:
Dann wird auf dem Rechner der Moxa Treiber installiert und das Programm kommuniziert
via Realcom.

2.
Ihr entwickelt ein neues Programm:
Der Moxa wird ausschliesslich als Protokollwandler gebraucht.
Der Nport wird auf TCP Client oder Server konfiguriert.
Auf dem Rechner wird keine Moxa Software installiert.
Ihr setzt die Kommunikation auf TCP/IP Basis um. Der Moxa wandelt die Kommunikation auf RS232 oder RS485.

MatRo 26. Feb 2014 08:14

AW: Moxa NPort 5150 mit IPSerial auf Windows Server 2008
 
Hallo, danke für eure Antworten.

Also die init ist so deklariert: function nsio_open(server_ip: PChar; port_index: Longint; timeouts: Longint): Longint; stdcall;

@Taveuni
Zweiteres trifft zu, konfiguriert als TCP-Server:
2.
Ihr entwickelt ein neues Programm:
Der Moxa wird ausschliesslich als Protokollwandler gebraucht.
Der Nport wird auf TCP Client oder Server konfiguriert.
Auf dem Rechner wird keine Moxa Software installiert.
Ihr setzt die Kommunikation auf TCP/IP Basis um. Der Moxa wandelt die Kommunikation auf RS232 oder RS485.

Ich will nicht ausschließen, dass wir dann die falsche DLL bzw. die falsche IPSerial.pas zugeschoben bekommen haben. Die DLL ist vom 16.11.2010, 160kb (x86). Die andere (x64) ist 191 kb groß. Kann mir jemand denn ein passendes pärchen für Delphi XE 32 Bit inklusive der IPSerial.pas und der DLL zukommen lassen?

Beste Grüße
Matthias

Union 26. Feb 2014 08:25

AW: Moxa NPort 5150 mit IPSerial auf Windows Server 2008
 
Versuche mal, die Funktion so zu deklarieren. Vermutlich ist die IPSerial.pas noch für ältere Delphi-Versionen.
Delphi-Quellcode:
function nsio_open(server_ip: PAnsiChar; port_index: Longint; timeouts: Longint): Longint; stdcall;

MatRo 26. Feb 2014 08:38

AW: Moxa NPort 5150 mit IPSerial auf Windows Server 2008
 
Ich habs mal versucht mit dem umdeklarieren.

Delphi-Quellcode:
ip := PAnsiChar(Edit1.Text);
function nsio_open(server_ip: PAnsiChar; port_index: Longint; timeouts: Longint): Longint; stdcall;
Leider gleicher return value -2. Dann hab ich mal das timeout rausgenommen und habe eine Zugriffsverletzung bekommen. Wird immer die DLL aus dem Beispielverzeichnis benutzt oder sucht der vorher vllt in System32 etc.?

taveuni 26. Feb 2014 08:45

AW: Moxa NPort 5150 mit IPSerial auf Windows Server 2008
 
Zitat:

Zitat von MatRo (Beitrag 1249660)

@Taveuni
Zweiteres trifft zu, konfiguriert als TCP-Server:

[..]

Ich will nicht ausschließen, dass wir dann die falsche DLL bzw. die falsche IPSerial.pas zugeschoben bekommen haben. Die DLL ist vom 16.11.2010, 160kb (x86). Die andere (x64) ist 191 kb groß. Kann mir jemand denn ein passendes pärchen für Delphi XE 32 Bit inklusive der IPSerial.pas und der DLL zukommen lassen?

Vermutlich liegt hier ein Verständnis Problem vor.
Die Moxa ipSerial.dll ist ausschliesslich ein Wrapper für die RealCom RS232 Kommunikation.
Ausserdem ist sie buggy und outdated. Diese Variante wäre also meine Variante 1.
Also die Moxa Treiber sind auf dem Rechner installiert und simulieren einen realen Comport.
Falls Ihr aus mir momentan nicht erschliessbaren Gründen die Kommunikation so entwickeln wollt -
nehmt Asyncpro oder ähnliches.

Für die TCP/IP Kommunikation kannst Du irgendeine Library wie ICS, Indy, Synapse usw. nehmen.

Alles klar?

MatRo 26. Feb 2014 08:54

AW: Moxa NPort 5150 mit IPSerial auf Windows Server 2008
 
Also wie wir uns das vorgestellt haben:

Alte Geräte (Waage/Pata Nosta) die auf die COM-Schnittstelle bauen sollen über den NPort über das Netzwerk erreichbar sein. Die Clients sitzen auf verschiedenen Terminalservern und sollten durch unsere Lösung mit den COM Geräten kommunizieren können. D.h. eine Waage ist an den NPort angeschlossen und der Client kann z.B. das aktuelle Gewicht über unsere Delphi-Anwendung erfragen über das Netzwerk erfragen. Die Clients sind z.B. Thin Clients die selber über keinen Com Port mehr verfügen und nur eine RDP-Verbindung zu unseren Terminal Servern aufbauen. Da unser Netzwerk ziemlich groß ist brauchen wir auch pro Client verschiedene und manchmal auch keine Com Ports.

Indy haben wir bereits probiert aber es lief nicht so wie erwartet. Wir kommen an den COM Port aber die Verbindung ist nicht zuverlässig, auch hier kann ich keine Fehler in der Programmierung ausschließen.

Beste Grüße
Matthias

taveuni 26. Feb 2014 09:00

AW: Moxa NPort 5150 mit IPSerial auf Windows Server 2008
 
Dies ist der richtige Weg.
Der Moxa setzt TCP/IP zu RS232 absolut zuverlässig um.
Da müsst ihr in der Umsetzung des Herstellerprotokolls ein Problem haben.

Was lief denn nicht wie erwartet?
Was ist es denn für ein Protokoll? Ascii oder Binär. Und wie habt Ihrs versucht?


Nachtrag:
Einfacher Test:
Eine Brücke an der seriellen Schnittstelle des Moxa RX und TX machen.
Dann via TCP/IP etwas senden. Das Echo ist das gesendete an die serielle Schnittstelle.

MatRo 26. Feb 2014 09:18

AW: Moxa NPort 5150 mit IPSerial auf Windows Server 2008
 
Hier mal unser mittlerweile durch die ganzen Versuche verhunster Code um hoffentlich einen kleinen Einblick auf unsere Versuche zu bekommen.

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  sSend: string;
  sRecieve: string;
begin
  sSend := Edit1.Text + '#13';
  IdTCPClient1.IOHandler.WriteLn(sSend);

//  sRecieve := IdTCPClient1.IOHandler.ReadLn();
//  Memo1.Lines.Add(sRecieve);
//  sRecieve := IdTCPClient1.IOHandler.ReadLn();
//  Memo1.Lines.Add(sRecieve);
end;

procedure TForm1.CloseButtonClick(Sender: TObject);
begin
  IdTCPClient1.Disconnect();
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Memo1.Clear();
end;

procedure TForm1.IdIOHandlerStack1Status(ASender: TObject;
  const AStatus: TIdStatus; const AStatusText: string);
begin
  sleep(1000);
end;

procedure TForm1.IdTCPClient1Connected(Sender: TObject);
begin
  Memo1.Lines.Add('Connected');
end;

procedure TForm1.IdTCPClient1Disconnected(Sender: TObject);
begin
  Timer1.Enabled := False;
  Memo1.Lines.Add('Disconnected');
end;

procedure TForm1.OpenButtonClick(Sender: TObject);
begin
  IdTCPClient1.Host := '10.20.40.220';
//  IdTCPClient1.Port := 23;   // Telnetport;
  IdTCPClient1.Port := 4001;

  IdTCPClient1.Connect();

  sleep(1000);
  IdTCPClient1.IOHandler.WriteLn(chr(13));

  Timer1.Enabled := True;
end;


procedure TForm1.Timer1Timer(Sender: TObject);
var
  iInfo: integer;
  bInfo: boolean;
  sSend: string;
  sRecieve: string;
  I: integer;
  iBufSize: integer;
begin
  Timer1.Enabled := False;
//  iInfo := IdTCPClient1.IOHandler.ReadTimeout; // ist immer 3000 (3sek)
//  bInfo := IdTCPClient1.IOHandler.ReadLnTimedout; // stürzt ebenfalls ab ???

//  bInfo := IdTCPClient1.IOHandler.Readable(10); // stürzt ebenfalls ab ???
//  label1.Caption := '0';
//  if bInfo then
//    label1.Caption := '1';
//  application.processmessages;
//  sleep(1000);






//  while bInfo do
//  begin
//    sRecieve := IdTCPClient1.IOHandler.ReadLnRFC(bInfo);
//    Memo1.Lines.Add(sRecieve);
//  end;

//  I := IdTCPClient1.IOHandler.ReadTimeout;
//  showmessage(IntToStr(I));

  if IdTCPClient1.IOHandler.Readable() then
  begin
//    iBufSize := IdTCPClient1.IOHandler.RecvBufferSize;
//    sRecieve := IdTCPClient1.IOHandler.ReadLn();
    sRecieve := IdTCPClient1.IOHandler.readString(100);  // 6000
    Memo1.Lines.Add(sRecieve);
  end;
//  IdTCPClient1.IOHandler.rea
  Timer1.Enabled := True;
end;
Zurzeit angeschlossen ist ein riesen Switch, bei einer Eingabe wird der Login erfragt, so sehen wir ob was zurück kommt. Nach einer Zeit und einigen Passwort-Abfragen hängt sich die Anwendung auf und tut nichts mehr.

taveuni 26. Feb 2014 09:45

AW: Moxa NPort 5150 mit IPSerial auf Windows Server 2008
 
Sieht ja abenteuerlich aus.
Aber mal davon abgesehen:

Das was mit Button1 gesendet wird entspricht dem Protokoll des Subsystems?
Demzufolge ist es ein Ascii Protokoll mit abschliessendem CR.
Falls ja antwortet das System korrekt?

Und was heisst hängt sich auf?


Nachtrag:
Lade Dir mal einen neutralen TCP Client herunter z.b. den Hercules.
Benötigt kein Setup kann einfach gestartet werden.
Sende mal mit dem Deine Anfrage(n) um andere Fehler auszuschliessen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:02 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz