Beiträge von Homer J. S.

    alpines: Ich musste beruflich kurzfristig verreisen, deshalb sorry für die späte Antwort.


    Was du übergibst ist ein void**. Schau dir an was in den Funktionen davon als Buffer verwendet wird (ich schätze mal int[] oder char[] respektive byte[])

    Du hattest mal wieder Recht. Ich habe es jetzt wie folgt erfolgreich umgesetzt:



    Vielen Dank für deine Hilfe/Unterstützung!


    Gruß

    Homer J. S.


    PS: Ich setzte das Thema wieder auf gelöst

    Hallo Zusammen,

    ich bin ein gutes Stück weiter gekommen mit dieser DLL. Allerdings habe ich ein Problem mit dem Aufruf der Funktion “EApiI2CWriteReadRaw“. Es wäre schön, wenn mir nochmal eine(r) auf die Sprünge helfen könnte.


    Hier der Aufruf aus der Dokumentation:

    Code
    EApiStatus_t EAPI_CALLTYPE EApiI2CWriteReadRaw (__IN EApiId_t Id, __IN uint8_t Addr, __INOPT void* pWBuffer, __IN uint32_t WriteBCnt, __OUTOPT void *pRBuffer, __IN uint32_t RBufLen, __IN uint32_t ReadBCnt)


    Hier mein Aufruf mit AutoIt (Auszug):

    Code
    $tWBuffer=DllStructCreate("ptr")
    $pWBuffer=DllStructGetPtr($tWBuffer, 1)
    DllStructSetData($tWBuffer, 1, Null)
    $tRBuffer=DllStructCreate("ptr")
    $pRBuffer=DllStructGetPtr($tRBuffer, 1)
    $DllResult=DllCall($DllHandle, "uint:cdecl", "EApiI2CWriteReadRaw", "unit", 0, "byte", 0xA0, "ptr", $pWBuffer ,"uint", 0, "ptr", $pRBuffer, "uint", 1, "uint", 1)

    Wenn ich dieses so Aufrufe, dann gibt mir @error eine 1 zurück.


    Link zu Dokumentation aus Post #9 (ab Seite 10): Dokumentation



    Vielen Dank schonam für eure Hilfe!


    Gruß

    Homer J. S.

    Dein Parametertyp für $pBuflen ist "uint_ptr*", das wäre (wenn das überhaupt möglich ist in AutoIt, was es nicht ist) ein Pointer vom Pointer. Es darf aber nur ein einfacher Pointer sein -> "uint_ptr", "uint*" oder "ptr" nutzen!

    Du solltest für das Initialize und UnInitialize ebenfalls :cdecl nutzen, da diese auch API Calls sind und keine Std Calls.

    Das habe ich jetzt auch umgesetzt. An dem Problem mit der Bufferlänge hat sich nichts geändert. Allerdings ist das auch nicht wirklich ein Problem, da ich die Bufferlänge auch selbst nach dem Empfang ermitteln kann. Daher stelle ich jetzt das Thema auf gelöst. Vielen Dank für deine professionelle Hilfe!


    Gruß

    Homer J. S.

    alpines :


    Hier ist mein vollständiger Testcode:


    BugFix :

    Häufig verwenden Dll folgenden Mechanismus: Aufruf der Dll mit allen Parametern und als Bufferlänge null (Wert "0" oder "Null"), dann wird die Bufferlänge auf den erforderlichen Wert gesetzt. Den Wert verwende ich dann um meinen Buffer auf die richtige Länge zu setzen und rufe dann die Dll korrekt auf. Ggf. muss zur Länge 1 addiert werden, falls der Buffer einen null-terminierten String halten soll (sowas steht in der Doku).

    Danke für die Idee, aber leider funktioniert es nicht. Aber im Anhang findest du die PDF mit der Dokumentation, falls du mal drüber schauen möchtest...



    Gruß

    Homer J. S.

    Dateien

    • aaeonEAPI.pdf

      (1,03 MB, 110 Mal heruntergeladen, zuletzt: )

    Vielleicht passt er auch die Buffergröße an, übergib mal einen sehr kleinen Buffer und schau dir an was er zurückgibt und was in *pBuffer und *pBufferLen drinsteht.


    Ich habe mal folgendes getestet:


    Test 1:

    Buffer= char[20]

    Buflen = 1 (Vorbelegung)

    Rückgabewert Buffer = String mit 5 Zeichen (müssen 5 Zeichen sein)

    Rückgabewert Buflen = 1

    => Kein Fehler wird zurückgegeben ($EAPI_STATUS_SUCCESS=0)


    Test 2:

    Buffer= char[1]

    Buflen = 20 (Vorbelegung)

    Rückgabewert Buffer = String mit 1 Zeichen (müssten 5 Zeichen sein)

    Rückgabewert Buflen = 20

    => Kein Fehler wird zurückgegeben ($EAPI_STATUS_SUCCESS=0)


    Test 3:

    Buffer= char[1]

    Buflen = 1 (Vorbelegung)

    Rückgabewert Buffer = String mit 1 Zeichen (müssten 5 Zeichen sein)

    Rückgabewert Buflen = 1

    => Kein Fehler wird zurückgegeben ($EAPI_STATUS_SUCCESS=0)


    Test 4:

    Buffer= char[1]

    Buflen = / (Keine Vorbelegung)

    Rückgabewert Buffer = String mit 1 Zeichen (müssten 5 Zeichen sein)

    Rückgabewert Buflen = 0

    => Kein Fehler wird zurückgegeben ($EAPI_STATUS_SUCCESS=0)


    Test 5:

    Buffer= char[20]

    Buflen = / (Keine Vorbelegung)

    Rückgabewert Buffer = String mit 5 Zeichen (müssen 5 Zeichen sein)

    Rückgabewert Buflen = 0

    => Kein Fehler wird zurückgegeben ($EAPI_STATUS_SUCCESS=0)



    Es sieht ein wenig so aus, als ob die DLL nicht das macht, was sie sollte - Oder?


    Gruß

    Homer J. S.

    alpines:

    Vielen Dank für deine Unterstützung - Dein Code funktioniert einwandfrei :party:


    Jetzt verstehe ich ein wenig mehr, was die Kommunikation mit DLL´s angeht. Somit habe ich mich auch an das Auslesen der Boardinformationen gemacht. Dies funktioniert auch schon, allerdings ändert die DLL die Bufferlänge nicht. Laut Dokumentation ist das eine “__INOUT“ Funktion und daher habe ich “by reference“ angegeben, aber die Bufferlänge bleibt bei meiner Vorgabe. Vieleicht hast du ja noch einen Tipp für mich?




    Den Code habe ich nicht gesäubert, und er sieht ehrlich gesagt ziemlich beschissen aus, du solltest ihn sauberer schreiben.

    Das dieser nicht wunderschön ist, das war/ist mir bewusst. Ich teste am Anfang immer ein wenig rum und dann wird es ins reine geschrieben. Zudem wollte ich später wahrscheinlich eine UDF daraus machen.



    Gruß

    Homer J. S.

    Hallo Zusammen,

    ich benötige nach langer Zeit nochmals eure Hilfe. Ich möchte von meinem Mainboard Informationen (Temperatur, GPIO, usw...) abrufen bzw. setzen. Allerdings komme ich mit der DLL nicht wirklich weiter. Nach der Dokumentation (pdf im Anhang) muss man erst ein "EApiLibInitialize" ausführen um gewisse andere Funktionen ausführen zu können und dies funktioniert schon mal ohne Fehlermeldung. Nach Beendigung des Programms muss man ein "EApiLibUnInitialize" ausführen was auch ohne Fehlermeldung funktioniert. Allerdings wenn ich eine andere Funktion aufrufe, dann schließt sich das Script ohne Fehlermeldung oder sonstiges. Ich muss zugeben, dass ich mit DLL´s nicht wirklich bewandert bin. Daher bitte ich euch, mir unter die Arme zu greifen und somit zu helfen.


    Enthaltene Dateien im Anhang (Zip-File):

    1 - aaeonEAPI.dll
    2 - aaeonEAPI.h
    3 - aaeonEAPI.lib
    4 - aaeonEAPI.pdf



    Mein Testcode:


    Ich bedanke mich im voraus für eure Unterstützung/Hilfe!



    Gruß

    Homer J. S.

    Dateien

    • aaeonEAPI.zip

      (1,93 MB, 83 Mal heruntergeladen, zuletzt: )

    Hallo Zusammen,
    ich habe mich letzter Zeit ein wenig mit der ModBus-UDF beschäftigt und ein Gerät läuft schon ohne Probleme. Allerdings benötige ich bei einem anderem Gerät die ModBus-Funktion "0x10" (modbus_write_registers), die in der Modbus-UDF (ModBus-UDF) nicht enthalten ist. Ich habe versucht diese selber zu integrieren aber leider ohne Erfolg. Allerdings tue ich mich auch sehr schwer mit einem DLL-Call.


    Im Anhang ist die Original Doku der ModBus-Funktion "0x10" von der libmodbus.dll (modbus_write_registers.zip).


    Hier ist die gekürzte (ohne native Funktionen) ModBus-UDF:



    Hier noch ein Link zu einem autoit.de-Thread wo @funkey und @vivus schon einiges besprochen haben: ModBus Thread


    Vieleicht findet sich ja einer von euch, der mir bezüglich der Integration helfen kann/will?!


    Vielen dank schon mal für eure Hilfe!


    Gruß
    Homer J. S.

    Hallo Zusammen,
    ich hatte nochmal etwas mehr Zeit mich mit ModBus zu beschäftigen.


    Allerdings wenn ich einen Disconnect mache, dann geht der Koppler in Störung, die sich nur durch AEG (ausschalten, einschalten, geht) lösen lässt. Das passiert allerdings nur, wenn ich nach einem Connect einen Ausgang gesetzt hatte.

    Das ist kein fehler vom ModBus bzw. der UDF, sondern das ist vom Watchdog des Beckhoff-Buskopllers. Dies kann man allerdings über den ModBus quittieren.
    Hier der Code dazu:



    Zudem schaffe ich es einfach nicht einen Analogausgang zu beschreiben. Eigentlich dachte ich, das ich dem WriteRegister lediglich eine andere Adresse mitgeben muß, aber das funktioniert so leider nicht

    Und doch, das funktioniert so. Ich habe lediglich die falsche Adresse benutzt :Face: .



    Ich hoffe, das ich dem ein oder anderem damit helfen konnte?!



    Gruß
    Homer J. S.

    Wie kommt darauf? Wenn er das Thema nicht bewusst abboniert hat bekommt er keine Email.

    ...da gebe ich dir recht. Habe mich diesbezüglich im Forum geirrt - Sorry.



    aber ich möchte sagen, dass ich es optimal finde, so wie Homer es gemacht hat.
    Einerseits aus den von ihm schon genannten Gründen, andererseits weil man so alles, was thematisch zusammen gehört, schön in einem einzelnen Thread hat. Das ist sehr vorteilhaft, wenn man die Suchfunktion benutzt.

    ...das war auch mein Denken bezüglich "Leiche ausgraben" ;)


    Gruß
    Homer J. S.

    Homer J. S.: vivus = Letzte Aktivität 6. Mai 2015, also kein Grund hier die Leichen auszugraben.


    @chip: Prinzipiell gebe ich dir ja recht, aber da es so ein spezielles Thema ist, wollte ich keinen neuen Thread erstellen. Zudem bekommt @vivus im Regelfall eine E-Mail Benachrichtigung, wenn sich was in diesem Thread tut. Was wäre den deiner Meinung nach der richtige Weg?


    Gruß
    Homer J. S.

    vivus: Erst einmal Danke für dein spitzen ModBus-UDF! Allerdings habe ich noch zwei kleine Probleme, wo du mir, oder auch gerne ein anderer, ggf. helfen könntest.


    Ich habe einen Beckhoff Koppler BK9050 und einige Module zum Testen zu Verfügung. Der Koppler mit Digitalen IO's funktioniert grundsätzlich mit deiner UDF (mit DLL) schon sehr gut. Allerdings wenn ich einen Disconnect mache, dann geht der Koppler in Störung, die sich nur durch AEG (ausschalten, einschalten, geht) lösen lässt. Das passiert allerdings nur, wenn ich nach einem Connect einen Ausgang gesetzt hatte.


    Zudem schaffe ich es einfach nicht einen Analogausgang zu beschreiben. Eigentlich dachte ich, das ich dem WriteRegister lediglich eine andere Adresse mitgeben muß, aber das funktioniert so leider nicht.


    Vielen Dank schon mal für deine (eure) Hilfe!


    Gruß
    Homer J. S.

    Homer J. S. wenn's hier einen LikeButton gäbe würde ich in klicken. Fühl dich also geehrt und füge ein Sir oder einen sonstigen Titel (außer Kaiser, König) vor deinem Namen ein!

    Danke für die Lorbeeren :). Hoffe das war nicht ironisch gemeint?


    Maxoo: Vielleicht ist es für dich etwas einfacher das Netzwerk mit Network Monitor 3.4 zu sniffen.
    => Link: https://www.microsoft.com/en-u…load/details.aspx?id=4865


    Gruß
    Sir Homer J. S. ;)

    BinDannMalWeg:
    Ich habe dein Testskript mal getestet mit Version 3.3.14.2. Im Anhang findest du das Logfiles. Ich sehe da auch die von dir beschribenen Probleme.
    Allerdings hatte auch einige schwirgkeiten seit Version 3.3.14.2 (vorher 3.3.12.0).


    Hier ein Auszug eines Skriptes von mir mit der Version 3.3.12.0:


    ...hier der Auszug des Skriptes mit der selben funktion unter Version 3.3.14.2:

    Mit dem @CRLF&@CRLF erkenne ich das Ende der gesendeten Daten.


    Vieleicht hilft dir das ja weiter?!



    Gruß
    Homer J. S.

    Dateien

    • log1.txt

      (1,08 MB, 111 Mal heruntergeladen, zuletzt: )
    • log2.txt

      (193,16 kB, 98 Mal heruntergeladen, zuletzt: )