COMI_US_RetrvChannel


SYNOPSYS

ULONG COMI_US_RetrvChannel (HANDLE hDevice, int chOrder, ULONG startCount,
int maxNumData, void *pDestBuf, TVarType VarType)

DESCRIPTION

  • 이 함수는 A/D Scan 채널 중에서 하나의 채널에 대한 데이터 블럭을 voltage 값으로 환산하여 전달합니다. 데이터 블럭은 사용자가 지정한 startCount 에서부터 maxNumData 에서 지정한 수만큼이 됩니다.

PARAMETER

▶ hDevice : 디바이스 핸들값입니다. 이 값은 COMI_LoadDevice() 함수에 의해 얻어진 값이어야 합니다.

▶ chOrder : 데이터를 취하기 원하는 채널의 채널 리스트 상의 순서(0 Based) 입니다. 이 값은 채널 번호가 아님을 주의하여야 합니다.

▶ startCount : 전달 받고자 하는 데이터 블럭의 시작 Scan Count.

▶ maxNumData : 전달 받고자 하는 데이터 블럭의 크기(데이터 수) 를 지정 합니다. 이 값이 양수이면 startCount 부터 이후에 스캔된 데이터 중 maxNumData 에서 지정한 수 만큼 데이터를 전달합니다. 이 값이 음수이면 StartCount 부터 이전에 스캔된 데이터 중 maxNUmData 에서 지정한 수 만큼 데이터를 전달합니다.

▶ pDestBuf : 데이터를 전달 받을 버퍼 포인터를 지정합니다. 이 버퍼의 데이터형은 VarType 파라미터에서 지정한데이터형과 일치해야 합니다. 또한 이 버퍼의 크기는 maxNumData 에서 지정한 값보다 크거나 같아야 한다.

▶ VarType : pDestBuf 의 데이터 형을 지정합니다. 이 값은 다음의 값 중 하나이어야 합니다.

  • VT_SHORT => pDestBuf 가 short 형 포인터임을 의미하며, 데이터는 Voltage 로 환산되기 이전의 정수형 값으로 전달됩니다.

  • VT_FLOAT => pDestBuf 가 float 형 포인터임을 의미합니다. 데이터는 Voltage 값으로 전달됩니다.

  • VT_DOUBLE => pDestBuf 가 double 형 포인터임을 의미합니다. 데이터는 Voltage 값으로 전달됩니다.

RETURN VALUE

  • 실제 전달된 데이터 수. 만일 startCount 이후에 현재까지 스캔된 데이터 수가 maxNumData 에서 지정한 수 보다 작으면, 현재 스캔된 데이터까지만 전달하게됩니다.

Device

  • 지원 디바이스: COMI-CP101, COMI-CP201, COMI-SD101, COMI-SD102, COMI-SD103, COMI-SD104, COMI-SD201

EXAMPLE

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
 /**********************************************************************************
 /* [COMIDAS sample progrma by COMIZOA Inc.. Ltd]
 /*
 /* - Subject : Unlimited Scan
 /* - contents: 이 프로그램은 A/D CH0 와 CH4 의 두 채널을 Unlimited Scan 을 이용하여
 /*             A/D Convert를 하고 그 중 CH0의 데이터를 파일에 저장하는 예제이다. 이 함수는 스캔
 /*             버퍼를 직접 Access 하지 않고, COMI_US_RetrvChannel () 함수를 사용하여 데이터를
 /*             취한다.
 /* - Remarks :
 /*   1. 이 예제는 COMI-CP101 보드를 사용하는 것으로 작성되었습니다. 따라서 다른 보드를
 /*      사용하는 경우에는 COMI_LoadDevice(...) 함수의 첫 번째 파라미터를 알맞은 디바이스
 /*      ID로 바꾸어야 합니다.
 /**********************************************************************************/

 #include <windows.h>
 #include <stdio.h>
 #include <conio.h>
 #include "Comidas.h"

 #define NUM_CH 2      /* Number of Channel                                    */
 #define S_FREQ 1000   /* Scan freq. -> 1000 Hz                                */
 #define MSB    40960  /* Max scans/buffer => 이 값은 scan 버퍼의 크기를 결정하는데
                       /* 1024 의 배수로 지정하는 것이 좋다.                       */
 #define CH_BUF_SIZE (S_FREQ)

 void main(void)
 {
   HANDLE hDevice;
   int ch_list[2] = {0, 4}; /* scan channel list : 0번 과 4 번 채널 */
   FILE *fp;
   float *pChanBuf;
   ULONG prv_cnt=0, count;
   ULONG i;

   /* Load DLL */
   if(!COMI_LoadDll()){
     printf("Comidas.dll load failure");
     exit(0);
   }
   /* Load Device */
   hDevice = COMI_LoadDevice (COMI_CP101, 0);
   if(hDevice == INVALID_HANDLE_VALUE){
     printf("Can't load specified device!");
     COMI_UnloadDll();
     exit(0);
   }

   // Set A/D range //
   COMI_AD_SetRange(hDevice, 0, -10, 10);
   COMI_AD_SetRange(hDevice, 4, -10, 10);

   /* start unlimited scan */
   long act_freq = COMI_US_Start (hDevice, NUM_CH, ch_list, S_FREQ, MSB, TRS_SINGLE)
   if(act_freq < 0){
     /* Error 처리 */
     COMI_ErrorString (COMI_LastError());
     COMI_UnloadDevice(hDevice);
     COMI_UnloadDll();
     exit(0);
   }

   /* Create a file to save data */
   fp = fopen ("C:\\ComiUscan.txt", "w");
   fprintf(fp, " CH0\n");
   printf("Unlimited scan has started !!\nPress any key to quit");
   // Allocate a buffer to retrieve scan data //
   if((pChanBuf = (float *)malloc(sizeof(float)*CH_BUF_SIZE)) == NULL){
     printf("Memory allocation failed !");
     COMI_US_Stop(hDevice, TRUE);
     COMI_UnloadDevice(hDevice);
     COMI_UnloadDll();
     exit(0);
   }
   prv_cnt = 0;
   while(!kbhit())
   {
     // CH0 의 Scan Data를 얻어온다.                          //
     // prv_cnt 이후에 scan한 데이터수가 CH_BUF_SIZE 보다 작으면 //
     // 현재 scan된 것 까지 버퍼에 담아주고 CH_BUF_SIZE 보다 크면 //
     // CH_BUF_SIZE 만큼만 담아준다.                           //
     count = COMI_US_RetrvChannel (hDevice, 0, prv_cnt+1, CH_BUF_SIZE, pChanBuf, VT_FLOAT);
     for(i = 0; i<count; i++)
     {
       fpintf(fp, "%6.2f\n", pChanBuf[i]);
     }
     prv_cnt += count;
     printf("%d\n , prv_cnt");
     Sleep(100);
   }
   free(pChanBuf); // Free Channel Buffer
   COMI_US_Stop (hDevice, TRUE);
   fclose(fp);

   COMI_UnloadDevice(hDevice);
   COMI_UnloadDll();
 }