Mỗi PC_LABCARD có một software driver Adsapi32.dll cho
phép chúng ta có thể dùng các hàm và thủ tục viết sẵn để viết
chương trình ứng dụng bằng ngôn ngữ cấp cao như Delphi, Visual
Basic, Visual C. Điều này giúp lập trình một cách đơn giản hơn là
viết trực tiếp vào các thanh ghi vìmỗi hàm sẽ kéo tất cả các
tham số từ bảng tham số. Chúngta không cần định lại bảng
tham số mỗi khi ta gọi nó, trừ khi bảng tham số có sự thay đổi.
Chương trình cài đặt chứa trong CDROM. Trong chương trình ứng
dụng cần khai báo sử dụng driver. Driver của hãng Advantech
viết có thể sử dụng chung cho nhiều loại card của hãng và việc
đọc tìm hiểu các hàm đã viết sẵn tương đối mất nhiều thời gian.
Mục 5.3.1 trình bày một unit gồmcác hàm viết sẵn cho Delphi.
Mục 5.3.4 trình bày sơ lược driver adsapi32.
43 trang |
Chia sẻ: maiphuongdc | Lượt xem: 1872 | Lượt tải: 4
Bạn đang xem trước 20 trang tài liệu Giáo trình Đo lường và điều khiển bằng máy tính - Card thu thập tín hiệu và điều khiển, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
CN3 chọn nhờ BASE+ 10, chân Gate là DI2 (chân 3
CHƯƠNG 5: CARD THU THẬP TÍN HIỆU VÀ ĐIỀU KHIỂN TRANG 122
CN2) hay GATE0 (chân 36 CN3) chọn nhờ cầu nối JP3.
Ghi vào BASE+10 để cho phép hoặc cấm bộ đếm/ định thời
của PCL-818L tạo xung.
BASE+10 - Cho phép pacer
Bit D7 D6 D5 D4 D3 D2 D1 D0
Value x x x x x x TC1 TC0
• TC0: cấm/ cho phép pacer
TC0 = 0; cho phép pacer
TC0 = 1; pacer được điều khiển bởi TRIG0 (chân 35 CN3). Tín
hiệu này chặn xung trigger gởi từ ‘pacer’ đến bộ A/D khi nó bằng
0.
• TC1: chọn chế độ nguồn xung nhịp ngõ vào Counter 0.
TC1 = 0; counter 0 nhận xung clock ngoài (chân 17 CN3)
TC1 = 1; counter 0 nhận xung clock 100KHz ở bên trong.
5.2.8 Các thanh ghi điều khiển và đọc/ghi bộ đếm
Bộ định thì 8254 sử dụng bốn thanh ghi BASE+12, BASE+13,
BASE+14, BASE+15. Các chức năng của các thanh ghi này được
liệt kê trong bảng 5.14.
Tác giả: TS Nguyễn Đức Thành Trang 123
Thành phố Hồ Chí Minh, tháng 4 năm 2006
Bảng 5.4
Thanh ghi Chức năng Thanh ghi Chức năng
BASE+12 Counter 0 đọc/ghi BASE+14 Counter 2 đọc/ghi
BASE+13 Counter 1 đọc/ghi BASE+15 Điều khiển bộ đếm
Do bộ đếm 8254 có cấu trúc 16 bit, nên mỗi dữ liệu đọc/ ghi
được chia làm 2 byte: byte thấp (LSB), byte cao (MSB). Để tránh
phạm lỗi đọc/ghi sai, cần chú ý thao tác đọc ghi từng đôi (tức mỗi
lần đọc/ghi hai byte) và theo đúng thứ tự byte. Chi tiết về thanh
ghi điều khiển của 8254 xem ở Chương 3.
5.3 CHUYỂN ĐỔI A/D, D/A & DO
5.3.1 Lập trình trực tiếp
Card PCL-818 có thể lập trình bằng kỹ thuật đã trình bày ở
Chương 4, nghĩa là truy cập trực tiếp các thanh ghi của card.
1- Chuyển đổi A/D
Có thể kích đổi A/D bằng phần mềm, bằng xung ngoài hay
bằng pacer on board. Bit 1 và 0 của thanh ghi BASE+9 sẽ chọn
nguồn trigger tương ứng.
Khi chọn kích pacer tần số kích từ 2,5 MHz đến 71 phút một
xung. Khi chọn kích ngoài, nguồn kích định bởi cầu nối JP3 chọn
tín hiệu kích là TRIGO (chân 35 CN3) hay DI0 (chân 1 CN2).
Việc truyền kết quả A/D cho máy tính có thể thực hiện bằng
chương trình điều khiển, bằng ngắt hay DMA.
Các bước hình thành để chuyển đổi A/D với trigger bằng
phần mềm và truyền kết quả A/D bằng chương trình điều khiển:
- Đặt tầm vào cho mỗi kênh A/D.
- Đặt kênh vào bằng cách chỉ rõ tầm quét kênh.
- Kích đổi A/D bằng cách ghi vào BASE+0 một số bất kỳ nào đó.
- Kiểm tra chuyển đổi đã kết thúc chưa bằng cách đọc bit
EOC của thanh ghi trạng thái.
- Đọc kết quả chuyển đổi ở thanh ghi BASE+ 0 và BASE+ 1.
CHƯƠNG 5: CARD THU THẬP TÍN HIỆU VÀ ĐIỀU KHIỂN TRANG 124
- Chuyển dữ liệu từ số nhị phân thành số nguyên.
2- Chuyển đổi D/A
Ghi vào thanh ghi BASE+ 4 và BASE+ 5. Khi ghi dữ liệu cho
kênh D/A phải ghi byte thấp trước. Byte thấp này được giữ tạm
thời trong một thanh ghi và không được xuất ra. Sau khi ghi xong
byte cao thì khi đó byte cao và byte thấp được kết hợp lại để
chuyển thành D/A.
3- Digital input và output (DI&DO)
Ta đọc DI từ thanh ghi BASE+3 (byte thấp) và thanh ghi
BASE+11 (byte cao). Sau khi đọc dữ liệu sẽ không được chốt,
đường vào sẽ ở trạng thái thứ ba. Ta có thể xuất ra DO cũng
bằng cách dùng hai thanh ghi BASE+3 và BASE+11 này. Thanh
ghi sẽ chốt giá trị đã ghi (có thể đọc lại). Để an toàn nên ghép
nối các ngõ vào/ra digital thông qua ghép quang.
5.3.2 Lập trình theo software driver của nhà sản xuất
Mỗi PC_LABCARD có một software driver Adsapi32.dll cho
phép chúng ta có thể dùng các hàm và thủ tục viết sẵn để viết
chương trình ứng dụng bằng ngôn ngữ cấp cao như Delphi, Visual
Basic, Visual C. Điều này giúp lập trình một cách đơn giản hơn là
viết trực tiếp vào các thanh ghi vì mỗi hàm sẽ kéo tất cả các
tham số từ bảng tham số. Chúng ta không cần định lại bảng
tham số mỗi khi ta gọi nó, trừ khi bảng tham số có sự thay đổi.
Chương trình cài đặt chứa trong CDROM. Trong chương trình ứng
dụng cần khai báo sử dụng driver. Driver của hãng Advantech
viết có thể sử dụng chung cho nhiều loại card của hãng và việc
đọc tìm hiểu các hàm đã viết sẵn tương đối mất nhiều thời gian.
Mục 5.3.1 trình bày một unit gồm các hàm viết sẵn cho Delphi.
Mục 5.3.4 trình bày sơ lược driver adsapi32.
Tác giả: TS Nguyễn Đức Thành Trang 125
Thành phố Hồ Chí Minh, tháng 4 năm 2006
5.4 LẬP TRÌNH CHO CARD PCL-818L
5.4.1 Unit dùng cho card PCL-818L trong Delphi
Unit PCL818L;
Interface
CONST
base= $300; { }đia chi nen cho I/O
reg0= base + 0;
reg1= base + 1;
reg2= base + 2;
reg3= base + 3;
reg4= base + 4;
reg5= base + 5;
reg6= base + 6;
reg7= base + 7;
reg8= base + 8;
reg9= base + 9;
reg10= base + 10;
reg11= base + 11;
reg12= base + 12;
reg13= base + 13;
reg14= base + 14;
reg15= base + 15;
{ }1 Function Read_AD (var channel: byte): word
{ }2 Procedure Trig_AD;
{ }3 Procedure Set_rangeAD (range: byte);
{ }4 Procedure Set_channel AD (start, stop: byte);
{ }5 Function Dig_in: word;
{ }6 Procedure Dig_out (data: word);
{ }7 Procedure Analog_out (data: word);
{ }8 Function EOC: byte;
{ }9 Function MUX: byte;
{ }10 Function INT: byte;
{ }11 Function Next_channel: byte;
{ }12 Function INTE: byte;
CHƯƠNG 5: CARD THU THẬP TÍN HIỆU VÀ ĐIỀU KHIỂN TRANG 126
{ }13 Function IRQ: byte;
{ }14 Function DMAE: byte;
{ }15 Function Trigsource: byte;
{ }16 Procedure Set_INTE (sint: byte);
{ }17 Procedure Set_IRQ (irq: byte);
{ }18 Procedure Set_DMAE (dmae: byte);
{ }19 Procedure Set_trigsource (trs: byte);
{ }20 Procedure Clear_INT;
{ }21 Procedure Counter_enb (tc: byte);
{ }22 Procedure Set_counter (cnt, mode, dl, dh: byte);
{ }23 Procedure Select_nextchannel (setchan: byte);
{ }24 Function Read_counter (cnt: byte): word;
{ }25 procedure Reload_counter (dl1, dh1, dl2, dh2: byte);
{ }26 procedure Xuat (add:word; data: byte);
{ }27 function Nhap (add:word): byte;
implementation
Function inport (address: word): byte; { }ham nhap vao Port
var data: word;
begin
asm
mov dx, address
in ax, dx
mov data, ax
end;
inport:= data;
end;
Procedure outport (address: word; data: word); { }ham xuat ra Port
begin
asm
mov dx, address
mov ax, data
out dx, ax
end;
end;
{ }1 Function Read_AD (var channel: byte): word; { }doc du lieu bo A/D
Tác giả: TS Nguyễn Đức Thành Trang 127
Thành phố Hồ Chí Minh, tháng 4 năm 2006
var dlow, dhigh: byte;
begin
dlo:= inport (reg0);
dhigh:=inport(regl);
channel:= dlow and $0F; { }lay 4 bit thap
dlow:= (dlow and $F0) shr 4;
Read_AD:= dlow + 16*dhigh;
end;
{ }2 Procedure Trig_AD; { }kich mem bo A/D
begin
outport (reg0, $FF);
end;
{ }3 Procedure Set_rangeAD (range: byte);
{ }dat tam dien ap ngo vao AD
var rang: byte;
begin
rang:=range and $03;
outport (reg1, rang);
end;
{ }4 Procedure Set_channel AD (start: byte; stop: byte);
begin
outport (reg2, (stop shl 4) or start);
end;
{ }5 Function Dig_in: word;
begin
dig_in:=inport (reg3) + 256* inport (reg11);
end;
{ }6 Procedure Dig_out (data: word);
begin
outport (reg3, data and $00FF);
outport (reg11, (data and $FF00) shr 8);
end;
{ }7 Procedure Analog_out (data: word);
begin
outport (reg4, (data and $000F) shl 4);
outport (reg5, (data and $0FF0) shr 4);
end;
CHƯƠNG 5: CARD THU THẬP TÍN HIỆU VÀ ĐIỀU KHIỂN TRANG 128
{ }8 Function EOC: byte;
begin
EOC:= (inport (reg8) and $80) shr 7;
end;
{ }9 Function MUX: byte;
begin
MUX:= (inport (reg8) and $20) shr 5;
end;
{ }10 Function INT: byte;
begin
INT:= (inport (reg8) and $10) shr 4;
end;
{ }11 Function Next_channel: byte;
begin
Next_channel:= inport (reg8) and $0F;
end;
{ }12 Function INTE: byte;
begin
INTE:= (inport (reg9) and $80) shr 7;
end;
{ }13 Function IRQ: byte;
begin
IRQ:= (inport (reg9) and $70) shr 4;
end;
{ }14 Function DMAE: byte;
begin
DMAE:= (inport (reg9) and $04) shr 4;
end;
{ }15 Function Trigsource: byte;
begin
Trigsource:= inport (reg9) and $03;
end;
{ }16 Procedure Set_INTE (sint: byte); {dat xoa INTE}
var i: byte;
begin
i:= inport (reg9) and $7F;
outport (reg9), (sint shl 7) or i);
Tác giả: TS Nguyễn Đức Thành Trang 129
Thành phố Hồ Chí Minh, tháng 4 năm 2006
end;
{ }17 Procedure Set_IRQ (irq: byte); {chon ngo ngat}
var i: byte;
begin
i:= inport (reg9) and $8F;
outport (reg9, (irq shl 4) or i);
end;
{ }18 Procedure Set_DMAE (dmae: byte); {dat xoa DMAE}
var i: byte;
begin
i:= inport (reg9) and $FB;
outport (reg9, (dmae shl 2) or i);
end;
{ }19 Procedure Set_trigsource (trs: byte);
var i: byte;
begin
i:= inport (reg9) and $FC;
outport (reg9, i or trs);
end;
{ }20 Procedure Clear_INT;
begin
outport (reg8, $FF);
end;
{ }21 Procedure Counter_enb (tc: byte);
begin
outport (reg10, tc and $03);
end;
{ }22 Procedure Set_counter (cnt, mode, dl, dh: byte);
begin
outport (reg15, $30) + (cnt shl 6) + (mode shl 1);
outport (reg12 + cnt, dl);
outport (reg12 + cnt, dh)
end;
{ }23 Procedure Select_nextchannel (setchan: byte)
var i: byte;
begin
i:= (inport (reg8) and $F0) or setchan;
outport (reg8, i)
CHƯƠNG 5: CARD THU THẬP TÍN HIỆU VÀ ĐIỀU KHIỂN TRANG 130
end;
{ }24 Function Read_counter (cnt: byte): word; {doc LSB truoc, MSB sau}
var dl, dh, cnt0: byte;
begin
cnt0:= cnt +1;
if cnt0 = 3 then cnt0:=4
outport (reg15, $D0 + (cnt0 shl 1));
dl:= inport (reg12 + cnt);
dh:=inport (reg12 + cnt);
Read_counter:= dl + 256*dh;
end;
{ }25 Procedure Reload_counter (dl1, dh1, dl2, dh2: byte);
var dl, dh: byte;
begin
outport (reg15, $D4);
dl:= inport (reg13);
dh:= inport (reg13);
if (dl+dh = 0) then
begin
Counter_enb (1); { }counter 1, mode 2
Set_counter (1, 2, dl1, dh1);
end;
outport (reg15, $D8);
dl:= inport (reg14);
dh:= inport (reg14);
if (dl+dh = 0) then
begin
Counter_enb(2); { }counter 1, mode 2
Set_counter (2,2, dl1, dh1);
end;
end;
{ }26 Procedure Xuat (add: word; data: byte);
begin
outport (add, data);
end;
{ }27 Function Nhap (add: word): byte;
begin
nhap:=inport (add);
Tác giả: TS Nguyễn Đức Thành Trang 131
Thành phố Hồ Chí Minh, tháng 4 năm 2006
end;
end.
5.4.2 Chương trình C đổi tương đồng ra số dùng kích mềm
#include
#include
#include
#include
char *gain_str[4]={"5V","2.5V","1.25V","0.625V"};
void main()
{
int status, s_end, start, stop;
int dtl, dth, adl, adt, c_reg, s_ch_val, r_ch;
int chv, ch_gain[16];
int port, val, i, j;
port= 0x300; /* Set I/O port base address */
/********** STEP 1: INITIALIZE & SELECT SOFTWARE TRIGGER *************/
val= 0x70;
outportb(port+9, val); /* software trigger */
c_reg = inportb(port+9);
if (c_reg != val)
{
printf("PCL-818L hardware verification failed!\n");
exit(0);
}
outportb(port+8,1); /* Clear interrupt request */
printf("\n***** Please set PCL-818L's jumper 7 (A/D IN) to 5V *****\n\n");
/* ******** STEP 2: READ A/D STATUS REGISTER **************************** */
status = inportb(port+ 8);
if ((status & 0x20)== 0x20)
s_end = 1;
CHƯƠNG 5: CARD THU THẬP TÍN HIỆU VÀ ĐIỀU KHIỂN TRANG 132
else
s_end = 0;
redo:
if(s_end==1)
{
printf("Enter start channel number : ");
scanf("%d",&start);
printf("Enter stop channel number : ");
scanf("%d",&stop);
}
else
{
printf("Enter start channel number : ");
scanf("%d",&start);
printf("Enter stop channel number : ");
scanf("%d",&stop);
}
if ((s_end== 0) & (stop>7))
{
printf("Entered channel failed! Re-do!\n");
goto redo;
}
if ((s_end==1) & (stop>15))
{
printf("Entered channel failed! Re-do!\n");
goto redo;
}
if (start > stop)
{
printf("Entered channel failed!\n");
Tác giả: TS Nguyễn Đức Thành Trang 133
Thành phố Hồ Chí Minh, tháng 4 năm 2006
goto redo;
}
/*********** STEP 3: SET A/D RANGE CODE *****************/
for(i=start; i<=stop; i++)
{
printf("Enter range code for channel %d :",i);
re_enter_gain:
scanf("%d",&ch_gain[i]);
if( ch_gain[i] 3 )
{
printf("Wrong code! Enter again: ");
goto re_enter_gain;
}
outportb(port+2, i);
outportb(port+1, ch_gain[i]);
printf("\n");
}
/********* STEP 4: SET SCAN CHANNEL RANGE ***********************/
s_ch_val=stop*16+start; /* Set scan channel value */
outportb(port+2,s_ch_val);
r_ch = inportb(port+ 2); /* Read back channel value */
if (r_ch != s_ch_val)
{
printf("Scan channel setting failed!\n");
exit(0);
}
delay(1);
/********* STEP 5: PERFORM SINGLE A/D CONVERSION ***********/
do {
outportb(port+8, 0);
CHƯƠNG 5: CARD THU THẬP TÍN HIỆU VÀ ĐIỀU KHIỂN TRANG 134
outportb(port, 0);
reread:
status = inport(port+ 8);
if ((status & 0x10)== 0x10)
goto reread;
delay(1);
dtl = inportb(port);
dth = inportb(port+1);
adl = dtl/16;
adt = dth*16+ adl;
chv = dtl- adl*16;
printf(" A/D data = %d\n",adt);
printf(" Current channel = %d A/D range = %-7s\n",chv, gain_str[ch_gain[chv]]);
printf(" Next scan channel = %d\n",(status & 0x0f));
printf(" Start scan channel= %d\n",start);
printf(" Stop scan channel = %d\n",stop);
printf(" Type 'ESC' to exit or other key for another conversion.\n\n");
} while(getche()!=27);
}
5.4.3 Chương trình Qbasic
230 SCREEN 0,0,0:WIDTH 80:CLS:KEY OFF
240 PORT%=&H300 'SET I/O PORT BASE ADDRESS
310 DIM GAIN%(16)
320 '******** STEP 1: INITIALIZE & SELECT SOFTWARE TRIGGER ***************
330 'PORT%+9 ---- CONTROL REGISTER
340 OUT PORT%+9,&H70 'SELECT SOFTWARE TRIGGER
350 C.REG%=INP(PORT%+9)
360 IF C.REG% &H70 THEN PRINT"PCL-818L VERIFICATION FAILED!":STOP
370 OUT PORT%+8,1 'CLEAR INTERRUPT REQUEST
380 PRINT "***** PLEASE SET PCL-818L'S JUMPER 7 (A/D IN) TO 5V *****"
Tác giả: TS Nguyễn Đức Thành Trang 135
Thành phố Hồ Chí Minh, tháng 4 năm 2006
400 '******** STEP 2: READ A/D STATUS REGISTER ****************************
420 S.END=0
430 ST%=INP(PORT%+8)
450 IF (ST% AND &H20)=&H20 THEN S.END=1 ELSE S.END=0
538 '******** STEP 3: SET A/D RANGE ****************
540 FOR I=START% TO STP%
542 PRINT "ENTER RANGE CODE FOR CHANNEL ";I;
544 INPUT GR%
546 OUT PORT%+2,I 'CHANNEL SETTING
548 OUT PORT%+1,GR% 'RANGE SETTING
549 GAIN%(I)=GR%
550 PRINT
552 NEXT I
555 '******** STEP 4: SET SCAN CHANNEL RANGE *****************************
560 S.CH.VAL%=STP%*16+START% 'SET SCAN CHANNEL VALUE
562 OUT PORT%+2,S.CH.VAL%
564 R.CH%=INP(PORT%+2) 'READ BACK CHANNEL VALUE
570 IF R.CH% S.CH.VAL% THEN PRINT"SET SCAN CHANNEL FAILED!":STOP
600 '******** STEP 5: PERFORM SINGLE A/D CONVERSION **********
620 OUT PORT%+0,0
630 ST%=INP(PORT%+8)
640 IF (ST% AND &H80)=&H80 GOTO 630 'CHECK CONVERSION OK ?
650 DTL%=INP(PORT%+0)
660 DTH%=INP(PORT%+1)
670 ADL%=DTL%\16
680 ADT%=DTH%*16+ADL%
690 CHV%=DTL%-ADL%*16
695 PRINT"A/D READING = ";ADT%
700 PRINT"CURRENT CHANNEL = ";CHV%;
710 PRINT"NEXT CHANNEL = ";(ST% AND &HF)
CHƯƠNG 5: CARD THU THẬP TÍN HIỆU VÀ ĐIỀU KHIỂN TRANG 136
720 PRINT"START SCAN CHANNEL = ";START%
730 PRINT"STOP SCAN CHANNEL = ";STP%
740 PRINT
750 PRINT"PRESS 'SPACE' KEY TO CONTINUE"
760 A$=INKEY$ :IF A$ ="" GOTO 760
770 IF A$=" " GOTO 620
780 END
5.4.4 Thư viện adsapi32.dll
File adsapi32.dll do hãng cung cấp được cài vào thư mục hệ
thống, trong chương trình ứng dụng phải khai sử dụng driver
khai báo các hàm trong dll. Sử dụng các hàm trong thư viện giúp
chương trình mang tính chuyên nghiệp hơn, có thể lập trình
ngắt, DMA trong hệ điều hành Win988, Win2000XP. Vì file
driver (.pas, .h, .bas) khá lớn nên chỉ trình bày một phần nhỏ ở
đây (xem website www.advantech.com).
Đầu tiên phải cài đặt driver vào máy tính thư mục
Advantech\Adsapi\include sẽ chứa các file driver (.pas, .bas,.h)
khai báo các hàm của adsapì.dll (chứa trong windows\system).
Sau khi đã gắn card vào máy tính chạy chương trình Device
installation để cài đặt thông số card vào máy , card sẽ được gắn
một số là DeviceNum. Có thể có nhiều card sử dụng cùng lúc với
các số khác nhau. Khi lập trình cần phải khai báo sử dụng driver,
các hàm được gọi đến kèm theo thông số do driver qui định. Cụ
thể tùy theo ngông ngữ lập trình sử dụng. Phần sau mô tả một số
hàm của driver và ví dụ áp dụng
Device Functions Analog Input Analog Output
DRV_DeviceOpen
DRV_DeviceClose
DRV_DeviceGetFeatures
DRV_GetErrorMessage
DRV_SelectDevice
DRV_DeviceGetNumOfList
DRV_DeviceGetList
DRV_GetAddress
DRV_AIConfig
DRV_AIGetConfig
DRV_AIBinaryIn
DRV_AIScale
DRV_AIVoltageIn
DRV_MAIConfig
DRV_MAIBinaryIn
DRV_MAIVoltageIn
DRV_AOConfig
DRV_AOBinaryOut
DRV_AOVoltageOut
DRV_AOScale
Tác giả: TS Nguyễn Đức Thành Trang 137
Thành phố Hồ Chí Minh, tháng 4 năm 2006
Digital In/Out Port I/O Functions
DRV_DioReadPortByte
DRV_DioWritePortByte
DRV_DioReadBit
DRV_DioWriteBit
DRV_DioGetCurrentDOByte
DRV_DioGetCurrentDOBit
DRV_WritePortByte
DRV_WritePortWord
DRV_ReadPortByte
DRV_ReadPortWord
DRV_outp
DRV_outpw
DRV_intp
DRV_intpw
Các hàm có dạng chung
status = FUNCTION_Name(parameter 1, parameter 2...parameter n)
status là biến 4 byte, nếu hàm thực hiện tốt thì biến status trả về bằng 0, nếu không tốt thì
status0
Mở card để dùng
status = DRV_DeviceOpen(DeviceNum,DriverHandle)
Tên Hướng Loại Miêu tả
DeviceNum Input unsigned long Số của card do chương trình cài đặt của
advantech quiđịnh
DriverHandle output unsigned long Con trỏ đến cấu hình card
Đóng card khi không dùng, giải phóng bộ nhớ
status = DRV_DeviceClose(DriverHandle)
Nhận thông báo lỗi tùy theo mã lỗi
status = DRV_GetErrorMessage(ErrorCode,ErrorMsg)
Tên Hướng Loại Miêu tả
ErrorCode Input unsigned long Mã báo sai do driver gởi về
DriverHandle output con trỏ chỉ đến chuỗi thông báo Thông báo sử cố
Liệt kê card
status = DRV_SelectDevice(hCaller, GetModule, DeviceNum, Description)
Tên Hướng Loại Miêu tả
hCaller Input HWND (windows
handle)
Specify the Windows handle that is calling
this function.
GetModule Input bool, true
DeviceNum output unsigned long số của card
Description output unsigned char miêu tả card
CHƯƠNG 5: CARD THU THẬP TÍN HIỆU VÀ ĐIỀU KHIỂN TRANG 138
Đặt độ lợi cho chuyển đổi AD
status = DRV_AIConfig(DriverHandle,lpAIConfig)
Tên Hướng Loại Miêu tả
DriverHandle input long Do DRV_DevicoOpen trả về
lpAIConfig input long pointer trỏ đến record
PT_AIConfig
Qui định số kênh AI và độ lợi
kênh
Type PT_AIConfig ‘khai báo cấu trúc kểu Visual Basic
DasChan As Integer
DasGain As Integer
End Type
PT_AIConfig = Record {khai báo cấu trúc kiểu Delphi}
DasChan : Smallint;
DasGain : Smallint;
End;
typedef struct tagPT_AIConfig //khai báo kiểu C
{
USHORT DasChan; //USHORT :unsigned short
USHORT DasGain;
} PT_AIConfig, FAR * LPT_AIConfig;
Đọc độ lợi
status = DRV_AIGetConfig(DriverHandle,lpAIGetConfig)
lpAIGetConfig: input/output con trỏû đến PT_AIGetConfig
Type PT_AIGetConfig
buffer As Long ' LPDEVCONFIG_AI
size As Integer
End Type
Đọc kết quả nhị phân của A/D
status = DRV_AIBinaryIn(DriverHandle,lpAIBinaryIn)
lpAIBinaryIn:input/output, con trỏ đến PT_AIBinaryIn
Type PT_AIBinaryIn
chan As Integer ‘số kênh
TrigMode As Integer ‘ cách kích chuyển đổi
reading As Long 'kết quả nhị phân USHORT far * reading
End Type
Đọc kết quả dạng điện áp
status = DRV_AIVoltageIn(DriverHandle, lpAIVoltageIn)
Tác giả: TS Nguyễn Đức Thành Trang 139
Thành phố Hồ Chí Minh, tháng 4 năm 2006
Type PT_AIVoltageIn
chan As Integer
gain As Integer
TrigMode As Integer
voltage As Long ' FLOAT far *voltage
End Type
Đặt tỷ lệ chuyển đổi
status = DRV_AIScale(DriverHandle, lpAIScale)
Type PT_AIScale
reading As Integer
MaxVolt As Single
MaxCount As Integer
offset As Integer
voltage As Long ' FLOAT far *voltage
End Type
Đặt số kênh quét
status = DRV_MAIConfig(DriverHandle, lpMAIConfig)
Type PT_MAIConfig
NumChan As Integer
StartChan As Integer
GainArray As Long ' USHORT far *GainArray
End Type
Đọc kết quả nhị phân nhiều kênh
status = DRV_MAIBinaryIn(DriverHandle,lpMAIBinaryIn)
Type PT_MAIBinaryIn
NumChan As Integer
StartChan As Integer
TrigMode As Integer
ReadingArray As Long 'USHORT far *Reading
End Type
Đọc kết quả điện áp nhiều kênh
status = DRV_MAIVoltageIn(DriverHandle,lpMAIVoltageIn)
Type PT_MAIVoltageIn
NumChan As Integer
StartChan As Integer
GainArray As Long 'USHORT far *GainArray
TrigMode As Integer
VoltageArray As Long 'FLOAT far *VoltageArray
End Type
CHƯƠNG 5: CARD THU THẬP TÍN HIỆU VÀ ĐIỀU KHIỂN TRANG 140
Đặt cấu hình xuất điện áp
status = DRV_AOConfig(DriverHandle,lpAOConfig)
Type PT_AOConfig
chan As Integer
RefSrc As Integer
MaxValue As Single
MinValue As Single
End Type
Xuất điện áp
status = DRV_AOVoltageOut(DriverHandle,lpAOVoltageOut)
Type PT_AOVoltageOut
chan As Integer
OutputValue As Single ‘điện áp cần xuất ra
End Type
Tỷ lệ giữa nhị phân và điện áp
status = DRV_AOScale(DriverHandle,lpAOScale)
Type PT_AOScale
chan As Integer
OutputValue As Single
BinData As Long ' USHORT far *BinData
End Type
Xuất điện áp ra theo trị nhị phân
status = DRV_AOBinaryOut(DriverHandle,lpAOBinaryOut)
Type PT_AOBinaryOut
chan As Integer
BinData As Integer
End Type
Đọc ngõ vào số
status = DRV_DioReadPortByte(DriverHandle,lpDioReadPortByte)
Type PT_ReadPortByte
Port As Integer ‘ số của port
ByteData As Long ' USHORT far *ByteData
End Type
Xuất ra ngõ số
status = DRV_DioWritePortByte(DriverHandle,lpDioWritePortByte)
Type PT_DioWritePortByte
Port As Integer
Tác giả: TS Nguyễn Đức Thành Trang 141
Thành phố Hồ Chí Minh, tháng 4 năm 2006
Mask As Integer
state As Integer
End Type
Đọc một bit ngõ vào
status = DRV_DioReadBit(DriverHandle,lpDioReadBit)
Type PT_DioReadBit
Port As Integer
bit As Integer ‘từ 0 đến 7
state As Long ' 0 hay 1, USHORT far *state
End Type
Xuất ra một bit
status = DRV_DioWriteBit(DriverHandle,lpDioWriteBit)
Type PT_DioWriteBit
Port As Integer
bit As Integer
state As Integer
End Type
Xuất byte ra port
status = DRV_WritePortByte(DriverHandle,lpWritePortByte)
Type PT_WritePortByte
Port As Integer ‘địa chỉ port máy tính
ByteData As Integer
End Type
Xuất word ra port
status = DRV_WritePortByte(DriverHandle,lpWritePortWord)
Type PT_WritePortWord
Port As Integer
WordData As Integer
End Type
Đọc byte ở port in
status = DRV_ReadPortByte(DriverHandle,lpReadPortByte)
Type PT_ReadPortByte
Port As Integer
ByteData As Long ' USHORT far *ByteData
End Type
Đọc word ở port in
status = DRV_ReadPortWord(DriverHandle,lpReadPortWord)
CHƯƠNG 5: CARD THU THẬP TÍN HIỆU VÀ ĐIỀU KHIỂN TRANG 142
Type PT_ReadPortWord
Port As Integer
WordData As Long ' USHORT far *WordData
End Type
5.4.5 Ví Dụ Lập Trình Dùng Adsapi
1/ Dùng VB chuyển đổi AD
Tác giả: TS Nguyễn Đức Thành Trang 143
Thành phố Hồ Chí Minh, tháng 4 năm 2006
Private Sub cmdRead_Click()
Dim ErrCde As Long' Error code
Dim szErrMsg As String * 80
' Error string
Dim DeviceHandle As Long
Dim lpAIConfig As PT_AIConfig
Dim AiVolIn As PT_AIVoltageIn
Dim AiCtrMode As Integer
Dim voltage As Single
' Step 1: open device
ErrCde = DRV_DeviceOpen(0, DeviceHandle)
If (ErrCde 0) Then
DRV_GetErrorMessage ErrCde, szErrMsg
Response = MsgBox(szErrMsg, vbOKOnly, "Error!!")
Exit Sub
End If
' Step 2: configure input range
lpAIConfig.DasChan = 0 ' channel: 0
lpAIConfig.DasGain = 0 ' gain code: 0
ErrCde = DRV_AIConfig(DeviceHandle, lpAIConfig)
If (ErrCde 0) Then
DRV_GetErrorMessage ErrCde, szErrMsg
Response = MsgBox(szErrMsg, vbOKOnly, "Error!!")
Exit Sub
End If
' Step 3: read value
AiVolIn.chan = lpAIConfig.DasChan
AiVolIn.g
Các file đính kèm theo tài liệu này:
- chapter5_.pdf