LibNoDave

SPS_PC

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

ich möchte mir mit der libnodave.dll ein Delphi Programm zum Auslesen einzelner SPS-Bausteine schreiben. Mit welcher Funktion ist das möglich,
und wie wird der Aufruf am besten durchgeführt.


Ich verwende eine S7-300 mit Ethernet CP und Delphi 7.


Danke im Voraus
 
Gibt doch ein Beispiel dafür, muss aber etwas angepasst werden.
Mit Nodavedemo erst einmal die Verbindung testen.

Mit welcher Funktion hängt davon ab was Du lesen willst.
 
Ich habe bisher nur daten damit gelesen, laut Beschreibung kann er aber auch Programmcode lesen und schreiben.

Demo ist unter DelphiComponent/Demo/Delphi wenn du die Library geladen hast.
 
Danke das Beispiel hab ich jetzt gefunden.
Das lesen von Daten funktionert.

Ich habe mir mal die nodave.pas und die nodavecomponent.pas angeschaut.

Habe dabei folgende Funktionen in der nodave.pas entdeckt
initupload, doupload und endupload.
Sind das die richtigen zum auslesen von OB's und FC's? Wenn ja wie werden sie eingesetzt?

Gibt es auch solle Funktionen der in nodavecomponent.pas?
Konnte darin keine vergleichbaren finden.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich denke die Funktionen sind richtig.

Die dem Beispiel beiliegende Komponente habe ich um folgende Funktion erweitert

Code:
// Read PLC-Program-Block
function  TNoDave.ReadPLCPrg(blockType:char; blockNr:longint):longint;
var
  WasActive : Boolean;
  res       : longint;
  upID,
  len,
  more      :longint;
  sError    : string;
  Buf         : ppuc;
  Data        : string;
  i           : Integer;
begin
  WasActive:=Active;
  Active:=True;
  // Transfer von SPS nach PC starten
  LockNoDave.Enter;
  res := initUpload(daveConn, blockType, blockNr, @upID);
  LockNoDave.Leave;
  // Transfer ausführen
  New(Buf);
  Buf^ := AllocMem(1024);
  more := 0;
  len  := 0;
  if res = daveResOK then
    begin
      // Blöcke lesen
      LockNoDave.Enter;
      repeat
        res := doUpload(daveConn, @more, @Buf, @len, upID);
        if res <> daveResOK then
          begin
            LockNoDave.Leave;
            Dispose(Buf);
            SError := daveStrerror(abs(res));
            result := res;
            exit;
          end;
      until more <= 0;
      LockNoDave.Leave;
      // Transfer beenden
      endUpload(DaveConn, upID);
    end;
  Data := '';
  for i := 0 to len - 1 do
    Data := Data + pUC(Integer(Pointer(Buf^)) + i)^;
  Dispose(Buf);
  result := res;
  Active:=WasActive;
end;

Funktionert leider nicht richtig. Ich vermutet das Problem liegt
in der Übergabe des Parameters "Buf". Hat jedem Erfahrung mit
der Parameterübergabe von Delphi an C-Routine mit dem Type
"Zeiger auf Zeiger auf Char"?
 
Zuletzt bearbeitet:
Ich hab immer ein Array für Buf definiert. Dieses passe ich bei Bedarf dynamisch in der Länge an.
 
Zurück
Oben