// 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 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); } } } } */