MFC工控项目实例之十八手动测试界面输入信号实时检测

承接专栏添加链接描述《MFC工控项目实例之十七添加手动测试界面》

用到PC6408板卡,根据板卡设置界面组合框选项设定的输入信号,通过读取文件中保存的键值,用线程的方式实时检测输入信号通断,这里只用启动、停止两个信号示例。

1、在Data_1.h文件中添加代码

cpp 复制代码
CString COMB_Data_1[]={"启动","停止"};	
CString COMB_Data_O_1[]={"夹紧","密闭","进气","平衡","排气","黄灯","绿灯","红灯","输出9","输出10","输出11","输出12","输出13","输出14","输出15","输出16"};
CString COMB_Data_AD_1[]={"AD输入1","AD输入2","AD输入3","AD输入4","AD输入5","AD输入6","AD输入7","AD输入8","AD输入9","AD输入10","AD输入11","AD输入12","AD输入13","AD输入14","AD输入15","AD输入16"};
int COMB_Data_Number_1;
int COMB_Data_O_Number_1=(sizeof(COMB_Data_O_1) / sizeof(COMB_Data_O_1[1]));
int COMB_Data_AD_Number_1=(sizeof(COMB_Data_AD_1) / sizeof(COMB_Data_AD_1[1]));
unsigned char b_1[16];
CString b_str_1[16];

2、在JogTest.h中添加代码

cpp 复制代码
class CJogTest : public CDialog
{
// Construction
public:
	CJogTest(CWnd* pParent = NULL);   // standard constructor
    CButtonST   m_btnStart_1[16];
    CFont m_font;
	CWinThread* pThread_1; 
	bool isThreadBegin_1 ;  //线程退出/执行控制
	void My_Func_1();
  static UINT My_TheradFunc_1(LPVOID lparam);
 CString	m_Path;
CString strFilePath;
int In_lamp[16];
...
protected:
unsigned short nAddr_1;
	// Generated message map functions
	//{{AFX_MSG(CJogTest)
	virtual BOOL OnInitDialog();
	afx_msg void OnRadio1();
	afx_msg void OnRadio2();
	virtual void OnOK();
	virtual void OnCancel();
	//}}AFX_MSG
	DECLARE_MESSAGE_MAP()
};
#endif // !defined(AFX_JOGTEST_H__7E13E123_5220_40F7_9ED7_862C1685F610__INCLUDED_)

3、在JogTest.cpp中添加代码

cpp 复制代码
	CJogTest::CJogTest(CWnd* pParent /*=NULL*/)
	: CDialog(CJogTest::IDD, pParent)
{
	m_font.CreateFont(-28,0,0,0,700,FALSE,FALSE,
					0,134,OUT_DEFAULT_PRECIS,
					CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,
					FF_SWISS,"楷体_GB2312");
	TCHAR exeFullPath[MAX_PATH];
	GetModuleFileName(NULL,exeFullPath,MAX_PATH);
	m_Path = exeFullPath;
	for(int i = m_Path.GetLength() - 1; i > 0 ; i --)
	{
		if(m_Path.GetAt(i) == '\\')
			break;
	}
	SetCurrentDirectory(m_Path);
	m_Path = m_Path.Left(i);
    strFilePath= m_Path + "\\Test.ini";
	nAddr_1 = 0x100; //设置板卡基地址
	COMB_Data_Number_1=(sizeof(COMB_Data_1) / sizeof(COMB_Data_1[1]));

}


BOOL CJogTest::OnInitDialog() 
{
	CDialog::OnInitDialog();
	for(int i=0;i<=COMB_Data_Number_1;i++)
   {
	   
	GetPrivateProfileString("输入信号",COMB_Data_1[i],NULL,b_str_1[i].GetBuffer(20),20,strFilePath);	

	}
	

				for ( i=0;i<2;i++)
	{
			m_btnStart_1[i].SetIcon(IDI_ICON_LedOff);
    }

    for ( i=0;i<14;i++)

	{
		GetDlgItem(IDC_STATIC0+i)->SetFont(&m_font);
		SetDlgItemText(IDC_STATIC0+i,"0");

	}

	if( OpenDevice6K() != TRUE )
		AfxMessageBox("Open device failed!");
	DO6408All(nAddr_1,0X0);
	SetTimer(1,500,NULL);
	isThreadBegin_1= true;            //运行线程执行
     pThread_1= AfxBeginThread(My_TheradFunc_1,(LPVOID)this);

	return TRUE;  // return TRUE unless you set the focus to a control
	              // EXCEPTION: OCX Property Pages should return FALSE
}


UINT CJogTest::My_TheradFunc_1(LPVOID lparam)//将窗口指针赋给无类型指针
 
{
 
     CJogTest *dlg = (CJogTest*)lparam;   //可以调用CBoardTest定义的类成员函数
     while (dlg->isThreadBegin_1)
	{
		dlg->My_Func_1(); //线程要执行的函数(调用CTheradtDlg定义的类成员函数)
	
	}
 return 0;
     
}


void CJogTest::My_Func_1() //处理函数在这里写
{
	 for(int i=0;i<2;i++)
	 {
In_lamp[i]=_ttoi(b_str_1[i]);
b_1[i]=DI6408Bit(nAddr_1,In_lamp[i]);
    if (b_1[i])
	{
      m_btnStart_1[i].SetIcon(IDI_ICON_LedOn);
	}
	else
	{
		 m_btnStart_1[i].SetIcon(IDI_ICON_LedOff);
	}
	 }
    Sleep(100);
}

void CJogTest::OnRadio1() 
{
	CString tempStr;
	//int n=b_1[1];
//str.Format("s%",n);
tempStr.Format("%s",b_1[1]);
//sprintf(tempStr,"%s",b_1[1]);
   // SetDlgItemText(IDC_STATIC99,tempStr1);
	SetDlgItemText(IDC_STATIC101,tempStr);
	
}

void CJogTest::OnRadio2() 
{
	// TODO: Add your control notification handler code here
	
}

void CJogTest::OnOK() 
{
	isThreadBegin_1  = false;            //停止线程执行
KillTimer(1); 
 Sleep(500);
EndDialog(IDD_DIALOG_SYS_TEST);
	CDialog::OnOK();
}

void CJogTest::OnCancel() 
{
isThreadBegin_1  = false;            //停止线程执行
KillTimer(1); 
 Sleep(500);
EndDialog(IDD_DIALOG_SYS_TEST);
	CDialog::OnCancel();
}
相关推荐
I_belong_to_jesus6 小时前
C++关于分支预测的优化1
开发语言·c++·算法
Rabitebla7 小时前
【Linux】进程控制(十二) 自定义 Shell(二):内建命令与进程工作目录管理
linux·c++·笔记·学习·bash
码客-ygluu13 小时前
一个通用游戏数据服务器
c++·架构
another heaven13 小时前
【C/C++ Ranges 是零开销抽象吗?拆开管道、惰性求值和编译期膨胀】
c语言·开发语言·c++
YLCHUP15 小时前
【思维&图论建模】题解:债权(debt)_图论_建模_思路转化_思维题目_C++算法竞赛
c++·笔记·算法·数学建模·贪心算法·深度优先·图论
xiaoye-duck15 小时前
《C++ 项目:手写大模型接入 SDK》会话模块整合:内存 SessionManager 与 DataManager 持久化联动
开发语言·数据库·c++·语言模型
思麟呀16 小时前
背包DP(01背包+完全背包)
c++·算法
旖旎夜光17 小时前
【C++ 基础入门】C++11 新特性(中):右值引用、移动语义与完美转发
开发语言·c++·笔记·学习
ShineWinsu18 小时前
对于Qt:QTabWidget常见属性的解析
开发语言·数据库·c++·qt·浏览器·qtabwidget·标签页
俊俊几年的19 小时前
动态规划(Dynamic Programming)详解:从入门到 LeetCode Hot 100
linux·c++·算法·leetcode·嵌入式·动态规划·c