// 읽기용데이터작성

CString CPLC_Comm::MakeReadCmd(int nCpu, CString strAddress, int nSize)
{
    CString strCmd;

   // 01BRDI00001,020 CR LF //    01WRDD00001,05 CR LF     strCmd= "HHCMDSAAAAA,LLL";

    switch(strAddress.GetAt(0))
    {
        // Word Read    
        case 'X':
        case 'Y':            
        case 'I':            
        case 'E':            
        case 'L':            
        case 'M':        
        // 여기까지는Bit / Word Read 모두가능

        /*        
        // Bit Read                                                                
        strCmd.Format(_T("%.2dBRD%s,%.3d\r\n"),
                      nCpu,
                      strAddress,
                      nSize);
        */

        // 이하는Word만읽기가능...    
        case 'T':    // TP = Timer Current Value, TS = Timer preset value, TI = Timer current value(Count Up Type)
        case 'C':    // CP = Timer Current Value, CS = Timer preset value, CI = Timer current value(Count Up Type)
        case 'D':
        case 'B':
        case 'W':
        case 'Z':
        case 'R':
        case 'V':
            // Word Read
            strCmd.Format(_T("%.2dWRD%s,%.2d\r\n"),
                          nCpu,
                          strAddress,
                          nSize);        
            break;
    }
    return strCmd;
}

// 쓰기용데이터작성
CString CPLC_Comm::MakeWriteCmd(int nCpu, CString strAddress, CString strData)
{

// 01BRWI00001,020 CR LF //    01WRWD00001,05 CR LF    strCmd= "HHCMDSAAAAA,LLL,";
    CString strCmd;

    switch(strAddress.GetAt(0))
    {            
        // Bit Write    
        // X, M, Z 는쓰기불가..
        // 아래것은BitWord 모두가능하니까.. 구분해서처리하도록하자...
        case 'I':
        case 'Y':        
        case 'E':
        case 'L':
            // 여기까지는Bit/Word 모두사용가능

            if( strData.GetLength() < 5)                                // 길이가1이면1Bit만쓰자...
            {
                // 한비트씩쓰니까.. 길이는고정...
                strCmd.Format(_T("%.2dBWR%s,001,%s\r\n"),
                              nCpu,
                              strAddress,
                            // (strData.GetLength()),                            // 기존처럼.. 굳이.. 길이구할필요가없음..
                              strData);
            }
            else                                                                // 아니라면Word 형태로쓰자..
            {
                if(strData.GetLength() % 4 == 0)
                {
                    strCmd.Format(_T("%.2dWWR%s,%.2d,%s\r\n"),
                                  nCpu,
                                  strAddress,
                                  (int)(strData.GetLength() * 0.25),
                                  strData);
                }
                else
                {
                    _LOG_DISP(_T("Word 번지의값은4자리값만사용할수있습니다."));
                }
            }
            break;            

        // 여기부터는Word만가능
        case 'T':    // TP = Timer Current Value, TS = Timer preset value, TI = Timer current value(Count Up Type)
        case 'C':    // CP = Timer Current Value, CS = Timer preset value, CI = Timer current value(Count Up Type)     
        case 'D':    
        case 'B':
        case 'R':    
        case 'W':
        case 'V':    
        // Word Write
            if(strData.GetLength() % 4 == 0)
            {
                strCmd.Format(_T("%.2dWWR%s,%.2d,%s\r\n"),
                              nCpu,
                              strAddress,
                              (int)(strData.GetLength() * 0.25),
                              strData);
            }
            else
            {
                _LOG_DISP(_T("Word 번지의값은4자리값만사용할수있습니다."));
            }            
            break;

            // 특수명령어처리...
        case 'S':        
            switch(strAddress.GetAt(2))        
            {    
                case 'P':                                
                    strCmd.Format(_T("%.2dSTP\r\n"), nCpu);                    // Stop
                    break;                    

                case 'A':
                    strCmd.Format(_T("%.2dSTA\r\n"), nCpu);                    // Run
                    break;
            }
            break;
    }

    #ifdef _DEBUG
        //TRACE(strCmd);
        _LOG_DISP(strCmd);        
    #endif //_DEBUG    
    _LOG_DISP(strCmd);        
    return strCmd;
}

+ Recent posts