有关中泰研创USB7310采集卡中USB7KC.dll调用中的问题,在线急等,已经查询过类似帖子,但没有解决问题

JSJJZJG2011 2019-01-26 08:21:48
我根据搜索到的答案做了试验,但是一直没有解决问题,请教各位了
该dll采用结构体传递参数
为了将对模块的操作简单化。动态链接库中所有的函数的参数均通过一个结构体(ZT)来传递。现将该结构体及有关函数说明如下:
struct ZT_USBBOARD
{
long lIndex; /*模块索引值,该值在安装时被系统分配*/
HANDLE hHandle; /*模块的操作句柄(只有涉及中断时才用)*/
short nCh; /* 通道号*/
long lData; /*输入输出数据变量*/
long* plData; /*输入输出数据指针*/
long lCode; /*设备控制字,具体含义见函数说明*/
};
打开设备:
函数: long APIENTRY OpenUSB7kC(ZT_USBBOARD* bs)
功能:打开某一模块
入口有效参数:lIndex 模块索引值
出口返回参数:hHandle 模块的操作句柄(只有涉及中断时,返回才有意义)
返回值: 0 打开设备成功
-1 打开设备失败
6.3.3模拟量输入部分:
模拟量采集(AI16):
函数:long APIENTRY USB7310AI16 (ZT_USBBOARD* bs)
功能:对USB7310所有通道(32字节/16个数)模拟量数据采集。
入口有效参数: lIndex USB模块索引值
lCode 设备控制字:
lCode= 0 plData中存放的数据数为原码值
1 plData中存放的数据0-10000mv
2 plData中存放的数据-5000-5000mv
3 plData中存放的数据-10000-10000mv
出口返回参数:plData 存放数据的地址
返回值: 0 采集成功
-1 采集失败
注:1.调用GetAddress设置存放数据的数组地址(该函数是为不支持指针的计算机语言设置的,比如:Visual Basic)
2.使用支持指针的计算机语言,可不用GetAddress函数,直接将存放数据的地址,赋给plData
即可
模拟量采集(AI):
函数:long APIENTRY USB7310AI(ZT_USBBOARD* bs)
功能:对USB7310某一通道(2字节/1个数)模拟量数据采集。
入口有效参数: lIndex USB模块索引值
nCh 通道号:1-16(单端采集)
1-8(双端采集)
lCode 设备控制字:
lCode= 0 lData中存放的数据数为原码值
1 lData中存放的数据0-10000mv
2 lData中存放的数据-5000-5000mv
3 lData中存放的数据-10000-10000mv
出口返回参数:lData 存放lCode规定返回的数据
返回值: 0 采集成功
-1 采集失败
我定义了结构体
type
TZT=record
lIndex: LongInt;
hHandle: THandle;
nCh: SmallInt;
lData: LongInt;
plData: PLongInt;
lCode: LongInt;
end;
PZT = ^TZT;
定义了函数
function OpenUSB7kC(bs: PZT): integer; stdcall; external 'usb7kc.dll';
function USB7310AI16(ad: PZT): Longint; stdcall;external 'usb7kC.dll';
我在
procedure TForm1.FormCreate(Sender: TObject);
var
p:TZT;
begin
P.lIndex:=0;
OpenUSB7kC(@P);
end;
可以成功
但在
procedure TForm1.tmr1Timer(Sender: TObject);
var
p1:TZT;
begin
p1.lIndex:=0;
p1.lCode:=1;
USB7310AI16(@p1);
end;
出错access violation at 0x00000016b
我是新手,我该如何采集数据,我如果定义一个整型变量,怎样把采集到的数据赋值给它,说明书中:使用支持指针的计算机语言,可不用GetAddress函数,直接将存放数据的地址,赋给plData是什么意思,我该如何编写语句,谢谢大家
...全文
1037 30 打赏 收藏 转发到动态 举报
写回复
用AI写文章
30 条回复
切换为时间正序
请发表友善的回复…
发表回复
flybirding10011 2019-01-28
  • 打赏
  • 举报
回复
很棒啊 非常棒
qq_39787134 2019-01-28
  • 打赏
  • 举报
回复
谢谢你,我来试一下,如有问题,再问,新手,找不到资料,再次谢谢
JSJJZJG2011 2019-01-27
  • 打赏
  • 举报
回复
我试过读数据,还是出错,完全根据各位的写法,但是还是采集数据出错,也就是调用USB7310AI16函数时出错,谢谢大家了
JSJJZJG2011 2019-01-27
  • 打赏
  • 举报
回复
谢谢你,我来试一下,如有问题,再问,新手,找不到资料,再次谢谢
doloopcn 2019-01-27
  • 打赏
  • 举报
回复
很奇怪,不是应该用PZT,你为什么老要用TZT
TZT_USBBOARD=record
lIndex : LongInt;
hHandle : THandle;
nCh : SmallInt;
lData : LongInt;
plData : PLongInt;
lCode : LongInt;
end;
PZT_USBBOARD = ^TZT_USBBOARD;
//////
var
ZT_USBBOARDData:PZT_USBBOARD;
begin
new(ZT_USBBOARDData);

//====打开USB======//
ZT_USBBOARDData^.lIndex:=0;
OpenUSB7kC(ZT_USBBOARDData);
//=====读数据=====//
ZT_USBBOARDData^.lIndex:=0;
ZT_USBBOARDData^.lCode :=0;
USB7310AI16(ZT_USBBOARDData);


//====Timer事件一般不能上面那样写====//
//=======这样写会导致上一个还没有读完,下一个又发出去了=========//
procedure TForm1.tmr1Timer(Sender: TObject);
var
p1:TZT;
begin
TTimer(Sender).Enabled:=False;//先停止,处理代码
p1.lIndex:=0;
p1.lCode:=1;
USB7310AI16(@p1);
TTimer(Sender).Enabled:=True;//处理完了,再开启
end;
JSJJZJG2011 2019-01-27
  • 打赏
  • 举报
回复
我找厂家要例子程序,厂家说板卡太老,没有delphi版的例子程序,所以急等解决,谢谢
JSJJZJG2011 2019-01-27
  • 打赏
  • 举报
回复
引用 4 楼 BlueStorm的回复:
你看一下是不是要先初始化一下plData的值: p1. plData := @(p1.lData);

procedure TForm1.tmr1Timer(Sender: TObject);
var
  p1:TZT;
begin
  p1.lIndex:=0;
  p1.lCode:=1;
  p1. plData := @(p1.lData);
  USB7310AI16(@p1);
end;
谢谢BlueStorm,我试过了还是出错,在USB7310AI16行上面,显示access at violation at address 1000132D in module 'usb7kc.dll' read of address 00000001'错误
看那山瞧那水 2019-01-27
  • 打赏
  • 举报
回复
用结构是不是和数据类型对齐有关?加个packed试试?
BlueStorm 2019-01-27
  • 打赏
  • 举报
回复
你看一下是不是要先初始化一下plData的值: p1. plData := @(p1.lData);

procedure TForm1.tmr1Timer(Sender: TObject);
var
  p1:TZT;
begin
  p1.lIndex:=0;
  p1.lCode:=1;
  p1. plData := @(p1.lData);
  USB7310AI16(@p1);
end;
JSJJZJG2011 2019-01-27
  • 打赏
  • 举报
回复
谢谢各位回复,我已经根据查到的资料改过了,看我上面的程序,但还是不行,我对这一块不是很懂,你有缘的朋友详细看一下我的提问,谢谢大家
BlueStorm 2019-01-27
  • 打赏
  • 举报
回复
C语言中struct的数据对齐方式一般是4字节对齐,delphi 7的record的默认数据对齐方式好像是1字节对齐,而Delphi 2009及以上默认的数据对齐方式是8字节对齐,因此在定义record前要把数据对齐方式改为4字节对齐:

{$A4}
type
  TZT=record
    lIndex: LongInt;
    hHandle: THandle;
    nCh: SmallInt;
    lData: LongInt;
    plData: PLongInt;
    lCode: LongInt;
  end;
BlueStorm 2019-01-27
  • 打赏
  • 举报
回复
问题解决了就好
JSJJZJG2011 2019-01-27
  • 打赏
  • 举报
回复
谢谢bluestorm,我用
procedure TForm1.tmr1Timer(Sender: TObject);
begin
ZT.lIndex := 0;
ZT.lCode := 1;
ZT.plData := @DataArr;
USB7310AI16(ZT);
edt1.Text:=IntToStr(DataArr[0]);
end;
可以了,也就是在timer下加了
ZT.plData := @DataArr;
现在输入信号变化时,edt1内数值实时变化,再次谢谢你
JSJJZJG2011 2019-01-27
  • 打赏
  • 举报
回复
BLueStorm,你好,我用这段
procedure TForm1.tmr1Timer(Sender: TObject);
begin
ZT.lIndex := 0;
ZT.lCode := 1;
USB7310AI16(ZT);
edt1.Text:=IntToStr(ZT.plData^);
end;
edt1内显示始终是0
JSJJZJG2011 2019-01-27
  • 打赏
  • 举报
回复
谢谢BLueStorm,可以采集出数据,而且和厂家提供的测试数据一样,但是在输入信号变化时,不会实时变化,当关掉程序重新编译,会显示新的数值,在用Btn时,第一次Btn可以显示数值,但第二次虽然输入信号变化了,按Btn数值还是不会变化,也必须关掉程序重新编译,才能显示正确的数值,我再想想,再次谢谢BLueStorm,我是20年前的大学生,现在年龄也40多了,学的机械设计,目前主要是从事机械设计方面的工作,大学学的还是Pascal语言,现在只是业余用Delphi编小程序,也就是一般的流程程序,对于指针,数据库等都不是很精,所以有些问题很幼稚,但都是找了厂家和在网上搜索后来问的,如果找到类似的,我也不会麻烦大家,再次谢谢,我在江苏泰州,各位朋友如在附近,可以交朋友
BlueStorm 2019-01-27
  • 打赏
  • 举报
回复

procedure TForm1.tmr1Timer(Sender: TObject);
begin
  ZT.lIndex := 0;
  ZT.lCode  := 1;
  USB7310AI16(ZT);
  edt1.Text:=IntToStr(ZT.plData^);
end;
BlueStorm 2019-01-27
  • 打赏
  • 举报
回复
就是你说的这么做就可以了:
引用 21 楼 JSJJZJG2011 的回复:
十分感谢BLueStorm,按你的程序可以编译,再次请教我在Timer中实时显示采集的值,但数值不实时变化,我该怎么做,谢谢帮看看是什么原因,我新手,感激不尽 procedure TForm1.tmr1Timer(Sender: TObject); begin ZT.lIndex := 0; ZT.lCode := 1; USB7310AI16(ZT); edt1.Text:=IntToStr(DataArr[0]); end;
  • 打赏
  • 举报
回复
你何止新手,你纯粹就是without a clue~~~
JSJJZJG2011 2019-01-27
  • 打赏
  • 举报
回复
十分感谢BLueStorm,按你的程序可以编译,再次请教我在Timer中实时显示采集的值,但数值不实时变化,我该怎么做,谢谢帮看看是什么原因,我新手,感激不尽
procedure TForm1.tmr1Timer(Sender: TObject);
begin
ZT.lIndex := 0;
ZT.lCode := 1;
USB7310AI16(ZT);
edt1.Text:=IntToStr(DataArr[0]);
end;
BlueStorm 2019-01-27
  • 打赏
  • 举报
回复
ZT.plData := @DataArr; 改为 ZT.plData := @DataArr[0];
加载更多回复(10)

16,748

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧