Libnodave unter delphi 2006 ohne Komponente

emsbootsmann

Level-1
Beiträge
25
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
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.
 
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.

Code:
//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;
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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;
 
Doch klar, pack die nodavecomponent in die uses und dann geht das so.

Jetzt noch das Beispiel:

Code:
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.
 
Zuletzt bearbeitet:
Zurück
Oben