AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Meilhaus PCI Karte - Inkompatible Typen

Ein Thema von Sascha.E · begonnen am 27. Nov 2006 · letzter Beitrag vom 30. Nov 2006
Antwort Antwort
Sascha.E

Registriert seit: 9. Nov 2006
Ort: Bremen
11 Beiträge
 
#1

Meilhaus PCI Karte - Inkompatible Typen

  Alt 27. Nov 2006, 09:34
Guten Morgen!
Ich bin bei der Arbeit gerade auf ein sehr unangenehmes Problem gestoßen, für das ich partout keine Lösung finden kann. Ich programmiere zur Zeit mit Delphi 5.0 an einer Steuerungssoftware einer Meilhaus PCI - Messkarte. Ganz genau die ME-4670i. Dafür verwende ich zur Anregung das im Downloadbereich von Meilhaus bereitgestellte Software Developer Kit, in dem Beispielprogramme angegeben sind.
Da ich sie als ein OnClick Ereignis verwende, habe ich zum Beispiel die AISingle Variante (näher auch im Handbuch erläutert) zum Beispiel auf eine normale Prozedur gewandelt, ohne dass es Probleme gab. Wie zu erwarten eigentlich.
(AISingle ist die in der me4000.dll vorgesehene Variante zum erfassen von Einzelwerten mit dieser Karte.)

Im Moment arbeite ich nun daran, die AI Simultaneous Funktion der Karte zu nutzen, welche zum erfassen einer Unbekannten Anzahl von Messwerten auf Timergesteuerter Basis ermöglichen soll. Dabei werden die Daten in einen Puffer geschrieben, der dann entsprechend dem Timer ausgelesen wird. Da ich dies wieder als Prozedur benötige, habe ich (wie vorher auch) die Variablendeklaration aus der Funktion extrahiert, die Function zur Prozedur erklärt und dann erstmal getestet. Nun bringt mir delphi allerdings bei folgendem Quellcode (nur die Punkte die betroffen sind, begins und ends sind richtig gesetzt und es passt auch sonst, nur taucht der unten beschriebene Fehler auf)
EDIT - hatte hier was getestet, da gibbet nen anderen Fehler! Quellcode enthält jetzt den Fehler der Angesprochen wurde, sorry :
Delphi-Quellcode:
VAR
  arrbChannelList: array [0..3] of pointer;
  uiChannelNumber: Cardinal;
  arrsiChannelScanData: array [0..3, 0..39] of Smallint;
  lwNumberOfChannelScanData: LongWord;
  arrdVoltValue: array [0..3] of Double;
  lwIndex: longWord;
  psValues:pointer; //<--- FEHLERVARIABLE
  uiNumberOfValues: Cardinal;
  pCallbackContext: pointer;
  iLastError: Integer;

{[...]}

procedure TForm1.ContinStart(Sender: TObject);
Begin
for uiChannelNumber := 0 to 3 do
  begin
    me4000AIExtractValues(
      uiChannelNumber, // Channel number
      psValues, // Data buffer <--- Inkompatible Typen, s.u.
      uiNumberOfValues, // Total number of data values
      @arrbChannelList[0], // Start of channel list
      4, // Number of entries in the channel list
      @arrsiChannelScanData[uiChannelNumber][0], // Channel data returned here
      40, // Size of channel data buffer
      lwNumberOfChannelScanData); // Number of values actually returned
                                                 // for this channel here
  end;
{[...]}
Für die Variable psValues, die sowohl in der DLL, wie in meinem Programm ein Pointer sein soll den Fehlercode "[Fehler] FinalLayout.pas(583): Inkompatible Typen: 'SmallInt' und 'Pointer'". Weder mein chef noch ich haben eine Ahnung wie das zu beseitigen sein soll, da die Deklarationen aus den Beispielen extrahiert wurden, die Variablen nirgends anders deklariert sind oder sonstwas. Wir stehen vor einem Rätsel ... Die Dll findet sich im Software Developers Kit!

Ich hoffe jemand hat den Elan sich das mal anzuschauen und kann mir dabei irgendwie helfen. Für weitere Informationen stehe ich natürlich gern zur Verfügung.
Und falls ich demnächst einen Geistesblitz haben sollte gibbet hier natürlich die Lösung!

Danke, Sascha
Wenn ich was net kriege, was ich haben will, dann mach ich den Traubenklaufuchs ...
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#2

Re: Meilhaus PCI Karte - Inkompatible Typen

  Alt 27. Nov 2006, 10:29
Herzlich willkommen in der Delphi-PRAXiS, Sascha.

Wenn du der Funktion me4000AIExtractValues() einen Datenpuffer für 40 Messwerte avisierst, dann musst du auch einen solchen Puffer vorhalten:

Delphi-Quellcode:
var
  sValues: array [0..39] of Smallint;

{[...]}

procedure TForm1.ContinStart(Sender: TObject);
Begin
for uiChannelNumber := 0 to 3 do
  begin
    me4000AIExtractValues(
      uiChannelNumber, // Channel number
      @sValues, // Data buffer <--- Inkompatible Typen, s.u.
      uiNumberOfValues, // Total number of data values
      @arrbChannelList[0], // Start of channel list
      4, // Number of entries in the channel list
      @arrsiChannelScanData[uiChannelNumber][0], // Channel data returned here
      40, // Size of channel data buffer
      lwNumberOfChannelScanData); // Number of values actually returned
                                                 // for this channel here
  end;
{[...]}
Freundliche Grüße vom marabu
  Mit Zitat antworten Zitat
Sascha.E

Registriert seit: 9. Nov 2006
Ort: Bremen
11 Beiträge
 
#3

Re: Meilhaus PCI Karte - Inkompatible Typen

  Alt 27. Nov 2006, 10:38
Danke Marabu ... werd das jetzt mal testen und schauen ob ich noch weitere Probleme finde, die ich dann bearbeiten muss das mit sicherheit is auf jeden Fall ne tolle Sache, dass du dich so schnell damit befassen konntest, da meine Ansätze bis eben alle ins leere liefen

Aktualisierung:
Also der Test ist mal klassisch fehlgeschlagen ...
Definiere ich die psValues als arry [0..x] of SmallInt, existiert beim Aufruf von @psValues in der Prozedur noch immer der Fehler: 'Smallint' und 'pointer' inkompatible Typen -.- kann es daran liegen, dass ich die Datenausleseprozedur vor der Prozedur mit der Kanalliste und der eigentlichen Werteaufnahme aufrufe, so dass da was durcheinander geht?
Wenn nicht muss es doch aber machbar sein, den Wert psValues über einen Pointer zu zuzuweisen, dass er funktioniert oder nicht?

langsam nervts echt ... 4 stunden ohne einen millimeter vorangekommen zu sein, das stresst
Wenn ich was net kriege, was ich haben will, dann mach ich den Traubenklaufuchs ...
  Mit Zitat antworten Zitat
Sascha.E

Registriert seit: 9. Nov 2006
Ort: Bremen
11 Beiträge
 
#4

Re: Meilhaus PCI Karte - Inkompatible Typen

  Alt 28. Nov 2006, 13:19
hm ... hat keiner ne idee, warum der pointer nicht funktionieren will? Sorry dass ich doppelposte, aber sonst geht der thread wahrscheinlich zu schnell unter
Wenn ich was net kriege, was ich haben will, dann mach ich den Traubenklaufuchs ...
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#5

Re: Meilhaus PCI Karte - Inkompatible Typen

  Alt 28. Nov 2006, 13:32
Sorry Sascha, aber ich kann das erst heute abend untersuchen. Sitze gerade am falschen Arbeitsplatz. Nach meiner Erinnerung wird der Datenpuffer als Zeiger-Parameter an die Funktion me4000AIExtractValues() übergeben, weshalb ich einen type mismatch eher woanders suchen würde. Zeige doch noch mal deinen aktuellen Code und markiere die Stelle an der der Compiler mault.

Freundliche Grüße
  Mit Zitat antworten Zitat
Sascha.E

Registriert seit: 9. Nov 2006
Ort: Bremen
11 Beiträge
 
#6

Re: Meilhaus PCI Karte - Inkompatible Typen

  Alt 30. Nov 2006, 10:09
Moin Marabu ... war jetzt 2 Tage net auf der Arbeit, deswegen kommt die Antwort erst jetzt. Ich Poste in 5 Minuten den Code! Muss nur kurz vom Admin account in den netzwerkaccoutn übertragen!

EDIT: hier ist erstmal der aktuelle Quellcode
Delphi-Quellcode:
psValues : ^SmallInt;
Zeiger : SmallInt;

procedure TForm1.ContinStart(Sender: TObject);
Begin
for uiChannelNumber := 0 to 3 do
  begin
    me4000AIExtractValues(
      uiChannelNumber, // Channel number
      psValues, // <--- Fehler: Type Missmatch Smallint+Pointer
      uiNumberOfValues, // Total number of data values
      @arrbChannelList[0], // Start of channel list
      4, // Number of entries in the channel list
      @arrsiChannelScanData[uiChannelNumber][0], // Channel data returned here
      40, // Size of channel data buffer
      lwNumberOfChannelScanData); // Number of values actually returned
                                                 // for this channel here
  end;
end;
so hab ichs im moment stehen ... die Zeiger-Variable ist momentan ziemlich sinnlos.

wenn ichs die variable Zeiger mit einbinde um ein array oder einfach nur den Smallint einzubinden, dann bleibt das programm trotzdem hängen ...

das sähe dann so aus:
Delphi-Quellcode:
psValues : Pointer;
Zeiger : SmallInt;

procedure TForm1.ContinStart(Sender: TObject);
Begin
Zeiger := {Hier kann stehen was will, er gibt den selben fehler};
psValues := @Zeiger;
for uiChannelNumber := 0 to 3 do
  begin
    me4000AIExtractValues(
      uiChannelNumber, // Channel number
      psValues, // <--- Fehler: Type Missmatch Smallint+Pointer
      uiNumberOfValues, // Total number of data values
      @arrbChannelList[0], // Start of channel list
      4, // Number of entries in the channel list
      @arrsiChannelScanData[uiChannelNumber][0], // Channel data returned here
      40, // Size of channel data buffer
      lwNumberOfChannelScanData); // Number of values actually returned
                                                 // for this channel here
  end;
end;
So langsam bekomm ich echt nen Affen hier ... es funktioniert keine der Pointerzuweisungen ...
Egal ob ich nach Literatur, nach meinem Wissen oder nach Vorschlägen arbeite, ich bekomme den Zeiger nicht zugewiesen um einen Buffer zu erzeugen ... und setze ich die
psValues : Smallint;
dann kompiliert er zwar, allerdings bekomme ich dann beim start die Karteninterne Fehlermeldung (wird an anderer Stelle implementiert) dass ich keinen Pointer zum Buffer habe ... ich stecke irgendwie in einer sehr tiefen misere -.-
Wenn ich was net kriege, was ich haben will, dann mach ich den Traubenklaufuchs ...
  Mit Zitat antworten Zitat
Alter Mann

Registriert seit: 15. Nov 2003
Ort: Berlin
934 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#7

Re: Meilhaus PCI Karte - Inkompatible Typen

  Alt 30. Nov 2006, 10:58
Hallo,

ohne mich zu weit aus den Fenster zu lehnen, aber fehlt das nicht ein New oder GetMem in der Art:
Delphi-Quellcode:
...
psValues : ^SmallInt;
Zeiger : SmallInt;

procedure TForm1.ContinStart(Sender: TObject);
Begin
  New(psValues);
  //bzw.
  GetMem(psValues, SizeOf(SmallInt));
...
Gruss
  Mit Zitat antworten Zitat
Sascha.E

Registriert seit: 9. Nov 2006
Ort: Bremen
11 Beiträge
 
#8

Re: Meilhaus PCI Karte - Inkompatible Typen

  Alt 30. Nov 2006, 11:27
Also: ich hab jetzt den Quellcode abgeändert, und das folgendermaßen:

Delphi-Quellcode:
type
  psvalues = ^SmallInt;
//Code

var sValues : array [0..99] of SmallInt;
//Code

procedure TForm1.ContinStart(Sender: TObject);
Begin
New(psValues);
for uiChannelNumber := 0 to 3 do
  begin
    me4000AIExtractValues(
      uiChannelNumber, // Channel number
      psValues, // Data buffer
      uiNumberOfValues, // Total number of data values
      @arrbChannelList[0], // Start of channel list
      4, // Number of entries in the channel list
      @arrsiChannelScanData[uiChannelNumber][0], // Channel data returned here
      40, // Size of channel data buffer
      lwNumberOfChannelScanData); // Number of values actually returned
                                                 // for this channel here
  end;
//...
end;
Jetzt bekomme ich an der Stelle psValues in der Schleife die Compilermeldung:
[Fehler] FinalLayout.pas(581): '(' erwartet, aber ',' gefunden.
Was will er denn da wieder deklariert haben? ich seh langsam net mehr durch -.-
Hoffe jetzt weiß nochmal jemand rat!
@alter mann: danke dir, denke jetzt bin ich schon ein stückel weiter ... vielleicht is der kommende Teil dann endlich mal machbar ... ich hasse diese Proggerei in völlig unbekanntem Gebiet ... vor allem wenn die quellcodes vom Kartenhersteller so muckig sind ...
Gruss, Sascha
Wenn ich was net kriege, was ich haben will, dann mach ich den Traubenklaufuchs ...
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#9

Re: Meilhaus PCI Karte - Inkompatible Typen

  Alt 30. Nov 2006, 11:32
Hallo Sascha,

ich habe zwar die Messkarte nicht zur Verfügung, aber nach Lesen des Handbuchs komme ich zu dem Schluss, dass da vielleicht etwas gewaltig schief läuft. Ich vermute, dass du dir das Beispiel aus dem aktuellen SDK angeschaut hast. Der Aufruf von me4000AIExtractValues() ist Bestandteil einer Callback-Routine, die du nach Vorbereitung der ChannelList mit me4000AIContinuous() veröffentlicht hast. Diese Callback-Routine kann keine Methode deiner Form sein. Ohne Callback-Routine bleibt dir nur das Polling über me4000AIGetNewValues(). Sind dir die Mechanismen klar?

Was den Datenpuffer betrifft: Der wird wohl vom Kartentreiber deklariert. Der Wert von psValues wird dir als Parameter der Callback-Routine angeliefert und du musst ihn einfach so an me4000AIExtractValues() weiterreichen. Also weg mit deiner lokalen Deklaration für psValues und vergiss auch mein sValues aus meinem ersten Beitrag.

Freundliche Grüße
  Mit Zitat antworten Zitat
Sascha.E

Registriert seit: 9. Nov 2006
Ort: Bremen
11 Beiträge
 
#10

Re: Meilhaus PCI Karte - Inkompatible Typen

  Alt 30. Nov 2006, 11:49
ich glaube ich habe meinen Fehler erkannt ...
Über das Onclick ereignis muss ich ja eigentlich nur die AIStart und AIStop Funktionen ansprechen ... den Rest kann ich deklarieren wie es im Bsp Prog vorgegeben ist, oder? Und das sollte dann die Probleme der "verschwundenen PSValues lösen ...
Ich nehm den Ganzen Krams mal ausm Code und versuche da was neues aufzubauen ...
Dachte nur dass es Vielleicht funzt, wie es beim AI Single hingehauen hat
scheint aber net so zu sein! Danke auf jeden Fall erstmal für den Denkanstoss Mara ... sobald die ganze Zeugs läuft poste ich nen Quellcode wie ich es gelöst habe, falls mal irgendwann zufällig jemand auf das selbe Problem stossen sollte, da er anfängt mit einer solchen Karte zu arbeiten
Wenn ich was net kriege, was ich haben will, dann mach ich den Traubenklaufuchs ...
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:08 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz