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회의 데이터를 취하는 예는 다음과 같이 들 수 있습니다.

../../../_images/Unlimited-1.jpg

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;


}