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();
}
|