C++开发SECS/GEM指南含源代码 EAP

S5F1用途

This message reports a change in or presence of an alarm condition. One message will be issued when the alarm is set and one message will be issued when the alarm is cleared. Irrecoverable errors and attention flags may not have a corresponding clear message.

C++开发SECS/GEM指南含源代码 EAP_第1张图片

ALID是什么?

Alarm怎么处理

C++开发SECS/GEM指南含源代码 EAP_第2张图片

获取和处理ALID、ALTX等

S5F1、S5F2、S5F3、S5F4、S5F5、S5F6指令

 中文SECS/GEM方案网站 www.secsgem.cn 

头文件

#pragma once
#include "afxcmn.h"


// CAlarmView 对话框

class CAlarmView : public CMyDialogEx
{
	DECLARE_DYNAMIC(CAlarmView)
	
public:
	CAlarmView(CWnd* pParent = NULL);   // 标准构造函数
	virtual ~CAlarmView();

// 对话框数据
	enum { IDD = IDD_ALARM_VIEW };

protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持
	virtual BOOL OnInitDialog();
	DECLARE_MESSAGE_MAP()
public:

	afx_msg void OnBtnEnable();
	afx_msg void OnBtnDisable();
	afx_msg void OnBtnDiscovery();
	afx_msg void OnLvnItemchangedListAlarm(NMHDR *pNMHDR, LRESULT *pResult);

	LRESULT OnStateChange(WPARAM wp, LPARAM lp);
	LRESULT OnAlarmChange(WPARAM wp, LPARAM lp);


public:

	// 更新列表
	void UpdateAlarmList();
	void DeleteAllItem();
	int AddItemToCtrl(ALARM_DATA& var);
	void InitCtrl();
	void AlarmEnable(string pALID, bool bEnable);	
	void UpdateAlarmLineColour(int nLine, bool bAlarm);	// 改变警报行颜色
	void InitAlarm();	
	void SortObject(vector& veVar);	// 排序

private:
	CListCtrlCl m_ctrlVariable;


	int m_nSelID;
	int m_nCurSel;


};

CPP部分

// ChildView/AlarmView.cpp : 实现文件
//

#include "stdafx.h"
#include "HostViewApp.h"
#include "ChildView/AlarmView.h"
#include "afxdialogex.h"
#include "CallbackHandle/CallbackHandle.h"

// CAlarmView 对话框

IMPLEMENT_DYNAMIC(CAlarmView, CMyDialogEx)

CAlarmView::CAlarmView(CWnd* pParent /*=NULL*/)
	: CMyDialogEx(CAlarmView::IDD, pParent)
{
	SetTitle("警报");
}

CAlarmView::~CAlarmView()
{
}

void CAlarmView::DoDataExchange(CDataExchange* pDX)
{
	CMyDialogEx::DoDataExchange(pDX);
	DDX_Control(pDX, IDC_LIST_ALARM, m_ctrlVariable);
}


BEGIN_MESSAGE_MAP(CAlarmView, CMyDialogEx)
	ON_MESSAGE(ON_CONTROL_CHANGE, OnStateChange)
	ON_BN_CLICKED(IDC_BTN_ENABLE, OnBtnEnable)
	ON_BN_CLICKED(IDC_BTN_DISABLE, OnBtnDisable)
	ON_BN_CLICKED(IDC_BTN_DISCOVERY, OnBtnDiscovery)
	ON_NOTIFY(LVN_ITEMCHANGED, IDC_LIST_ALARM, OnLvnItemchangedListAlarm)
	ON_MESSAGE(ON_ALARM_CHANGE, OnAlarmChange)
	
END_MESSAGE_MAP()


// CAlarmView 消息处理程序


BOOL CAlarmView::OnInitDialog()
{
	CMyDialogEx::OnInitDialog();

	InitCtrl();

	return TRUE;  // return TRUE unless you set the focus to a control
	// 异常: OCX 属性页应返回 FALSE
}




void CAlarmView::InitCtrl()
{
	m_ctrlVariable.InsertColumn(0, "ALID", 0, 100);
	m_ctrlVariable.InsertColumn(1, "Enable", 0, 80);
	m_ctrlVariable.InsertColumn(2, "Set", 0, 80);
	m_ctrlVariable.InsertColumn(3, "Name", 0, 496);

	m_ctrlVariable.InitCtrl();
}



void CAlarmView::OnBtnDiscovery()
{
	UpdateAlarmList();
}

LRESULT CAlarmView::OnStateChange(WPARAM wp, LPARAM lp)
{
	if(lp == eCONTROL_ONLINE)
	{
		InitAlarm();
	}
	return 0;
}

LRESULT CAlarmView::OnAlarmChange(WPARAM wp, LPARAM lp)
{
	int nIsSet = (int)lp;
	const char* pALID = (char* )wp;
	if(pALID != nullptr)
	{
		// 从查找对应的ID进行修改
		int nCount = m_ctrlVariable.GetItemCount();
		CString ID;

		for (int i = 0; i < nCount; i++)
		{
			ID = m_ctrlVariable.GetItemText(i, 0);
			if(ID == pALID)
			{
				m_ctrlVariable.SetItemText(i, 2, (nIsSet==0?"0":"1"));
				UpdateAlarmLineColour(i, nIsSet != 0);
				break;
			}
		}
	}
	return 0;
}

// 更新列表
void CAlarmView::UpdateAlarmList()
{
	vector vas;
	RcResult rc = m_pSecs->AlarmListGet(vas);
	SHOW_MSG_RC(rc);

	if(rc.rc == 0)
	{
		SortObject(vas);	// 排序

		DeleteAllItem();

		// 添加到界面	
		int nSel = 0;
		for(unsigned int i = 0; i < vas.size(); i++)
		{
			nSel = AddItemToCtrl(vas[i]);
			if (nSel >= 0)
			{
				// 更新颜色
				UpdateAlarmLineColour(nSel, vas[i].bSet);
			}
		}
	}
	
}



// 排序
void CAlarmView::SortObject(vector& veVar)
{	
	list listSort;
	list::iterator listIte;
	vector veTmp = veVar;

	// 排序
	for (unsigned int i = 0; i < veTmp.size(); i++)
	{
		SORT_OBJECT pObject;
		pObject.nNum = ::atoi(veTmp[i].ALID.c_str());
		pObject.pObject = &veTmp[i];

		for (listIte = listSort.begin(); listIte != listSort.end(); listIte++)
		{
			if (listIte->nNum > pObject.nNum)
			{
				break;
			}
		}
		listSort.insert(listIte, pObject);
	}

	// 复制到原来的对象
	veVar.clear();
	for (listIte = listSort.begin(); listIte != listSort.end(); listIte++)
	{
		veVar.push_back(*(ALARM_DATA*)(listIte->pObject));
	}
}

void CAlarmView::DeleteAllItem()
{
	m_ctrlVariable.DeleteAllItems();
}

int CAlarmView::AddItemToCtrl(ALARM_DATA& ad)
{
	int nCount = m_ctrlVariable.GetItemCount();
		
	m_ctrlVariable.InsertItem(nCount, ad.ALID.c_str());
	m_ctrlVariable.SetItemText(nCount, 1, (ad.bEnable ? "1" : "0"));
	m_ctrlVariable.SetItemText(nCount, 2, (ad.bSet ? "1" : "0"));
	m_ctrlVariable.SetItemText(nCount, 3, ad.ALTX.c_str());
	
	return nCount;
}


void CAlarmView::OnBtnEnable()
{
	CString pALID = m_ctrlVariable.GetItemText(m_nCurSel, 0);
	AlarmEnable((LPCSTR)pALID, true);
}

void CAlarmView::OnBtnDisable()
{
	CString pALID = m_ctrlVariable.GetItemText(m_nCurSel, 0);
	AlarmEnable((LPCSTR)pALID, false);
}


void CAlarmView::AlarmEnable(string pALID, bool bEnable)
{	
	int nALID = ::atoi(pALID.c_str());
	RcResult rc = m_pSecs->AlarmEnable(nALID, bEnable);
	if(rc.rc)
	{
		SHOW_MSG_RC(rc);
	}
	else
	{
		m_ctrlVariable.SetItemText(m_nCurSel, 1, bEnable?"1":"0");
	}
}






void CAlarmView::OnLvnItemchangedListAlarm(NMHDR *pNMHDR, LRESULT *pResult)
{
	LPNMLISTVIEW pNMLV = reinterpret_cast(pNMHDR);
	
	*pResult = 0;

	if(pNMLV->uOldState != 0  //旧状态
		&& pNMLV->uNewState == 0)
	{

	}
	else  //新状态 和 选择同样
	{	
		m_nCurSel = pNMLV->iItem;
		CString pText = m_ctrlVariable.GetItemText(m_nCurSel, 0);
		m_nSelID = ::atol(pText);			
	}
}



// 改变警报行颜色
void CAlarmView::UpdateAlarmLineColour(int nLine, bool bAlarm)
{
	COLORREF pSetColor = RGB(128, 0, 0);
	COLORREF pClearColor = RGB(128, 128, 128); // disco色

	if(bAlarm)
	{		
		// 警报
		m_ctrlVariable.SetRowColor(nLine, pSetColor);
		m_ctrlVariable.Invalidate();
	}
	else
	{
		// 正常
		m_ctrlVariable.SetRowColor(nLine, pClearColor);
		m_ctrlVariable.Invalidate();
	}	


}


void CAlarmView::InitAlarm()
{
	if (g_appdata.m_bInitAlarm)
	{
		UpdateAlarmList();
	}	
}





你可能感兴趣的:(SECS,欧姆龙协议,FINS)