// 읽기용데이터작성
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 는쓰기불가..
// 아래것은Bit와Word 모두가능하니까.. 구분해서처리하도록하자...
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;
}
'1.소프트웨어 이야기 > 09.ETC' 카테고리의 다른 글
switch case 문안에 변수나 클래스를 초기화 하고자 할때.. (0) | 2009.11.25 |
---|---|
엑셀에서 16진후 변환 하는 함수 - 참고용 (0) | 2009.08.28 |
정발위에서도 모드칩 없이 홈브류 설치가 가능................ (0) | 2009.05.11 |