3.1.2. COMI_PID_Enable


SYNOPSYS

BOOL COMI_PID_Enable (HANDLE hDevice)

DESCRIPTION

  • 이 함수는 고속 PID 제어가 가능하도록 합니다. PID 제어를 Enable 시킨 후 Unlimited Scan 을 시작하면 고속 PID 제어가 수행됩니다.

PARAMETER

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

RETURN VALUE

Value

Meaning

0

실패

1

성공

Device

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

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
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
/**********************************************************************************
/* [COMIDAS sample progrma by COMIZOA Inc.. Ltd]
/*
/* - Subject: COMI-SD101 보드를 이용하여 PID Control 을 하는 예제입니다.
/*   본 예제는 다음과 같은 내용을 담고 있습니다.
/*   1. A/D CH0 을 제어대상의 출력을 Feedback 받는 채널로 사용한다.
/*   2. D/A Ch0 을 제어대상에 조작량을 인가하는 채널로 사용한다.
/*   3. 레퍼런스 입력은 기본적으로 파라미터를 통하여 입력되도록 되어 있으며, 0V 와 4V 가
/*      약 2 초 간격으로 레퍼런스값으로 설정된다. 만일 외부에서 레퍼런스 입력을 주고자 한다면
/*      '#define REF_CH'의 값을 원하는 A/D 채널로 설정하면 된다.
/*   4. 제어 주파수는 선언된 '#define S_FREQ'의 값이 결정하며 Default 값은 500 Hz 로 지정되었다.
/*   5. 제어가 시작되면 레퍼런스값 및 각 A/D 채널의 값이 C:\COMIPID.TXT 파일에 저장된다.
/*   6. 제어를 시작한 후 아무키나 누르면 프로그램이 종료된다.
/*
/* - Remarks :
/*   1 . 이 예제는 COMI-SD101, COMI-SD102, COMI-SD103 에서만 적용되는 예제 입니다.
/**********************************************************************************/

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

#define DEV_ID COMI_SD101
#define NUM_CH 3    /* Number of channels                                */
#define S_FREQ 500  /* Scan freq. -> 500 Hz                              */
#define MSB 40960   /* Max scans/buffer => 이 값은 scan 버퍼의 크기를 결정.  */

#define FEED_CH 0 // - 제어대상의 출력을 Feedback 받는 A/D 채널 설정
#define DA_CH   0 // - 제어대상에 조작량을 인가할 D/A 채널 설정
#define REF_CH -1 // - 레퍼런스 채널 : -1 => 레퍼런스값을 파라미터에 의해 설정

#define LIMIT_H 10.f // Limiter high value = D/A 출력의 Limit
#define LIMIT_L 0.f // Limiter low value = D/A 출력의 Limit
#define Kp 5
#define Td 0
#define Ti 0

#define ToggleValue(v, l, h) ((V == l) ? h: l)

#define MAX_RET_SIZE 1024 // Scan buffer에서 데이터를 전달받을때 최대로 받을수 있는 크기 //

float Buffer[MAX_RET_SIZE * NUM_CH];
void main(void)
{
  HANDLE hDevice;
  FILE *fp;
  ULONG prv_cnt, ret_count, prv_time, cur_time;
  TPidParams PidParams = {0.f, LIMIT_H, LIMIT_L, Kp, Td, Ti, REF_CH, DA_CH, FEED_CH};
  int ch_list[NUM_CH] = {0, 1, 2}; // CH0 - 제어대상의 출력을 FEEDBACK
                                   // CH1, CH2 - 사용자에 따라 필요한 환경 계측

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

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

  COMI_PID_Enable(hDevice);
  COMI_PID_SetParams(hDevice, 1, &PidParams); /* PID_SetParams(..) 함수는
  반드시 PID_Enable(..)함수가 수행된 이후에 그리고 PID_Disable()함수 이전에 수행되어야 한다.*/

  /* start unlimited scan */
  if(COMI_US_Start (hDevice, NUM_CH, ch_list, S_FREQ, MSB, TRS_SINGLE) < 0) {
    /* Error 처리 */
    printf("Error : Failed to start unlimited scan!");
    printf("%s", COMI_ErrorString(COMI_LastError()));
    COMI_UnloadDevice(hDevice);
    COMI_UnloadDll();
    printf("아무키나 누르면 프로그램이 종료됩니다.. \n");
    _getch();
    exit(0);
  }

  prv_time = timeGetTime();
  /* Create a file to save data */
  fp = fopen("c:\\ComiPID.txt", "w");
  fprintf(fp,"Refer CH0 CH1 CH2\n");
  printf("Unlimited scan has started !!\n Press any key to quit\n");

  prv_cnt = 0L; // initialize count variable
  while(!kbhit())
  {
    // 약 2초 마다 레퍼런스 값을 바꾸어 펄스 형태의 레퍼런스 입력이 되도록 한다. //
    // 만일 외부 레퍼런스 입력으로 설정한 경우에는 다음의 구문은 무의미하다.     //
    cur_time = timeGetTime();
    if(cur_time - prv_time > 1000)
    {
      PidParams.Ref = ToggleValue(PidParams.Ref,0.f,4.f);
      COMI_PID_SetParams(hDevice, 1, &PidParams);
      prv_time = cur_time;
    }

    // 결과를 파일에 저장한다 //
    ret_count = COMI_US_RetrvBlock(hDevice, prv_cnt+1, MAX_RET_SIZE, Buffer, VT_FLOAT);
    for(ULONG i = 0; i<ret_count; i++)
    {
      fprintf(fp, "%7.2f %8.3f %8.3f %8.3f\n", PidParams.Ref , Buffer[i*NUM_CH], Buffer[i*NUM_CH+1], Buffer[i*NUM_CH+2]);
    }
    prv_cnt = prv_cnt + ret_count;
    printf("Refernce = %6.2f Number of saved data = %u\n" , PidParams.Ref, prv_cnt);
  }
  COMI_US_Stop(hDevice, TRUE);
  COMI_PID_Disable(hDevice);
  fclose(fp);

  COMI_UnloadDevice(hDevice);
  COMI_UnloadDll();
}