# Libnodave unter delphi 2006 ohne Komponente



## emsbootsmann (4 März 2010)

Ich möchte Libnodave.dll einsetzen aber ohne die Komponente einzusetzen bzw. zu installieren.
Ich habe mit Delphi 5 die Komponente eingesetzt und es klapp super aber nun möchte ich umsteigen auf Delphi 2006.
Ich weiss nun nicht wie ich die DLL anspreche um zb. eine Verbindung über TCP zu erstellen.In der Komponente wurde es einfach eingestellt.
Bitte um hilfe evtl. eine kleine Demo.


----------



## marcengbarth (4 März 2010)

Bei der Komponente ist doch Source dabei, schau einfach nach wie die Komponente die Verbindung aufbaut.

Aus der nodavecomponent.pas kopiert, müsste alles wichtige drin sein (ab Zeile 655), Deklarationen ab Zeile 135.


```
//Open the connection to the PLC specified by the properties ~[link .Protocol Protocol], ~[link .CPURack CPURack], ~[link .CPUSlot CPUSlot],
//~[link .COMPort COMPort], ~[link .IPAddress IPAddress], ~[link .IPPort IPPort], ~[link .MPILocal MPILocal], ~[link .MPIRemote MPIRemote]
// and/or ~[link .MPISpeed MPISpeed]
//~param OnlyIntf Open only the interface, don't connect to the PLC
procedure TNoDave.DoConnect(OnlyIntf: Boolean = False);
var
  Address: String;
  Speed: PChar;
begin
  If not FActive then
  begin
    If not (csLoading in ComponentState) then
    begin
      Case FProtocol of
        daveProtoMPI, daveProtoMPI2, daveProtoMPI3, daveProtoMPI4, daveProtoPPI, daveProtoAS511:
          begin
            Address:=FComPort + #0;
            Case ComSpeed of
              daveComSpeed9_6k:   Speed:='9600';
              daveComSpeed19_2k:  Speed:='19200';
              daveComSpeed38_4k:  Speed:='38400';
              daveComSpeed57_6k:  Speed:='57600';
              daveComSpeed115_2k: Speed:='115200';
              else                Speed:='38400';
            end;
            DaveFDS.rfd:=SetPort(@Address[1], Speed, 'O');
          end;
        daveProtoISOTCP, daveProtoISOTCP243, daveProtoIBH, daveProtoIBH_PPI, daveProtoNLPro:
          begin
            Address:=FIPAddress + #0;
            DaveFDS.rfd:=OpenSocket(FIPPort, @Address[1]);
          end;
        daveProtoS7Online:
          begin
            Address:=FComPort + #0;
            DaveFDS.rfd:=OpenS7Online(@Address[1], Handle);
          end;
      end;
      DaveFDS.wfd:=DaveFDS.rfd;
      If (DaveFDS.rfd > 0) or ((DaveFDS.rfd = 0) and (FProtocol = daveProtoS7Online)) then
      begin
        Address:=FIntfName + #0;
        DaveIntf:=daveNewInterface(DaveFDS, @Address[1], Ord(FMPIlocal), ProtCode(FProtocol), Ord(FMPISpeed));
        DaveIntf^.timeout:=FIntfTimeout;
        If not OnlyIntf then
        begin
          FLastError:=daveInitAdapter(DaveIntf);
          If FLastError = 0 then
          begin
            DaveConn:=daveNewConnection(DaveIntf, FMPIRemote, FCpuRack, FCpuSlot);
            FLastError:=daveConnectPLC(DaveConn);
            FActive:=(FLastError = 0);
            If Active then ReadBytes else DoOnError(daveStrerror(FLastError));
          end;
        end;
      end;
    end else FActive:=True;
  end;
end;
```


----------



## emsbootsmann (4 März 2010)

Gibts nichts einfacheres,so wie ndave in Uses einbinden und dann

procedure   TForm.Read_DB3_DBX2;
VAR Data : Variant;
begin
 HauptForm.NoDave.DBNumber:=3;
 HauptForm.NoDave.Area:=DaveDB;
 HauptForm.NoDave.BufLen:=2;
 HauptForm.NoDave.BufOffs:=2;
 If HauptForm.NoDave.Active = true then
 begin
  HauptForm.NoDave.ReadBytes;
  Data:=HauptForm.NoDave.GetInt(HauptForm.NoDave.BufOffs,0);
  Pointer:=(Data);
  //Label5.Caption:=(Data);
 end;
end;


----------



## marcengbarth (4 März 2010)

Doch klar, pack die nodavecomponent in die uses und dann geht das so. 

Jetzt noch das Beispiel:


```
procedure TForm1.Read_DB3_DBX2;
var
  Sps:  TNoDave;
  Data: SmallInt;
begin
  Sps := TNoDave.Create(parent);
  try
    Sps.Protocol := daveProtoISOTCP;      // Protokoll (bei mir ISOTCP)
    Sps.IPAddress := '192.168.178.10';    // IP-Adresse
    Sps.Connect();                        // Verbindug öffnen
    Sps.ReadBytes(daveDB, 3, 0, 2, nil);  // nil -> interner Buffer wird verwendet.
    Data := Sps.GetInt(0, nil, 0, 2);     // DBW0 aus DB3
    Sps.Disconnect;                       // Verbindung schließen
    Label5.Caption := IntToStr(Data);
  finally
    Sps.Free;
  end;
end;
```

Das ist jetzt nur mal schnell runtergetippt, sollte aber DBW0 aus DB3 lesen und im Label5 anzeigen. Getestet hab ich das allerdings nicht. Bei meinen Anwendungen lasse ich die Verbindung zur SPS bestehen bis die Anwendung beendet wird.


----------

