404 lines
13 KiB
C++
404 lines
13 KiB
C++
// DialDevStatusTimerShow.cpp : implementation file
|
||
//
|
||
|
||
#include "stdafx.h"
|
||
#include "geomative.h"
|
||
#include "DialQueryPLCStatus.h"
|
||
#include "TaskDataOper.h"
|
||
#include "FileOperTools.h"
|
||
|
||
#ifdef _DEBUG
|
||
#define new DEBUG_NEW
|
||
#undef THIS_FILE
|
||
static char THIS_FILE[] = __FILE__;
|
||
#endif
|
||
|
||
/////////////////////////////////////////////////////////////////////////////
|
||
// CDialDevStatusTimerShow dialog
|
||
extern int g_iUILanguage;
|
||
extern time_t Str2GmtTm(CString szTime);
|
||
extern CString Tm2LocalStr(time_t t);
|
||
extern float tcp_ntohf(float f);
|
||
CDialQueryPLCStatus::CDialQueryPLCStatus(CWnd* pParent /*=NULL*/)
|
||
: CNetRequestDialog(CDialQueryPLCStatus::IDD, pParent)
|
||
{
|
||
//{{AFX_DATA_INIT(CDialDevStatusTimerShow)
|
||
// NOTE: the ClassWizard will add member initialization here
|
||
//}}AFX_DATA_INIT
|
||
m_PLCID = 0;
|
||
m_bAppendData = FALSE;
|
||
}
|
||
|
||
|
||
void CDialQueryPLCStatus::DoDataExchange(CDataExchange* pDX)
|
||
{
|
||
CNetRequestDialog::DoDataExchange(pDX);
|
||
//{{AFX_DATA_MAP(CDialDevStatusTimerShow)
|
||
DDX_Control(pDX, IDC_LIST_PLC_STATUS, m_listData);
|
||
DDX_Control(pDX, IDC_DATETIMEPICKER_STARTTIME, m_StartTime);
|
||
DDX_Control(pDX, IDC_DATETIMEPICKER_ENDTIME, m_EndTime);
|
||
//}}AFX_DATA_MAP
|
||
}
|
||
|
||
|
||
BEGIN_MESSAGE_MAP(CDialQueryPLCStatus, CNetRequestDialog)
|
||
//{{AFX_MSG_MAP(CDialDevStatusTimerShow)
|
||
ON_BN_CLICKED(IDC_BTN_QUERY_PLC_STATUS, &CDialQueryPLCStatus::OnBnQueryPLCStatus)
|
||
//}}AFX_MSG_MAP
|
||
END_MESSAGE_MAP()
|
||
|
||
/////////////////////////////////////////////////////////////////////////////
|
||
// CDialDevStatusTimerShow message handlers
|
||
/*struct stPLCStatus
|
||
{
|
||
UINT32 uStatusTime;
|
||
float fSimulation1; //模拟量
|
||
float fSimulation2; //模拟量
|
||
float fSimulation3; //模拟量
|
||
float fSimulation4; //模拟量
|
||
float fVoltage; //电压
|
||
float fTemperature; //温度
|
||
float fSimulation7; //模拟量
|
||
float fSimulation8; //模拟量
|
||
float fReserve; //预留
|
||
BYTE bSwitch1; //控制变量
|
||
BYTE bSwitch2; //控制变量
|
||
BYTE bSwitch3; //控制变量
|
||
BYTE bSwitch4; //控制变量
|
||
BYTE bSwitch5; //控制变量
|
||
BYTE bSwitch6; //控制变量
|
||
BYTE bSwitch7; //控制变量
|
||
BYTE bSwitch8; //控制变量
|
||
BYTE bSwitch9; //控制变量
|
||
BYTE bSwitch10; //控制变量
|
||
BYTE bReserve; //预留
|
||
};*/
|
||
|
||
BOOL CDialQueryPLCStatus::OnInitDialog()
|
||
{
|
||
CNetRequestDialog::OnInitDialog();
|
||
if (LANG_ZHCN == g_iUILanguage)
|
||
{
|
||
SetWindowText(_T("设备状态"));
|
||
GetDlgItem(IDC_STATIC_START_TIME)->SetWindowText(_T("开始时间:"));
|
||
GetDlgItem(IDC_STATIC_END_TIME)->SetWindowText(_T("结束时间:"));
|
||
GetDlgItem(IDC_BTN_QUERY_PLC_STATUS)->SetWindowText(_T("查询"));
|
||
}
|
||
|
||
// TODO: Add extra initialization here
|
||
CString strColTitle;
|
||
|
||
int iColIndex = 0;
|
||
|
||
m_listData.SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_HEADERDRAGDROP
|
||
| LVS_EX_ONECLICKACTIVATE | LVS_EX_GRIDLINES);
|
||
|
||
CRect rect;
|
||
m_listData.GetClientRect(&rect);
|
||
int iWidth = rect.right - rect.left;
|
||
int iColCount = 5;
|
||
if (LANG_ZHCN == g_iUILanguage)
|
||
{
|
||
m_listData.InsertColumn(iColIndex++, _T("时间"), LVCFMT_CENTER, iWidth / iColCount);
|
||
// m_listData.InsertColumn(iColIndex++, _T("Voltage1(V)"), LVCFMT_CENTER, 90);
|
||
// m_listData.InsertColumn(iColIndex++, _T("Voltage2(V)"), LVCFMT_CENTER, 90);
|
||
// m_listData.InsertColumn(iColIndex++, _T("Voltage3(V)"), LVCFMT_CENTER, 90);
|
||
// m_listData.InsertColumn(iColIndex++, _T("Voltage4(V)"), LVCFMT_CENTER, 90);
|
||
m_listData.InsertColumn(iColIndex++, _T("电池电压(V)"), LVCFMT_CENTER, iWidth / iColCount);
|
||
m_listData.InsertColumn(iColIndex++, _T("温度(℃)"), LVCFMT_CENTER, iWidth / iColCount);
|
||
// m_listData.InsertColumn(iColIndex++, _T("Switch1"), LVCFMT_CENTER, 90);
|
||
// m_listData.InsertColumn(iColIndex++, _T("Switch2"), LVCFMT_CENTER, 90);
|
||
m_listData.InsertColumn(iColIndex++, _T("主机开关"), LVCFMT_CENTER, iWidth / iColCount);//K3
|
||
m_listData.InsertColumn(iColIndex++, _T("电源开关"), LVCFMT_CENTER, iWidth / iColCount);//K4
|
||
}
|
||
else
|
||
{
|
||
m_listData.InsertColumn(iColIndex++, _T("Time"), LVCFMT_CENTER, iWidth / iColCount);
|
||
// m_listData.InsertColumn(iColIndex++, _T("Voltage1(V)"), LVCFMT_CENTER, 90);
|
||
// m_listData.InsertColumn(iColIndex++, _T("Voltage2(V)"), LVCFMT_CENTER, 90);
|
||
// m_listData.InsertColumn(iColIndex++, _T("Voltage3(V)"), LVCFMT_CENTER, 90);
|
||
// m_listData.InsertColumn(iColIndex++, _T("Voltage4(V)"), LVCFMT_CENTER, 90);
|
||
m_listData.InsertColumn(iColIndex++, _T("Battery Voltage(V)"), LVCFMT_CENTER, iWidth / iColCount);
|
||
m_listData.InsertColumn(iColIndex++, _T("Temperature(℃)"), LVCFMT_CENTER, iWidth / iColCount);
|
||
// m_listData.InsertColumn(iColIndex++, _T("Switch1"), LVCFMT_CENTER, 90);
|
||
// m_listData.InsertColumn(iColIndex++, _T("Switch2"), LVCFMT_CENTER, 90);
|
||
m_listData.InsertColumn(iColIndex++, _T("GD Swit"), LVCFMT_CENTER, iWidth / iColCount);//K3
|
||
m_listData.InsertColumn(iColIndex++, _T("BP Swit"), LVCFMT_CENTER, iWidth / iColCount);//K4
|
||
}
|
||
|
||
// m_listData.InsertItem(0,"1");
|
||
// m_listData.InsertItem(1, "2");
|
||
//任务时间间隔默认5分钟
|
||
CTime time;
|
||
CTime TDate;
|
||
time_t tTime;
|
||
CString strTime;
|
||
CString strDate;
|
||
m_StartTime.GetTime(TDate);
|
||
strDate = TDate.Format("%Y-%m-%d"); //获取到的为日期 如:2010-03-05
|
||
strTime = time.Format(" 00:00:00");
|
||
strDate += strTime;
|
||
tTime = Str2GmtTm(strDate);
|
||
m_StartTime.SetTime(tTime);
|
||
|
||
m_EndTime.GetTime(TDate);
|
||
//strDate.Format(_T("%d-%d-%d"), TDate.GetYear(), TDate.GetMonth(), TDate.GetDay() + 3); //获取到的为日期 如:2010-03-05
|
||
strDate = TDate.Format("%Y-%m-%d");
|
||
strTime = time.Format(" 23:59:59");
|
||
strDate += strTime;
|
||
tTime = Str2GmtTm(strDate);
|
||
m_EndTime.SetTime(tTime);
|
||
|
||
//初始化任务列表
|
||
OnBnQueryPLCStatus();
|
||
return TRUE; // return TRUE unless you set the focus to a control
|
||
// EXCEPTION: OCX Property Pages should return FALSE
|
||
}
|
||
|
||
void CDialQueryPLCStatus::OnBnQueryPLCStatus()
|
||
{
|
||
// TODO: 在此添加控件通知处理程序代码
|
||
m_bAppendData = FALSE;
|
||
|
||
CTime time;
|
||
CTime TDate;
|
||
time_t tStartTime,tEndTime;
|
||
CString strTime;
|
||
CString strDate;
|
||
m_StartTime.GetTime(TDate);
|
||
//m_CDTTimeStart.GetTime(time);
|
||
strDate = TDate.Format("%Y-%m-%d"); //获取到的为日期 如:2010-03-05
|
||
strTime = time.Format(" 00:00:00");
|
||
strDate += strTime;
|
||
tStartTime = Str2GmtTm(strDate);
|
||
|
||
m_EndTime.GetTime(TDate);
|
||
//m_CDTTimeEnd.GetTime(time);
|
||
strDate = TDate.Format("%Y-%m-%d"); //获取到的为日期 如:2010-03-05
|
||
strTime = time.Format(" 23:59:59");
|
||
strDate += strTime;
|
||
tEndTime = Str2GmtTm(strDate);
|
||
CString strLog;
|
||
strLog.Format(_T("zm:PLC status:query starttime=%s,endtime=%s"), Tm2LocalStr(tStartTime), Tm2LocalStr(tEndTime));
|
||
CFileOperTools::GetInstance()->WriteComLog(strLog);
|
||
|
||
CTime clsStart(tStartTime);
|
||
CTime clsStop(tEndTime);
|
||
CTimeSpan timeSpan1 = clsStop - clsStart;
|
||
int iDay = timeSpan1.GetDays();
|
||
if (iDay > 10)
|
||
{
|
||
if (LANG_ZHCN == g_iUILanguage)
|
||
AfxMessageBox(_T("最多支持续10天内的状态查询"));
|
||
else
|
||
MessageBoxEx(NULL, _T("Maximum number of status queries for 10 days"), STRING_MESSAGEBOXEX_TITLE, MB_OK, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US));
|
||
return;
|
||
}
|
||
|
||
m_tSaveQueryStartTime = tStartTime;
|
||
m_tSaveQueryEndTime = tEndTime;
|
||
|
||
m_tQueryStartTime = tStartTime;
|
||
m_tQueryEndTime = tStartTime + LOAD_PLC_STATUS_BY_DATE_CELL*24 * 3600;
|
||
STPLCStatusInfoRequest request;
|
||
request.uPLCID = htonl(m_PLCID);
|
||
request.uStartTime = htonl(m_tQueryStartTime);
|
||
request.uEndTime = htonl(m_tQueryEndTime);
|
||
PostNetRequest(EN_REQ_QUERY_PLC_STATUS, this->m_hWnd, (char*)&request, sizeof(STPLCStatusInfoRequest),10*1024);
|
||
}
|
||
|
||
void CDialQueryPLCStatus::PreNetResponse(WPARAM wParam, LPARAM lParam)
|
||
{
|
||
LPRESPONSEPACKET pResponsePacket = (LPRESPONSEPACKET)lParam;
|
||
if (pResponsePacket == NULL)
|
||
{
|
||
return;
|
||
}
|
||
|
||
switch (pResponsePacket->clsPacketBase.ucCmd)
|
||
{
|
||
case EN_REQ_QUERY_PLC_STATUS://删除循环任务响应
|
||
{
|
||
if (!m_bAppendData)
|
||
{
|
||
OnPLCStatusResponse(wParam, lParam);
|
||
}
|
||
else
|
||
{
|
||
OnAppendPLCStatusResponse(wParam, lParam);
|
||
}
|
||
|
||
CString strLog;
|
||
CTime clsStart(m_tSaveQueryStartTime);
|
||
CTime clsStop(m_tSaveQueryEndTime);
|
||
//strLog.Format(_T("zm:CDialTaskTree::PreNetResponse query time range:starttime=%s,endTime=%s\n"), Tm2LocalStr(m_tSaveQueryStartTime), Tm2LocalStr(m_tSaveQueryEndTime));
|
||
//OutputDebugString(strLog);
|
||
CTimeSpan timeSpan1 = clsStop - clsStart;
|
||
int iDay = timeSpan1.GetDays();
|
||
if (iDay > 0)
|
||
{
|
||
m_bAppendData = TRUE;
|
||
|
||
CTimeSpan ts(1, 0, 0, 0); // 加1天
|
||
clsStart = clsStart + ts;
|
||
CString date = clsStart.Format("%Y-%m-%d %H:%M:%S ");
|
||
m_tSaveQueryStartTime = Str2GmtTm(date);
|
||
|
||
time_t uiCurTime = 0;
|
||
time_t uiStartTime = 0;
|
||
m_tQueryStartTime = m_tSaveQueryStartTime;
|
||
m_tQueryEndTime = m_tSaveQueryStartTime + LOAD_PLC_STATUS_BY_DATE_CELL * 24 * 3600 + 3600;//3600预留一小时,客户端与服务器偏差时间
|
||
strLog.Format(_T("zm:CDialQueryPLCStatus::PreNetResponse request start time:%s,end time=%s\n"), Tm2LocalStr(m_tQueryStartTime), Tm2LocalStr(m_tQueryEndTime));
|
||
OutputDebugString(strLog);
|
||
|
||
STPLCStatusInfoRequest request;
|
||
request.uPLCID = htonl(m_PLCID);
|
||
request.uStartTime = htonl(m_tQueryStartTime);
|
||
request.uEndTime = htonl(m_tQueryEndTime);
|
||
PostNetRequest(EN_REQ_QUERY_PLC_STATUS, this->m_hWnd, (char*)&request, sizeof(STPLCStatusInfoRequest), 10 * 1024);
|
||
}
|
||
}
|
||
break;
|
||
default:
|
||
break;
|
||
}
|
||
|
||
}
|
||
|
||
BOOL CDialQueryPLCStatus::OnPLCStatusResponse(WPARAM wParam, LPARAM lParam)
|
||
{
|
||
LPRESPONSEPACKET pResponsePacket = (LPRESPONSEPACKET)lParam;
|
||
if (pResponsePacket == NULL)
|
||
{
|
||
return FALSE;
|
||
}
|
||
if ((1 > pResponsePacket->wDataLen) || (EN_RECV_SUCCESS != pResponsePacket->pData[0]))
|
||
{
|
||
//theApp.m_NetWorkOper.SetSuspendForThread(false);
|
||
return FALSE;
|
||
}
|
||
else
|
||
{
|
||
m_listData.DeleteAllItems();
|
||
UINT32 *uiRevData = (UINT32*)(pResponsePacket->pData);
|
||
UINT32 iTotalNum = ntohl(uiRevData[0]);
|
||
STPLCSTATUS* pStatus = (STPLCSTATUS*)(&pResponsePacket->pData[sizeof(UINT32)]);
|
||
STPLCSTATUS status;
|
||
CString strTemp;
|
||
int iColIndex = 0;
|
||
int j = 0;
|
||
for (int i = 0; i < iTotalNum; i++)
|
||
{
|
||
iColIndex = 0;
|
||
status = pStatus[i];
|
||
m_listData.InsertItem(i, _T(""));
|
||
m_listData.SetItemText(i, iColIndex++, Tm2LocalStr(ntohl(status.uStatusTime)));
|
||
|
||
// j = 0;
|
||
// for (; j < 4; j++)
|
||
// {
|
||
// strTemp.Format(_T("%.2f"), tcp_ntohf(status.fSimulation[j]));
|
||
// m_listData.SetItemText(i, iColIndex++, strTemp);
|
||
// }
|
||
|
||
strTemp.Format(_T("%.2f"), tcp_ntohf(status.fVoltage));
|
||
m_listData.SetItemText(i, iColIndex++, strTemp);
|
||
|
||
strTemp.Format(_T("%.2f"), tcp_ntohf(status.fTemperature));
|
||
m_listData.SetItemText(i, iColIndex++, strTemp);
|
||
|
||
for (j = 2; j < 4; j++)//for (j = 0; j < 4; j++)
|
||
{
|
||
strTemp = (status.bSwitch[j] == 0) ? _T("OFF") : _T("ON");
|
||
m_listData.SetItemText(i, iColIndex++, strTemp);
|
||
}
|
||
|
||
}
|
||
}
|
||
return TRUE;
|
||
}
|
||
|
||
BOOL CDialQueryPLCStatus::OnAppendPLCStatusResponse(WPARAM wParam, LPARAM lParam)
|
||
{
|
||
LPRESPONSEPACKET pResponsePacket = (LPRESPONSEPACKET)lParam;
|
||
if (pResponsePacket == NULL)
|
||
{
|
||
return FALSE;
|
||
}
|
||
if ((1 > pResponsePacket->wDataLen) || (EN_RECV_SUCCESS != pResponsePacket->pData[0]))
|
||
{
|
||
return FALSE;
|
||
}
|
||
else
|
||
{
|
||
UINT32 *uiRevData = (UINT32*)(pResponsePacket->pData);
|
||
UINT32 iTotalNum = ntohl(uiRevData[0]);
|
||
STPLCSTATUS* pStatus = (STPLCSTATUS*)(&pResponsePacket->pData[sizeof(UINT32)]);
|
||
STPLCSTATUS status;
|
||
CString strTemp;
|
||
int iColIndex = 0,j;
|
||
int iItemCount = m_listData.GetItemCount();
|
||
for (int i = 0; i < iTotalNum; i++)
|
||
{
|
||
iColIndex = 0;
|
||
status = pStatus[i];
|
||
m_listData.InsertItem(i + iItemCount, _T(""));
|
||
m_listData.SetItemText(i + iItemCount, iColIndex++, Tm2LocalStr(ntohl(status.uStatusTime)));
|
||
|
||
// int j = 0;
|
||
// for (; j < 4; j++)
|
||
// {
|
||
// strTemp.Format(_T("%.2f"), tcp_ntohf(status.fSimulation[j]));
|
||
// m_listData.SetItemText(i + iItemCount, iColIndex++, strTemp);
|
||
// }
|
||
|
||
strTemp.Format(_T("%.2f"), tcp_ntohf(status.fVoltage));
|
||
m_listData.SetItemText(i + iItemCount, iColIndex++, strTemp);
|
||
|
||
strTemp.Format(_T("%.2f"), tcp_ntohf(status.fTemperature));
|
||
m_listData.SetItemText(i + iItemCount, iColIndex++, strTemp);
|
||
|
||
for (j = 2; j < 4; j++)//for (j = 0; j < 4; j++)
|
||
{
|
||
strTemp = (status.bSwitch[j] == 0) ? _T("OFF") : _T("ON");
|
||
m_listData.SetItemText(i + iItemCount, iColIndex++, strTemp);
|
||
}
|
||
|
||
}
|
||
}
|
||
return TRUE;
|
||
}
|
||
/*void CDialQueryPLCStatus::ShowPlcStatusData()
|
||
{
|
||
CTaskDataOper dataOper;
|
||
std::vector<STPlcStatusInfo> vtPlcData;
|
||
vtPlcData.clear();
|
||
if (dataOper.QueryPlcStatusData(vtPlcData))
|
||
{
|
||
int iColIndex = 0;
|
||
CString strTxt;
|
||
for (int i = 0; i < vtPlcData.size(); i++)
|
||
{
|
||
strTxt.Empty();
|
||
strTxt.Format(_T("%s %s"),vtPlcData[i].strRepDate, vtPlcData[i].strRepTime);
|
||
// m_listData.SetItemText(i, iColIndex++, strTxt);
|
||
m_listData.InsertItem(i,strTxt);
|
||
iColIndex = 1;
|
||
int j = 0;
|
||
for (; j < 6; j++)
|
||
{
|
||
strTxt.Empty();
|
||
strTxt.Format(_T("%.2f"),vtPlcData[i].fAnalog[j]);
|
||
m_listData.SetItemText(i, iColIndex++, strTxt);
|
||
}
|
||
|
||
for (j = 0; j < 4; j++)
|
||
{
|
||
strTxt = (vtPlcData[i].shCtrl[j] == 0) ? _T("OFF") : _T("ON");
|
||
m_listData.SetItemText(i, iColIndex++, strTxt);
|
||
}
|
||
|
||
}
|
||
|
||
}
|
||
} */ |