4.1.1. COMI_DIO_SetUsage


SYNOPSYS

void COMI_DIO_SetUsage (HANDLE hDevice, int usage)

DESCRIPTION

  • 이 함수는 디지털 입출력 채널의 용도를 설정하는 함수입니다.

PARAMETER

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

▶ usage : 디바이스의 용도를 선택합니다. 이 값은 다음의 세 값 중 하나이어야 합니다.

  • DI_ONLY => DIO 채널 모두를 Digital Input 채널로 사용.

  • DO_DI => DIO 채널의 전반부를 Output 으로 후반부를 Input 으로 사용.

  • DI_DO => DIO 채널의 전반부를 Input 으로 후반부를 Output 으로 사용.

  • DO_ONLY => DIO 채널 모두 Digital Output 채널로 사용.

REMARKS

  • 모든 제품이 디지털 입출력 채널의 용도를 소프트웨어적으로 설정할 수 있는 것은 아닙니다.

이 함수를 지원하는 제품과 각 설정값에 따른 채널 구분은 다음과 같습니다.

../../../_images/DIO-1.jpg

EXAMPLE1

  • Single Channel Digital input/Output

 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
  /**********************************************************************************
  /*
  /* - Subject : D/I and D/O
  /* - Contents : 이 프로그램은 COMI_DO_PutOne(..)과 COMI_DI_GetOne(..)함수를
  /* 사용하여 각 1 채널에 대한 D/I 와 D/O를 수행하는 예제 입니다.
  /* - Remakrs :
  /*   1. 이 예제는 COMI-CP101 보드를 사용하는 것으로 작성되었습니다. 따라서 다른 보드를
  /*      사용하는 경우에는 COMI_LoadDevice(...)함수의 첫 번째 파라미터를 알맞은 디바이스
  /*      ID로 바꾸어야 합니다.
  /*   2. 이 프로그램은 D/O 채널 0번을 통하여 On/Off 신호를 번갈아가면서 내보내고
  /*      D/I 채널 0번을 읽어들이는 프로그램 입니다. D/O 0번 채널과 D/I 0번 채널을
  /*      서로 연결해놓으면 D/O 에서 내보낸 신호를 D/I 채널에서 읽어들일수 있습니다.
  /**********************************************************************************/

  #include <windows.h>
  #include <stdio.h>
  #include <conio.h>
  #include "Comidas.h"

  #define DI_CH 0
  #define DO_CH 0

  void main (void)
  {
      HANDLE hDevice;
      int do_state=0, di_state;

      if(!COMI_LoadDll()){
      printf("sComidas.dll load failure");
      exit(0);
      }

      hDevice = COMI_LoadDevice(COMI_CP101,0);
      if(hDevice == INVALID_HANDLE_VALUE){
         printf("Can't load specified device!");
         COMI_UnloadDll();
         exit(0);
      }

      // COMI-CP401 보드의 경우에는 DI/DO 기능을 모두 사용하기 위해 //
      // 여기서 COMI_DIO_SetUsage(DO_DI) 구문을 써주어야 합니다.  //

      while(!kbhit())
      {
          do_state ^= 1; // state 반전
          COMI_DO_PutOne(hDevice, DO_CH, do_state); // Put D/O

          /* Get D/I and print on screen */
          di_state = COMI_DI_GetOne(hDevice, DI_CH);
          printf("Status of D/I CH0 = %d\n", di_state);
          Sleep(500);
      }

      COMI_UnloadDevice(hDevice);
      COMI_UnloadDll();
  }

EXAMPLE2

  • Multi Channel digital Input/Output

 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
 /**********************************************************************************
 /* [COMIDAS sample program by COMIZOA Inc., Ltd]
 /*
 /* - Subject  : D/I and D/O
 /* - Contents : 이 프로그램은 COMI_DI_GetAll(..)과 COMI_DO_PutAll(..) 함수를
 /*              사용하여 D/I와 D/O의 8 채널을 동시에 Control 하는 예제입니다.
 /* - Remarks :
 /*   1. 이 예제는 COMI_CP101 보드를 사용하는 것으로 작성되었습니다. 따라서 다른 보드를
 /*      사용하는 경우에는 COMI_LoadDevice(...) 함수의 첫 번째 파라미터를 알맞은 디바이스
 /*      ID로 바꾸어야 합니다.
 /**********************************************************************************/

 #include <windows.h>
 #include <stdio.h>
 #include <conio.h>
 #include "Comidas.h"

 void main(void)
 {
      HANDLE hDevice;
      ULONG do_states=0, di_states;
      int di_each[8], i;

      if(!COMI_LoadDll()){
          printf("Comidas.dll load failure");
          exit(0);
      }

      hDevice = COMI_LoadDevice(COMI_CP101,0);
      if(hDevice == INVALID_HANDLE_VALUE){
          printf("Can't load specified device!");
          COMI_UnloadDll();
          exit(0);
      }

      // COMI-CP401 보드의 경우에는 DI/DO 기능을 모두 사용하기 위해 //
      // 여기서 COMI_DIO_SetUsage(DO_DI) 구문을 써주어야 합니다.  //

      while(!kbhit())
      {
          do_states = ~do_states; // 모든 D/O 채널 On/Off state 반전
          COMI_DO_PutAll(hDevice, do_states); // Put D/O
          /* Get D/I and print on screen */
          di_states = COMI_DI_GetAll(hDevice);
          /* di_states 는 전채널의 state를 담고 있다.      */
          /* 각 채널의 상태를 얻으려면 다음과 같이 bit mask  */
          /* 를 하면 된다.                                */
          for(i = 0; i<8; i++)
              di_each[i] = (di_states >> i) & 0x1;
          printf("States of DIO ~ DI7 = %d %d %d %d %d %d %d %d\n" ,
                di_each[0], di_each[1], di_each[2], di_each[3],
                di_each[4], di_each[5], di_each[6], di_each[7]);
          Sleep(500);
      }

      COMI_UnloadDevice(hDevice);
      COMI_UnloadDll();
 }

EXAMPLE3

  • 64 Channel Digital Input

 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
  /**********************************************************************************
  * [COMIDAS sample program by COMIZOA Inc., Ltd]
  *
  * - Subject : 64bit digital Input
  * - Contents : 이프로그램은 COMI_DI_GetAllEx() 함수를 사용하는 예제로써, 32채널씩 나누
  *              어서 총 64 채널의 디지털 입력값을 읽어들여 화면에 HEXA_DECIMAL 값으로 그 상태를 표시합니다.
  /**********************************************************************************/

  #include <windows.h>
  #include <stdio.h>
  #include <conio.h>
  #include "Comidas.h"

  #define DEV_ID COMI_SD403

  void main(void)
  {
      HANDLE hDevice;
      DWORD di_states[2];

      if(!COMI_LoadDll()){
          printf("Comidas.dll load failure");
          printf("아무키나 누르면 프로그램이 종료됩니다 .. \n");
          _getch();
          exit(0);
      }

      hDevice = COMI_loadDevice(DEV_ID, 0);

      if(hDevice == INVALID_HANDLE_VALUE){
          printf("Can't load specified device!");
          printf("아무키나 누르면 프로그램이 종료됩니다.. \n");
          _getch();
          COMI_UnloadDll();
          exit(0);
      }

      printf("DIO 테스트를 시작하려면 아무키나 누르십시오.\n");
      printf("아무키나 다시 누르면 프로그램이 종료됩니다. \n");
      _getch();

      while(!kbhit()){
          /* Read first 32 D/I channels (CH0~CH31) */
          di_states[0] = COMI_DI_GetAllEx(hDevice, 0);
          /* Read second 32 D/I channels (CH32~CH63) */
          di_states[1] = COMI_DI_GetAllEx(hDevice, 1);
          printf("D/I States : CH0~CH31 = %08lx CH32~CH63=%08lx\n", di_states[0], di_states[1]);
          Sleep(10);
      }
      COMI_UnloadDevice(hDevice);
      COMI_UnloadDll();
  }

EXAMPLE4

  • 64 Channel Digital OutPut

 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
  /**********************************************************************************
  * [COMIDAS sample program by COMIZOA Inc., Ltd]
  *
  * - Subject : 64bit digital Output
  * - Contents : 이 프로그램은 COMI_DO_PutAllEx()함수를 사용하는 예제로써 32채널씩 나누어서 총 64채널의
  *              디지털 출력을 내보냅니다. 이 때의 출력 상태는 전 채널 모두 on/off를 반복하여 출력됩니다.
  /**********************************************************************************/

  #include <windows.h>
  #include <stdio.h>
  #include <conio.h>
  #include "Comidas.h"

  #define DEV_ID COMI_SD402

  void main(void)
  {
      HANDLE hDevice;
      DWORD do_states[2]={0x0, 0x0};

      if(!COMI_LoadDll()){
          printf("Comidas.dll load failure");
          printf("아무키나 누르면 프로그램이 종료됩니다. . \n");
          _getch();
          exit(0);
      }

      hDevice = COMI_LoadDevice(DEV_ID, 0);
      if(hDevice == INVALID_HANDLE_VALUE){
          printf("Can't load specified device!");
          printf("아무키나 누르면 프로그램이 종료됩니다.. \n");
          _getch();
          COMI_UnloadDll();
          exit(0);
      }

      printf("DIO 테스트를 시작하려면 아무키나 누르십시오.\n");
      printf("아무키나 다시 누르면 프로그램이 종료됩니다.\n");
      _getch();

      while(!kbhit())
      {
          do_states[0] = ~do_states[0]; /* toggle the status of D/O channels */
          COMI_DO_PutAllEx(hDevice, 0, do_states[0]); /* Put first 32 D/O channels (CH0~CH31) */

          do_states[1] = ~do_states[1]; /* toggle the states of D/O channels */
          COMI_DO_PutAllEx(hDevice, 1, do_states[1]); /* Put Second 32 D/I Channels (CH32~CH63) */

          printf("D/O States : CH0 ~ CH31 = %08lx CH32~CH63 = %08lx\n", do_states[0], do_states[1]);
          Sleep(500;)
      }

      COMI_UnloadDevice(hDevice);
      COMI_UnloadDll();
  }