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

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.

pdf43 trang | Chia sẻ: maiphuongdc | Lượt xem: 1777 | Lượt tải: 4download
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:

  • pdfchapter5_.pdf