Announcement

Collapse
No announcement yet.

Functionen einer DLL nutzen, aber wie?

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Functionen einer DLL nutzen, aber wie?

    Hallo,
    ich habe da noch dieverse probleme mit dem benutzen einer DLL.
    Es gibt zwar ein Beispiel Programm in Delphi, aber leider werden da nicht alle Functionen der DLL benutzt.
    Es hanndelt sich dabei um ein PC Scope Name PicoScope 5303..
    Wer kann mir da mal grundsätzlich helfen, wie ich alle vorgegeben Functionen (in C) umsetze in Delphi Functionen, und vorallem, was muss ich fuer Daten uebergeben an die Funktionen. Typ usw... Meine bisherigen versuche liefen alle schief. Falsche Parameter usw..
    Ein bischen Erfahrung habe ich mit einer DLL eine Ad-Wandlerkarte von GAGE(sehr teuer), gemacht, da hat alles nachher funktioniert..
    Ein Problem war z.B. dabei, das man die Recordfelder im Compiler richtig einstellen musste...
    Vielen Dank für Euere Hilfe.
    Bernd
    Bin halt kein Profi im Programmieren

  • #2
    Also das einfachste ist Du schaust Dir mal die Header der dll an. Ich habe leider kein D7 installiert aber da sollte es doch sowas wie eine Klassenansicht geben. Falls Du den Quellcode der dll hast (ich denke mal nicht) kannst Du auch da in die *.h Datei schauen um die Funktionen mit ihren Parametern einzusehen. Gibt es nicht vielleicht im Netz eine Doku zu dem Ganzen oder die Möglichkeit beim Hersteller dies anzufragen?!
    Zuletzt editiert von Nico Stöckigt; 27.10.2007, 14:40. Reason: doch 'nen Tippfehler übersehen

    Comment


    • #3
      Hallo
      danke für die Antwort..
      Es gibt das ganze paket zum download..
      Da ist ein beispile Programm in C und in Delphi(3).dabei..
      Ich brauche jemand, der mir das erklären kann, wie ich das ganze benutzen kann. Ich kann dir gerne mal die Dateien schicken.
      Bernd
      P.S. Hier mal die INC Datei dazu....
      z.B Ein Problem was ich hatte, die Function ps5000GEUnitInfo.
      Wie rufe ich die korrekt auf.. Ein teil eines String war richtig, der Rest war nur Müll...
      Es gibt auch noch ein PDF File dazu....
      ******anfang
      type
      pSmallInt = ^smallInt;
      pInteger = ^Integer;

      enThresholdMode = (Level, Window);

      enThresholdDirection = (ABOVE, BELOW, RISING, FALLING, RISING_OR_FALLING);

      enTriggerState = (CONDITION_DONT_CARE, CONDITION_TRUE, CONDITION_FALSE,CONDITION_MAX);

      enPulseWidthType = (PW_TYPE_NONE, PW_TYPE_LESS_THAN, PW_TYPE_GREATER_THAN, PW_TYPE_IN_RANGE, PW_TYPE_OUT_OF_RANGE);

      enTimeUnits = (PS5000_FS, PS5000_PS, PS5000_NS, PS5000_US, PS5000_MS, PS5000_S, PS5000_MAX_TIME_UNITS);

      tChannelProperties = record
      thresholdMajor : smallint;
      thresholdMinor : smallint;
      hysteresis : smallint;
      channel : smallint;
      thresholdMode : enThresholdMode;
      end;
      pChannelProperties = ^tChannelProperties;

      tTriggerConditions = record
      channelA : enTriggerState;
      channelB : enTriggerState;
      channelC : enTriggerState;
      channelD : enTriggerState;
      channelExt : enTriggerState;
      aux : enTriggerState;
      pulseWidthQualifier : enTriggerState;
      end;
      pTriggerConditions = ^tTriggerConditions;

      tPwqConditions = record
      channelA : enTriggerState;
      channelB : enTriggerState;
      channelC : enTriggerState;
      channelD : enTriggerState;
      channelExt : enTriggerState;
      aux : enTriggerState;
      end;
      pPwqConditions = ^tPwqConditions;

      ps5000BlockReady = procedure
      ( handle : smallint;
      status : smallint;
      parameter : Pointer

      ); {$IFDEF WIN32} stdcall; {$ENDIF}

      ps5000StreamingReady = procedure
      ( handle : smallint;
      noOfSamples : integer;
      startIndex : integer;
      overflow : smallint;
      triggerAt : integer;
      triggered : smallint;
      autoStop : smallInt; {boolean;}
      parameter : Pointer
      ); {$IFDEF WIN32} stdcall; {$ENDIF}

      function ps5000OpenUnit (var handle : smallint) : smallint;
      {$IFDEF WIN32} stdcall; external 'ps5000.dll'{$ENDIF}

      function ps5000CloseUnit (handle : smallint) : smallint;
      {$IFDEF WIN32} stdcall; external 'ps5000.dll'{$ENDIF}

      function ps5000GetUnitInfo
      ( handle : smallInt;
      var str;
      stringLength : smallInt;
      var requiredSize : smallInt;
      info : integer
      ): smallInt
      {$IFDEF WIN32} stdcall; external 'ps5000.dll'{$ENDIF}


      function ps5000SetEts
      ( handle : smallInt;
      mode : smallInt;
      etsCycles : smallInt;
      etsInterleave :smallInt;
      var sampleTimePicoseconds : integer
      ) : smallInt
      {$IFDEF WIN32} stdcall; external 'ps5000.dll'{$ENDIF}

      function ps5000SetChannel(handle:smallInt;channel:smallInt; enabled:smallInt;{boolean;}dc:smallInt;{boolean;}r ange:smallInt):smallInt{$IFDEF WIN32}stdcall; external 'ps5000.dll'{$ENDIF}
      //Aufgerufen=> ps5000SetChannel(ps5000_handle, 0 ,1 {true} ,0{false} ,10); Kanal A an
      // kanal B aus ps5000SetChannel(ps5000_handle, 1 ,0 {false} ,0{false} ,10); Kanal B aus

      function ps5000MemorySegments(handle: smallInt; nSegments : smallInt; var nMaxSamples : Integer) : smallInt
      {$IFDEF WIN32} stdcall; external 'ps5000.dll'{$ENDIF}

      function ps5000SetTriggerChannelProperties
      ( handle : smallInt;
      channelProperties : pChannelProperties;
      nChannelProperties : smallInt;
      auxOutputEnable : smallInt;
      autoTriggerMilliseconds : Integer
      ) : smallInt
      {$IFDEF WIN32} stdcall; external 'ps5000.dll'{$ENDIF}


      function ps5000SetTriggerConditions
      ( handle : smallInt;
      conditions : pTriggerConditions;
      nConditions : smallInt
      ) : smallInt
      {$IFDEF WIN32} stdcall; external 'ps5000.dll'{$ENDIF}

      function ps5000SetTriggerDirections
      ( handle : smallInt;
      channelA : enThresholdDirection;
      channelB: enThresholdDirection;
      channelC: enThresholdDirection;
      channelD: enThresholdDirection;
      ext : enThresholdDirection;
      aux : enThresholdDirection
      ) : smallInt
      {$IFDEF WIN32} stdcall; external 'ps5000.dll'{$ENDIF}


      function ps5000SetTriggerDelay
      ( handle : smallInt;
      delay : Integer
      ) : smallInt
      {$IFDEF WIN32} stdcall; external 'ps5000.dll'{$ENDIF}

      function ps5000GetTriggerOrPulseWidthQualifierEnabled
      ( handle : smallInt;
      var triggerEnabled : smallInt; {boolean}
      var pulseWidthQualifierEnabled : smallInt {boolean}
      ) : smallint;
      {$IFDEF WIN32} stdcall; external 'ps5000.dll'{$ENDIF}

      function ps5000SetPulseWidthQualifier
      ( handle : smallInt;
      conditions : pPwqConditions;
      nConditions : smallInt;
      direction : enThresholdDirection;
      lower : Integer;
      upper : Integer;
      PwqType : enPulseWidthType
      ) : smallInt
      {$IFDEF WIN32} stdcall; external 'ps5000.dll'{$ENDIF}

      function ps5000SetDataBuffers(handle:smallInt;channel:small Int;maxBufferSmallInt;minBufferSmallInt;bufferLength:Integer):smallInt
      // ps5000SetDataBuffers(ps5000_handle , 0 ,@channelA ,@channelAmin , 10000);
      {$IFDEF WIN32} stdcall; external 'ps5000.dll'{$ENDIF}

      function ps5000Stop ( handle : smallInt ) : smallInt
      {$IFDEF WIN32} stdcall; external 'ps5000.dll'{$ENDIF}

      function ps5000RunStreaming(handle:smallInt;
      // ps5000RunStreaming(ps5000_handle,
      var sampleInterval:Integer;
      // sampleInterval, war vorher def als 1
      sampleIntervalTimeUnits : enTimeUnits;
      //PS5000_US
      maxPreTriggerSamples : Integer;
      // 0
      maxPostPreTriggerSamples : Integer;
      // 10000
      autoStop : smallInt; {boolean;}
      // 1 = true
      noOfSamplesPerAggregate : Integer;
      // 10
      overviewBufferSize : Integer ) : smallInt
      // 10000
      {$IFDEF WIN32} stdcall; external 'ps5000.dll'{$ENDIF}

      function ps5000GetStreamingLatestValues
      ( handle : smallInt;
      callback : ps5000StreamingReady;
      parameter : Pointer
      ) : smallint;
      {$IFDEF WIN32} stdcall; external 'ps5000.dll'{$ENDIF}


      function ps5000GetValuesAsync
      ( handle : smallInt;
      startIndex : Integer;
      noOfSamples : Integer;
      downSampleRatio : Integer;
      downSampleRatioMode : smallInt;
      segmentIndex : smallInt;
      callback : Pointer;
      parameter : Pointer
      ) : smallint;
      {$IFDEF WIN32} stdcall; external 'ps5000.dll'{$ENDIF}


      function ps5000RunBlock
      ( handle : smallInt;
      noOfPreTriggerSamples : integer;
      noOfPostTriggerSamples : integer;
      timebase : integer;
      oversample : smallInt;
      var timeIndisposedMs : integer;
      segmentIndex : smallInt;
      callback : ps5000BlockReady;
      parameter : Pointer
      ): smallint;
      {$IFDEF WIN32} stdcall; external 'ps5000.dll'{$ENDIF}

      function ps5000GetValues
      ( handle : smallInt;
      startIndex : Integer;
      var noOfSamples : Integer;
      downSampleRatio : Integer;
      downSampleRatioMode : smallInt;
      segmentIndex : smallInt;
      var overflow : smallInt
      ) : smallint;
      {$IFDEF WIN32} stdcall; external 'ps5000.dll'{$ENDIF}


      function ps5000GetTriggerTimeOffset
      ( handle : smallInt;
      timeUpper : Integer;
      timeLower : Integer;
      timeUnits : smallInt;
      segmentIndex : smallInt
      ) : smallint;
      {$IFDEF WIN32} stdcall; external 'ps5000.dll'{$ENDIF}

      function ps5000SetEtsTimeBuffers
      ( handle : smallInt;
      timeUpper : pInteger;
      timeLower : pInteger;
      bufferLth : Integer
      ) : smallint;
      {$IFDEF WIN32} stdcall; external 'ps5000.dll'{$ENDIF}
      Zuletzt editiert von behbeh; 28.10.2007, 12:41.
      Bin halt kein Profi im Programmieren

      Comment


      • #4
        Ohje! Delphi ist schon was her bei mir... (bald 6 Jahre!)
        Also die DLL kannst Du dir ja mit
        Code:
        dllHandle := LoadLibraryEx('PICOSCOPE.DLL', 0, LOAD_LIBRARY_AS_DATAFILE);
        ins Projekt holen. Du schreibst ja nicht das es das Ganze als Komponente gibt.
        Nehmen wir mal als Beispiel die Funktion ps5000OpenUnit:
        Code:
        function ps5000OpenUnit (var handle : smallint) : smallint;
        das handle ist dann wohl der Verweis auf unsere PICOSCOPE.dll -> dllHandle
        der Rückgabewert ist ein handle, man könnte auch pointer sagen, auf die geöffnete Unit.

        Diese Angaben
        Code:
        enThresholdMode = (Level, Window);
        
        enThresholdDirection = (ABOVE, BELOW, RISING, FALLING, RISING_OR_FALLING);
        
        enTriggerState = (CONDITION_DONT_CARE, CONDITION_TRUE, CONDITION_FALSE,CONDITION_MAX);
        
        enPulseWidthType = (PW_TYPE_NONE, PW_TYPE_LESS_THAN, PW_TYPE_GREATER_THAN, PW_TYPE_IN_RANGE, PW_TYPE_OUT_OF_RANGE);
        
        enTimeUnits = (PS5000_FS, PS5000_PS, PS5000_NS, PS5000_US, PS5000_MS, PS5000_S, PS5000_MAX_TIME_UNITS);
        sind definierte Zustände (auch als Enums bezeichnet)

        darauf folgen einige Strukturen die die spezifischen Daten als ein "Objekt" halten.
        Code:
        tChannelProperties = record
        thresholdMajor : smallint;
        thresholdMinor : smallint;
        hysteresis : smallint;
        channel : smallint;
        thresholdMode : enThresholdMode;
        end;
        pChannelProperties = ^tChannelProperties;
        
        tTriggerConditions = record
        channelA : enTriggerState;
        channelB : enTriggerState;
        channelC : enTriggerState;
        channelD : enTriggerState;
        channelExt : enTriggerState;
        aux : enTriggerState;
        pulseWidthQualifier : enTriggerState;
        end;
        pTriggerConditions = ^tTriggerConditions;
        
        tPwqConditions = record
        channelA : enTriggerState;
        channelB : enTriggerState;
        channelC : enTriggerState;
        channelD : enTriggerState;
        channelExt : enTriggerState;
        aux : enTriggerState;
        end;
        pPwqConditions = ^tPwqConditions;
        am Ende jeder Struktur (record) wird definiert das auf diese mit einem Pointer zugegriffen werden kann, man also nicht direkt diese Struktur sondern ein Abbild im Speicher verwendet. (Ich würde das ja mit Klassen und Objekten machen...)

        Darauf folgen die Funktionen die spezielle Parameter erfordern. Ich weiß ja nicht was Du genau vorhast und kenne mich mit der Anwendung von Scopes ohnehin nicht wirklich aus, also kann ich dir zur konkreten Verwendung auch nicht weiterhelfen. Poste doch mal deinen Ansatz dann können wir hier weitersehen...

        Comment


        • #5
          Danke

          Hallo,
          vielen Dank für die erklärungen, die helfen mir schon mal ein stueck weiter..
          Es ist für mich sehr schwierig, diese Pointerstrkturen und wie du schreibst, die Abbilder zu verstehen, ich bin halt kein Programmier sonder ein techniker, deshlab muss ich das immer Bildlich vorstellen können.
          ich habe noch ein beispielprogramm, das stelle ich mal rein, im Monet hat sich diese Sache erledigt, das Gerät war zu schlecht fuer uns..
          Danke nochmal
          Bernd
          Bin halt kein Profi im Programmieren

          Comment

          Working...
          X