📄 powerdc.cpp
字号:
// PowerDC.cpp : 实现文件
//
#include "stdafx.h"
#include "SerialTest.h"
#include "PowerDC.h"
#include ".\powerdc.h"
#include "..\..\global\tcpbase.h"
#include "protocol.h"
#include <math.h>
// CPowerDC 对话框
IMPLEMENT_DYNAMIC(CPowerDC, CDialog)
CPowerDC::CPowerDC(CWnd* pParent /*=NULL*/)
: CDialog(CPowerDC::IDD, pParent)
, m_DeviceCode(0)
{
blOpen = false;
blMonitor = false;
m_DeviceCode = 0x25;
iPt = 0;
//电压参数
m_Power1.SetMinValue(46);
m_Power1.SetMaxValue(57);
m_Power2.SetMinValue(46);
m_Power2.SetMaxValue(57);
//电流参数
m_Power3.SetMinValue(0);
m_Power3.SetMaxValue(500);
m_Power4.SetMinValue(0);
m_Power4.SetMaxValue(500);
}
CPowerDC::~CPowerDC()
{
}
void CPowerDC::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Control(pDX, IDC_STAPOWER1, m_Power1);
DDX_Control(pDX, IDC_CMBCOM, m_listCom);
DDX_Text(pDX, IDC_EDTRATE, m_rate);
DDX_Control(pDX, IDC_CHKAUTO, m_chkAutoSend);
DDX_Control(pDX, IDC_LSTINFO, m_listInfo);
DDX_Control(pDX, IDC_STAPOWER2, m_Power2);
DDX_Control(pDX, IDC_STAPOWER3, m_Power3);
DDX_Control(pDX, IDC_STAPOWER4, m_Power4);
DDX_Control(pDX, IDC_LISTDEVICE, m_lstAddress);
DDX_Control(pDX, IDC_LISTALARM, m_lstInfo);
}
BEGIN_MESSAGE_MAP(CPowerDC, CDialog)
ON_BN_CLICKED(IDC_BTNOPEN, OnBnClickedBtnopen)
ON_BN_CLICKED(IDC_BTNCLOSE, OnBnClickedBtnclose)
ON_BN_CLICKED(IDC_CHKAUTO, OnBnClickedChkauto)
ON_MESSAGE(WM_COMM_RXCHAR,onCOMM_RXCHAR)
ON_WM_PAINT()
ON_BN_CLICKED(IDC_BTNADD, OnBnClickedBtnadd)
ON_BN_CLICKED(IDC_BTNDELETE, OnBnClickedBtndelete)
ON_BN_CLICKED(IDC_BTNSEND, OnBnClickedBtnsend)
ON_WM_CLOSE()
ON_NOTIFY(NM_DBLCLK, IDC_LISTALARM, OnNMDblclkListalarm)
ON_NOTIFY(HDN_ITEMCLICK, 0, OnHdnItemclickListalarm)
ON_NOTIFY(LVN_ITEMCHANGED, IDC_LISTALARM, OnLvnItemchangedListalarm)
END_MESSAGE_MAP()
// CPowerDC 消息处理程序
void CPowerDC::OnBnClickedBtnopen()
{
// TODO: 在此添加控件通知处理程序代码
DWORD dwCommEvents =0;
dwCommEvents |= EV_BREAK;
dwCommEvents |= EV_CTS;
dwCommEvents |= EV_DSR;
dwCommEvents |= EV_ERR;
dwCommEvents |= EV_RING;
dwCommEvents |= EV_RLSD;
dwCommEvents |= EV_RXCHAR;
dwCommEvents |= EV_RXFLAG;
dwCommEvents |= EV_TXEMPTY;
BOOL bResult = FALSE;
CString strCom;
int iPort ;
if (blOpen)
{
m_Port.ClosePort();
((CWnd *)GetDlgItem(IDC_BTNOPEN))->SetWindowText("Open");
blOpen = FALSE;
}
else
{
m_listCom.GetWindowText(strCom);
if (strCom.GetLength() >0 )
{
strCom.Replace("COM","");
iPort = atoi(strCom.GetBuffer());
}
if (iPort < 0 || iPort> 12)
iPort = 1;
//assert(iPort>0 && iPort<= 12);
bResult = m_Port.InitPort(this,iPort,4800,'N',8,1,dwCommEvents,1024);
if (!bResult)
{
((CWnd *)GetDlgItem(IDC_BTNOPEN))->SetWindowText("Open");
blOpen = FALSE;
AfxMessageBox("串口被占用或不存在...");
return ;
}else
{
blOpen = TRUE;
((CWnd *)GetDlgItem(IDC_BTNOPEN))->SetWindowText("Close");
}
}
}
void CPowerDC::IniControl(void)
{
/*
CFont ft;
LOGFONT lgFont;
ft.GetLogFont(&lgFont);
lgFont.lfHeight =12;
ft.CreateFontIndirect(&lgFont);
((CWnd *)GetDlgItem(IDC_STATIC1))->SetFont(&ft);
((CWnd *)GetDlgItem(IDC_STATIC2))->SetFont(&ft);
((CWnd *)GetDlgItem(IDC_STATIC3))->SetFont(&ft);
((CWnd *)GetDlgItem(IDC_STATIC4))->SetFont(&ft);
*/
m_arrayDevice.RemoveAll();
memset(&m_subStatus,0,sizeof(m_subStatus));
m_listCom.AddString(_T("COM1"));
m_listCom.AddString(_T("COM2"));
m_listCom.AddString(_T("COM3"));
m_listCom.AddString(_T("COM4"));
m_listCom.AddString(_T("COM5"));
m_listCom.AddString(_T("COM6"));
m_listCom.AddString(_T("COM7"));
m_listCom.AddString(_T("COM8"));
m_listCom.SetCurSel(0);
CBitmap *bmIcon16 = new CBitmap();
bmIcon16->LoadBitmap(IDB_BMPALARM16);
m_imgList.Create(16,16,ILC_COLOR24,5,1);
m_imgList.SetBkColor(RGB(255,255,255));
m_imgList.Add(bmIcon16,RGB(0,0,0));
CBitmap *bmIcon32 = new CBitmap();
bmIcon32->LoadBitmap(IDB_BMPALARM32);
m_imgList32.Create(32,32,ILC_COLOR24,5,1);
m_imgList32.SetBkColor(RGB(255,255,255));
m_imgList32.Add(bmIcon32,RGB(0,0,0));
delete bmIcon16;
delete bmIcon32;
m_lstInfo.SetImageList(&m_imgList,LVSIL_SMALL);
m_lstInfo.SetImageList(&m_imgList32,LVSIL_NORMAL);
m_lstInfo.SetImageList(&m_imgList,LVSIL_STATE);
m_lstInfo.DeleteAllItems();
m_lstInfo.ModifyStyle(NULL,LVS_REPORT | WS_VSCROLL | WS_VSCROLL );
m_lstInfo.SetExtendedStyle(LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES|LVS_EX_FLATSB|LVS_EX_GRIDLINES|LVS_EX_ONECLICKACTIVATE);
int i = 0;
m_lstInfo.InsertColumn(i++,"序号",LVCFMT_CENTER,70,0);
m_lstInfo.InsertColumn(i++,"地址",LVCFMT_CENTER,70,0);
m_lstInfo.InsertColumn(++i,"主电压",LVCFMT_CENTER,60,0);
m_lstInfo.InsertColumn(++i,"备电压",LVCFMT_CENTER,60,0);
m_lstInfo.InsertColumn(++i,"主电流",LVCFMT_CENTER,60,0);
m_lstInfo.InsertColumn(++i,"备电流",LVCFMT_CENTER,60,0);
m_lstInfo.InsertColumn(++i,"电压告警",LVCFMT_CENTER,60,0);
m_lstInfo.InsertColumn(++i,"电流告警",LVCFMT_CENTER,60,0);
m_lstInfo.InsertColumn(++i,"支路告警",LVCFMT_CENTER,160,0);
m_lstInfo.InsertColumn(++i,"时间",LVCFMT_CENTER,80,0);
}
BOOL CPowerDC::OnInitDialog()
{
CDialog::OnInitDialog();
// TODO: 在此添加额外的初始化
SetDlgItemText( IDC_EDTRATE,_T("1000"));
IniControl();
return TRUE; // return TRUE unless you set the focus to a control
// 异常: OCX 属性页应返回 FALSE
}
void CPowerDC::OnBnClickedBtnclose()
{
BOOL bResult;
if (blMonitor)
{
bResult = m_Port.CloseMonitoring();
if (bResult)
{
((CWnd *)GetDlgItem(IDC_BTNCLOSE))->SetWindowText("Start");
blMonitor = FALSE;
}else
{
((CWnd *)GetDlgItem(IDC_BTNCLOSE))->SetWindowText("Stop");
blMonitor = TRUE;
}
}else
{
bResult = m_Port.StartMonitoring();
if (bResult)
{
((CWnd *)GetDlgItem(IDC_BTNCLOSE))->SetWindowText("Stop");
blMonitor = TRUE;
}else
{
((CWnd *)GetDlgItem(IDC_BTNCLOSE))->SetWindowText("Open");
blMonitor = FALSE;
}
}
}
void CPowerDC::OnBnClickedChkauto()
{
BOOL bResult = FALSE;
DWORD dCode;
UpdateData();
if (m_rate.GetLength() == 0)
return ;
iInterval = atoi(m_rate.GetBuffer());
if (m_chkAutoSend.GetCheck() == BST_CHECKED)
{
bAsking = TRUE;
m_pThread = AfxBeginThread(Asking,(LPVOID)this);
//SetTimer(1,iRate,NULL);
}
else if (m_chkAutoSend.GetCheck() == BST_UNCHECKED)
{
bAsking = FALSE;
if ( ::GetExitCodeThread(m_pThread->m_hThread,&dCode))
{
::TerminateThread(m_pThread->m_hThread,dCode);
m_pThread = NULL;
}
//KillTimer(1);
}
}
UINT CPowerDC::Asking(LPVOID lpWnd)
{
CPowerDC *dlg = (CPowerDC *)lpWnd;
int iRate = dlg->iInterval;
for(;;)
{
if (!dlg->bAsking)
return 0;
else
{
dlg->AskData();
Sleep(iRate);
}
}
}
int CPowerDC::AskData()
{
char btBuf[] = "F\0";
UCHAR ucBuf;
CString sBuf,strType,strSend;
int iAddress = 0 ;
//btBuf = new char[]{"F\0"};
//btBuf[0] = 'F';
//btBuf[1] = '\0';
m_inCount++;
m_outCount++;
strType = char(0x25);
strType = m_fun.ToHexString(strType.GetBuffer(),1);
//strType = char(0x25);
//m_Port.AskCom(btBuf,1);
for (int i=0;i<m_lstAddress.GetCount();i++)
{
m_lstAddress.GetText(i,sBuf );
iAddress = atoi(sBuf.GetBuffer());
sBuf.Format("%0.2X",iAddress);
//sBuf = m_fun.ToHexString(sBuf.GetBuffer(),sBuf.GetLength());
strSend = m_fun.Build(sBuf,strType,UCHAR(0x44));
m_Port.AskCom(strSend.GetBuffer(),strSend.GetLength());
}
return 0;
}
LRESULT CPowerDC::onCOMM_RXCHAR(WPARAM wParam, LPARAM lParam)
{
CString sBuf,sTemp;
int iLen;
char *pt;
char cbuf[MAX_SIZE];
sMsgBody *msgBody;
//CProtocolfun pfun;
msgBody = (sMsgBody *)wParam;
iLen = msgBody->iLen;
pt = new char[msgBody->iLen + 1];
memcpy(pt,msgBody->lpBuf ,msgBody->iLen);
pt[msgBody->iLen] = '\0';
CProtocol fun;
//sBuf = fun.ToHexString(pt,iLen);
sBuf = pt;
m_listInfo.AddString(sBuf);
/*
CListBox *m_ListBox = (CListBox *)GetDlgItem(IDC_LSTINFO);
if (m_source.GetCheck() == BST_CHECKED)
{
if (m_hex.GetCheck()== BST_CHECKED)
sBuf = ToHexString(pt,iLen);
else
{
memcpy(cbuf,pt,iLen);
cbuf[iLen] = '\0';
sBuf = cbuf;
}
m_listInfo.AddString(sBuf);
}
m_inCount++ ;
CString strTip;
strTip.Format("发送:%d 接收:%d",m_outCount,m_inCount);
((CWnd *)GetDlgItem(IDC_STASEND))->SetWindowText(strTip);
*/
DataAnalyse(pt,iLen);
return 0;
}
// 分析计算级别及时间
int CPowerDC::Analyse(LPVOID *rscStatus)
{
double dValue = 0;
BOOL bStatus = FALSE;
int iOld = 0;
int iCur = 0;
return 0;
}
int CPowerDC::DataAnalyse(char *lpBuf, int iLen)
{
char cBuf[4096];
int iSub = 0;
int iSample = 0;
int iVoltage = 0;
int iRet = 0;
BYTE cData[5];
CString strBuf;
BYTE bt ;
memcpy(cBuf,lpBuf,iLen);
//校验数据的合法性
//if (!((BYTE)cBuf[0] == 0x7e && (BYTE)cBuf[iLen] == 0x0D))
//return -1;
tyPowerDC m_curData;
//取得地址码
strBuf = cBuf[3];
strBuf += cBuf[4];
sscanf(strBuf.GetBuffer(),"%X",&(m_curData.m_Addr));
strBuf = cBuf[7];
strBuf += cBuf[8];
sscanf(strBuf.GetBuffer(),"%X",&iRet);
if (iRet == 2)
return(-1);
//取得支路空开告警信息
strBuf = cBuf[13];
strBuf += cBuf[14];
sscanf(strBuf.GetBuffer(),"%X",&(m_curData.m_subAlarm));
//取得电压电流告警信息
strBuf = cBuf[15];
strBuf += cBuf[16];
sscanf(strBuf.GetBuffer(),"%X",&(m_curData.m_Alarm));
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -