|
|
|
|
#include "manage.h"
|
|
|
|
|
#include "log.h"
|
|
|
|
|
#include "var.h"
|
|
|
|
|
#include "ops.h"
|
|
|
|
|
#include "test.h"
|
|
|
|
|
#include "control.h"
|
|
|
|
|
|
|
|
|
|
//CProduct<63><74>ʵ<EFBFBD><CAB5>
|
|
|
|
|
CProduct::CProduct(int sindex)
|
|
|
|
|
{
|
|
|
|
|
_t1 = _t2 = _t3 = 0;
|
|
|
|
|
memset(&data, 0, sizeof(data));
|
|
|
|
|
data.pos = (EMapPos)sindex;
|
|
|
|
|
comm_strcpy(data.lot, ins->getLot());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void CProduct::Clear()
|
|
|
|
|
{
|
|
|
|
|
memset(&data, 0, sizeof(data));
|
|
|
|
|
data.pos = LocationInput;
|
|
|
|
|
comm_strcpy(data.lot, ins->getLot());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
char* CProduct::Ate()
|
|
|
|
|
{
|
|
|
|
|
switch (data.count)
|
|
|
|
|
{
|
|
|
|
|
case 2:
|
|
|
|
|
return data.ate2;
|
|
|
|
|
case 3:
|
|
|
|
|
return data.ate3;
|
|
|
|
|
default:
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
return data.ate1; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>B<EFBFBD>飬ate<74>ŵ<EFBFBD><C5B5><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֤<EFBFBD><D6A4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>¼
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void CProduct::SetIndex(int t)
|
|
|
|
|
{
|
|
|
|
|
switch (data.count)
|
|
|
|
|
{
|
|
|
|
|
case 2:
|
|
|
|
|
_t2 = t;
|
|
|
|
|
return;
|
|
|
|
|
case 3:
|
|
|
|
|
_t3 = t;
|
|
|
|
|
return;
|
|
|
|
|
default:
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
_t1 = t; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>B<EFBFBD>飬ate<74>ŵ<EFBFBD><C5B5><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֤<EFBFBD><D6A4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>¼
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int CProduct::lastIndex()
|
|
|
|
|
{//<2F><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ξ<EFBFBD><CEBE><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
switch (data.count)
|
|
|
|
|
{
|
|
|
|
|
case 2:
|
|
|
|
|
return _t2;
|
|
|
|
|
case 3:
|
|
|
|
|
return _t3;
|
|
|
|
|
default:
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
return _t1; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>B<EFBFBD>飬ate<74>ŵ<EFBFBD><C5B5><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֤<EFBFBD><D6A4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>¼
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const char* CProduct::LastAte()
|
|
|
|
|
{
|
|
|
|
|
switch (data.count)
|
|
|
|
|
{
|
|
|
|
|
case 2:
|
|
|
|
|
return data.ate2;
|
|
|
|
|
case 3:
|
|
|
|
|
return data.ate3;
|
|
|
|
|
default:
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
return data.ate1; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>B<EFBFBD>飬ate<74>ŵ<EFBFBD><C5B5><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֤<EFBFBD><D6A4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>¼
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
cstr getRetryModel(int count)
|
|
|
|
|
{
|
|
|
|
|
switch (count)
|
|
|
|
|
{
|
|
|
|
|
case 1:
|
|
|
|
|
return "T1";
|
|
|
|
|
case 2:
|
|
|
|
|
return "R1";
|
|
|
|
|
case 3:
|
|
|
|
|
return "R2";
|
|
|
|
|
case 4:
|
|
|
|
|
return "R3";
|
|
|
|
|
case 5:
|
|
|
|
|
return "R4";
|
|
|
|
|
default:
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
return "Rn";
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
cstr CProduct::getRetryModelS()
|
|
|
|
|
{
|
|
|
|
|
return getRetryModel(data.count + 1);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
cstr CProduct::getRetryModelE()
|
|
|
|
|
{
|
|
|
|
|
return getRetryModel(data.count);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool CProduct::CanTestAAB(const char* ate)
|
|
|
|
|
{//AABģʽ<C4A3><CABD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ate<74><65><EFBFBD><EFBFBD>
|
|
|
|
|
if (0 == data.count) return true;
|
|
|
|
|
return 1 == data.count
|
|
|
|
|
? strcmp(data.ate1, ate) ? false : true //<2F>ڶ<EFBFBD><DAB6>α<EFBFBD><CEB1><EFBFBD><EFBFBD>ŵ<EFBFBD><C5B5><EFBFBD>һ<EFBFBD>ε<EFBFBD><CEB5>ξ<EFBFBD>
|
|
|
|
|
: strcmp(LastAte(), ate) ? true : false; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD>ͬ<EFBFBD><CDAC><EFBFBD>ξ<EFBFBD>
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool CProduct::CanTestABC(const char* ate)
|
|
|
|
|
{//ABCģʽ<C4A3><CABD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ate<74><65><EFBFBD><EFBFBD>
|
|
|
|
|
if (0 == data.count) return true;
|
|
|
|
|
if (1 == data.count)
|
|
|
|
|
{
|
|
|
|
|
return strcmp(data.ate1, ate) ? true : false;
|
|
|
|
|
}
|
|
|
|
|
if (2 == data.count)
|
|
|
|
|
{
|
|
|
|
|
return strcmp(data.ate1, ate) && strcmp(data.ate2, ate) ? true : false;
|
|
|
|
|
}
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool CManage::NeedTestDual(CProduct* p, int t)
|
|
|
|
|
{//<2F>Ƿ<EFBFBD><C7B7><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> -- <20>ɳ<EFBFBD><C9B3>Դ<EFBFBD><D4B4><EFBFBD><EFBFBD>ξ<EFBFBD><CEBE>ж<EFBFBD><D0B6>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڸ<EFBFBD><DAB8>ξ߸<CEBE><DFB8><EFBFBD>
|
|
|
|
|
int x = 0;
|
|
|
|
|
int aend = m_pEnda->geti();
|
|
|
|
|
|
|
|
|
|
if (p->IsSameBin(getBinA())) return false; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Bin<69><6E>Ϣ<EFBFBD><CFA2>ͬ<EFBFBD><CDAC><EFBFBD><EFBFBD><EFBFBD>ٲ<EFBFBD><D9B2><EFBFBD>
|
|
|
|
|
if (p->lastIndex() > aend) return false; //<2F>Ѿ<EFBFBD><D1BE><EFBFBD>B<EFBFBD><42><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
if (p->NeedTest()) return t <= aend ? true : false; //<2F><>ҪA<D2AA><41><EFBFBD>ز<EFBFBD> -- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>B<EFBFBD><42>t<EFBFBD><74><EFBFBD><EFBFBD>false
|
|
|
|
|
if (aend >= TESTCNT) return false; //<2F><>ǰ<EFBFBD>ǵ<EFBFBD><C7B5><EFBFBD>ģʽ
|
|
|
|
|
if (!p->IsOk() && IsPassToB()) return false; //NG<4E><47><EFBFBD><EFBFBD>B<EFBFBD><42>
|
|
|
|
|
if (IsBindTest())
|
|
|
|
|
{//<2F><><EFBFBD><EFBFBD>ģʽ
|
|
|
|
|
x = p->lastIndex() + aend;
|
|
|
|
|
if (x > TESTCNT) return false;
|
|
|
|
|
if (!m_ptest[x - 1]->Enabled()) return false;
|
|
|
|
|
if (!m_ptest[x - 1]->IsReady()) return false;
|
|
|
|
|
return (t && t != x) ? false : true; //<2F><><EFBFBD>ڵ<EFBFBD>ǰ<EFBFBD>ξ<EFBFBD>
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//if (t > aend && t <= TESTCNT &&
|
|
|
|
|
// m_ptest[t - 1]->Enabled() &&
|
|
|
|
|
// m_ptest[t - 1]->IsReady())
|
|
|
|
|
//{//<2F>ξ߱<CEBE><DFB1><EFBFBD><EFBFBD><EFBFBD>Ч
|
|
|
|
|
// return true;
|
|
|
|
|
//}
|
|
|
|
|
|
|
|
|
|
//<2F>ǰ<EFBFBD><C7B0><EFBFBD>ģʽ -- <20><>B<EFBFBD><42><EFBFBD>Ƿ<EFBFBD><C7B7>о<EFBFBD><D0BE><EFBFBD><EFBFBD>ξ߿<CEBE><DFBF><EFBFBD>
|
|
|
|
|
if (t > aend) return true; //<2F><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5><EFBFBD><EFBFBD><EFBFBD>ξ<EFBFBD><CEBE>Ѿ<EFBFBD><D1BE><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
for (int i = aend; i < TESTCNT; i++)
|
|
|
|
|
{//<2F><><EFBFBD><EFBFBD>B<EFBFBD><42><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
if (!m_ptest[i]->Enabled()) continue; //δ<><CEB4><EFBFBD><EFBFBD>
|
|
|
|
|
if (!m_ptest[i]->IsReady()) continue; //<2F><><EFBFBD>ھ<EFBFBD><DABE><EFBFBD>״̬
|
|
|
|
|
t = i + 1;
|
|
|
|
|
return true; //<2F><><EFBFBD><EFBFBD>
|
|
|
|
|
}
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int CManage::FindTestDual(CProduct* p, bool bchkp, int aend)
|
|
|
|
|
{//<2F><><EFBFBD>ҿ<EFBFBD><D2BF>Էŵ<D4B7><C5B5>ξ<EFBFBD> -- ˫<><CBAB>ģʽ
|
|
|
|
|
int t = 0;
|
|
|
|
|
if (p->NeedTest(getBinA()))
|
|
|
|
|
{//<2F><><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA>A<EFBFBD><41><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
return FindTest(p, bchkp, aend);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ע<EFBFBD>ͣ<EFBFBD>NeedTestDual()<29>Ѿ<EFBFBD><D1BE>ж<EFBFBD><D0B6><EFBFBD>
|
|
|
|
|
//if (!p->IsOk() && IsPassToB()) return 0; //NG<4E><47><EFBFBD><EFBFBD>B<EFBFBD><42>
|
|
|
|
|
//if (p->lastIndex() > aend) return 0; //<2F>Ѿ<EFBFBD><D1BE><EFBFBD>B<EFBFBD><42><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
if (IsBindTest())
|
|
|
|
|
{//<2F><><EFBFBD><EFBFBD>ģʽ
|
|
|
|
|
t = p->lastIndex() + aend;
|
|
|
|
|
if (t > TESTCNT) return 0;
|
|
|
|
|
if (bchkp && m_ptest[t - 1]->_p) return 0; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
if (!m_ptest[t - 1]->Enabled()) return 0;
|
|
|
|
|
if (!m_ptest[t - 1]->IsReady()) return 0;
|
|
|
|
|
return t;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//<2F>ǰ<EFBFBD><C7B0><EFBFBD>ģʽ -- <20><>B<EFBFBD><42><EFBFBD>Ƿ<EFBFBD><C7B7>о<EFBFBD><D0BE><EFBFBD><EFBFBD>ξ߿<CEBE><DFBF><EFBFBD>
|
|
|
|
|
for (int i = aend; i < TESTCNT; i++)
|
|
|
|
|
{//<2F><><EFBFBD><EFBFBD>B<EFBFBD><42><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
if (bchkp && m_ptest[i]->_p) continue; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
if (!m_ptest[i]->Enabled()) continue; //δ<><CEB4><EFBFBD><EFBFBD>
|
|
|
|
|
if (!m_ptest[i]->IsReady()) continue; //<2F><><EFBFBD>ھ<EFBFBD><DABE><EFBFBD>״̬
|
|
|
|
|
return i + 1; //<2F><><EFBFBD><EFBFBD>
|
|
|
|
|
}
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void CManage::GetPutByTestB(int &v, int t, bool bchkp)
|
|
|
|
|
{//<2F>Ե<EFBFBD>ǰt<C7B0><74><EFBFBD>ȿ<EFBFBD><C8BF>ǣ<EFBFBD><C7A3>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD>Է<EFBFBD><D4B7><EFBFBD>B<EFBFBD><42><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
for (int i = 0; i < m_vacm_cnt; i++)
|
|
|
|
|
{//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
if (!m_vacm_lst[i]) continue;
|
|
|
|
|
if (bchkp && m_ptest[t - 1]->_p) continue;
|
|
|
|
|
if (m_ptest[t - 1]->IsNextNoTest())
|
|
|
|
|
{//<2F><><EFBFBD>ڻ<EFBFBD><DABB><EFBFBD> -- ֱ<>ӿ<EFBFBD><D3BF><EFBFBD>
|
|
|
|
|
v = i + 1;
|
|
|
|
|
REPORT("set notest v = %d t = %d.", v, t);
|
|
|
|
|
//set_int_var("test", 1);
|
|
|
|
|
//ops_analog_signal(IOS_PAUSE, 1); //<2F><><EFBFBD>ԣ<EFBFBD><D4A3><EFBFBD>ͣһ<CDA3><D2BB>
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
if (!NeedTestDual(m_vacm_lst[i], t)) continue; //<2F><><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA>B<EFBFBD><42><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
v = i + 1;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void CManage::GetTestPutDual(int &v, int &t, int aend, bool bchkp)
|
|
|
|
|
{//testput ֪ͨ<CDA8><D6AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD>ξߵ<CEBE><DFB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>->'v'<27><><EFBFBD>ξ߱<CEBE><DFB1><EFBFBD>->'t'<27><>Ϊ0ʱ<30><CAB1>Ч
|
|
|
|
|
v = 0;
|
|
|
|
|
if (t > 0 && t <= TESTCNT &&
|
|
|
|
|
m_ptest[t - 1]->Enabled() &&
|
|
|
|
|
m_ptest[t - 1]->IsReady())
|
|
|
|
|
{//<2F>ξ߱<CEBE><DFB1><EFBFBD><EFBFBD><EFBFBD>Ч
|
|
|
|
|
return t <= aend ? GetPutByTest(v, t, bchkp) : GetPutByTestB(v, t, bchkp);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for (int i = 0; i < m_vacm_cnt; i++)
|
|
|
|
|
{//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
if (!m_vacm_lst[i]) continue;
|
|
|
|
|
if (!NeedTestDual(m_vacm_lst[i])) continue; //<2F><><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>
|
|
|
|
|
t = FindTestDual(m_vacm_lst[i], bchkp, aend);
|
|
|
|
|
if (0 == t) continue; //δ<>ҵ<EFBFBD>
|
|
|
|
|
v = i + 1;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|