Zugriff mit libnodave (unter Delphi) auf S7-CP443-1

Frank

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

ich versuche jetzt schon seit 5 Wochen mit libnodave Daten aus meiner S7 (mit CP 443-1) über das ISO on TCP zu lesen, aber es klappt einfach nicht (bekomme nur komische Werte die ich nicht interpretieren kann :confused: ). Mit dem mitgelieferten Beispiel komme ich auch irgendwie nicht zurecht. Habe zwischenzeitlich schon mal mit AG-Link den gleichen Versuch gestartet - mit Erfolg, alles ziemlich einfach. Für meinen privaten Gebrauch ist die .dll aber nicht finanzierbar. Vielleicht kann mir ja jemand eine Starthilfe geben oder evtl. ein einfaches Sample wie ich die Kommunikation aufbauen kann und die gelesenen Werte zu verstehen habe.
Nutze die Delphi Komponente TNoDave und möchte z.B MW0 auslesen.
Gruß
Frank
 
Für das genannte Beispiel mußt Du mit meiner Komponente folgendes machen:
  • das entsprechende Protokol (daveProtoISOTCP) auswählen,
  • die IP-Adresse des CP-443 eintragen (der Port wird bei Auswahl des Protokolls automatisch eingetragen),
  • die Rack- und Slot-Nr. der CPU angeben (bei einer 400er meistens CPURack 0 und CPUSlot 3),
  • als Area den Merkerbereich (daveFlags) auswählen,
  • die Anzahl der zu lesenden Bytes in BufLen eintragen (2 für ein Merkerwort),
  • in BufOffs eintragen, ab welcher Offsetadresse gelesen werden soll (MW0 liegt an Offset 0),
  • ggf. bei Interval eintragen, in welchem Abstand (in ms) erneut gelesen werden soll,
  • Active auf True setzen.
Dann sollten entweder in der Eigenschaft Buffer die beiden Bytes des Merkerwortes als Hex-Werte angezeigt werde, oder in der Eigenschaft LastError der Fehlercode und in LastErrMsg die Fehlermeldung stehen. Wenn das fehlerfrei funktioniert (LastError = 0), dann kannst Du in Deinem Programmcode das Merkerwort mit TNoDave.GetWord(0) das Merkerwort auslesen.

Wenn das bei Dir nicht funktioniert, dann brauche ich ein paar mehr Infos, um Dir helfen zu können:
  • Wie sind die Eigenschaften von TNoDave eingestellt ?
  • Welche "komischen Werte" bekommst Du geliefert ?
  • Was steht in LastError/LastErrorMsg ?
  • Was passiert im Demo-Programm ?

Gruß Axel

PS: AGLink ist für privat zu teuer, aber eine 400er CPU mit CP-443 usw. ist nicht zu teuer ? Hast Du eine besonders günstige Bezugsquelle für Siemens-Hardware ?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Erstmal vielen Dank für die schnelle Antwort. Ich habe es eben nochmal genau der Anleitung entsprechend probiert, leider immer noch ohne Erfolg.

afk schrieb:
Wenn das bei Dir nicht funktioniert, dann brauche ich ein paar mehr Infos, um Dir helfen zu können:
  • Wie sind die Eigenschaften von TNoDave eingestellt ?
  • Welche "komischen Werte" bekommst Du geliefert ?
  • Was steht in LastError/LastErrorMsg ?
  • Was passiert im Demo-Programm ?
Zu den Fragen habe ich mal zwei Screenshots angehängt. Im DemoProgramm versuche ich die MW2..MW8 auszulesen. Dabei wird exemplarisch:

NoDave.Active:= true;
NoDave.Connect(...);

Schleife
Var[x]:=NoDaveGetWord(Adresse);

NoDave.Disconnect;
NoDave.Active:= false;

Würde Dir auch gern das Projekt für eine Analyse zu Verfügung stellen.
Wenn ich es richtig verstanden habe, werden schon mit der Eigenschaft NoDave.Active Werte gelesen. Wofür ist dann NoDave.Connect? Kann man vielleicht auch beim einbinden der Komponente in Delphi was falsch machen?


afk schrieb:
PS: AGLink ist für privat zu teuer, aber eine 400er CPU mit CP-443 usw. ist nicht zu teuer ? Hast Du eine besonders günstige Bezugsquelle für Siemens-Hardware ?

Die Steuerung ist eine (Dauer-)Leihgabe meiner Firma, wenn eine in den Anlagen kaputt geht ist sie weg. :(

Viele Grüße und ein schönes WE
Frank
 

Anhänge

  • Eigenschaften_TNoDave.JPG
    Eigenschaften_TNoDave.JPG
    33,2 KB · Aufrufe: 67
  • libnodave test.JPG
    libnodave test.JPG
    133,8 KB · Aufrufe: 97
Frank schrieb:
Würde Dir auch gern das Projekt für eine Analyse zu Verfügung stellen.
Ich hab Dir dazu was per PN geschickt.

Frank schrieb:
Wenn ich es richtig verstanden habe, werden schon mit der Eigenschaft NoDave.Active Werte gelesen. Wofür ist dann NoDave.Connect?
Active ist für die Bedienung im Objektinspektor, Connect für den Aufruf aus dem ProgrammCode heraus gedacht. Funktional ist kein Unterschied, beim Setzen von Active auf True wird intern Connect aufgerufen.

Frank schrieb:
Kann man vielleicht auch beim einbinden der Komponente in Delphi was falsch machen?
Nichts, was mir bekannt wäre.

Mir ist in Deinem Screenshot vom Objektinspektor aufgefallen, daß Du CPUSlot=4 eingetragen hast, steckt in Slot 4 wirklich die CPU oder steckt da der CP ?
Du mußt bei ISO over TCP unbedingt den Slot der CPU in CPUSlot eintragen, sonst fühlt sich die CPU nicht angesprochen und antwortet nicht.

Außerdem hast Du Interval=1 eingestellt, das bedeutet, daß die Komponente versucht, alle 1ms die aktuellen Werte von der SPS einzulesen (oder so schnell wie möglich, falls 1ms zu kurz ist). Da solltest Du besser einen deutlich höheren Wert eintragen, z.B. 1000 für 1 Sekunde. Wenn Dir das nicht schnell genug ist, dann kannst Du den Wert immer noch runtersetzen, sobald die Kommunikation korrekt funktioniert.

Aus dem anderen Screenshot werde ich nicht so richtig schlau, da ich mit Deinen Meldetexten nur zum Teil was anfangen kann.


Gruß Axel
 
so habe jetzt nach einigen Anlaufschwierigkeiten und netter Unterstützung
von Axel mal einiges ausprobiert (Testprogramm liest 4 MW's aus der Steuerung mit libnodave und zum Vergleich wird auch mit AG-Link gelesen). Folgendes Ergebnis habe ich auf der Reise durch unsere
Werkshalle erhalten:


CPU Rack Slot Status
313C 0 2 ok
416 0 3 nicht ok
316 0 2 ok
318 0 2 nicht ok
314 0 2 ok
315-2DP 0 2 ok
416 0 4 nicht ok
414 0 3 nicht ok
314C-2DP 0 2 ok


nicht OK = es werden falsche Werte gelesen

Die 318 und die 400’er Reihe haben meiner Kenntnis nach die gleiche Architektur.
Nun ist die Frage – liegt es am Unterschied der beiden Reihen oder ist da was in
der .dll nicht ok? Hat schon mal jemand erfolgreich mit libnodave über ISO over TCP auf eine 400'er zugegriffen?

Gruß
Frank
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Bei den verwendeten 400ern: Welches Netzteil kam jeweils zum Einsatz? Wie kommt die CPU auf Slot 4? Das wirkliche "nicht ok" das mich stutzen lässt ist das der 318 auf R/S 0/2. Die 300er ist standardmäßig immer auf Slot 2 erreichbar da es keine realen Steckplätze gibt.
Liefert AGLInk dasselbe wie die VAT bei Siemens?
 
Frank schrieb:
Nun ist die Frage – liegt es am Unterschied der beiden Reihen oder ist da was in der .dll nicht ok? Hat schon mal jemand erfolgreich mit libnodave über ISO over TCP auf eine 400'er zugegriffen?
Bei mir funktioniert libnodave per ISO over TCP mit folgenden Hardware-Kombinationen:
  • Siemens CPU 416/2-DP mit CP-443
  • Siemens CPU 416/2-DP mit NetLink
  • VIPA CPU 315 SB mit interner Ethernet-Schnittstelle
  • VIPA CPU 315 SB mit NetLink
  • Siemens CPU 315/2-DP mit CP-343
  • diverse Siemens CPUs der 300er-Reihe mit NetLink

Gruß Axel
 
Rainer Hönle schrieb:
Bei den verwendeten 400ern: Welches Netzteil kam jeweils zum Einsatz? Wie kommt die CPU auf Slot 4? Das wirkliche "nicht ok" das mich stutzen lässt ist das der 318 auf R/S 0/2. Die 300er ist standardmäßig immer auf Slot 2 erreichbar da es keine realen Steckplätze gibt.
Liefert AGLInk dasselbe wie die VAT bei Siemens?

Das Netzteil kann ich gerade nicht bennenen, da ich gerade unterwegs bin, könnte ich aber nachholen. Hat das Netzteil Einfluß auf die ganze Geschichte?
Die CPU ist einfach so auf Slot 4 - muss ja funktionieren, wenn man es einstellen kann.
AG-Link liefert immer die korrekten Werte --> arbeitet sehr zuverlässig, nur halt zu teuer für zu Hause zum basteln. Ich habe bei den Versuchen jeweils die VAT, AG-Link und libnodave zum vergleichen herangezogen, und dabei die MW's 2..8 ausgelesen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Frank schrieb:
Das Netzteil kann ich gerade nicht bennenen, da ich gerade unterwegs bin, könnte ich aber nachholen. Hat das Netzteil Einfluß auf die ganze Geschichte?
Die CPU ist einfach so auf Slot 4 - muss ja funktionieren, wenn man es einstellen kann.
AG-Link liefert immer die korrekten Werte --> arbeitet sehr zuverlässig, nur halt zu teuer für zu Hause zum basteln. Ich habe bei den Versuchen jeweils die VAT, AG-Link und libnodave zum vergleichen herangezogen, und dabei die MW's 2..8 ausgelesen.
Nur die Breite des Netzteiles, davon hängt bei der 400er die richtige Slotnummer ab. Und wenn die CPU wirklich in Slot 4 steckt und die richtigen Werte liefert ist ja alles in Ordnung.
 
Die Sache scheint sich aufgeklärt zu haben:
Bei daveReadBytes(dc, area, DBnummer, start, len) muß der Parameter DBnummer 0 sein, wenn area nicht daveDB, also Datenbaustein ist. Manche/Alle 300er scheinen trotzdem Daten zu liefern, während die 400er das genau nehmen.
 
nun funktioniert es auch bei mir.
vielen dank für die hilfe!
habe jede menge gelernt dabei.

gruß frank
 
Zuviel Werbung?
-> Hier kostenlos registrieren
libnodave für delphi

wer kann mir helfen,ich habe mir die Komponete runtergeladen und wollte nun mal ausprobieren.Das Demoprogramm läuft so das ich sagen kann das die Verbindung steht.Da ich Delphi 5 benutze kann ich das Demoprogramm selbst nich comilieren.Mit dem Package hatte ich auch einige schwierigkeiten.Ich binn nun soweit das ich eine Verbindung bekomme jedoch werden keine Daten ausgelesen.Kann mir jemand mal ein kleines Beispielprogramm in Delphi anzeigen wie ich über Iso Tcp einfach einen Input auslese damit ich weiter komme.Ich hatte auch beim Package compilieren Schwierigkeiten er merkelte Plongint an das ich dann in Longint geändert hatte.Liegt hier der Fehler.Gibt es auch einen anderen Weg die DLL zu nutzen.Freue mich über jede hilfe.
 
wer kann mir helfen,ich habe mir die Komponete runtergeladen und wollte nun mal ausprobieren.Das Demoprogramm läuft so das ich sagen kann das die Verbindung steht.Da ich Delphi 5 benutze kann ich das Demoprogramm selbst nich comilieren.Mit dem Package hatte ich auch einige schwierigkeiten.Ich binn nun soweit das ich eine Verbindung bekomme jedoch werden keine Daten ausgelesen.Kann mir jemand mal ein kleines Beispielprogramm in Delphi anzeigen wie ich über Iso Tcp einfach einen Input auslese damit ich weiter komme.Ich hatte auch beim Package compilieren Schwierigkeiten er merkelte Plongint an das ich dann in Longint geändert hatte.Liegt hier der Fehler.Gibt es auch einen anderen Weg die DLL zu nutzen.Freue mich über jede hilfe.
Ich bin nicht der Delphi-Fachmann, das ist AFK. Ein PLongint wird wohl ein Zeiger of Longint sein. Ihn durch Longint zu ersetzen liefert wohl die gleiche Speichergröße (32bit), sollte aber anderswo zu Meckereien führen (in Pascal mehr als in C) und ist sicher nicht im Sinne des Erfinders. Da würde ich eher versuchen, die Definition nachzuliefern:
Type Plongint =Longint;
oder so.
 
Plongint ist in nDelphi7 in System definiert, kann durchaus sein, daß es das so in Delphi5 noch nicht gab.
Der ganze Abschnitt sieht so aus:

(*$HPPEMIT 'namespace System' *)
(*$HPPEMIT '{' *)
(*$HPPEMIT ' typedef int *PLongint;' *)
(*$HPPEMIT '}' *)
PLongint = ^Longint;
{$EXTERNALSYM PLongint}
PInteger = ^Integer;
PCardinal = ^Cardinal;
PWord = ^Word;
PSmallInt = ^SmallInt;
PByte = ^Byte;
PShortInt = ^ShortInt;
PInt64 = ^Int64;
PLongWord = ^LongWord;
PSingle = ^Single;
PDouble = ^Double;
PDate = ^Double;
PDispatch = ^IDispatch;
PPDispatch = ^PDispatch;
PError = ^LongWord;
PWordBool = ^WordBool;
PUnknown = ^IUnknown;
PPUnknown = ^PUnknown;
{$NODEFINE PByte}
PPWideChar = ^PWideChar;
PPChar = ^PChar;
PPAnsiChar = PPChar;
PExtended = ^Extended;
PComp = ^Comp;
PCurrency = ^Currency;
PVariant = ^Variant;
POleVariant = ^OleVariant;
PPointer = ^Pointer;
PBoolean = ^Boolean;

Man kann das ganze natürlich auch "zu Fuß" machen, dazu mußt du nodave.pas einbinden und dir am Besten mal das Beispiel für Pascal ansehen, da sollten die wesentlichen Sachen drin sein. Zuerst würde ich aber versuchen die Delphi-Komponente zum laufen zu bringen, die ist prima gemacht und funktioniert gut. PLongint ist eigentlich nicht wichtig, da es nur in Funktionen vorkommt, die du wahrscheinlich gar nicht benötigst.

{
PLC program read functions:
}
function initUpload(dc:pdaveConnection; blockType:char; blockNr:longint; uploadID:plongint):longint;stdcall;
external LibName {$ifdef WIN32} name 'initUpload'{$ENDIF};

function doUpload(dc:pdaveConnection; more:plongint; buffer:pPuc; len:plongint; uploadID:longint):longint;stdcall;
external LibName {$ifdef WIN32} name 'doUpload'{$ENDIF};

function endUpload(dc:pdaveConnection; uploadID:longint):longint;stdcall;
external LibName {$ifdef WIN32} name 'endUpload'{$ENDIF};
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Mit dem Package hatte ich auch einige schwierigkeiten.
Das kann auch nicht funktionieren, das Package ist nur für Lazarus (steht auch in der Hilfe). Bei Delphi bräuchte man für jede Version ein eigenes Package, und dadurch wird es dann auch kaum einfacher als das Einbinden der Komponente in ein vorhandenes Package.

Kann mir jemand mal ein kleines Beispielprogramm in Delphi anzeigen wie ich über Iso Tcp einfach einen Input auslese damit ich weiter komme.
Dafür ist eigentlich das Demo-Programm gedacht ...

Ich hatte auch beim Package compilieren Schwierigkeiten er merkelte Plongint an das ich dann in Longint geändert hatte.Liegt hier der Fehler.
Glaube ich nicht, denn die von Ralle bereits aufgezählten Funktionen werden von der Komponente gar nicht verwendet.

Gibt es auch einen anderen Weg die DLL zu nutzen.Freue mich über jede hilfe.
Direkt mit den Funktionen in NoDave.pas, aber meiner Meinung nach ist es mit der Komponente einfacher ...

Ich kann die Kompatibilität zu Delphi 5 leider nicht mehr herstellen, da ich selbst keinen Zugriff mehr auf Delphi 5 habe. Vermutlich ist es aber gar nicht schwer, das selbst zu bewerkstelligen. Delphi wird wahrscheinlich meckern, daß es irgendwelche Units nicht findet. Diese müssen dann nur aus der Uses-Liste entfernt werden. Danach kommt dann Mecker wegen nicht deklarierter Prozeduren, Funktionen oder Klassen. Jeweils aus der Delphi-Hilfe heraussuchen, in welchen Units diese sich befinden, und die in der Uses-Liste eintragen. Bei Definitionen wie PLongInt, die in Delphi 5 noch fehlen, einfach mal nach der korrekten Definition googeln, und die dann hinzufügen. Dann sollte es kompilieren und auch funktionieren.


Aus dem 43°C heißen Indien:

Gruß Axel
 
brauche nochmal hilfe

ich brauche nochmal hilfe,ich habe von Frank noch was gemailt bekommen was mir sehr geholfen hat jedoch habe ich immer noch ein Problem.
Ich möchte jetzt z.B. den E1.0 auslesen.Ich habe es mit NoDave.ReadByte versucht ohne erfolg,dann habe ich mit Getbit versucht ohne erfolg.Wenn ich nach der Demo gehe bekomme ich mit meiner 315 auch andere Werte als in der S7 Status Variable.Kann mir jemand helfen,hab die ganze Nacht verzweifelt versucht.Danke
 
Ich möchte jetzt z.B. den E1.0 auslesen.Ich habe es mit NoDave.ReadByte versucht ohne erfolg,dann habe ich mit Getbit versucht ohne erfolg.
Die Komponente liest immer mit NoDave.ReadBytes von der SPS. Wenn Du Bits auswerten willst, dann mußt Du die entsprechenden Bytes zuerst mit NoDave.ReadBytes in den Puffer übertragen, und dann mit NoDave.GetBit das entsprechende Bit aus dem Puffer lesen.

Wenn ich nach der Demo gehe bekomme ich mit meiner 315 auch andere Werte als in der S7 Status Variable.
Verstehe ich nicht. Was für eine 315 ist es denn, und mit welchem Protokoll läuft die Verbindung ?


Gruß Axel
 
Zuviel Werbung?
-> Hier kostenlos registrieren
jetzt funktionierts

danke an Frank der mir seine Demo zur Verfügung gestellt hat und so die entscheidene Hilfe gegeben hat.Das mit den falschen Werten hat sich auch aufgeklärt , ich hatte hier das mit dem Dbnummer:=0 überlesen.
Danke nochmals an alle die mir geholfen haben.
 
problem mit Datenbausteine

Ich habe in meinem S7 Programm Datenbausteine,mir ist nun aufgefallen wenn ich mich ausgeloggt habe das später die Dateninhalte der DB's alle auf Null waren.Ist jemanden das auch passiert.Ich lese nur EB und Ab aus verwende aber vorhert immer DBnummer:=0; da ja sonst falsche Werte eingelesen wurden.Vielleicht jemand eine Idee.
 
Ich habe in meinem S7 Programm Datenbausteine,mir ist nun aufgefallen wenn ich mich ausgeloggt habe das später die Dateninhalte der DB's alle auf Null waren.Ist jemanden das auch passiert.Ich lese nur EB und Ab aus verwende aber vorhert immer DBnummer:=0; da ja sonst falsche Werte eingelesen wurden.Vielleicht jemand eine Idee.
Auf Ausgänge habe ich bisher nur mal testweise mit meiner Delphi-Demo geschrieben, dabei ist mir so ein Verhalten zumindest nicht augefallen. Auf DBs schreibe ich aber häufig rum, dabei ist sowas noch nie passiert.

Bist Du sicher, daß nicht zufällig jemand zur gleichen Zeit die Datenbausteine neu auf die SPS geladen hat ?

Hast Du schon im Diagnosepuffer der CPU nach einem Hinweis gesucht ?


Gruß Axel
 
Zurück
Oben