三菱FX系列PLC與PC通訊的實現之專有協議(計算機聯接)的程式設計之二
阿新 • • 發佈:2019-01-06
在實現這程式的過程中,關於字串的使用。
1、CString型別加法。指令操作是由各個功能區組成的。
Instruction = pParentDlg->m_StationID + pParentDlg->m_PCID + Instruction + pParentDlg->m_WaitingTime + SoftElementType+ SoftElementNum + m_SoftElementAmount;
2、字串前面補“0”,使得長度一致3、字元轉HEX(2位)for (int i = 0; i<(4 - LengthOfSoftElementNum); i++) { SoftElementNum = _T("0") + SoftElementNum; }
for (int i = 0; i<m_InstructionPackage.GetLength(); i++)
{
str.Format(_T("%.2x"), m_InstructionPackage[i]);
InstructionPackage_HEX += str+_T(" ");
}
轉HEX時,有大小寫差異,%x 轉換後 是小寫, %X轉換後是大寫
4、特殊字元用轉義符
if (pParentDlg->m_Ctrl_Protocol.GetCurSel() == 0) { m_InstructionPackage = _T("\x5") + m_Command; } else if (pParentDlg->m_Ctrl_Protocol.GetCurSel() == 1) { m_InstructionPackage = _T("\x5") + m_Command + _T("\r") + _T("\n"); }
關於函式的引數使用控制元件
CWnd* pcCComboBox;
pcCComboBox = GetDlgItem(IDC_COMBO_SOFTELEMENTTYPE1);
SoftElementType1 = GetSoftElementType(pcCComboBox);
CString PC_FXPLCDlg_Test::GetSoftElementType(CWnd* cComboBox)
關於Tab控制元件內的視窗使用主視窗類的變數
//定義一個指向主視窗類的指標,通過該指標來獲取其他變數
//兩次GetParent(),第一次得到Tab,第二次得到主對話方塊 CPC_FXPLCDlg *pParentDlg = (CPC_FXPLCDlg *)GetParent()->GetParent();
Instruction = pParentDlg->m_StationID + pParentDlg->m_PCID + Instruction + pParentDlg->m_WaitingTime + ElementsAmount + SoftElementType1 + SoftElementID1 + SoftElementData1;
關於Tab控制元件的使用
1、需要建立border為none、style為child的視窗及關聯類;
2、在主視窗類中新增子視窗類變數,在主視窗的初始化函式中,新增如下程式碼
//Tab區初始化
CRect tabRect; // 標籤控制元件客戶區的位置和大小
m_Ctrl_Tab.InsertItem(0, _T("成批軟元件讀寫")); // 插入第一個標籤“成批軟元件讀寫”
m_Ctrl_Tab.InsertItem(1, _T("指定軟元件讀寫")); // 插入第二個標籤“指定軟元件讀寫”
m_Ctrl_Tab.InsertItem(2, _T("其他指令"));
m_rwDlg.Create(IDD_PC_FXPLCDLG_RW, &m_Ctrl_Tab); // 建立第一個標籤頁
m_testDlg.Create(IDD_PC_PLCTEST_DIALOG, &m_Ctrl_Tab); // 建立第二個標籤頁
m_othersDlg.Create(IDD_PC_PLC_DIALOG_OTHERS, &m_Ctrl_Tab);
m_Ctrl_Tab.GetClientRect(&tabRect); // 獲取標籤控制元件客戶區Rect
// 調整tabRect,使其覆蓋範圍適合放置標籤頁
tabRect.left += 1;
tabRect.right -= 1;
tabRect.top += 20;
tabRect.bottom -= 1;
// 根據調整好的tabRect放置m_rwDlg子對話方塊,並設定為顯示
m_rwDlg.SetWindowPos(NULL, tabRect.left, tabRect.top, tabRect.Width(), tabRect.Height(), SWP_SHOWWINDOW);
// 根據調整好的tabRect放置m_testDlg子對話方塊,並設定為隱藏
m_testDlg.SetWindowPos(NULL, tabRect.left, tabRect.top, tabRect.Width(), tabRect.Height(), SWP_HIDEWINDOW);
// 根據調整好的tabRect放置m_othersDlg子對話方塊,並設定為隱藏
m_othersDlg.SetWindowPos(NULL, tabRect.left, tabRect.top, tabRect.Width(), tabRect.Height(), SWP_HIDEWINDOW);
3、定義tab切換的函式
void CPC_FXPLCDlg::OnTcnSelchangeTabFunctions(NMHDR *pNMHDR, LRESULT *pResult)
{
// TODO: 在此新增控制元件通知處理程式程式碼
*pResult = 0;
CRect tabRect; // 標籤控制元件客戶區的Rect
// 獲取標籤控制元件客戶區Rect,並對其調整,以適合放置標籤頁
m_Ctrl_Tab.GetClientRect(&tabRect);
tabRect.left += 1;
tabRect.right -= 1;
tabRect.top += 20;
tabRect.bottom -= 1;
switch (m_Ctrl_Tab.GetCurSel())
{
// 如果標籤控制元件當前選擇標籤為“成批軟元件讀寫”,則隱藏m_testDlg、m_othersDlg對話方塊, 顯示m_rwDlg對話方塊
case 0:
m_rwDlg.SetWindowPos(NULL, tabRect.left, tabRect.top, tabRect.Width(), tabRect.Height(), SWP_SHOWWINDOW);
m_testDlg.SetWindowPos(NULL, tabRect.left, tabRect.top, tabRect.Width(), tabRect.Height(), SWP_HIDEWINDOW);
m_othersDlg.SetWindowPos(NULL, tabRect.left, tabRect.top, tabRect.Width(), tabRect.Height(), SWP_HIDEWINDOW);
break;
// 如果標籤控制元件當前選擇標籤為“指定軟元件讀寫”,則隱藏m_rwDlg、m_othersDlg對話方塊,顯示m_testDlg對話方塊
case 1:
m_rwDlg.SetWindowPos(NULL, tabRect.left, tabRect.top, tabRect.Width(), tabRect.Height(), SWP_HIDEWINDOW);
m_testDlg.SetWindowPos(NULL, tabRect.left, tabRect.top, tabRect.Width(), tabRect.Height(), SWP_SHOWWINDOW);
m_othersDlg.SetWindowPos(NULL, tabRect.left, tabRect.top, tabRect.Width(), tabRect.Height(), SWP_HIDEWINDOW);
break;
// 如果標籤控制元件當前選擇標籤為“其他指令”,則隱藏m_rwDlg、m_testDlg對話方塊,顯示m_othersDlg對話方塊
case 2:
m_rwDlg.SetWindowPos(NULL, tabRect.left, tabRect.top, tabRect.Width(), tabRect.Height(), SWP_HIDEWINDOW);
m_testDlg.SetWindowPos(NULL, tabRect.left, tabRect.top, tabRect.Width(), tabRect.Height(), SWP_HIDEWINDOW);
m_othersDlg.SetWindowPos(NULL, tabRect.left, tabRect.top, tabRect.Width(), tabRect.Height(), SWP_SHOWWINDOW);
break;
default:
break;
}
}
字串中每個字元求和
UINT Sum_Instruction = 0;
for (int i = 0; i <= Instruction.GetLength();i++)
{
char c = Instruction[i];
Sum_Instruction = Sum_Instruction + c;
}
m_SumOfInstruction.Format(_T("%X"), Sum_Instruction);
判斷輸入字元是否滿足要求
void CPC_FXPLCDlg_RW::OnEnKillfocusEditSoftelementamount()
{
// TODO: 在此新增控制元件通知處理程式程式碼
CString SoftElementAmount_New;
m_Ctrl_SoftElementAmount.GetWindowTextW(SoftElementAmount_New);
BOOL Flag_SoftElementAmount = TRUE;
int i = 0;
char c = SoftElementAmount_New[i];
for (;SoftElementAmount_New[i] != '\0';i++)
{
if (Flag_SoftElementAmount)
{
if (!(((c >= '0') && (c <= '9')) || ((c >= 'A') && (c <= 'F'))))
{
AfxMessageBox(_T("輸入的軟元數量非法"));
Flag_SoftElementAmount = FALSE;
UpdateData(FALSE);
return;
}
}
}
if (Flag_SoftElementAmount)
{
UpdateData(TRUE);
UpdateData(FALSE);
}
}
程式程式碼:
http://download.csdn.net/detail/pengjc2001/9752456