COMI_US_RetrvBlock


SYNOPSYS

ULONG COMI_US_RetrvBlock (HANDLE hDevice, UINT startCount,
UINT maxNumData, void *pDestBuf, TVarType VarType)

DESCRIPTION

  • 이 함수는 모든 A/D Scan 채널에 대한 데이터 블럭을 전달합니다. 데이터 블럭은 각 채널별로 사용자가 지정한 startCount 에서부터 maxNumScan 에서 지정한 수만큼이 됩니다.

PARAMETER

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

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

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

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

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

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

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

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

RETURN VALUE

  • 실제 전달된 데이터 블럭의 크기(스캔 횟수).

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
 /**********************************************************************************
 /* [COMIDAS sample progrma by COMIZOA Inc.. Ltd]
 /*
 /* - Subject : Unlimited Scan
 /* - Contents: 이 프로그램은 A/D CH0 와 CH4 의 두 채널을 Unlimited Scan 을 이용하여
 /*             A/D Convert를 하고 데이터를 파일에 저장하는 예제이다. 이 함수는 스캔버퍼를 직접
 /*             Access 하지 않고, COMI_US_RetrvBlock () 함수를 사용하여 데이터를 취한다.
 /* - 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 channels                                    */
 #define S_FREQ 1000 /* Scan freq. -> 1000 Hz                                 */
 #define MSB 40960   /* Max scans/buffer => 이 값은 scan 버퍼의 크기를 결정하는데
                     /* 1024의 배수로 지정하는것이 좋다                           */
 #define CH_BUF_SIZE (S_FREQ * NUM_CH)

 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 rage //
   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", "wt");
   fprintf(fp, "CH0 CH4\n");
   printf("Unlimited scan has started !! \nPress any key to quit...\n");
   // 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())
   {
     // 모든 채널의 SCAN 데이터를 얻어온다. //
     // prv_cnt 이후에 scan 한 데이터수가 CH_BUF_SIZE 보다 적으면 //
     // 현재 scan된 것까지 버퍼에 담아주고 CH_BUF_SIZE 보다 크면 //
     // CH_BUF_SIZE 만큼만 담아준다.
     count = COMI_US_RetrvBlock(hDevice, prv_cnt+1, CH_BUF_SIZE/NUM_CH, pChanBuf, VT_FLOAT);
     for(i = 0; i < count; i++)
       fprintf(fp, "%6.2f %6.2f\n" , pChanBuf[i*NUM_CH] , pChanBuf[i * NUM_CH+1]);
     prv_cnt += count;
     printf("%d\n", prv_cnt);
     Sleep(1000);
   }

   free(pChanBuf); // Free Channel buffer
   COMI_US_Stop(hDevice, TRUE);
   fclose(fp);

   COMI_UnloadDevice(hDevice);
   COMI_UnloadDll();
 }