You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

244 lines
6.1 KiB
C++

2 years ago
#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;
}
}