1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
#pragma once
 
#include "Thread_ControlIF.h"
#include "TransDataManager.h"
#include "BICommon.h"
 
// 4/13 MiniLED
#if MINI_LED
#define        PLC_ADDR_SENDSIGNAL1        2129 // EI : 629 // MINI LED : 2129 // RCUT : 629
#define        PLC_TRASFERDATA_ADDR        2000 // EI : 500 // MINI LED : 2000 // RCUT : 500
#define        PLC_ADDR_GLASS_JUDEMENT        2100 // EI : 600 // MINI LED : 2100 // RCUT : 600
#else
#define        PLC_ADDR_SENDSIGNAL1        629 // MINI LED : 2129 // RCUT : 629
#define        PLC_TRASFERDATA_ADDR        500 // MINI LED : 2000 // RCUT : 500
#define        PLC_ADDR_GLASS_JUDEMENT        600 // MINI LED : 2100 // RCUT : 600
#endif // MINI_LED
 
#define        PLC_ADDR_PROFILE_JUDEMENT    4300
#define        PLC_MAX_SIGNAL_BIT            10
 
enum    enInterface_Send_Control{SERVER_ALIVE=0,GLASSLOADING_HANDSHAKE, SHORT_SCANSTART_HANDSHAKE,SHORT_SCANEND_HANDSHAKE, LONG_SCANSTART_HANDSHAKE,LONG_SCANEND_HANDSHAKE,enInterface_None};
 
enum ControlToAllSignal {C2A_ControlAlive = 0, C2A_RunningMode, C2A_ReviewMode, C2A_ReviewManualMode, C2A_BypassMode, C2A_VaripanelMode, C2A_DualMode, C2A_PPIDUseMode ,ControlToAllSignal_Count };
 
enum ControlToInspect    {C2I_Loading = 0, C2I_ShortScanStart, C2I_ShortScanEnd,C2I_LongScanStart, C2I_LongScanEnd, C2I_EMOGrabStop,C2I_InitInspect,    ControlToInspect_Count};
 
enum InspectToControlSignal    { IToC_Ack_LoadingSuccess=0, IToC_Ack_LoadingFail, IToC_Ack_ShortScanStartSuccess, IToC_Ack_ShortScanStartFail, IToC_Ack_ShortScanEndSuccess, IToC_Ack_ShortScanEndFail
    , IToC_Ack_LongScanStartSuccess, IToC_Ack_LongScanStartFail, IToC_Ack_LongScanEndSuccess, IToC_Ack_LongScanEndFail, IToC_Sig_InspectionCount};
enum InspectToControlAlarm {IToC_Alarm_InspectorError=0, IToC_Alarm_InspectOverflow,IToC_Alarm_EdgeCrack, IToC_Alarm_NoRecipe ,IToC_Alarm_FindEdgeFail, IToC_Alarm_LightError, IToC_Alarm_UpperLimit, IToC_Alarm_LowestLimit
    ,IToC_Alarm_NoImage,IToC_Alarm_GlassDetectFail,IToC_Alarm_TransferData,IToC_Alarm_InternalValue ,IToC_Alarm_InspectionCount};
 
#define    ALIVE_BIT(nValue, add, bit)     nValue= nValue | ((add)<<(bit));
#define IS_ALIVE_BIT(nValue, bit)     ((nValue & (0x01<<(bit))) >>(bit));
 
typedef struct _ST_PLC_RECIVE_01
{
    BOOL                    bPLCHeatbit;
    BOOL                    bGlassLoading;    
    BOOL                    bShortScanStart;        
    BOOL                    bShortScanEnd;                    
    BOOL                    bLongScanStart;        
    BOOL                    bLongScanEnd;                    
    BOOL                    bEMOGrabStop;
 
    _ST_PLC_RECIVE_01()
    {
        Reset();
    }
    _ST_PLC_RECIVE_01(int nPLCData)
    {    
        (nPLCData & 0x01)?bPLCHeatbit=TRUE:bPLCHeatbit=FALSE;
        (nPLCData & 0x02)?bGlassLoading=TRUE:bGlassLoading=FALSE;
        (nPLCData & 0x04)?bShortScanStart=TRUE:bShortScanStart=FALSE;
        (nPLCData & 0x08)?bShortScanEnd=TRUE:bShortScanEnd=FALSE;            
        (nPLCData & 0x10)?bLongScanStart=TRUE:bLongScanStart=FALSE;
        (nPLCData & 0x20)?bLongScanEnd=TRUE:bLongScanEnd=FALSE;
        (nPLCData & 0x40)?bEMOGrabStop=TRUE:bEMOGrabStop=FALSE;        
    }
    void Reset()
    {
        bPLCHeatbit = bGlassLoading = bShortScanStart = bShortScanEnd = bLongScanStart =FALSE;
        bLongScanEnd = bEMOGrabStop = FALSE;        
    }        
}ST_PLC_RECIVE_01,*pST_PLC_RECIVE_01;
 
typedef struct _ST_PLC_SEND_01
{
    BOOL    bServerAlive;
    BOOL    bGlassLoadingAck;        
    BOOL    bShortScanStartAck;
    BOOL    bShortScanEndAck;
    BOOL    bLongScanStartAck;
    BOOL    bLongScanEndAck;
 
    _ST_PLC_SEND_01()
    {
        bServerAlive = FALSE;
        Reset(FALSE);
    }    
    void Reset(BOOL bSet)
    {        
        bGlassLoadingAck = bShortScanStartAck = bShortScanEndAck = bLongScanStartAck = bLongScanEndAck = bSet;                                    
    }        
    void ChangeSignal(_ST_PLC_SEND_01 &pSent)
    {
        if(pSent.bGlassLoadingAck) bGlassLoadingAck = FALSE;
        if(pSent.bShortScanStartAck) bShortScanStartAck = FALSE;
        if(pSent.bShortScanEndAck) bShortScanEndAck = FALSE;
        if(pSent.bLongScanStartAck) bLongScanStartAck = FALSE;
        if(pSent.bLongScanEndAck) bLongScanEndAck = FALSE;            
    }
    void MakeSend(int &nSendData)
    {        
        nSendData = 0;    
        ALIVE_BIT(nSendData, bLongScanEndAck, 5);
        ALIVE_BIT(nSendData, bLongScanStartAck, 4);
        ALIVE_BIT(nSendData, bShortScanEndAck, 3);
        ALIVE_BIT(nSendData, bShortScanStartAck, 2);
        ALIVE_BIT(nSendData, bGlassLoadingAck, 1);
        ALIVE_BIT(nSendData, bServerAlive, 0);    
    }
}ST_PLC_SEND_01,*pST_PLC_SEND_01;
 
interface IMainFrameInterface2Parent
{
    virtual void IMI2P_PLC_ReceiveSignalValue(int nSignalIndex, int nValue) = 0;    
};
 
class CControl_Interface : public IControlInterface2Parent
{
public:
    CControl_Interface(void);
    virtual ~CControl_Interface(void);
 
public:    
    virtual BOOL        ControlProcess();
    virtual    BOOL        ConnectToControl();
    virtual BOOL        DisconnectToPLC();
    virtual BOOL        SendConstrol(enInterface_Send_Control enAlarm,int nValue);    
    virtual BOOL        SendCIMData(short *pBuf,int nAddr,int nCnt);        
    virtual BOOL        SendJudgement(int nJudge);                
    virtual BOOL        ReadRcpHandNo(int &nRcpNo,int &nHandNo);
 
    BOOL                IsConnect(){return m_bConnect;}
    void                SetI2M(IMainFrameInterface2Parent *pI2M){m_pI2M=pI2M;}
 
public:
    bool                WriteCStringPLC(TCHAR* strAddress, CString strData,int nWSize=0);
    bool                WriteLongPLC(TCHAR* strAddress, short* WriteData, unsigned int nWORDSize);    
    bool                WriteLongPLC_Signal(int iLongSigIdx,TCHAR* strAddress, short* WriteData, unsigned int nWORDSize);
    bool                WriteIntArrayPLC(TCHAR* strAddress, int* WriteData, unsigned int nArraySize);
    bool                WriteWordArrayPLC(TCHAR* strAddress, WORD* WriteData, unsigned int nArraySize);
    bool                WriteWORDPLCTimer(TCHAR* strAddress, short WriteData, DWORD msecTimer);    
    bool                WriteWORDOneBitTimer(TCHAR* strAddress, short BITOrder, DWORD msecTimer);
    bool                WriteWORDManyBitsTimer(TCHAR* strAddress, char* BitFlag, DWORD msecTimer);
 
    BOOL                ReadPLCData(int nAddr, int& nData);
    BOOL                ReadPLCData(int nAddr, int &nData, int nLen);
    BOOL                ReadPLCData(int nAddr, CString& strData, int nLen);
    BOOL                ReadPLCData(char cMemory, int nAddr, CString& strData, int nLen);    
    BOOL                RecvPLCData(char cDevice , int nAddr, char* pData,unsigned short nWORDSize);
    bool                ReadLongData(char* pData, TCHAR* strAddress, unsigned short nSize);
    BOOL                ReadTIMEData(char cMemory, int nAddr, CString& strData, int nLen, SYSTEMTIME &sTime);    
    BOOL                ReadPLCDataDec(char cMemory, int nAddr, int &nData, int nByteSize);
 
    BOOL                SendPLCIO_Alive();
    BOOL                SendPLCData(int nAddr, int nData);
    BOOL                SendPLCData_NoTimer(int nAddr, int nData, int nLen);
    BOOL                SendPLCBItData(int nAddr, short nData);
    BOOL                SendPLCData(char cDevice, int nAddr, CString& strData, int nLen);    
    BOOL                SendIntPLCData(char cDevice, int nAddr, int nData);
    BOOL                SendIntArrayPLCData(char cDevice, int nAddr, int* pData, int nLen);
    BOOL                SendWordArrayPLCData(char cDevice, int nAddr, WORD* pData, int nLen);
 
    BOOL                ReadTransferData(CTransDataManager *TData,char *lpTransBuffer,int Addr);
    BOOL                StrToHex(CHAR* pchData, CHAR* pchDataSrc, INT nLength, BOOL bWordReverse=TRUE);
 
public:
    void                LoadSignalOnTime();
    void                SaveSignalOnTime();
    int                    GetSignalOnTime(int nSignalIndex);
    int                    GetSignalDelayTime(int nSignalIndex);
    int                    m_nSignalOnTime[PLC_MAX_SIGNAL_BIT];
    int                    m_nSignalOnDelayTime[PLC_MAX_SIGNAL_BIT];
 
protected:
    BOOL                ConnectPLCConnector();
    BOOL                ReadPLCIOBit();
    BOOL                CheckSignal_01();
    BOOL                SendPLCIO_01();        
    BOOL                CheckAliveTime();
    int                    GetSignal();
    int                    GetLongSignal();
 
protected:
    HANDLE                m_hMap;
    char                *m_pSharedMemory;            
    ST_PLC_RECIVE_01    m_Rcv01;
    ST_PLC_SEND_01        m_Send01,m_SentBack01;
    int                    m_nSignal;            //Signal ÀÔ·Â
    int                    m_nLongSignal;            //Signal ÀÔ·Â
    CEvent                m_ReadEvent;
    double                m_dTickPrevTime;
 
 
    
protected:    
    IMainFrameInterface2Parent    *m_pI2M;
    CThread_ControlIF            *m_pThreadControlIF;
    BOOL                        m_bConnect;
 
    int                            m_nRecvedPLCIO1;
    BOOL                        m_bRecvedPLCIO1;
};