COMI_US_Start


SYNOPSYS

long COMI_US_Start (HANDLE hDevice, int numCh, int *chanList,
UINT scanFreq, UINT bufSize, int trsMethod)

DESCRIPTION

  • 이 함수는 Unlimited Scan 기능을 시작합니다.

PARAMETER

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

▶ numCh : Scan 할 A/D 채널의 수.

▶ chanList : A/D Scan 을 수행할 채널 리스트를 담고 있는 배열 또는 포인터.

▶ scanFreq : A/D Scan Frequency를 지정합니다. 이 값은 SCAN 과 SCAN 사이의 시간차를 결정합니다.

▶ bufSize스캔 데이터를 저장할 환형버퍼의 크기를 지정합니다.

이 값의 단위는 바이트가 아니고 SCAN 횟수입니다. 예를 들어, 채널이 2 채널일 때 bufSize 값을 10240 으로 지정하면 실제로는 2 * 10240 * sizeof(short) = 40960 바이트 크기의 버퍼가 할당됩니다. 이 값은 1024 의 배수로 지정하는 것이 좋습니다.

▶ trsMethodA/D 디바이스에서 스캔버퍼로 데이터를 전송하는 방식을 지정합니다.

이 값은 다음의 두 값 중의 하나이어야 합니다. 단, CP 시리즈 보드에서는 TRS_SINGLE 값만 사용할 수 있습니다.

  • TRS_SINGLE => CP 시리즈 보드의 경우에는 매 채널 A/D 변환이 완료 될 때마다 그리고 SD 시리즈 보드의 경우에는 1회의 SCAN 이 완료될 때마다 인터럽트를 발생시켜 데이터를 전송합니다. 인터럽트의 한계에 따라 Scan Frequency 가 30 KHz 이상이 되면 이 방식이 적절히 작동하지 않을 수 있습니다.

  • TRS_BLOCK => 이 방식을 선택하면, A/D 디바이스는 A/D Conversion 데이터를 디바이스에 내장되어 있는 FIFO 메모리에 일단 저장하고, 1024개의 데이터가 쌓이면 인터럽트를 발생시켜 데이터를 1024개 단위로 사용자 버퍼에 전송합니다. 이 방식은 고속 A/D Scan 시에 적합합니다. 단, 이 방식은 CP 시리즈 보드에서는 사용할 수 없습니다.

RETURN VALUE

  • 실제로 설정되는 스캔 주파수를 Hz 단위로 반환합니다. 사용자가 지정한 스캔 주파수와 실제로 설정되는 스캔 주파수는 약간의 차이가 있을 수 있습니다. 이 값이 0 보다 자긍면 수행도중 에러가 발생하였음을 의미합니다.

Device

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

EXAMPLE

  • Unlimited Scan 사용예 1 : 스캔 버퍼 직접 Access 방법을 통하여 데이터를 취하는 방법

  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
100
101
/**********************************************************************************
/* [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 *fp;
 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_LoadDevice (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.txt", "w");
 fprintf (fp, "CH 0 CH4\n");
 printf("Unlimited scan has started !!\nPress any key to quit");

 pScanBuf = COMI_US_GetBufPtr(hDevice); // Get scan buffer pointer
 prv_cnt = 0; // initialize 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 scaned 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", pScanBuf[idx1], pScanBuf[idx2]);
     }
   prv_cnt = cur_cnt;
   }

   COMI_US_Stop (hDevice, TRUE);
   fclose(fp);

   COMI_UnloadDevice(hDevice);
   COMI_UnloadDll();
 }