|
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;
: : }
: : }
: :
: :
|