COMI_US_SBPos¶
SYNOPSYS¶
UINT COMI_US_SBPos (HANDLE hDevice, int chOrder, ULONG scanCount)
DESCRIPTION¶
이 함수는 원하는 스캔 데이터가 있는 스캔 버퍼의 인덱스(Index)를 계산해줍니다. 스캔 버퍼는 환형 버퍼로 운용되므로 Scan Count 와 버퍼상의 인덱스가 항상 일치하지는 않습니다. 원하는 데이터의 버퍼상 인덱스를 얻기 위해서는 채널 순서와 Scan Count 를 가지고 약간의 조작이 필요한데, COMI_US_SBPos()는 이를 해주는 함수입니다.
PARAMETER¶
▶ hDevice : 디바이스 핸들값입니다. 이 값은 COMI_LoadDevice() 함수에 의해 얻어진 값이어야 합니다.
▶ chOrder : 데이터를 취하기 원하는 채널의 채널 리스트 상의 순서 (0 Based)입니다. 이 값은 채널 번호가 아님을 주의하여야 합니다.
▶ scanCount : 원하는 데이터의 Scan Count.
RETURN VALUE¶
chOrder 와 ScanCount 에 의해 지정된 데이터의 스캔 버퍼상의 인덱스.
Remarks¶
COMI_US_SBPos() 함수의 사용예 : 스캔 채널 배열이 {CH0, CH5} 인 경우, 가장 최근에 Scan 된 100회의 데이터를 취하는 예는 다음과 같이 들 수 있습니다.

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 97 98 99 | /**********************************************************************************
/* [COMIDAS sample program by COMIZOA Inc., Ltd]
/*
/* - Subject : Unlimited Scan
/* - Contents : 이 프로그램은 A/D CH0 와 CH4의 두 채널을 Unlimited scan 을 이용하여 A/D Convert를 하고
/* 그 결과를 파일로 저장하는 예제입니다. 이 프로그램에서는 Scan 버퍼를 직접
/* handling 하는 방법을 보여주고 있습니다.
/* - 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. -> 1000Hz*/
#define MSB 40960 /*Max scans/buffer => 이 값은 scan 버퍼의 크기를 결정하는데*/
/*1024의 배수로 지정하는 것이 좋다.*/
void main (void)
{
HANDLE hDevice;
int ch_list[2] = {0, 4}; /*Scan channel list : 0번 과 4번 채널*/
FILE *fq;
short *pScanBuf;
ULONG c, prv_cnt, cur_cnt;
UINT idx1, idx2;
/*Load DLL*/
if(!COMI_LoadDll){
printf("Comidas.dll load failure");
exit(0);
}
/*Load Device*/
hDevice = COMI_LoadDevoce (COMI_CP101, 0);
if(hDevice == INVALID_HANDLE_VALUE){
printf("Can't load specified device!");
COMI_UnloadDll();
exit(0);
}
/*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.tst", "w");
fprintf(fp, "CH0 CH4\n");
printf("Unlimited scan has started !\nPress any key to quit");
pScanBuf = COMI_US_GetBufPtr(hDevice); // Get scan buffer pointer
prv_cnt = 0; // initizalize count variable
while(!_kbhit()){
cur_cnt = COMI_US_CurCount (hDevice);
/*prv_cnt : end count of previously processed data block */
/*prv_cnt+1 : initial count of newly scand data block */
/*cur_cnt : end count of current newly scanned data block */
for(c = prv_cnt+1; c <= cur_cnt; c++)
{
/*COMI_US_SBPos (..)함수를 이용하여 각 채널의 버퍼상 인덱스를 얻는다.*/
/*이때 두번쨰 파라미터는 채널번호가 아니라 채널 리스트상의 순서이다.*/
/*즉, CH0 는 0이고, CH4 는 1 이된다.*/
idx1 = COMI_US_SBPos (hDevice, 0, c);
idx2 = COMI_US_SBPos (hDevice, 1, c);
/*File 에 데이터를 저장한다. 아래의 코드는 Voltage 값으로 저장하는*/
/*것이 아니고 정수값으로 저장된다. 이를 Voltage 값으로 환산해서*/
/*저장하려면 아래의 주석처리된 코드를 이용하면 된다.*/
/*(단, COMI_SD201 보든느 COMI_Digit16ToVolt()를 이용해야 한다.)*/
// float ch0_volt, ch4_volt;
// ch0_volt = COMI_DigitToVolt (pScanBuf[idx1], -10, 10);
// ch4_volt = COMI_DigitToVolt (pScanBuf[idx2], -10, 10);
// fprintf(fp, "%6.2f %6.2f\n", ch0_volt, ch4_volt);
fprintf(fp, "%6d %6d\n")
}
prv_cnt = cur_cnt;
}
COMI_US_Stop(hDevice, TRUE);
fclose(fp);
COMI_UnloadDevice(hDevice);
COMI_UnloadDll;
}
|