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();
}
|