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.

399 lines
12 KiB
C

2 years ago
#pragma once
#ifndef _INCLUDE_COREWORK_MANAGE_H
#define _INCLUDE_COREWORK_MANAGE_H
#include "sysapi.h"
#include <list>
#include <hash_map>
#include <string>
#include <vector>
#include "corework.h"
#include "simtest.h"
#include "vision.h"
#include "ipvar.h"
using std::list;
using std::vector;
using std::string;
using std::hash_map;
#define VACMCNT 4 //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
#define TESTCNT 6 //<2F>ξ<EFBFBD><CEBE><EFBFBD><EFBFBD><EFBFBD>
#define MINAEND 3 //<2F><>СA<D0A1><41><EFBFBD>ֽ<EFBFBD>ֵ
#define STOCKCNT 5 //<2F>ϲ<EFBFBD><CFB2><EFBFBD><EFBFBD><EFBFBD>
#define VERSION 2135 //<2F><EFBFBD><E6B1BE>
#define CFG_KEY "work"
#define ins CManage::Get_Instance()
//#define REPORT(msg, ...) ins->Report(msg, __VA_ARGS__)
#define REPORT(msg, ...) post_message(MSG_ASCII, msg, __VA_ARGS__)
#define SPLIT "#" //<2F>ָ<EFBFBD><D6B8><EFBFBD>
#define REG "Register" //<2F>ͻ<EFBFBD><CDBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ע<EFBFBD><D7A2>
#define STATUS "Status" //<2F><>ѯ<EFBFBD>ͻ<EFBFBD><CDBB><EFBFBD>״̬
#define START "StartTest" //֪ͨ<CDA8>ξ<EFBFBD><CEBE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
#define RES "Result" //<2F><>ѯ<EFBFBD><D1AF><EFBFBD>Խ<EFBFBD><D4BD><EFBFBD><EFBFBD><EFBFBD>Ϣ
#define ERR "ErrorCode" //<2F><>ѯ<EFBFBD><D1AF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>+<2B><><EFBFBD><EFBFBD>
#define GRIP "Grip" //֪ͨ<CDA8>ξߴ򿪼<DFB4>צ
#define PAUSE "Pause" //֪ͨ<CDA8>ξ<EFBFBD><CEBE><EFBFBD>ͣ
#define GR "GR" //<2F>Ӿ<EFBFBD><D3BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
#define HOME "Home" //֪ͨ<CDA8>ξ߻<CEBE>ԭ
#define RESET "Reset" //֪ͨ<CDA8>ξ<EFBFBD><CEBE><EFBFBD><EFBFBD><EFBFBD>
#define RIO "ReadIO" //<2F><>ȡIO
#define WIO "WriteIO" //д<><D0B4>IO
#define VLOG "Vlog" //<2F>ϴ<EFBFBD><CFB4><EFBFBD>־
#define HOMECT 60000 //<2F><><EFBFBD><EFBFBD><EFBFBD>ξ߻<CEBE>ԭʱ<D4AD><CAB1>
#define TAKECT 5000 //ȡ<>ŵ<EFBFBD><C5B5><EFBFBD><EFBFBD><EFBFBD>Ԥ<EFBFBD><D4A4>ʱ<EFBFBD><CAB1>
#define VPORT 6051 //<2F>Ӿ<EFBFBD><D3BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD>˿<EFBFBD>
#define VPORTEST 6081 //<2F><><EFBFBD>Բ<EFBFBD><D4B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˿<EFBFBD>
cstr GetTestMode(cstr p);
enum VisionSence
{//<2F>Ӿ<EFBFBD><D3BE>ͻ<EFBFBD><CDBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
EVInput = 0, //M1 ȡ<><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
EVHamal, //M2 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
EVOkTray, //M3 ok<6F><6B><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
EVNGTray, //M4 NG<4E><47><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
EVNGTakeOne, //M5 NGȡһ<C8A1><D2BB>һ
EVNGPutOne, //M6 NG<4E><47>һ<EFBFBD><D2BB>һ
EVTestTake, //M7 <20><EFBFBD><EFBFBD><E9B3A1>
EVTestPut, //M8 <20>ξ߷<CEBE>
EVSize, //<2F>ͻ<EFBFBD><CDBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
};
struct MachineInfo
{//<2F>ξ߽ṹ
TestMachine data; //<2F>ξ<EFBFBD><CEBE><EFBFBD><EFBFBD><EFBFBD>
int index; //<2F>ξ<EFBFBD><CEBE><EFBFBD><EFBFBD><EFBFBD>
uint start; //<2F><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
int lastct; //<2F><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>CT
uint qstatus; //<2F><>ѯ״̬ʱ<CCAC><CAB1>
};
struct TPosxy
{//ȡ<>Ϸ<EFBFBD><CFB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
char sn[MAX_NAME_LEN];
double x;
double y;
int index;
TPosxy() { memset(this, 0, sizeof(TPosxy)); }
};
struct TGRMsg
{//ת<><D7AA><EFBFBD><EFBFBD><EFBFBD>ξߵ<CEBE><DFB5><EFBFBD>Ϣ
int tindex;
char* s;
};
class CProduct
{
public:
CProduct(int sindex = LocationInput);
int _t1; //<2F><>һ<EFBFBD><D2BB><EFBFBD>ξ<EFBFBD><CEBE><EFBFBD><EFBFBD><EFBFBD>
int _t2; //<2F>ڶ<EFBFBD><DAB6><EFBFBD>
int _t3;
TProduct data;
void Clear();
//<2F><><EFBFBD>Դ<EFBFBD><D4B4><EFBFBD>
int tCount() { return data.count; }
//<2F>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>ok
bool IsOk() { return 1 == data.status; }
//<2F>Ƿ<EFBFBD><C7B7><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
bool NeedTest(cstr s = 0) { return data.count < 3 && 0 == data.status && !IsSameBin(s); }
//<2F>Ƿ<EFBFBD>Bin<69><6E>Ϣ<EFBFBD><CFA2>ͬ
bool IsSameBin(cstr s) { return s && 0 == strcmp(s, data.level); }
//<2F><>ȡ<EFBFBD>ز<EFBFBD>ģʽ<C4A3><CABD>ʶ<EFBFBD>ַ<EFBFBD><D6B7><EFBFBD> -- <20><><EFBFBD>Ϳ<EFBFBD>ʼָ<CABC><D6B8>ʱ
cstr getRetryModelS();
//<2F><>ȡ<EFBFBD>ز<EFBFBD>ģʽ<C4A3><CABD>ʶ<EFBFBD>ַ<EFBFBD><D6B7><EFBFBD> -- <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>ʱ
cstr getRetryModelE();
char* Ate(); //<2F><>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD>ξ߱<CEBE><DFB1><EFBFBD>ָ<EFBFBD><D6B8>
void SetIndex(int t); //<2F><><EFBFBD>õ<EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD>ξ<EFBFBD><CEBE><EFBFBD><EFBFBD><EFBFBD>
int lastIndex();
const char* LastAte();
bool CanTestAAB(const char* ate);
bool CanTestABC(const char* ate);
};
class CTest;
class CManage
{
public:
static CManage* Get_Instance();
static void ReleaseInstance();
CManage(void);
~CManage(void);
int Init();
int Deinit();
int IsRun() { return m_brun ? 1 : 0; } //<2F>ξ<EFBFBD>ͨ<EFBFBD><CDA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//<2F>ξ<EFBFBD>ͨ<EFBFBD><CDA8>
int StartRun();
int StopRun();
cstr GetTestModel();
int SetConfig(CoreConfig* pcfg);
const CoreConfig* getCfg() const { return &m_cfg; }
void GetConfig(CoreConfig* pcfg) { memcpy(pcfg, &m_cfg, sizeof(m_cfg)); }
int SummaryLog(const char* title, const char* content);
int BreakdownLog(const char* psztype, const char* pszmsg);
int UnitTracker(const char* sn, const char* ate, const char* lot, int result, const char* RetryUsage);
int EventTracker(const char* keyword, int errcode, const char*errmsg, const char*msg);
int GetProduct(const char* sn, TProduct* pdata);
int GetAllProduct(TProduct* pdata/* = 0*/, int nsize/* = 0*/);
int GetProductByPos(EMapPos pos, int index, TProduct* pdata/* = 0*/);
int GetProductList(EMapPos pos, TProduct* pdata/* = 0*/, int nsize/* = 0*/);
int GetMachine(int index, TestMachine* pdata);
int TestEnable(int index, int benable);
int TestDebug(int index, const char* sn);
int TestHome(int testIndex);
int TestReset(int testIndex);
int TestClear(int testIndex);
int SendCustomCmd(const char* msg, char* res = NULL);
int RecvCustomCmd(const char* msg, char* res, int timeout/* = 0*/);
int GetCommandDesc(char* pszcmddesc);
cstr GetVersion();
cstr getBinA() { return m_cfg.BinA; } //<2F><>ȡBinA<6E><41><EFBFBD><EFBFBD>
cstr getLot() { return m_cfg.lot; } //<2F><>ȡ<EFBFBD><C8A1><EFBFBD>κ<EFBFBD>
cstr getMachine() { return m_cfg.machine; }
bool NodeLog() { return 0 != m_cfg.bNodeLog; }
bool IsMakeDir() { return 0 != m_cfg.bDirDate; }
bool IsFourpic() { return 0 != m_cfg.bFourPic; }
bool IsSavePos() { return 0 != m_cfg.bSavePos; }
bool testLog() { return 0 != m_cfg.bTestlog; }
bool visionLog() { return 0 != m_cfg.bVisionlog; }
bool IsBindTest() { return 0 != m_cfg.bBindB; } //B<><42><EFBFBD>Ƿ<EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>ģʽ TC1->TCB1 TC2->TCB2
bool IsPassToB() { return 0 != m_cfg.bPassTestB; } //<2F>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>pass<73>Ž<EFBFBD><C5BD><EFBFBD>B<EFBFBD><42><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
uint getFail() { return 100 - m_cfg.iSimYield; } //ʧ<><CAA7><EFBFBD><EFBFBD>
uint getSimCT() { return m_cfg.iSimCT; } //ģ<><C4A3><EFBFBD><EFBFBD><EFBFBD>Ի<EFBFBD>̨CT
//<2F>ξ<EFBFBD>ע<EFBFBD><D7A2>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ξ߱<CEBE><DFB1><EFBFBD><EFBFBD>Ƿ<EFBFBD>ok
bool ChkAteValid(int index, const char* pszate);
//<2F><><EFBFBD>͸<EFBFBD><CDB8>Ӿ<EFBFBD><D3BE><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
int SendTestGR(int tindex, const char* s = 0);
int PostReplyGR(int tindex, const char* s);
//<2F>ϱ<EFBFBD><CFB1><EFBFBD>־
void Report(const char *pszFormat, ...);
void PostWarn(const char *pszFormat, ...);
int regist_callback(callback fun);
callback get_callback()
{
return m_callback;
}
protected:
void Release();
void ReadConfig();
void RestorePos(int sindex);
//ģ<><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȫ<EFBFBD><C8AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void MakeInput();
//ȷ<><C8B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void Resize(vector<CProduct*>& vec, int nsize);
//<2F>ж<EFBFBD><D0B6><EFBFBD><EFBFBD><EFBFBD>ij<EFBFBD><C4B3>λ<EFBFBD><CEBB><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD>ϣ<EFBFBD><CFA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>򴴽<EFBFBD>һ<EFBFBD><D2BB>
void MakeProduct(int sindex, int index);
//<2F>ж<EFBFBD><D0B6><EFBFBD><EFBFBD><EFBFBD>ij<EFBFBD><C4B3>λ<EFBFBD><CEBB><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD>ϣ<EFBFBD><CFA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͷ<EFBFBD>
void ReleaseProduct(int sindex, int index);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int GetPosxy(int sindex); //<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӷ<EFBFBD><D3B6><EFBFBD>ɾ<EFBFBD><C9BE>
int SetPosxy(int sindex); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD><DDB5><EFBFBD><EFBFBD><EFBFBD>
int PosMap(int sindex); //ͨ<><CDA8>3<EFBFBD><33><EFBFBD><EFBFBD><EFBFBD>ݼ<EFBFBD><DDBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int ReleasePosxy(int sindex); //<2F>ͷ<EFBFBD><CDB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int SetPosxy(int sindex, char* pszcmd);
void MakeDate(char* pszdate);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ID
int CreateVar(const char* pszname, const char* pszdesc, int keep = 0);
void SetVarInit(const char* pszname, int ival);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ipvar* getVar(const char* pszname, const char* pszdesc, bool block = true);
ipvar* getVar(const char* pszname, const char* pszdesc, const char* pszval);
int GetTestIndex(const char* ate); //ͨ<><CDA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҳ<EFBFBD><D2B2>Ի<EFBFBD>̨<EFBFBD><CCA8><EFBFBD><EFBFBD>
//<2F><>Ʒ
CProduct* GetFromInput(); //<2F>ӽ<EFBFBD><D3BD>ϲֻ<CFB2>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
CProduct* FindProduct(const char* sn);
void FreeProduct(CProduct* p); //<2F>ͷŲ<CDB7>Ʒ
void PutToStock(int sindex, CProduct* p); //<2F><><EFBFBD><EFBFBD><EFBFBD>ϲ<EFBFBD>
//δ<>ӱ<EFBFBD><D3B1><EFBFBD>
int GetVacmCount(); //<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD><D0B6>ٿ<EFBFBD><D9BF><EFBFBD><EFBFBD><EFBFBD>
int FindTest(CProduct* p, bool bchkp, int aend = TESTCNT); //<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD>ξ<EFBFBD> ʧ<>ܷ<EFBFBD><DCB7><EFBFBD>0
int FindTestDual(CProduct* p, bool bchkp, int aend = TESTCNT); //<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD>ξ<EFBFBD> ʧ<>ܷ<EFBFBD><DCB7><EFBFBD>0 -- ˫<><CBAB>ģʽ
int M1();
int M2();
int M3();
int M4();
int M5();
int M6();
int M7();
int M8();
int Test(const char* pszcmd); //<2F><><EFBFBD>Խӿ<D4BD>
int SimTest(int tindex, int benable);
int VacmReset();
int StockReset(int sindex);
int VacmTake();
int TestPut();
int TestTake();
int StockPut();
int WhereToGo();
int TakeFromInput(const char* sn, int vacmIndex);
int MovetoTest(int vacmIndex, int testIndex);
int MovetoVacm(int testIndex, int vacmIndex);
int MovetoStock(int vacmIndex, int sindex);
int WaitTestIdle(int testIndex, int timeout);
int WaitM2Result(int sindex, char* szres, int timeout);
//˫<><CBAB>ģʽ<C4A3>ӿ<EFBFBD>
bool NeedTestDual(CProduct* p, int t = 0);
void GetTestPutDual(int &v, int &t, int aend, bool bchkp = false);
bool IsAAB() { return m_cfg.testType == 1; }
bool IsABC() { return m_cfg.testType == 2; }
bool IsDefault() { return m_cfg.testType == 0; }
void GetTestTake(int &v, int &t);
void GetNotestPut(int &v, int &t); //<2F><><EFBFBD><EFBFBD>4<EFBFBD><34><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ˣ<EFBFBD><CBA3><EFBFBD>ס<EFBFBD>ˣ<EFBFBD><CBA3><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD>ξ߽<CEBE><DFBD>л<EFBFBD><D0BB><EFBFBD>
void GetPutByTest(int &v, int t, bool bchkp);
void GetPutByTestB(int &v, int t, bool bchkp); //<2F><><EFBFBD>ξ<EFBFBD><CEBE>Ҳ<EFBFBD>Ʒ - B<><42>
void GetTestPut(int &v, int &t, bool bchkp = false);
//<2F>ӱ<EFBFBD><D3B1><EFBFBD>
int M1B();
int M2B();
int VacmResetB();
int StockResetB(int sindex);
int VacmTakeB();
int TestPutB();
int TestTakeB();
int StockPutB();
int WhereToGoB();
int TestPause(int testIndex, int bpause);
int GripEnable(int testIndex, int benable);
int CreateProductB(const char* sn, int vacmIndex);
int MovetoVacmB(int testIndex, int vacmIndex);
int MovetoStockB(int vacmIndex, int sindex);
int GetProductByPosB(EMapPos pos, int index, TProduct* pdata/* = 0*/);
int GetProductListB(EMapPos pos, TProduct* pdata/* = 0*/, int nsize/* = 0*/);
static int GreaterThenProduct(const void* a,const void* b);
//<2F>ξ<EFBFBD>ͨ<EFBFBD><CDA8>
void AcceptNew(); //<2F>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void ProcessMsg(); //<2F><>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD>
void RecvTestMsg();
void CalcUph(); //<2F><><EFBFBD><EFBFBD>UPH
void UpdateVarProduct();
void UploadReport();
int Process(); //<2F>̺߳<DFB3><CCBA><EFBFBD>
static int WINAPI ThreadFun(void* param);
void ProcessSendGR();
static int WINAPI PoolGR(void* param);
ulong _logct; //<2F><><EFBFBD>ڼ<EFBFBD>¼<EFBFBD><C2BC>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>־ʱ<D6BE><CAB1>
ulong GetLastCT(ulong curct);
private:
static CManage *m_pInstance;
Handle m_hSection; //<2F>ٽ<EFBFBD><D9BD><EFBFBD>
CoreConfig m_cfg;
list<char*> m_lsgMsg;
bool m_tstRun; //ת<><D7AA><EFBFBD>߳<EFBFBD><DFB3>Ƿ<EFBFBD><C7B7><EFBFBD>ִ<EFBFBD>У<EFBFBD>
list<TGRMsg*> m_tstMsg; //ת<><D7AA><EFBFBD><EFBFBD><EFBFBD>ξߵ<CEBE><DFB5><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߳<EFBFBD>ִ<EFBFBD><D6B4>
vector<CProduct*> m_vecStock[STOCKCNT]; //<2F><><EFBFBD><EFBFBD>Input OK NG1 NG2 NG3
CProduct** m_vacm_lst; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʒ
int m_vacm_cnt;
//<2F><>ǰ<EFBFBD><C7B0><EFBFBD>մ洢λ<E6B4A2><CEBB><EFBFBD><EFBFBD>Ϣ
list<TPosxy*> m_lst_pos[STOCKCNT];
list<TPosxy*> m_lst_posTmp[STOCKCNT];
int m_lst_index[STOCKCNT]; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>ȡλ<C8A1><CEBB>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
int m_prePut; //<2F><>һ<EFBFBD>η<EFBFBD><CEB7>ξ߱<CEBE><DFB1><EFBFBD>
CTest* m_ptest[TESTCNT]; //<2F>ξ<EFBFBD>
CTest* m_pconn; //<2F><><EFBFBD><EFBFBD><EFBFBD>Ӷ<EFBFBD><D3B6><EFBFBD>
bool m_brun; //<2F>߳<EFBFBD><DFB3><EFBFBD><EFBFBD>б<EFBFBD>ʶ
Handle m_hThread; //<2F>߳̾<DFB3><CCBE><EFBFBD>
hash_map<string, CProduct*> m_hash_lst; //<2F><><EFBFBD>в<EFBFBD>Ʒ<EFBFBD><C6B7><EFBFBD><EFBFBD>
//<2F>Ӿ<EFBFBD><D3BE><EFBFBD><EFBFBD><EFBFBD>
CVision* m_pVision[EVSize];
CVision* m_pVisionTest; //<2F><><EFBFBD>Բ<EFBFBD><D4B2><EFBFBD><EFBFBD><EFBFBD>
//ģ<><C4A3>
CSimTest* m_psimTest[TESTCNT];
//<2F><><EFBFBD><EFBFBD>
ipvar* m_pv; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ipvar* m_pt; //<2F>ξ<EFBFBD>/<2F>ϲֱ<CFB2><D6B1><EFBFBD>
ipvar* m_pclear; //<2F><><EFBFBD><EFBFBD><EFBFBD>ź<EFBFBD>
ipvar* m_pFour; //<2F>Ƿ<EFBFBD>һ<EFBFBD><D2BB>4
ipvar* m_pntake; //Ҫȡ<D2AA><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ipvar* m_pnput; //Ҫ<><D2AA>OK<4F>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ipvar* m_pUph; //<2F><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>ʵʱUPH
ipvar* m_pAllUph; //<2F><><EFBFBD><EFBFBD><EFBFBD>ܵ<EFBFBD>UPH
ipvar* m_pOutput; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ipvar* m_pLot; //<2F><><EFBFBD>̻<EFBFBD><CCBB>ϴ<EFBFBD><CFB4><EFBFBD>
ipvar* m_pEnda; //A<><41><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ipvar* m_pPause; //<2F><>ͣ<EFBFBD>ź<EFBFBD>
ipvar* m_pBin; //<2F><>bin<69><6E>Ϣ
ipvar* m_pCastoff; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʒ<EFBFBD><C6B7><EFBFBD><EFBFBD>
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
bool m_bupdatevar; //<2F>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD>²<EFBFBD>Ʒ<EFBFBD><C6B7><EFBFBD>ݵ<EFBFBD><DDB5><EFBFBD><EFBFBD><EFBFBD>
ipvar* m_pvar_vacm[4];
ipvar* m_pvar_test[TESTCNT];
callback m_callback; //<2F>ص<EFBFBD><D8B5><EFBFBD><EFBFBD><EFBFBD>
};
#endif //<2F><>ֹ<EFBFBD>ظ<EFBFBD><D8B8><EFBFBD><EFBFBD><EFBFBD>