Hilfe zu einer OpenSource DLL um Daten aus einer SIMATIC-SPS auszulesen

  • Hallo Leute,
    ich habe im Internet eine DLL-Datei gefunden, mit deren Hilfe ich Daten aus einer Siemens SPS auslesen kann.
    3 Funktionen konnte ich übersetzen, aber bei den wichtigen Funktionen hänge ich. Vielleicht könnte mir ein ein Profi auf dem Gebiet mal unter die Arme greifen?

    Die DLL heißt libnodave.dll

    Bereits funktionierende Funktionen:
    _openSocket
    _closeSocket
    _daveStrerror


    Noch mind. erforderliche Funktionen:
    _daveNewInterface <-- wenn diese Funktion geht, dann dürfte der Rest kein Problem mehr sein. Hier ist das Problem die Struktur, die übergeben weden muss.
    _daveReadSZL <-- Erster Versuch etwas auszulesen


    Ich hoffe es kann mir jemand helfen. Vielen herzlichen Dank im Voraus!!

  • Du solltest besser davePascalNewInterface statt daveNewInterface verwenden, da dann die Struct einfach per Pointer statt direkt übergeben wird.

  • Noch mind. erforderliche Funktionen:
    _daveNewInterface <-- wenn diese Funktion geht, dann dürfte der Rest kein Problem mehr sein. Hier ist das Problem die Struktur, die übergeben weden muss.


    Hallo funkey, hab mal kurz reingeschaut und vermute das ist ein Problemchen, das mit letztens auch wahnsinnig gemacht hat. Wenn du die Struktur byValue übergeben musst, probier mal die Übergabe entsprechend "aufzulösen" - d.h. nicht den Pointer rüberzuschieben sondern die einzelnen Elemente, in deinem Fall so ungefähr:

    $di = DllCall($DLL, "HANDLE", "daveNewInterface", "ptr", DllStructGetPtr($fds), "int", rfd, "int", wfd, "str", "IF1", "int", 2, "int", 122, "int", 2)

    (nicht sicher ob ich auf die Schnelle das richtige Typedef rausgesucht habe, aber vom Prinzip gehts in diese Richtung und hilft dir hoffentlich weiter ...)

  • davePascalNewInterface sollte das gleiche wie daveNewInterface sein, nur dass die DLLStruct ByRef stat by value übergeben wird.
    Die nötigen Infos stehen ja in der header-Datei in funkeys Anhang.

    Code
    EXPORTSPEC daveInterface * DECL2 daveNewInterface(_daveOSserialType nfd, char * nname, int localMPI, int protocol, int speed);
    EXPORTSPEC daveInterface * DECL2 davePascalNewInterface(_daveOSserialType* nfd, char * nname, int localMPI, int protocol, int speed);
    [autoit]

    Func _daveNewInterface($fds, $nname, $localMPI, $protocol, $speed)
    If IsPtr($fds) Then
    Local $i_fds = $fds
    Else
    Local $i_fds = DllStructGetPtr($fds)
    EndIf
    Local $di = DllCall($ghDaveDLL, "HANDLE", "davePascalNewInterface", "ptr", DllStructGetPtr($fds), "str", $nname, "int", $localMPI, "int", $protocol, "int", $speed)
    If @error Then Return SetError(1,@error,0)
    Return $di[0]
    EndFunc

    [/autoit]

    2 Mal editiert, zuletzt von progandy (12. Oktober 2010 um 15:06)

  • davePascalNewInterface sollte das gleiche wie daveNewInterface sein, nur dass die DLLStruct ByRef stat by value übergeben wird.


    ... oder so! Ist halt nur die Frage ob für alle Funktionen der dll auch eine reine byRef-Variante existiert (so genau hab ich die Sourcen jetzt auch nicht studiert ...) - und bevor die selbe Frage dann nochmal kommt, kann man sie ja einfach mal generell beantworten ... Klar, wenns geht ist byRef natürlich much more 6y ;)

  • Vielen Dank!

    Mit eurer Hilfe ist es mir nun gelungen eine Verbindung zu der SPS aufzubauen und Daten auszulesen! Super! :thumbup:
    Es sind aber noch viele Funktionen zu übersetzen.

    Könnte mir bitte noch jemand mit der Funktion '_daveGetBlockInfo' helfen. Da sehe ich nicht, was ich falsch gemacht habe.
    Edit: Hab den Fehler gefunden.

  • hei Funkey..

    hab jetzt einfach mal dein Script laufen lassen.

    Sprichst du die SPS über Lan an ?

    hab nur ein MPi - USB Adapter hier. ( für die 313 CPU )

    .. auto it steigt nämlich "fatal" aus .. ;)

    mit ::
    openSocketw.c: bind Socket error: No error
    !>16:43:53 AutoIT3.exe ended.rc:-1073741819

    ich setz mich mal weiter dran ..

    nicht's desto trotz .. geniales File, des du da gebaut hast . !!!

    beide Daumen hoch !!!!

    bye

  • kann man damit auch SMS-Eingänge setzen??

    Geile Funktion, wusste garnich, dass sowas existiert!
    Bist du Elektroniker für Automatisierungstechnik?

  • ich denke er meint SPS .. nicht SMS damit ..

    also wenn du dir die Arbeit machen wollen würdest ;) .. dagegen hätte ich nix ..

    ne kleine Beschreibung wäre vielleicht noch ganz nice ... mit solchen dingen, die für dich sonnen klar erscheinen. ..

    also, wenn ich es schaffe, mit dem script ne s7 313 anzusteuern .. oder sei es auch nur auszulesen dann kann man wirklich schöne sachen mit machen.

    zumal eine Konventionelle Ansteuerung von PC von Siemens nur über teure Zusatz Software realisierbar ist.

    und wenn man nur eine art Remote Display mit bauen könnte. Wäre dieses Script wirklich wertvoll !!!

    so n mini S7 Display kostet Hunderte von Euros. und kann ( milde gesagt ) NIX ..

    so n kleiner alter Läppi mit USB hat jeder rum fahren .. und eine schöne GUI ist mit AutoIt auch schnell zusammen geschustert. ;)

    bin mal gespannt, was hieraus alles noch wird. !!

  • genau: SPS

    Da stimm ich dir zu Vivus, das wär geil, wenn das jemand machen könnte...

    SPS Eingänge setzen über ne Dll...
    Gibt doch seit neustem nen Virus, der Zu S7 Steuerungen kommunizieren kann und somit Programme ändern kann... (stand in ausgabe der letzten C't !!)