Hallo Leute
Ich schreibe gerade ein Delphi Programm für eine Messkarte von ADLINK
Der Hersteller hat leider nur eine Pascal
Unit mitgeliefert und einige Beispiele in C.
Hier werden z.B. Daten der Messkarte ausgelesen und in einer Datei abgespeichert.
Code:
#include "dask.h"
U16 channel=3; //4 channels
U16 range=AD_B_5_V;
char *file_name="9112d";
U32 read_count=1000;
F64 sample_rate=10000;
main()
{
I16 card, err, card_num;
printf("This program inputs %d data from CH-%d to CH-0 of PCI-9112 in %d Hz, and\nstore data to file '%s.dat'.\n\nPress any key to start the operation.\n", read_count, channel, (int)sample_rate, file_name);
printf("Please input a card number: ");
scanf(" %d", &card_num);
//getch();
if ((card=Register_Card (PCI_9112, card_num)) <0 ) {
printf("Register_Card error=%d\n", card);
exit(1);
}
err = AI_9112_Config(card, TRIG_INT_PACER);
if (err!=0) {
printf("AI_9112_Config error=%d", err);
exit(1);
}
err = AI_AsyncDblBufferMode(card, 0);
if (err!=0) {
printf("AI_DblBufferMode error=%d", err);
exit(1);
}
err = AI_ContScanChannelsToFile(card, channel, range, file_name, read_count, sample_rate, SYNCH_OP);
if (err!=0) {
printf("AI_ContReadChannel error=%d", err);
exit(1);
}
Release_Card(card);
printf("\n\nThe input data is already stored in file '%s.dat'.\n", file_name);
printf("\nPress ENTER to exit the program. "); getch();
}
Meine Umsetzung in Delphi sieht so aus:
Delphi-Quellcode:
procedure TAKonForm.daskClick(Sender: TObject);
{------------------------------------------------------------------------------+
Messkarte testen
------------------------------------------------------------------------------}
var
err,card,card_num : Smallint;
channel,range : Word;
file_name : PChar;
read_count : Cardinal;
sample_rate : Double;
begin
channel := 3;
range := AD_B_5_V;
file_name := '9112d';
read_count := 1000;
sample_rate :=10000;
card_num := 0;
card := Register_Card(PCI_9112, card_num);
if card<0 then
begin
MessageDlg('Register_Card error. Card:'+ IntToStr(card), mtError, [mbOK], 0);
exit;
end;
err := AI_9112_Config(card, TRIG_INT_PACER);
if err<>0 then
begin
MessageDlg('AI_9112_Config error '+ IntToStr(err), mtError, [mbOK], 0);
exit;
end;
err := AI_AsyncDblBufferMode(card, 0);
if err<>0 then
begin
MessageDlg('AI_DblBufferMode error '+ IntToStr(err), mtError, [mbOK], 0);
exit;
end;
err := AI_ContScanChannelsToFile(card, channel, range, file_name, read_count, sample_rate, SYNCH_OP);
if err<>0 then
begin
MessageDlg('AI_ContReadChannel error '+ IntToStr(err), mtError, [mbOK], 0);
exit;
end;
Release_Card(card);
end;
Die Routine
AI_ContScanChannelsToFile macht Probleme bei der Übergabe von file_name.
Das erzeugte File sollte 9112d.dat heissen, tatsächlich wird aber ein File mit Namen ÌtI.dat erzeugt.
Die
Unit sieht an der Stelle so aus:
Delphi-Quellcode:
function AI_ContScanChannelsToFile (CardNumber:Word; Channel:Word; AdRange:Word;
var FileName:PChar; ReadCount:Cardinal; SampleRate:Double; SyncMode:Word):Smallint;stdcall;
Die
Unit habe ich modifiziert.
"var FileName
Char" war ursprünglich "var FileName:Char"
Der zugehörige C
DLL Header:
Code:
I16 __stdcall AI_ContScanChannelsToFile (U16 CardNumber, U16 Channel, U16 AdRange,
U8 *FileName, U32 ReadCount, F64 SampleRate, U16 SyncMode);
Ich habe jetzt schon einiges probiert. Unter anderem habe ich die
Unit mit dem Programm HeadConv V4.20 frisch erzeugt.
Der Konverter gibt FileName das Format Byte, was mir aber auch nicht weiterhilft. Ich will ja einen String übergeben.
Letztendlich macht die selbst erzeugte
Unit die gleichen Probleme wie die mitgelieferte.
Langsam bin ich ratlos.