|
DLL 이 아니고 그냥 함수인데.
extern 으로 선언해 놓은 함수입니다.
hongfox(붉은여우) 님이 쓰신 글 :
: hongfox입니다.
:
: 아래 내용을 보니 통신부분을 DLL로 쓰는것 같은데....
:
: 혹 통신 DLL의 통신 Buffer를 Grobal 변수로 사용하고 있지는 않은지요?
:
: 즉 Work_Check(),.....
: 통신 DLL에서는 Grobal 변수를 사용해서는 않됩니다.
:
: 저의 직원이 통신 DLL를 만들때 통신 Buffer를 Grobal로 변수를 사용해서 만들어
: 3개이상의 Thread에서 같은 Function을 Call할때 운선 점유한 Thread의 통신 에서만
: 통신이 되는 현상이 벌어졌습니다.
:
: 이부분을 모두 Local로 변경한 후에 즉, 통신 DLL만 변경한 후에 APP를 돌린이 정상적으로
: 3개의 Thread가 모두 정상적으로 동작 하였습니다.
:
: 아래 Fuction Logic이 저희 직원이 사용한 거와 비슷한 점으로 보아서는 통신 DLL인 것 같습니다.
:
: 이름 점검하기 위해서는 통신 DLL부분을 모두 막은 후에 돌려 보세요....
: 그럼이만....
:
: 즐프하세요.....
:
:
:
:
:
: 꼴 님이 쓰신 글 :
: : 안녕하세요.
: : 쓰레드는 Sleep이나 우선순위랑은 상관없이 제대로 돌아야 정상인데요.. ^^;
: : 쓰레드 실행부분(UpdateDisplay)이 쫌 복잡해서 원인이 뭔지는 정확히 모르겠지만..
: : 혹시 화면 Update가 안되는것을 쓰레드가 안 돌고 있다고 판단 하신건 아닌가 합니다.
: :
: : 어쨌든..
: : 소스에서 ..
: :
: : UpdateDisplay사용할때 Synchronize함수를 전혀 안 쓰렸는데.
: : 쓰레드 안에서 화면 처리하는 함수에는 Synchronize함수를 꼭 쓰셔야 합니다.
: : 이걸 안쓰면 어디서 문제가 터질지 모르니까요.
: : 이런 부분을 정확히 고쳐놓고 그 다음에 버그가 있다면 잡는게 순서입니다.
: :
: : 그리고 구조가 쫌 걸리는부분인데요.
: : while(!Terminated) 이 루틴이 Execute부분에도 있고
: : UpdateDisplay부분에도 똑같은 무한루프가 있으니 뭔가 찜찜한 구석이 있네요.
: : 쓰레드 처리할때 이런식의 구조는 문제가 있어 보입니다. ( 개인적인 경험상.. )
: :
: : 모터 구동 부분이 들어있으니 프로젝트 보내주셔도 컴파일이 안될테고..
: : 흠.... 암튼 빨리 해결되길 빕니다.
: :
: :
: :
: : 0:
: : : //head 에서는 이렇게 선언했습니다.
: : : class Tthread_A : public TThread
: : : {
: : : public:
: : : __fastcall Tthread_A(bool flag);
: : : private:
: : : void __fastcall Execute(void);
: : : void __fastcall UpdateDisplay(void);
: : : };
: : : class Tthread_B : public TThread
: : : {
: : : public:
: : : __fastcall Tthread_B(bool flag);
: : : private:
: : : void __fastcall Execute(void);
: : : void __fastcall UpdateDisplay(void);
: : : };
: : : //이건 cpp 화일입니다.
: : : //---------------------------------------------------------------------------
: : : #include <vcl.h>
: : : #pragma hdrstop
: : :
: : : #include "Unit4.h"
: : : #include "Util.h"
: : : #include <stdio.h>
: : : #include <dos.h>
: : : #include <time.h>
: : : //---------------------------------------------------------------------------
: : : #pragma package(smart_init)
: : : #pragma link "TFlatPanelUnit"
: : : #pragma resource "*.dfm"
: : : TForm4 *Form4;
: : : static int f_remain_count, f_temp_count, s_remain_count, s_temp_count, f_save_count, s_save_count;
: : : int pause_value, stop_value;
: : : char filename1[100], filename2[100], filename3[100], filename4[100];
: : : char savefile1[100000][100], savefile2[100000][100], savefile3[100000][100], savefile4[100000][100];
: : : int thread_a_run, thread_b_run;
: : : FILE *fp1, *fp2, *fp3, *fp4;
: : : //---------------------------------------------------------------------------
: : : __fastcall Tthread_A::Tthread_A(bool flag) : TThread(TRUE)
: : : {
: : : FreeOnTerminate = true;
: : : Priority = tpNormal; //우선 순위를 안정해도 별관계는 없더군요.
: : : Resume();
: : : }
: : : //---------------------------------------------------------------------------
: : : __fastcall Tthread_B::Tthread_B(bool flag) : TThread(TRUE)
: : : {
: : : FreeOnTerminate = true;
: : : Priority = tpLower; //우선 순위를 안정해도 별관계는 없더군요.
: : : Resume();
: : : }
: : : //---------------------------------------------------------------------------
: : : void __fastcall Tthread_A::Execute()
: : : {
: : : while(!Terminated) {
: : : UpdateDisplay();
: : : }
: : : }
: : : //---------------------------------------------------------------------------
: : : void __fastcall Tthread_B::Execute()
: : : {
: : : while(!Terminated) {
: : : UpdateDisplay();
: : : }
: : : }
: : : //---------------------------------------------------------------------------
: : : void __fastcall Tthread_A::UpdateDisplay()
: : : {
: : : int check, check1, pos_check, count, error = 0, timeout = 0;
: : : double spd = 0, spd_sum = 0, spd_avr = 0;
: : : double cur = 0, cur_sum = 0, cur_avr = 0;
: : : char temp[300];
: : : int cw_time, cw_rest_time, ccw_time, ccw_rest_time, total_count;
: : : int first_brake, first_accel;
: : : time_t begintime, endtime;
: : :
: : : first_brake = Form4->first_brake;
: : : first_accel = Form4->first_accel;
: : :
: : : cw_time = Form4->cw_sec;
: : : if(first_brake && first_accel)
: : : cw_rest_time = Form4->cw_rest - cw_time;
: : : else
: : : cw_rest_time = Form4->cw_rest;
: : : ccw_time = Form4->ccw_sec;
: : : if(first_brake && first_accel)
: : : ccw_rest_time = Form4->ccw_rest - ccw_time;
: : : else
: : : ccw_rest_time = Form4->ccw_rest;
: : : total_count = Form4->t_cycle;
: : : Form4->total_1->Caption = total_count;
: : :
: : : while(!Terminated) {
: : : thread_a_run = 1;
: : : if(pause_value || stop_value) break;
: : : if(first_brake && first_accel) {
: : : pos_check = 0;
: : : pos_check = Work_Check(5, PORT_0, BRAKE1_HOME);
: : : if(!pos_check) {
: : : error = 1;
: : : break;
: : : }
: : : BRAKE1_CYL_2_UPDOWN(UP);
: : : BRAKE1_CYL_1_UPDOWN(DOWN);
: : :
: : : check = Work_Check(DUR, PORT_1, BRAKE1_UPPER_2);
: : : check1 = Work_Check(DUR, PORT_1, BRAKE1_LOWER_1);
: : :
: : : //brake 1 cw test
: : : if(check && check1) {
: : : spd_sum = 0, cur_sum = 0;
: : : pos_check = 0, count = 0;
: : : Power_1(1); //POWER1_BRAKE(ON);
: : : BRAKE1_CW(ON);
: : : begintime = time(NULL);
: : : while(1) {
: : : endtime = time(NULL);
: : : if(difftime(endtime, begintime) > cw_time) {
: : : if(pos_check) break;
: : : }
: : : if(!pos_check) {
: : : spd = ConvertData(4, 10);
: : : cur = ConvertData(12, 10);
: : : spd_sum += spd;
: : : cur_sum += cur;
: : : count++;
: : : }
: : : pos_check = Limit_Check(PORT_0, BRAKE1_END);
: : : if(pos_check) BRAKE1_CW(OFF);
: : : if(pause_value || stop_value) break;
: : : if(difftime(endtime, begintime) > 20) {
: : : timeout = 1;
: : : break;
: : : }
: : : }
: : : if(timeout == 1) break;
: : : if(pause_value || stop_value) break;
: : : BRAKE1_CW(OFF);
: : : POWER1_BRAKE(OFF);
: : : spd_avr = spd_sum / count;
: : : cur_avr = cur_sum / count;
: : : sprintf(temp,"%d cw : load : %1.0f spd : %1.2f cur : % 1.2f",f_temp_count+1,cycle_spec[0], spd_avr, cur_avr);
: : : sprintf(savefile1[f_save_count],"%d,cw,load,%1.0f,spd,%1.2f,cur,%1.2f\n",f_temp_count+1,cycle_spec[0],spd_avr,cur_avr);
: : : fprintf(fp1,"%s",savefile1[f_save_count]);
: : : Form4->Memo1->Lines->Add(temp);
: : : //accel 1 cw test
: : : pos_check = 0;
: : : pos_check = Work_Check(5, PORT_0, ACCEL1_HOME);
: : : if(!pos_check) {
: : : error = 4;
: : : break;
: : : }
: : : ACCEL1_CYL_2_UPDOWN(UP);
: : : ACCEL1_CYL_1_UPDOWN(DOWN);
: : :
: : : check = Work_Check(DUR, PORT_0, ACCEL1_UPPER_2);
: : : check1 = Work_Check(DUR, PORT_0, ACCEL1_LOWER_1);
: : :
: : : if(check && check1) {
: : : spd_sum = 0, cur_sum = 0;
: : : pos_check = 0, count = 0;
: : : Power_1(2); //POWER1_ACCEL(ON);
: : : BRAKE1_CCW(ON);
: : : begintime = time(NULL);
: : : while(1) {
: : : endtime = time(NULL);
: : : if(difftime(endtime, begintime) > cw_time) {
: : : if(pos_check) break;
: : : }
: : : if(!pos_check) {
: : : spd = ConvertData(1, 10);
: : : cur = ConvertData(12, 10);
: : : spd_sum += spd;
: : : cur_sum += cur;
: : : count++;
: : : }
: : : pos_check = Limit_Check(PORT_0, ACCEL1_END);
: : : if(pos_check) BRAKE1_CCW(OFF);
: : : if(pause_value || stop_value) break;
: : : if(difftime(endtime, begintime) > 20) {
: : : timeout = 3;
: : : break;
: : : }
: : : }
: : : if(timeout == 3) break;
: : : if(pause_value || stop_value) break;
: : : BRAKE1_CCW(OFF);
: : : POWER1_ACCEL(OFF);
: : : spd_avr = spd_sum / count;
: : : cur_avr = cur_sum / count;
: : : sprintf(temp,"%d cw : load : %1.0f spd : %1.2f cur : %1.2f",f_temp_count+1,cycle_spec[0],spd_avr, cur_avr);
: : : sprintf(savefile2[f_save_count],"%d,cw,load,%1.0f,spd,%1.2f,cur,%1.2f\n",f_temp_count+1,cycle_spec[0],spd_avr,cur_avr);
: : : fprintf(fp2,"%s",savefile2[f_save_count]);
: : : Form4->Memo2->Lines->Add(temp);
: : : begintime = time(NULL);
: : : while(1) {
: : : endtime = time(NULL);
: : : if(difftime(endtime, begintime) > cw_rest_time) {
: : : break;
: : : }
: : : Form4->pnl_1->Caption = difftime(endtime, begintime);
: : : if(pause_value || stop_value) break;
: : : }
: : : if(pause_value || stop_value) break;
: : : //brake 1 ccw test
: : : pos_check = 0;
: : : pos_check = Work_Check(5, PORT_0, BRAKE1_END);
: : : if(!pos_check) {
: : : error = 7;
: : : break;
: : : }
: : : BRAKE1_CYL_1_UPDOWN(UP);
: : : BRAKE1_CYL_2_UPDOWN(DOWN);
: : :
: : : check = Work_Check(DUR, PORT_1, BRAKE1_UPPER_1);
: : : check1 = Work_Check(DUR, PORT_1, BRAKE1_LOWER_2);
: : :
: : : if(check && check1) {
: : : spd_sum = 0, cur_sum = 0;
: : : pos_check = 0, count = 0;
: : : Power_1(1); //POWER1_BRAKE(ON);
: : : BRAKE1_CCW(ON);
: : : begintime = time(NULL);
: : : while(1) {
: : : endtime = time(NULL);
: : : if(difftime(endtime, begintime) > ccw_time) {
: : : if(pos_check) break;
: : : }
: : : if(!pos_check) {
: : : spd = ConvertData(4, 10);
: : : cur = ConvertData(12, 10);
: : : spd_sum += spd;
: : : cur_sum += cur;
: : : count++;
: : : }
: : : pos_check = Limit_Check(PORT_0, BRAKE1_HOME);
: : : if(pos_check) BRAKE1_CCW(OFF);
: : : if(pause_value || stop_value) break;
: : : if(difftime(endtime, begintime) > 20) {
: : : timeout = 2;
: : : break;
: : : }
: : : }
: : : if(timeout == 2) break;
: : : if(pause_value || stop_value) break;
: : : BRAKE1_CCW(OFF);
: : : POWER1_BRAKE(OFF);
: : : spd_avr = spd_sum / count;
: : : cur_avr = cur_sum / count;
: : : sprintf(temp,"%d ccw : load : %1.0f spd : %1.2f cur : %1.2f",f_temp_count+1,cycle_spec[0],spd_avr, cur_avr);
: : : sprintf(savefile1[++f_save_count],"%d,ccw,load,%1.0f,spd,%1.2f,cur,%1.2f\n",f_temp_count+1,cycle_spec[0],spd_avr,cur_avr);
: : : fprintf(fp1,"%s",savefile1[f_save_count]);
: : : Form4->Memo1->Lines->Add(temp);
: : : //accel 1 ccw test
: : : pos_check = 0;
: : : pos_check = Work_Check(5, PORT_0, ACCEL1_END);
: : : if(!pos_check) {
: : : error = 10;
: : : break;
: : : }
: : : ACCEL1_CYL_1_UPDOWN(UP);
: : : ACCEL1_CYL_2_UPDOWN(DOWN);
: : :
: : : check = Work_Check(DUR, PORT_0, ACCEL1_UPPER_1);
: : : check1 = Work_Check(DUR, PORT_0, ACCEL1_LOWER_2);
: : :
: : : if(check && check1) {
: : : pos_check = 0, count = 0;
: : : spd_sum = 0, cur_sum = 0;
: : : Power_1(2); //POWER1_ACCEL(ON);
: : : BRAKE1_CW(ON);
: : : begintime = time(NULL);
: : : while(1) {
: : : endtime = time(NULL);
: : : if(difftime(endtime, begintime) > Form4->cw_sec) {
: : : if(pos_check) break;
: : : }
: : : if(!pos_check) {
: : : spd = ConvertData(1, 10);
: : : cur = ConvertData(12, 10);
: : : spd_sum += spd;
: : : cur_sum += cur;
: : : count++;
: : : }
: : : pos_check = Limit_Check(PORT_0, ACCEL1_HOME);
: : : if(pos_check) BRAKE1_CW(OFF);
: : : if(pause_value || stop_value) break;
: : : if(difftime(endtime, begintime) > 20) {
: : : timeout = 4;
: : : break;
: : : }
: : : }
: : : if(timeout == 4) break;
: : : if(pause_value || stop_value) break;
: : : BRAKE1_CW(OFF);
: : : POWER1_ACCEL(OFF);
: : : spd_avr = spd_sum / count;
: : : cur_avr = cur_sum / count;
: : : sprintf(temp,"%d ccw : load : %1.0f spd : %1.2f cur : %1.2f",f_temp_count+1,cycle_spec[0],spd_avr, cur_avr);
: : : sprintf(savefile2[f_save_count],"%d,ccw,load,%1.0f,spd,%1.2f,cur,%1.2f\n",f_temp_count+1,cycle_spec[0],spd_avr,cur_avr);
: : : fprintf(fp2,"%s",savefile2[f_save_count]);
: : : Form4->Memo2->Lines->Add(temp);
: : : begintime = time(NULL);
: : : while(1) {
: : : endtime = time(NULL);
: : : if(difftime(endtime, begintime) > ccw_rest_time) {
: : : break;
: : : }
: : : Form4->pnl_1->Caption = difftime(endtime, begintime);
: : : if(pause_value || stop_value) break;
: : : }
: : : if(pause_value || stop_value) break;
: : : f_remain_count = total_count - (++f_temp_count);
: : : Form4->remain_1->Caption = f_remain_count;
: : : if(f_remain_count > 0) {
: : : f_save_count++; // 여기가 쓰레드 A 의 완료 시점입니다.
: : : } // 여기가 false 이면 쓰레드 A 를 빠져나갑니다
: : : else break;
: : : }
: : : else {
: : : if(!check) error = 11;
: : : if(!check1) error = 12;
: : : break;
: : : }
: : : }
: : : else {
: : : if(!check) error = 8;
: : : if(!check1) error = 9;
: : : break;
: : : }
: : : }
: : : else {
: : : if(!check) error = 5;
: : : if(!check1) error = 6;
: : : break;
: : : }
: : : }
: : : else {
: : : if(!check) error = 2;
: : : if(!check1) error = 3;
: : : break;
: : : }
: : : }
: : : Sleep(250); //여기서 delay 를 주었습니다.
: : : }
: : :
: : : BRAKE1_CW(OFF);
: : : BRAKE1_CCW(OFF);
: : : POWER1_BRAKE(OFF);
: : : POWER1_ACCEL(OFF);
: : :
: : : while(!Terminated) Terminate();
: : : if(!error && !timeout && !f_remain_count) {
: : : Terminate();
: : : if(!pause_value && !stop_value) {
: : : thread_a_run = 0;
: : : Init_Cyl(1);
: : : Form4->FileSave_A();
: : : Form4->thread_exit_check();
: : : }
: : : }
: : : else {
: : : BuzzerOnOff();
: : :
: : : if(error == 1) Application->MessageBoxA("BRAKE1_HOME POSITION ERROR","Brake 1",MB_OK|MB_ICONERROR);
: : : if(error == 2) Application->MessageBoxA("BRAKE1_CYL_2_UPPER POSITION ERROR","Brake 1",MB_OK|MB_ICONERROR);
: : : if(error == 3) Application->MessageBoxA("BRAKE1_CYL_1_LOWER POSITION ERROR","Brake 1",MB_OK|MB_ICONERROR);
: : : if(error == 4) Application->MessageBoxA("ACCEL1_HOME POSITION ERROR","Accel 1",MB_OK|MB_ICONERROR);
: : : if(error == 5) Application->MessageBoxA("ACCEL1_CYL_2_UPPER POSITION ERROR","Accel 1",MB_OK|MB_ICONERROR);
: : : if(error == 6) Application->MessageBoxA("ACCEL1_CYL_1_LOWER POSITION ERROR","Accel 1",MB_OK|MB_ICONERROR);
: : : if(error == 7) Application->MessageBoxA("BRAKE1_END POSITION ERROR","Brake 1",MB_OK|MB_ICONERROR);
: : : if(error == 8) Application->MessageBoxA("BRAKE1_CYL_1_UPPER POSITION ERROR","Brake 1",MB_OK|MB_ICONERROR);
: : : if(error == 9) Application->MessageBoxA("BRAKE1_CYL_2_LOWER POSITION ERROR","Brake 1",MB_OK|MB_ICONERROR);
: : : if(error == 10) Application->MessageBoxA("ACCEL1_END POSITION ERROR","Brake 1",MB_OK|MB_ICONERROR);
: : : if(error == 11) Application->MessageBoxA("ACCEL1_CYL_1_UPPER POSITION ERROR","Accel 1",MB_OK|MB_ICONERROR);
: : : if(error == 12) Application->MessageBoxA("ACCEL1_CYL_2_LOWER POSITION ERROR","Accel 1",MB_OK|MB_ICONERROR);
: : : if(timeout == 1) Application->MessageBoxA("BRAKE1_END POSITION SEARCH ERROR","Brake 1",MB_OK|MB_ICONERROR);
: : : if(timeout == 2) Application->MessageBoxA("BRAKE1_HOME POSITION SEARCH ERROR","Brake 1",MB_OK|MB_ICONERROR);
: : : if(timeout == 3) Application->MessageBoxA("ACCEL1_END POSITION SEARCH ERROR","Accel 1",MB_OK|MB_ICONERROR);
: : : if(timeout == 4) Application->MessageBoxA("ACCEL1_HOME POSITION SEARCH ERROR","Accel 1",MB_OK|MB_ICONERROR);
: : :
: : : Form4->resume_btn->Enabled = true;
: : : }
: : : }
: : : //------------------------------------------------------------------------------------------------
: : : void __fastcall Tthread_B::UpdateDisplay()
: : : {
: : : int check, check1, pos_check, count, error = 0, timeout = 0;
: : : double spd = 0, spd_sum = 0, spd_avr = 0;
: : : double cur = 0, cur_sum = 0, cur_avr = 0;
: : : char temp[300];
: : : int cw_time, cw_rest_time, ccw_time, ccw_rest_time, total_count;
: : : int second_brake, second_accel;
: : : time_t begintime, endtime;
: : :
: : : second_brake = Form4->second_brake;
: : : second_accel = Form4->second_accel;
: : :
: : : cw_time = Form4->cw_sec;
: : : if(second_brake && second_accel)
: : : cw_rest_time = Form4->cw_rest - cw_time;
: : : else
: : : cw_rest_time = Form4->cw_rest;
: : : ccw_time = Form4->ccw_sec;
: : : if(second_brake && second_accel)
: : : ccw_rest_time = Form4->ccw_rest - ccw_time;
: : : else
: : : ccw_rest_time = Form4->ccw_rest;
: : : total_count = Form4->t_cycle;
: : : Form4->total_2->Caption = total_count;
: : :
: : :
: : : while(!Terminated) {
: : : thread_b_run = 1;
: : : if(pause_value || stop_value) break;
: : : if(second_brake && second_accel) {
: : : pos_check = 0;
: : : pos_check = Work_Check(5, PORT_2, BRAKE2_HOME);
: : : if(!pos_check) {
: : : error = 1;
: : : break;
: : : }
: : : BRAKE2_CYL_2_UPDOWN(UP);
: : : BRAKE2_CYL_1_UPDOWN(DOWN);
: : :
: : : check = Work_Check(DUR, PORT_3, BRAKE2_UPPER_2);
: : : check1 = Work_Check(DUR, PORT_3, BRAKE2_LOWER_1);
: : :
: : : //brake 2 cw test
: : : if(check && check1) {
: : : spd_sum = 0, cur_sum = 0;
: : : pos_check = 0, count = 0;
: : : Power_2(1); //POWER2_BRAKE(ON);
: : : BRAKE2_CW(ON);
: : : begintime = time(NULL);
: : : while(1) {
: : : endtime = time(NULL);
: : : if(difftime(endtime, begintime) > cw_time) {
: : : if(pos_check) break;
: : : }
: : : if(!pos_check) {
: : : spd = ConvertData(10, 10);
: : : cur = ConvertData(13, 10);
: : : spd_sum += spd;
: : : cur_sum += cur;
: : : count++;
: : : }
: : : pos_check = Limit_Check(PORT_2, BRAKE2_END);
: : : if(pos_check) BRAKE2_CW(OFF);
: : : if(pause_value || stop_value) break;
: : : if(difftime(endtime, begintime) > 20) {
: : : timeout = 1;
: : : break;
: : : }
: : : }
: : : if(timeout == 1) break;
: : : if(pause_value || stop_value) break;
: : : BRAKE2_CW(OFF);
: : : POWER2_BRAKE(OFF);
: : : spd_avr = spd_sum / count;
: : : cur_avr = cur_sum / count;
: : : sprintf(temp,"%d cw : load : %1.0f spd : %1.2f cur : %1.2f",s_temp_count+1,cycle_spec[0],spd_avr, cur_avr);
: : : sprintf(savefile3[s_save_count],"%d,cw,load,%1.0f,spd,%1.2f,cur,%1.2f\n",s_temp_count+1,cycle_spec[0],spd_avr,cur_avr);
: : : fprintf(fp3,"%s",savefile3[s_save_count]);
: : : Form4->Memo3->Lines->Add(temp);
: : : //accel 2 cw test
: : : pos_check = 0;
: : : pos_check = Work_Check(5, PORT_2, ACCEL2_HOME);
: : : if(!pos_check) {
: : : error = 4;
: : : break;
: : : }
: : : ACCEL2_CYL_2_UPDOWN(UP);
: : : ACCEL2_CYL_1_UPDOWN(DOWN);
: : :
: : : check = Work_Check(DUR, PORT_2, ACCEL2_UPPER_2);
: : : check1 = Work_Check(DUR, PORT_2, ACCEL2_LOWER_1);
: : :
: : : if(check && check1) {
: : : spd_sum = 0, cur_sum = 0;
: : : pos_check = 0, count = 0;
: : : Power_2(2); //POWER2_ACCEL(ON);
: : : BRAKE2_CCW(ON);
: : : begintime = time(NULL);
: : : while(1) {
: : : endtime = time(NULL);
: : : if(difftime(endtime, begintime) > cw_time) {
: : : if(pos_check) break;
: : : }
: : : if(!pos_check) {
: : : spd = ConvertData(7, 10);
: : : cur = ConvertData(13, 10);
: : : spd_sum += spd;
: : : cur_sum += cur;
: : : count++;
: : : }
: : : pos_check = Limit_Check(PORT_2, ACCEL2_END);
: : : if(pos_check) BRAKE2_CCW(OFF);
: : : if(pause_value || stop_value) break;
: : : if(difftime(endtime, begintime) > 20) {
: : : timeout = 3;
: : : break;
: : : }
: : : }
: : : if(timeout == 3) break;
: : : if(pause_value || stop_value) break;
: : : BRAKE2_CCW(OFF);
: : : POWER2_ACCEL(OFF);
: : : spd_avr = spd_sum / count;
: : : cur_avr = cur_sum / count;
: : : sprintf(temp,"%d cw : load : %1.0f spd : %1.2f cur : %1.2f",s_temp_count+1,cycle_spec[0],spd_avr, cur_avr);
: : : sprintf(savefile4[s_save_count],"%d,cw,load,%1.0f,spd,%1.2f,cur,%1.2f\n",s_temp_count+1,cycle_spec[0],spd_avr,cur_avr);
: : : fprintf(fp4,"%s",savefile4[s_save_count]);
: : : Form4->Memo4->Lines->Add(temp);
: : : begintime = time(NULL);
: : : while(1) {
: : : endtime = time(NULL);
: : : if(difftime(endtime, begintime) > cw_rest_time) {
: : : break;
: : : }
: : : Form4->pnl_2->Caption = difftime(endtime, begintime);
: : : if(pause_value || stop_value) break;
: : : }
: : : if(pause_value || stop_value) break;
: : : //brake 2 ccw test
: : : pos_check = 0;
: : : pos_check = Work_Check(5, PORT_2, BRAKE2_END);
: : : if(!pos_check) {
: : : error = 7;
: : : break;
: : : }
: : : BRAKE2_CYL_1_UPDOWN(UP);
: : : BRAKE2_CYL_2_UPDOWN(DOWN);
: : :
: : : check = Work_Check(DUR, PORT_3, BRAKE2_UPPER_1);
: : : check1 = Work_Check(DUR, PORT_3, BRAKE2_LOWER_2);
: : :
: : : if(check && check1) {
: : : spd_sum = 0, cur_sum = 0;
: : : pos_check = 0, count = 0;
: : : Power_2(1); //POWER1_BRAKE(ON);
: : : BRAKE2_CCW(ON);
: : : begintime = time(NULL);
: : : while(1) {
: : : endtime = time(NULL);
: : : if(difftime(endtime, begintime) > ccw_time) {
: : : if(pos_check) break;
: : : }
: : : if(!pos_check) {
: : : spd = ConvertData(10, 10);
: : : cur = ConvertData(13, 10);
: : : spd_sum += spd;
: : : cur_sum += cur;
: : : count++;
: : : }
: : : pos_check = Limit_Check(PORT_2, BRAKE2_HOME);
: : : if(pos_check) BRAKE2_CCW(OFF);
: : : if(pause_value || stop_value) break;
: : : if(difftime(endtime, begintime) > 20) {
: : : timeout = 2;
: : : break;
: : : }
: : : }
: : : if(timeout == 2) break;
: : : if(pause_value || stop_value) break;
: : : BRAKE2_CCW(OFF);
: : : POWER2_BRAKE(OFF);
: : : spd_avr = spd_sum / count;
: : : cur_avr = cur_sum / count;
: : : sprintf(temp,"%d ccw : load : %1.0f spd : %1.2f cur : %1.2f",s_temp_count+1,cycle_spec[0],spd_avr, cur_avr);
: : : sprintf(savefile3[++s_save_count],"%d,ccw,load,%1.0f,spd,%1.2f,cur,%1.2f\n",s_temp_count+1,cycle_spec[0],spd_avr,cur_avr);
: : : fprintf(fp3,"%s",savefile3[s_save_count]);
: : : Form4->Memo3->Lines->Add(temp);
: : : //accel 2 ccw test
: : : pos_check = 0;
: : : pos_check = Work_Check(5, PORT_2, ACCEL2_END);
: : : if(!pos_check) {
: : : error = 10;
: : : break;
: : : }
: : : ACCEL2_CYL_1_UPDOWN(UP);
: : : ACCEL2_CYL_2_UPDOWN(DOWN);
: : :
: : : check = Work_Check(DUR, PORT_2, ACCEL2_UPPER_1);
: : : check1 = Work_Check(DUR, PORT_2, ACCEL2_LOWER_2);
: : :
: : : if(check && check1) {
: : : pos_check = 0, count = 0;
: : : spd_sum = 0, cur_sum = 0;
: : : Power_2(2); //POWER2_ACCEL(ON);
: : : BRAKE2_CW(ON);
: : : begintime = time(NULL);
: : : while(1) {
: : : endtime = time(NULL);
: : : if(difftime(endtime, begintime) > Form4->cw_sec) {
: : : if(pos_check) break;
: : : }
: : : if(!pos_check) {
: : : spd = ConvertData(7, 10);
: : : cur = ConvertData(13, 10);
: : : spd_sum += spd;
: : : cur_sum += cur;
: : : count++;
: : : }
: : : pos_check = Limit_Check(PORT_2, ACCEL2_HOME);
: : : if(pos_check) BRAKE2_CW(OFF);
: : : if(pause_value || stop_value) break;
: : : if(difftime(endtime, begintime) > 20) {
: : : timeout = 4;
: : : break;
: : : }
: : : }
: : : if(timeout == 4) break;
: : : if(pause_value || stop_value) break;
: : : BRAKE2_CW(OFF);
: : : POWER2_ACCEL(OFF);
: : : spd_avr = spd_sum / count;
: : : cur_avr = cur_sum / count;
: : : sprintf(temp,"%d ccw : load : %1.0f spd : %1.2f cur : %1.2f",s_temp_count+1,cycle_spec[0],spd_avr, cur_avr);
: : : sprintf(savefile4[s_save_count],"%d,ccw,load,%1.0f,spd,%1.2f,cur,%1.2f\n",s_temp_count+1,cycle_spec[0],spd_avr,cur_avr);
: : : fprintf(fp4,"%s",savefile4[s_save_count]);
: : : Form4->Memo4->Lines->Add(temp);
: : : begintime = time(NULL);
: : : while(1) {
: : : endtime = time(NULL);
: : : if(difftime(endtime, begintime) > ccw_rest_time) {
: : : break;
: : : }
: : : Form4->pnl_2->Caption = difftime(endtime, begintime);
: : : if(pause_value || stop_value) break;
: : : }
: : : if(pause_value || stop_value) break;
: : : s_remain_count = total_count - (++s_temp_count);
: : : Form4->remain_2->Caption = s_remain_count;
: : : if(s_remain_count > 0) { // 여기가 쓰레드 B 의 완료 시점입니다.
: : : s_save_count++; // 여기가 false 이면 쓰레드 B 를 빠져나갑니다.
: : : }
: : : else break;
: : : }
: : : else {
: : : if(!check) error = 11;
: : : if(!check1) error = 12;
: : : break;
: : : }
: : : }
: : : else {
: : : if(!check) error = 8;
: : : if(!check1) error = 9;
: : : break;
: : : }
: : : }
: : : else {
: : : if(!check) error = 5;
: : : if(!check1) error = 6;
: : : break;
: : : }
: : : }
: : : else {
: : : if(!check) error = 2;
: : : if(!check1) error = 3;
: : : break;
: : : }
: : : }
: : : }
: : :
: : : BRAKE2_CW(OFF);
: : : BRAKE2_CCW(OFF);
: : : POWER2_BRAKE(OFF);
: : : POWER2_ACCEL(OFF);
: : :
: : : while(!Terminated) Terminate();
: : : if(!error && !timeout && !s_remain_count) {
: : : Terminate();
: : : if(!pause_value && !stop_value) {
: : : thread_b_run = 0;
: : : Init_Cyl(2);
: : : Form4->FileSave_B();
: : : Form4->thread_exit_check();
: : : }
: : : }
: : : else {
: : : BuzzerOnOff();
: : :
: : : if(error == 1) Application->MessageBoxA("BRAKE2_HOME POSITION ERROR","Brake 2",MB_OK|MB_ICONERROR);
: : : if(error == 2) Application->MessageBoxA("BRAKE2_CYL_2_UPPER POSITION ERROR","Brake 2",MB_OK|MB_ICONERROR);
: : : if(error == 3) Application->MessageBoxA("BRAKE2_CYL_1_LOWER POSITION ERROR","Brake 2",MB_OK|MB_ICONERROR);
: : : if(error == 4) Application->MessageBoxA("ACCEL2_HOME POSITION ERROR","Accel 2",MB_OK|MB_ICONERROR);
: : : if(error == 5) Application->MessageBoxA("ACCEL2_CYL_2_UPPER POSITION ERROR","Accel 2",MB_OK|MB_ICONERROR);
: : : if(error == 6) Application->MessageBoxA("ACCEL2_CYL_1_LOWER POSITION ERROR","Accel 2",MB_OK|MB_ICONERROR);
: : : if(error == 7) Application->MessageBoxA("BRAKE2_END POSITION ERROR","Brake 2",MB_OK|MB_ICONERROR);
: : : if(error == 8) Application->MessageBoxA("BRAKE2_CYL_1_UPPER POSITION ERROR","Brake 2",MB_OK|MB_ICONERROR);
: : : if(error == 9) Application->MessageBoxA("BRAKE2_CYL_2_LOWER POSITION ERROR","Brake 2",MB_OK|MB_ICONERROR);
: : : if(error == 10) Application->MessageBoxA("ACCEL2_END POSITION ERROR","Brake 2",MB_OK|MB_ICONERROR);
: : : if(error == 11) Application->MessageBoxA("ACCEL2_CYL_1_UPPER POSITION ERROR","Accel 2",MB_OK|MB_ICONERROR);
: : : if(error == 12) Application->MessageBoxA("ACCEL2_CYL_2_LOWER POSITION ERROR","Accel 2",MB_OK|MB_ICONERROR);
: : : if(timeout == 1) Application->MessageBoxA("BRAKE2_END POSITION SEARCH ERROR","Brake 2",MB_OK|MB_ICONERROR);
: : : if(timeout == 2) Application->MessageBoxA("BRAKE2_HOME POSITION SEARCH ERROR","Brake 2",MB_OK|MB_ICONERROR);
: : : if(timeout == 3) Application->MessageBoxA("ACCEL2_END POSITION SEARCH ERROR","Accel 2",MB_OK|MB_ICONERROR);
: : : if(timeout == 4) Application->MessageBoxA("ACCEL2_HOME POSITION SEARCH ERROR","Accel 2",MB_OK|MB_ICONERROR);
: : : Form4->resume_btn->Enabled = true;
: : : }
: : : }
: : :
: : :
|