1. 程式人生 > >三菱FX系列PLC與PC通訊的實現之專有協議(計算機聯接)的程式設計之二

三菱FX系列PLC與PC通訊的實現之專有協議(計算機聯接)的程式設計之二

在實現這程式的過程中,關於字串的使用。

1、CString型別加法。指令操作是由各個功能區組成的。

Instruction = pParentDlg->m_StationID + pParentDlg->m_PCID + Instruction + pParentDlg->m_WaitingTime + SoftElementType+ SoftElementNum + m_SoftElementAmount;
2、字串前面補“0”,使得長度一致
for (int i = 0; i<(4 - LengthOfSoftElementNum); i++)
{
SoftElementNum = _T("0") + SoftElementNum;
}
3、字元轉HEX(2位)
	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