LibNoDave Runtime Error

Lazarus™

Level-2
Beiträge
434
Reaktionspunkte
52
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

ich mache gerade meine ersten Gehversuche mit LibNoDave und Ethernet.

Ich habe mir folgende Testroutine gemacht:

Code:
procedure TfrmMain.Button1Click(Sender: TObject);
var aDaveInterface: pdaveInterface;
    aDaveConnection: pdaveConnection;
    aDaveOsSerialType: _daveOSserialType;
    Buffer: Array[0..1024] of Byte;

begin
  aDaveOsSerialType.rfd := OpenSocket(102, '10.10.0.200');
  aDaveOsSerialType.wfd := aDaveOsSerialType.rfd;
  if (aDaveOsSerialType.rfd > 0) then begin
    aDaveInterface := DaveNewInterface(aDaveOsSerialType, 'IF1', 15, daveProtoISOTCP, daveSpeed187k);
 	  aDaveInterface^.Timeout := 5000000;
    if (daveInitAdapter(aDaveInterface) = 0) then begin
    	aDaveConnection := daveNewConnection(aDaveInterface, 2, 0, 2);
    	if (daveConnectPLC(aDaveConnection) = 0) then begin

        daveReadBytes(aDaveConnection, daveDB, 5, 0, 200, @Buffer);


        daveDisconnectPLC(aDaveConnection);
      end;
   	  daveDisconnectAdapter(aDaveInterface);
    end;
  end;
end;

Und bei: aDaveInterface := DaveNewInterface(aDaveOsSerialType, 'IF1', 15, daveProtoISOTCP, daveSpeed187k);
gibt es schon einen Runtime - Error. Diese Routinen habe ich aus dem Beispiel übernommen.
Verstehe ich das falsch ??? Oder gibt es einen echten logischen Fehler in meinem Hirn ?? :oops:
 
Hat sich dann auch erledigt... Habe mal die ganzen cdecl; gelöscht.

Ist InitAdapter überhaupt nötig, bei TCPIP ??
Wieso liest die Lib nicht MB0 - 255 in einem Zug ??? Nur 200 Bytes ???
Liest die Lib auch z.B. MB1000 etc. ???
Gibt es eine Grenze für 200 Byte pro auftrag ???
Und zu guter letzt, sind in PDU.data alle meine Bytes sequenziell abgelegt ??? Wie gross ist der Buffer ???
 

Anhänge

  • libnodave-unit.zip
    8,1 KB · Aufrufe: 9
Zuviel Werbung?
-> Hier kostenlos registrieren
Lazarus™ schrieb:
Hat sich dann auch erledigt... Habe mal die ganzen cdecl; gelöscht.
Ist InitAdapter überhaupt nötig, bei TCPIP ??
Nein, aber es tut einfach nix. Es bläht auch deinen Code nur minimal auf. Dafür kann die Anwendung unverändert mit mit allen Protokollen laufen.
Lazarus™ schrieb:
Wieso liest die Lib nicht MB0 - 255 in einem Zug ??? Nur 200 Bytes ???
Liest die Lib auch z.B. MB1000 etc. ???
Gibt es eine Grenze für 200 Byte pro auftrag ???
Es gibt eine Grenze der Länge der PDU (Datenpakete), je nach CPU und Übertragungsweg. Die wird in connectPLC "ausgehandelt", bei dir wahrscheinlich 240.
Libnodave zeigt dir das Ergebnis des "Aushandelns" mit der -d Option bei den Testprogrammen, oder daveSetDebug(daveDebugConnect) oder setDaveDebug(daveDebugAll) im eigenen Programm.

Die maximale Länge der Daten beim Lesen ist 18 weniger, beim Schreiben 28 weniger, also 222 bzw. 212.
Um längere Blöcke zu lesen oder zu schreiben, mußt du halt daveReadBytes oder daveWriteBytes mehrfach aufrufen. Das machen andere Bibliotheken intern, aber ich halte es für gut, wenn sich der Anwender dessen bewußt ist, es dauert dann viel länger.

Viellicht kommt ja jemand auch mit einem Word statt einem DWord aus, wenn er dadurch bei der Gesamtlänge unter der Grenze bleibt.

Die nächste Version wird Funktionen daveReadManyBytes oder daveWriteManyBytes enthaten, die das intern erledigen.
 
Zurück
Oben