RTDatOpr.cpp
上传用户:shtiemo
上传日期:2017-12-29
资源大小:163k
文件大小:47k
开发平台:

Visual C++

  1. #include "stdafx.h"
  2. #include <afxtempl.h>
  3. #include "math.h"
  4. #include "RTDatOpr.h"
  5. #include "ES5SBSys.h"
  6. #include "RTUYC.h"
  7. #include "RTUYX.h"
  8. #include "RTU.h"
  9. #include "PwrNet.h"
  10. #include "Station.h"
  11. #include "CT.h"
  12. #include "PT.h"
  13. #include "AMea.h"
  14. #include "CB.h"
  15. #include "DisCon.h"
  16. #include "Tran.h"
  17. #include "PasRTDat.h"
  18. int nSecond = 0;
  19. CTime DatStartTime = CTime::GetCurrentTime(); // 数据断面开始时间
  20. CTime StartTime = CTime::GetCurrentTime(); // 仿真开始时间
  21. int nSeconds = 60;
  22. BOOL bAutoRead = FALSE;
  23. BOOL bAutoSave = FALSE;
  24. int gRtuID = 9999;
  25. #define SHEET_NUM 10
  26. #define SHEET1_ID 4
  27. #define SB_REGFAIL 0
  28. #define SB_REGOK 1
  29. #define RTSERVER_OK 2
  30. char szModulName[] = "PASRTDAT_01S"; // 注册模块名称(根据需要改变)
  31. TCHAR szDBServName[] = "DBSERVER"; // DB Server Name
  32. HANDLE  hReadDataEvent = NULL; // Event Handle
  33. BOOL bYXYCAryBusy = FALSE;
  34. static BOOL bSheetUsed[SHEET_NUM] = {0,0,0,0,0,0,0,0,0,0}; //
  35. BOOL bDBServerOK = FALSE;
  36. BOOL bSBConnect = TRUE;
  37. TASKBLK TaskBLK;
  38. PTASKBLK pCommTask = &TaskBLK; //SB Task block 
  39. CLIENTREQ ClientREQ;
  40. PCLIENTREQ pClientREQ = &ClientREQ;
  41. DEVICEVALUE RetData[MAX_ID_NUM]; // 
  42. CArray<PRTU, PRTU> RtuAry; // RTU数组
  43. CArray<PRTUYX, PRTUYX> YXInfoAry1; // RTU-YX数组
  44. CArray<PRTUYC, PRTUYC> YCInfoAry1; // RTU-YC数组
  45. CArray<PRTUYX, PRTUYX> YXInfoAry2; // 数据文件读入-YX数组
  46. CArray<PRTUYC, PRTUYC> YCInfoAry2; // 数据文件读入-YC数组
  47. CArray<PRTUYX, PRTUYX> YXInfoAry3; // 由电网部件产生-YX数组
  48. CArray<PRTUYC, PRTUYC> YCInfoAry3; // 由电网部件产生-YC数组
  49. BOOL bRTUMea = TRUE; // 默认由RTU信息表获取实时数据
  50. PWRNETPARA PwrNetPara;
  51. CArray<LPSTATIONPARA, LPSTATIONPARA> StaParaAry; // 厂站系数
  52. CArray<LPCTPARA, LPCTPARA> CTParaAry; // CT系数
  53. CArray<LPPTPARA, LPPTPARA> PTParaAry; // PT系数
  54. CArray<LPVAMEAPARA, LPVAMEAPARA> VAMeaParaAry; // 虚拟量系数
  55. CArray<LPCBPARA, LPCBPARA> CBParaAry; // 开关参数
  56. CArray<LPDISPARA, LPDISPARA> DisParaAry; // 刀闸参数
  57. CArray<LPTRANPARA, LPTRANPARA> TranParaAry; // 变压器参数
  58. CArray<PRTU,PRTU> RtuInfoAry; // RTU信息
  59. void CutSpaceChar(char* pChar, int nLen)
  60. {
  61. BOOL bSpace = FALSE;
  62. for (int i=nLen-1; i>=0; i--)
  63. {
  64. if (pChar[i] == 0) continue;
  65. else if (pChar[i] == 32) pChar[i] = 0;
  66. else break;
  67. }
  68. }
  69. int GetFreeSheet()
  70. {
  71. for (int i=0; i<SHEET_NUM; i++)
  72. {
  73. if (!bSheetUsed[i]) return i+SHEET1_ID;
  74.   }
  75. return INVALID_SHEET;
  76. }
  77. VOID RecvServplt (WORD wOpType, LPVOID pPara,
  78.   LPVOID* pRecvBuf, LPDWORD pDataLength)
  79. {
  80. switch( wOpType )
  81. {
  82. case SB_CALL_LinkBroken:
  83. bDBServerOK = FALSE;
  84. break;
  85. case SB_CALL_LinkRestored:
  86. bDBServerOK = TRUE;
  87. break;
  88. case SB_CALL_NpRecvServerInfo:
  89. break;
  90. default:
  91. break;
  92. }
  93. }
  94. //Connect to DB Server
  95. BOOL  ConnectServ()
  96. {
  97. CONNECTSERVER  connserv;
  98. connserv.lpRecvServerInfo = (LP_SBCPLT_ROUTINE)RecvServplt;
  99.     TASKBLK  taskblk;
  100. strcpy(taskblk.cRemoteName, szDBServName); // 请求连服务器
  101. taskblk.dwCommMode = SBC_CONNECT; // 操作方式
  102. taskblk.pSendBuf = (LPVOID)&connserv;
  103.     if (SB_Comm(&taskblk)!= SBR_SUCCESS) return FALSE;
  104. bDBServerOK = TRUE;
  105. return TRUE;
  106. }
  107. //Disconnect from server
  108. BOOL  DisConnectServ()
  109. {
  110.     TASKBLK  taskblk;
  111. taskblk.dwCommMode = SBC_DISCONNECT; // 操作方式
  112. strcpy(taskblk.cRemoteName, szDBServName); // 远程服务名
  113.     if (SB_Comm(&taskblk)!= SBR_SUCCESS) return FALSE;
  114. bDBServerOK = FALSE;
  115. return TRUE;
  116. }
  117. //Cancel sheet
  118. BOOL  CancelDataSheet(LPVOID pDataMenu)
  119. {
  120.     TASKBLK  taskblk;
  121. taskblk.dwCommMode = SBC_CANCELQUERY; // 操作方式
  122. strcpy(taskblk.cRemoteName, szDBServName); // 远程服务名
  123. taskblk.pSendBuf = pDataMenu;   // 用户定单结构指针
  124.     if (SB_Comm(&taskblk) != SBR_SUCCESS) return FALSE;
  125. return TRUE;
  126. }
  127. //Module Regist, Module Name: SBVBSERV_01G
  128. BOOL ModuleRegist()
  129. {
  130. int nRet = SB_REGFAIL;
  131. DWORD result = SB_ModuleRegist(szModulName);
  132. if (result != SBR_SUCCESS) return FALSE;
  133. hReadDataEvent = CreateEvent(NULL, TRUE, TRUE, NULL);
  134. ASSERT(hReadDataEvent);
  135. return TRUE;
  136. }
  137. //Module UnRegist
  138. BOOL ModuleUnRegist()
  139. {
  140. if (bSBConnect)
  141. {
  142. if (hReadDataEvent) CloseHandle(hReadDataEvent);
  143. return SB_ModuleUnregist();
  144. }
  145. return FALSE;
  146. }
  147. BOOL GetRealData(RTMenuData &RtMenuData)
  148. {
  149. int nNewSheet = 4; //GetFreeSheet();
  150. if (nNewSheet == INVALID_SHEET) return NO_SHEET;
  151. if (!bDBServerOK) return DBSERVER_ERROR;
  152. int nIDNum = int(RtMenuData.wIDNum);
  153. if (nIDNum > MAX_ID_NUM) nIDNum = MAX_ID_NUM;
  154. bSheetUsed[nNewSheet-SHEET1_ID] = TRUE;
  155. pClientREQ->wSheetCode = nNewSheet; //(WORD)SheetCode;
  156. pClientREQ->wCountOfEntry = nIDNum; //2*(1 + pYKXH->GuanLianItemNum);
  157. pClientREQ->dwUseAddPara = 2; //2*(1 + MAXYKGUANLIANITEMNUM )* 8 + 16;
  158. pClientREQ->lpReqCallBack = GetRealDataCallBack;
  159. for (int i=0; i<nIDNum; i++)
  160. {
  161. pClientREQ->IDEntryList[i].bIDEntry[0] = BYTE(RtMenuData.PartsRtData[i].wPartTypeID); //CT Type ID
  162. pClientREQ->IDEntryList[i].bIDEntry[1] = BYTE(RtMenuData.PartsRtData[i].wPartParaID); //P ID
  163. pClientREQ->IDEntryList[i].bIDEntry[2] = LOBYTE(RtMenuData.PartsRtData[i].wPartID);
  164. pClientREQ->IDEntryList[i].bIDEntry[3] = HIBYTE(RtMenuData.PartsRtData[i].wPartID);
  165. pClientREQ->IDEntryList[i].wRefresh = SBD_RENEW_LAZY;
  166. pClientREQ->IDEntryList[i].pEntryBuf = NULL;
  167. }
  168. pCommTask->dwCommMode = SBC_QUERY;
  169. strcpy(pCommTask->cRemoteName, szDBServName);
  170. pCommTask->pSendBuf = pClientREQ;
  171. ResetEvent(hReadDataEvent); //Set Event Single
  172. WORD wFlag = SB_Comm(pCommTask); 
  173. WORD wOpCode = 0;
  174. if(wFlag == SBR_SUCCESS) 
  175. {
  176. DWORD RetValue = WaitForSingleObject(hReadDataEvent, 5000L);
  177. switch( RetValue )
  178. {
  179. case WAIT_OBJECT_0:
  180. {
  181. wOpCode = GET_DATA_OK;
  182. BYTE byData = 0;
  183. for (i=0; i<nIDNum; i++)
  184. {
  185. RtMenuData.PartsRtData[i].fYCData = RetData[i].m_Ycv;
  186. RtMenuData.PartsRtData[i].dwTap = RetData[i].m_wBYQFJT;
  187. RtMenuData.PartsRtData[i].dwKWH = DWORD(RetData[i].m_RetwKwhv);
  188. memcpy(&byData, &RetData[i].m_RetYxv, 1);
  189. RtMenuData.PartsRtData[i].byYXVal = byData;
  190. }
  191. }
  192. break;
  193. case WAIT_TIMEOUT:
  194. //AfxMessageBox(_T("发送数据超时!"));
  195. wOpCode = WAIT_SHEET_TIMEOUT;
  196. break;
  197. case WAIT_ABANDONED:
  198. //AfxMessageBox(_T("发送数据失败! WAIT_ABANDONED"));
  199. wOpCode = WAIT_SHEET_ABANDONED;
  200. break;
  201. case WAIT_FAILED:
  202. //AfxMessageBox(_T("发送数据失败! WAIT_FAILED"));
  203. wOpCode = WAIT_SHEET_FAILED;
  204. break;
  205. }
  206. CancelDataSheet(pClientREQ); //
  207. }
  208. else
  209. {
  210. SetEvent(hReadDataEvent);
  211. wOpCode = SBCOM_ERROR;
  212. //AfxMessageBox(_T("发送提交错误"));
  213. }
  214. //Free allocated resources
  215. bSheetUsed[nNewSheet-SHEET1_ID] = FALSE;
  216. return wOpCode;
  217. }
  218. //SB CallBack Function
  219. void GetRealDataCallBack(WORD wOpType, LPVOID pPara, LPVOID* pRecBuf, PDWORD pDataLength)
  220. {
  221. PCLIENTREQ pGClienTReq = NULL;
  222. WORD i, wIDNum;
  223. switch(wOpType)
  224. {
  225. case SB_CALL_StaticReqData:
  226. pGClienTReq = PCLIENTREQ(pPara);
  227. wIDNum = pGClienTReq->wCountOfEntry;
  228. for (i=0; i<wIDNum; i++)
  229. {
  230. if (pGClienTReq->IDEntryList[i].pEntryBuf)
  231. memcpy(&RetData[i], pGClienTReq->IDEntryList[i].pEntryBuf, sizeof(DEVICEVALUE));
  232. else
  233. memset(&RetData[i], 0, sizeof(DEVICEVALUE));
  234. }
  235. SetEvent(hReadDataEvent);
  236. break;
  237. default:
  238. pGClienTReq = NULL;
  239. break;
  240. }
  241. }
  242. BOOL SetModuleStatus() 
  243. {
  244. // TODO: Add your command handler code here
  245. if (!bSBConnect) return FALSE;
  246. char cStatus;
  247. if (SB_GetModuleStatus(&cStatus))
  248. {
  249. if (cStatus != SBGRADE_MAIN)
  250. SB_ModuleChangeStatus(SBXTEVT_MQ_Manual,SBGRADE_MAIN);
  251. else
  252. SB_ModuleChangeStatus(SBXTEVT_MQ_Manual,SBGRADE_NORMAL);
  253. return TRUE;
  254. }
  255. else return FALSE;
  256. }
  257. BOOL GetModuleStatus()
  258. {
  259. if (!bSBConnect) return FALSE;
  260. char cModuleStatus;
  261. WORD wCode = 0;
  262. if (SB_GetModuleStatus(&cModuleStatus))
  263. {
  264. if (cModuleStatus == SBGRADE_MAIN) 
  265. return TRUE;
  266. else
  267. return FALSE;
  268. }
  269. else return FALSE;
  270. }
  271. #define IES500_SERVERPPIPENAME "CCMTOADM"
  272. CRITICAL_SECTION crSendSCADA;
  273. DWORD dwPipePP=0;
  274. // 永久管道客户端回调:本系统中,不接收服务器回送的数据
  275. VOID PPipeClientCallbackFor500(WORD, LPVOID, LPVOID*, LPDWORD)
  276. {
  277. return;
  278. };
  279. // 连接500永久管道服务器
  280. BOOL Connect500PPipeServer()
  281. {
  282. if (dwPipePP!=0) return TRUE;
  283. TASKBLK tkC;
  284. tkC.dwCommMode = SBC_OPENPIPE;
  285. // tkC.dwCommMode = SBC_OPENPIPEPLUSMIS;
  286. lstrcpy (tkC.cRemoteName, IES500_SERVERPPIPENAME);
  287. tkC.pCpltRoutine = PPipeClientCallbackFor500;
  288. if (SB_Comm(&tkC)==SBR_SUCCESS)
  289. {
  290. dwPipePP = (DWORD)tkC.phGroup;
  291. InitializeCriticalSection (&crSendSCADA);
  292. return TRUE;
  293. }
  294. return FALSE;
  295. };
  296. // 断开与500永久管道的连接
  297. // 此管道用于将数据反送至 500 SCADA
  298. BOOL Disconnect500PPipeServer()
  299. {
  300. if (dwPipePP==0) return TRUE;
  301. TASKBLK tkDC;
  302. tkDC.dwCommMode = SBC_CLOSEPIPE;
  303. tkDC.phGroup = (LPVOID)dwPipePP;
  304. if (SB_Comm(&tkDC)==SBR_SUCCESS)
  305. {
  306. dwPipePP = 0;
  307. DeleteCriticalSection (&crSendSCADA);
  308. return TRUE;
  309. }
  310. return FALSE;
  311. };
  312. BOOL CCMComToAdm (LPVOID lpBuf, DWORD dwLen)
  313. {
  314. BOOL bRet = TRUE;
  315. if (dwPipePP == 0) return FALSE;
  316. EnterCriticalSection (&crSendSCADA);
  317. try
  318. {
  319. TASKBLK tkBlk;
  320. memset (&tkBlk, sizeof(TASKBLK),0);
  321. tkBlk.dwCommMode = SBC_SENDPIPE;
  322. tkBlk.pSendBuf = lpBuf;
  323. tkBlk.dwSendDataLen = dwLen;
  324. tkBlk.phGroup = (LPVOID)dwPipePP;
  325. if (SB_Comm(&tkBlk)!=SBR_SUCCESS) bRet = FALSE;
  326. }
  327. catch (...){}
  328. LeaveCriticalSection (&crSendSCADA);
  329. return bRet;
  330. };
  331. BOOL SendAllDataToADM()
  332. {
  333. if (bYXYCAryBusy) return FALSE;
  334. if (!Connect500PPipeServer()) return FALSE; // 无法连通数据接收服务器
  335. bYXYCAryBusy = TRUE;
  336. int i, iStart, iCount;
  337. COM_SB_BUF bkSBBuf;
  338. PCOMSBFRAME pFrame;
  339. PCCMYCDATA pYCData;
  340. PCCMYXDATA  pYXData;
  341. USHORT nDataLen;
  342. memset( &bkSBBuf, 0, sizeof( COM_SB_BUF ) );
  343. BOOL bEnd = FALSE;
  344. iStart = 0;
  345. iCount = YCInfoAry2.GetSize();
  346. while (!bEnd && iCount>0)
  347. {
  348. // 组织数据,注意数据地址处数据类型的转换
  349. bkSBBuf.nDataTotalLength = offsetof(COM_SB_BUF, byBuffer); // 数据总长度
  350. bkSBBuf.pInfPoint[0] = bkSBBuf.nDataTotalLength;
  351. bkSBBuf.nInfBlockNum = 1; // 信息块个数只有一个即为遥测数据
  352. nDataLen = bkSBBuf.nDataTotalLength;
  353. pFrame = (COMSBFRAME*) (&(bkSBBuf.bySB_Reserve[nDataLen]));
  354. #ifdef NEW_SYSTEM
  355. pFrame->byType = 12; // 状态估计浮点型数据
  356. #else
  357. pFrame->byType = 0; // 状态估计浮点型数据
  358. #endif
  359. pFrame->nDataLength = 0;
  360. nDataLen += 3;
  361. bkSBBuf.nDataTotalLength = nDataLen;
  362. try
  363. {
  364. // nDataLen - 当前数据总长度
  365. pYCData = (PCCMYCDATA)(&(bkSBBuf.bySB_Reserve[nDataLen]));
  366. for (i=iStart; i<iCount; i++)
  367. {
  368. if ( nDataLen+sizeof(CCMYCDATA) >= sizeof(COM_SB_BUF) )
  369. {
  370. iStart = i; break; //实施发送
  371. }
  372. nDataLen += sizeof(CCMYCDATA);
  373. // 部件类型
  374. pYCData->sDataId.byBjType = YCInfoAry2[i]->DBID.byBjType;
  375. pYCData->sDataId.byCShType = YCInfoAry2[i]->DBID.byCShType;
  376. pYCData->sDataId.nBjID = YCInfoAry2[i]->DBID.nBjID;
  377. // pYCData->DataVal = 100;
  378. pYCData->DataVal = (SHORT)YCInfoAry2[i]->fVal;
  379. pFrame->nDataLength += sizeof(CCMYCDATA);
  380. bkSBBuf.nDataTotalLength = nDataLen;
  381. pYCData++; // 继续下一个
  382. }
  383. if (i>=iCount) {bEnd = TRUE;} // 全部组包完毕
  384. }
  385. catch (...) {}
  386. // 发送
  387. if (bkSBBuf.nDataTotalLength> offsetof(COM_SB_BUF, byBuffer))
  388. {
  389. Sleep(1);
  390. CCMComToAdm (&bkSBBuf, bkSBBuf.nDataTotalLength);
  391. }
  392. }
  393. memset( &bkSBBuf, 0, sizeof( COM_SB_BUF ) );
  394. bEnd = FALSE;
  395. iStart = 0;
  396. iCount = YXInfoAry2.GetSize();
  397. while (!bEnd && iCount>0)
  398. {
  399. // 组织数据,注意数据地址处数据类型的转换
  400. bkSBBuf.nDataTotalLength = offsetof(COM_SB_BUF, byBuffer); // 数据总长度
  401. bkSBBuf.pInfPoint[0] = bkSBBuf.nDataTotalLength;
  402. bkSBBuf.nInfBlockNum = 1; // 信息块个数只有一个即为遥测数据
  403. nDataLen = bkSBBuf.nDataTotalLength;
  404. pFrame = (COMSBFRAME*) (&(bkSBBuf.bySB_Reserve[nDataLen]));
  405. pFrame->byType = 1; // 状态估计浮点型数据
  406. pFrame->nDataLength = 0;
  407. nDataLen += 3;
  408. bkSBBuf.nDataTotalLength = nDataLen;
  409. try
  410. {
  411. // nDataLen - 当前数据总长度
  412. pYXData = (PCCMYXDATA)(&(bkSBBuf.bySB_Reserve[nDataLen]));
  413. for (i=iStart; i<iCount; i++)
  414. {
  415. if ( nDataLen+sizeof(CCMYXDATA) >= sizeof(COM_SB_BUF) )
  416. {
  417. //实施发送
  418. iStart = i;
  419. break;
  420. }
  421. nDataLen += sizeof(CCMYXDATA);
  422. // 部件类型
  423. pYXData->sDataId.byBjType = YXInfoAry2[i]->DBID.byBjType;
  424. pYXData->sDataId.byCShType = YXInfoAry2[i]->DBID.byCShType;
  425. pYXData->sDataId.nBjID = YXInfoAry2[i]->DBID.nBjID;
  426. // pYXData->DataVal = 1;
  427. pYXData->DataVal = YXInfoAry2[i]->bVal;
  428. pFrame->nDataLength += sizeof(CCMYXDATA);
  429. bkSBBuf.nDataTotalLength = nDataLen;
  430. pYXData++; // 继续下一个
  431. }
  432. if (i>=iCount) {bEnd = TRUE;} // 全部组包完毕
  433. }
  434. catch (...) {}
  435. // 发送
  436. if (bkSBBuf.nDataTotalLength> offsetof(COM_SB_BUF, byBuffer))
  437. {
  438. Sleep(1);
  439. CCMComToAdm (&bkSBBuf, bkSBBuf.nDataTotalLength);
  440. }
  441. }
  442. Disconnect500PPipeServer();
  443. bYXYCAryBusy = FALSE;
  444. return TRUE;
  445. };
  446. //////////////////////////////////////////////////////////////////////////////
  447. void GetRtuName(PDBID pDBID,CString& Name,int nYCYX)
  448. {
  449. BOOL bFind = FALSE;
  450. int RtuID=0;
  451. Name = "RTU";
  452. if (nYCYX==1)
  453. {
  454. int nYCNum = YCInfoAry1.GetSize();
  455. for (int i=0;i<nYCNum;i++)
  456. {
  457. if ((YCInfoAry1[i]->DBID.byBjType==pDBID->byBjType)
  458. &&(YCInfoAry1[i]->DBID.byCShType==pDBID->byCShType)&&(YCInfoAry1[i]->DBID.nBjID==pDBID->nBjID))
  459. {
  460. RtuID = YCInfoAry1[i]->nRTUID;
  461. bFind = TRUE;
  462. break;
  463. }
  464. }
  465. }
  466. else
  467. {
  468. int nYXNum = YXInfoAry1.GetSize();
  469. for (int i=0;i<nYXNum;i++)
  470. {
  471. if ((YXInfoAry1[i]->DBID.byBjType==pDBID->byBjType)
  472. &&(YXInfoAry1[i]->DBID.byCShType==pDBID->byCShType)&&(YXInfoAry1[i]->DBID.nBjID==pDBID->nBjID))
  473. {
  474. RtuID = YXInfoAry1[i]->nRTUID;
  475. bFind = TRUE;
  476. break;
  477. }
  478. }
  479. }
  480. if (bFind)
  481. {
  482. int nRTUNum = RtuAry.GetSize();
  483. for (int i=0;i<nRTUNum;i++)
  484. {
  485. if (RtuAry[i]->nRtuID==RtuID)   
  486. {
  487. Name = RtuAry[i]->szName;
  488. break;
  489. }
  490. }
  491. }
  492. }
  493. ////////////////////////////////////////////////////////////////////////////
  494. BOOL ReadRTUYCYXInfo()
  495. {
  496. FreeRTUYXYCInfo();
  497. CRtu Rtu;
  498. Rtu.m_strSort = ("wRTUNum");
  499. Rtu.m_strFilter = ("");
  500. if (Rtu.Open(CRecordset::forwardOnly, NULL, CRecordset::readOnly))
  501. {
  502. while(!Rtu.IsEOF())
  503. {
  504. PRTU pRTU = new RTU; memset(pRTU, 0 , sizeof(RTU));
  505. sprintf(pRTU->szName , Rtu.m_szMingZi);
  506. pRTU->nRtuID = Rtu.m_wRTUNum;
  507. pRTU->nYCNum = Rtu.m_wRTUYCNum;
  508. pRTU->nYXNum = Rtu.m_wRTUYXNum;
  509. RtuAry.Add(pRTU);
  510. Rtu.MoveNext();
  511. }
  512. Rtu.Close();
  513. }
  514. else
  515. return FALSE;
  516. CRTUYC RtuYC;
  517. RtuYC.m_strSort = ("wRTUNum, YC_NO");
  518. RtuYC.m_strFilter = ("byBjType<>0 and byCShType<>0 and nBjID<>0");
  519. float fCoef, fOffSet;
  520. CString strParaName;
  521. if (RtuYC.Open(CRecordset::forwardOnly, NULL, CRecordset::readOnly))
  522. {
  523. while(!RtuYC.IsEOF())
  524. {
  525. PRTUYC pRTUYC = new RTUYC; memset(pRTUYC, 0 , sizeof(RTUYC));
  526. pRTUYC->DBID.byBjType = RtuYC.m_byBjType;
  527. pRTUYC->DBID.byCShType = RtuYC.m_byCShType;
  528. pRTUYC->DBID.nBjID = RtuYC.m_nBjID;
  529. pRTUYC->nRTUID = RtuYC.m_wRTUNum;
  530. if (GetMeaCoef(&(pRTUYC->DBID), &fCoef, &fOffSet, strParaName))
  531. {
  532. sprintf(pRTUYC->szName, strParaName);
  533. }
  534. YCInfoAry1.Add(pRTUYC);
  535. RtuYC.MoveNext();
  536. }
  537. RtuYC.Close();
  538. }
  539. else
  540. return FALSE;
  541. CRTUYX RtuYX;
  542. RtuYX.m_strSort = ("wRTUNum,YX_NO");
  543. RtuYX.m_strFilter = ("byBjType<>0 and byCShType<>0 and nBjID<>0");
  544. if (RtuYX.Open(CRecordset::forwardOnly, NULL, CRecordset::readOnly))
  545. {
  546. while(!RtuYX.IsEOF())
  547. {
  548. PRTUYX pRTUYX = new RTUYX; memset(pRTUYX, 0, sizeof(RTUYX));
  549. pRTUYX->DBID.byBjType = RtuYX.m_byBjType;
  550. pRTUYX->DBID.byCShType = RtuYX.m_byCShType;
  551. pRTUYX->DBID.nBjID = RtuYX.m_nBjID;
  552. pRTUYX->nRTUID = RtuYX.m_wRTUNum;
  553. if (GetMeaCoef(&(pRTUYX->DBID), &fCoef, &fOffSet, strParaName))
  554. {
  555. sprintf(pRTUYX->szName, strParaName);
  556. }
  557. YXInfoAry1.Add(pRTUYX);
  558. RtuYX.MoveNext();
  559. }
  560. RtuYX.Close();
  561. }
  562. else
  563. return FALSE;
  564. return TRUE;
  565. };
  566. // 从电网部件中创建所有的量测信息
  567. void CreateMeaAryFromPwrNet()
  568. {
  569. PRTUYC pRTUYC = NULL;
  570. PRTUYX pRTUYX = NULL;
  571. // 电网(频率)
  572. pRTUYC = new  RTUYC;
  573. pRTUYC->DBID.byBjType = DianWangTab_ID;
  574. pRTUYC->DBID.byCShType = DW_PinLu;
  575. pRTUYC->DBID.nBjID = 1 ;
  576. YCInfoAry3.Add(pRTUYC);
  577. // 厂站(频率)
  578. int nStaNum = StaParaAry.GetSize();
  579. for (int i=0; i<nStaNum; i++)
  580. {
  581. pRTUYC = new  RTUYC;
  582. pRTUYC->DBID.byBjType = ChangZhanTab_ID;
  583. pRTUYC->DBID.byCShType = CZ_PinLu;
  584. pRTUYC->DBID.nBjID = StaParaAry[i]->ID ;
  585. YCInfoAry3.Add(pRTUYC);
  586. }
  587. // CT(有功、无功、电流)
  588. int nCTNum = CTParaAry.GetSize();
  589. for (i=0; i<nCTNum; i++)
  590. {
  591. pRTUYC = new  RTUYC;
  592. pRTUYC->DBID.byBjType = CTTab_ID;
  593. pRTUYC->DBID.byCShType = CT_P;
  594. pRTUYC->DBID.nBjID = CTParaAry[i]->ID ;
  595. YCInfoAry3.Add(pRTUYC);
  596. pRTUYC = new  RTUYC;
  597. pRTUYC->DBID.byBjType = CTTab_ID;
  598. pRTUYC->DBID.byCShType = CT_Q;
  599. pRTUYC->DBID.nBjID = CTParaAry[i]->ID ;
  600. YCInfoAry3.Add(pRTUYC);
  601. #ifdef NEW_SYSTEM
  602. pRTUYC = new  RTUYC;
  603. pRTUYC->DBID.byBjType = CTTab_ID;
  604. pRTUYC->DBID.byCShType = CT_Ia;
  605. pRTUYC->DBID.nBjID = CTParaAry[i]->ID ;
  606. YCInfoAry3.Add(pRTUYC);
  607. pRTUYC = new  RTUYC;
  608. pRTUYC->DBID.byBjType = CTTab_ID;
  609. pRTUYC->DBID.byCShType = CT_Ib;
  610. pRTUYC->DBID.nBjID = CTParaAry[i]->ID ;
  611. YCInfoAry3.Add(pRTUYC);
  612. pRTUYC = new  RTUYC;
  613. pRTUYC->DBID.byBjType = CTTab_ID;
  614. pRTUYC->DBID.byCShType = CT_Ic;
  615. pRTUYC->DBID.nBjID = CTParaAry[i]->ID ;
  616. YCInfoAry3.Add(pRTUYC);
  617. #else
  618. pRTUYC = new  RTUYC;
  619. pRTUYC->DBID.byBjType = CTTab_ID;
  620. pRTUYC->DBID.byCShType = CT_I;
  621. pRTUYC->DBID.nBjID = CTParaAry[i]->ID ;
  622. YCInfoAry3.Add(pRTUYC);
  623. #endif
  624. }
  625. // PT(有功、无功、电流)
  626. int nPTNum = PTParaAry.GetSize();
  627. for (i=0; i<nPTNum; i++)
  628. {
  629. pRTUYC = new  RTUYC;
  630. pRTUYC->DBID.byBjType = PTTab_ID;
  631. pRTUYC->DBID.byCShType = PT_VA;
  632. pRTUYC->DBID.nBjID = PTParaAry[i]->ID ;
  633. YCInfoAry3.Add(pRTUYC);
  634. pRTUYC = new  RTUYC;
  635. pRTUYC->DBID.byBjType = PTTab_ID;
  636. pRTUYC->DBID.byCShType = PT_VB;
  637. pRTUYC->DBID.nBjID = PTParaAry[i]->ID ;
  638. YCInfoAry3.Add(pRTUYC);
  639. pRTUYC = new  RTUYC;
  640. pRTUYC->DBID.byBjType = PTTab_ID;
  641. pRTUYC->DBID.byCShType = PT_VC;
  642. pRTUYC->DBID.nBjID = PTParaAry[i]->ID ;
  643. YCInfoAry3.Add(pRTUYC);
  644. #ifdef NEW_SYSTEM
  645. pRTUYC = new  RTUYC;
  646. pRTUYC->DBID.byBjType = PTTab_ID;
  647. pRTUYC->DBID.byCShType = PT_VabX;
  648. pRTUYC->DBID.nBjID = PTParaAry[i]->ID ;
  649. YCInfoAry3.Add(pRTUYC);
  650. pRTUYC = new  RTUYC;
  651. pRTUYC->DBID.byBjType = PTTab_ID;
  652. pRTUYC->DBID.byCShType = PT_VbcX;
  653. pRTUYC->DBID.nBjID = PTParaAry[i]->ID ;
  654. YCInfoAry3.Add(pRTUYC);
  655. pRTUYC = new  RTUYC;
  656. pRTUYC->DBID.byBjType = PTTab_ID;
  657. pRTUYC->DBID.byCShType = PT_VcaX;
  658. pRTUYC->DBID.nBjID = PTParaAry[i]->ID ;
  659. YCInfoAry3.Add(pRTUYC);
  660. #else
  661. pRTUYC = new  RTUYC;
  662. pRTUYC->DBID.byBjType = PTTab_ID;
  663. pRTUYC->DBID.byCShType = PT_VX;
  664. pRTUYC->DBID.nBjID = PTParaAry[i]->ID ;
  665. YCInfoAry3.Add(pRTUYC);
  666. #endif
  667. }
  668. // 虚拟模拟量(模拟量值)
  669. int nVMeaNum = VAMeaParaAry.GetSize();
  670. for (i=0; i<nVMeaNum; i++)
  671. {
  672. pRTUYC = new  RTUYC;
  673. pRTUYC->DBID.byBjType = XuNiDMNLiangTab_ID;
  674. pRTUYC->DBID.byCShType = XN_XNValue;
  675. pRTUYC->DBID.nBjID = VAMeaParaAry[i]->ID ;
  676. YCInfoAry3.Add(pRTUYC);
  677. }
  678. // 变压器(分接头)
  679. int nTranNum = TranParaAry.GetSize();
  680. for (i=0; i<nTranNum; i++)
  681. {
  682. if (TranParaAry[i]->bLTC)
  683. {
  684. pRTUYC = new  RTUYC;
  685. pRTUYC->DBID.byBjType = BianYaQiTab_ID;
  686. pRTUYC->DBID.byCShType = BYQ_DDFJT;
  687. pRTUYC->DBID.nBjID = TranParaAry[i]->ID ;
  688. YCInfoAry3.Add(pRTUYC);
  689. }
  690. }
  691. // 开关(开关状态)
  692. int nCBNum = CBParaAry.GetSize();
  693. for (i=0; i<nCBNum; i++)
  694. {
  695. pRTUYX = new  RTUYX;
  696. pRTUYX->DBID.byBjType = KaiGuanTab_ID;
  697. pRTUYX->DBID.byCShType = KG_KGState;
  698. pRTUYX->DBID.nBjID = CBParaAry[i]->ID;
  699. YXInfoAry3.Add(pRTUYX);
  700. }
  701. // 刀闸(刀闸状态)
  702. int nDisNum = DisParaAry.GetSize();
  703. for (i=0; i<nDisNum; i++)
  704. {
  705. pRTUYX = new  RTUYX;
  706. pRTUYX->DBID.byBjType = DaoZhaTab_ID;
  707. pRTUYX->DBID.byCShType = DZ_DZState;
  708. pRTUYX->DBID.nBjID = DisParaAry[i]->ID;
  709. YXInfoAry3.Add(pRTUYX);
  710. }
  711. }
  712. // 从YC、YX表中找出指定RTU的起始索引
  713. int GetRTUYXYCStartIdx(int nRTUID, int nYCYX)
  714. {
  715. int nYCNum = YCInfoAry1.GetSize();
  716. int nYXNum = YXInfoAry1.GetSize();
  717. int nStartIdx = -1;
  718. if (nYCYX == 1)
  719. {
  720. for (int i=0; i<nYCNum; i++)
  721. {
  722. if (YCInfoAry1[i]->nRTUID == nRTUID)
  723. {
  724. nStartIdx = i;
  725. break;
  726. }
  727. }
  728. }
  729. else
  730. {
  731. for (int i=0; i<nYXNum; i++)
  732. {
  733. if (YXInfoAry1[i]->nRTUID == nRTUID)
  734. {
  735. nStartIdx = i;
  736. break;
  737. }
  738. }
  739. }
  740. return nStartIdx;
  741. }
  742. // 从YC、YX表中找出指定RTU的YC或YX数目
  743. int GetRTUYCYXNum(int nRTUID, int nYC, int nStartIdx)
  744. {
  745. int nYCNum = YCInfoAry1.GetSize();
  746. int nYXNum = YXInfoAry1.GetSize();
  747. int nYCYXNum = 0;
  748. if (nYC == 1)
  749. {
  750. for (int i=nStartIdx; i<nYCNum; i++)
  751. {
  752. if (YCInfoAry1[i]->nRTUID == nRTUID) nYCYXNum++;
  753. else break;
  754. }
  755. }
  756. else
  757. {
  758. for (int i=nStartIdx; i<nYXNum; i++)
  759. {
  760. if (YXInfoAry1[i]->nRTUID == nRTUID) nYCYXNum++;
  761. else break;
  762. }
  763. }
  764. return nYCYXNum;
  765. }
  766. // 获取YC、YX信息表中的所有实时数据
  767. // 1、RTU接收YC、YX量测表;
  768. // 2、所有电网设备的实时信息组成的量测表
  769. BOOL GetAllRTData()
  770. {
  771. if (!ConnectServ()) return FALSE;
  772. RTMenuData RtMenuData;
  773. int nYCNum = 0;
  774. if (bRTUMea) nYCNum = YCInfoAry1.GetSize();
  775. else nYCNum = YCInfoAry3.GetSize();
  776. int nCount = 0;
  777. for (int i=0; i<nYCNum; i++)
  778. {
  779. if (bRTUMea)
  780. {
  781. RtMenuData.PartsRtData[nCount].wPartTypeID = YCInfoAry1[i]->DBID.byBjType;
  782. RtMenuData.PartsRtData[nCount].wPartParaID = YCInfoAry1[i]->DBID.byCShType;
  783. RtMenuData.PartsRtData[nCount].wPartID = YCInfoAry1[i]->DBID.nBjID;
  784. }
  785. else
  786. {
  787. RtMenuData.PartsRtData[nCount].wPartTypeID = YCInfoAry3[i]->DBID.byBjType;
  788. RtMenuData.PartsRtData[nCount].wPartParaID = YCInfoAry3[i]->DBID.byCShType;
  789. RtMenuData.PartsRtData[nCount].wPartID = YCInfoAry3[i]->DBID.nBjID;
  790. }
  791. nCount++;
  792. if (nCount == MAX_ID_NUM || i == nYCNum-1)
  793. {
  794. RtMenuData.wIDNum = nCount;
  795. GetRealData(RtMenuData);
  796. for (int j=0; j<nCount; j++)
  797. {
  798. if (bRTUMea)
  799. {
  800. if (YCInfoAry1[i+1-nCount +j]->DBID.byBjType == BianYaQiTab_ID)
  801. YCInfoAry1[i+1-nCount +j]->fVal = float(RtMenuData.PartsRtData[j].dwTap);
  802. else
  803. YCInfoAry1[i+1-nCount +j]->fVal = RtMenuData.PartsRtData[j].fYCData;
  804. }
  805. else
  806. {
  807. if (YCInfoAry3[i+1-nCount +j]->DBID.byBjType == BianYaQiTab_ID)
  808. YCInfoAry3[i+1-nCount +j]->fVal = float(RtMenuData.PartsRtData[j].dwTap);
  809. else
  810. YCInfoAry3[i+1-nCount +j]->fVal = RtMenuData.PartsRtData[j].fYCData;
  811. }
  812. }
  813. nCount = 0;
  814. }
  815. }
  816. // 开关状态的处理(KG_RTUKG1, KG_RTUKG2)
  817. int nYXNum = 0;
  818. if (bRTUMea) nYXNum = YXInfoAry1.GetSize();
  819. else nYXNum = YXInfoAry3.GetSize();
  820. nCount = 0;
  821. for (i=0; i<nYXNum; i++)
  822. {
  823. if (bRTUMea)
  824. {
  825. RtMenuData.PartsRtData[nCount].wPartTypeID = YXInfoAry1[i]->DBID.byBjType;
  826. RtMenuData.PartsRtData[nCount].wPartID = YXInfoAry1[i]->DBID.nBjID;
  827. if (YXInfoAry1[i]->DBID.byBjType == KaiGuanTab_ID && 
  828. (YXInfoAry1[i]->DBID.byCShType == KG_RTUKG1 || 
  829. YXInfoAry1[i]->DBID.byCShType == KG_RTUKG2))
  830. RtMenuData.PartsRtData[nCount].wPartParaID = KG_KGState;
  831. }
  832. else
  833. {
  834. RtMenuData.PartsRtData[nCount].wPartTypeID = YXInfoAry3[i]->DBID.byBjType;
  835. RtMenuData.PartsRtData[nCount].wPartID = YXInfoAry3[i]->DBID.nBjID;
  836. if (YXInfoAry3[i]->DBID.byBjType == KaiGuanTab_ID && 
  837. (YXInfoAry3[i]->DBID.byCShType == KG_RTUKG1 || 
  838. YXInfoAry3[i]->DBID.byCShType == KG_RTUKG2))
  839. RtMenuData.PartsRtData[nCount].wPartParaID = KG_KGState;
  840. }
  841. nCount++;
  842. if (nCount == MAX_ID_NUM || i == nYXNum-1)
  843. {
  844. RtMenuData.wIDNum = nCount;
  845. GetRealData(RtMenuData);
  846. for (int j=0; j<nCount; j++)
  847. {
  848. if (bRTUMea) YXInfoAry1[i+1-nCount +j]->bVal = RtMenuData.PartsRtData[j].byYXVal;
  849. else YXInfoAry3[i+1-nCount +j]->bVal = RtMenuData.PartsRtData[j].byYXVal;
  850. }
  851. nCount = 0;
  852. }
  853. }
  854. DisConnectServ();
  855. return TRUE;
  856. }
  857. BOOL bSaveAll = TRUE;
  858. int nPreMinute = -1;
  859. BOOL saveAllRTDataToFile()
  860. {
  861. CString strFile;
  862. CTime Time = CTime::GetCurrentTime();
  863. strFile.Format("C:\IES500\PARAM\实时数据\实时数据%02d%02d%02d%02d.dat", Time.GetDay(), Time.GetHour(), 
  864. Time.GetMinute(), Time.GetSecond());
  865. CFile fWR;
  866. BOOL bOper = fWR.Open(strFile, CFile::modeWrite|CFile::modeCreate);
  867. if (!bOper) return FALSE;
  868. // 每10分钟保存1次全网数据
  869. int nMinute = Time.GetMinute();
  870. if (nMinute%10 == 0 && nMinute != nPreMinute)
  871. {
  872. bSaveAll = TRUE;
  873. nPreMinute = nMinute;
  874. }
  875. int iItemCount=0;  
  876. int nYCNum = 0;
  877. if (bRTUMea) nYCNum = YCInfoAry1.GetSize();
  878. else nYCNum = YCInfoAry3.GetSize();
  879. int nYXNum = 0;
  880. if (bRTUMea) nYXNum = YXInfoAry1.GetSize();
  881. else nYXNum = YXInfoAry3.GetSize();
  882. int nChangedYCNum = 0;
  883. int nChangedYXNum = 0;
  884. for (int i=0; i<nYCNum; i++)
  885. {
  886. if (bRTUMea)
  887. {
  888. if (YCInfoAry1[i]->DBID.byBjType == DianWangTab_ID && YCInfoAry1[i]->DBID.byCShType == DW_PinLu)
  889. {
  890. YCInfoAry1[i]->bChanged = 1;
  891. nChangedYCNum ++;
  892. }
  893. else if (YCInfoAry1[i]->DBID.byBjType == ChangZhanTab_ID && YCInfoAry1[i]->DBID.byCShType == CZ_PinLu)
  894. {
  895. YCInfoAry1[i]->bChanged = 1;
  896. nChangedYCNum ++;
  897. }
  898. else if (fabs(YCInfoAry1[i]->fVal-YCInfoAry1[i]->fPreVal)>0.1)
  899. {
  900. YCInfoAry1[i]->fPreVal = YCInfoAry1[i]->fVal;
  901. YCInfoAry1[i]->bChanged = 1;
  902. nChangedYCNum ++;
  903. }
  904. else
  905. YCInfoAry1[i]->bChanged = 0;
  906. }
  907. else
  908. {
  909. if (YCInfoAry3[i]->DBID.byBjType == DianWangTab_ID && YCInfoAry3[i]->DBID.byCShType == DW_PinLu)
  910. {
  911. YCInfoAry3[i]->bChanged = 1;
  912. nChangedYCNum ++;
  913. }
  914. else if (YCInfoAry3[i]->DBID.byBjType == ChangZhanTab_ID && YCInfoAry3[i]->DBID.byCShType == CZ_PinLu)
  915. {
  916. YCInfoAry3[i]->bChanged = 1;
  917. nChangedYCNum ++;
  918. }
  919. else if (fabs(YCInfoAry3[i]->fVal-YCInfoAry3[i]->fPreVal)>0.1)
  920. {
  921. YCInfoAry3[i]->fPreVal = YCInfoAry3[i]->fVal;
  922. YCInfoAry3[i]->bChanged = 1;
  923. nChangedYCNum ++;
  924. }
  925. else
  926. YCInfoAry3[i]->bChanged = 0;
  927. }
  928. }
  929. for (i=0; i<nYXNum; i++)
  930. {
  931. if (bRTUMea)
  932. {
  933. if (YXInfoAry1[i]->bVal != YXInfoAry1[i]->bPreVal)
  934. {
  935. YXInfoAry1[i]->bPreVal = YXInfoAry1[i]->bVal;
  936. YXInfoAry1[i]->bChanged = 1;
  937. nChangedYXNum ++;
  938. }
  939. else
  940. YXInfoAry1[i]->bChanged = 0;
  941. }
  942. else
  943. {
  944. if (YXInfoAry3[i]->bVal != YXInfoAry3[i]->bPreVal)
  945. {
  946. YXInfoAry3[i]->bPreVal = YXInfoAry3[i]->bVal;
  947. YXInfoAry3[i]->bChanged = 1;
  948. nChangedYXNum ++;
  949. }
  950. else
  951. YXInfoAry3[i]->bChanged = 0;
  952. }
  953. }
  954.   try
  955.   {
  956. if (bSaveAll)
  957. {
  958. nChangedYCNum = nYCNum;
  959. nChangedYXNum = nYXNum;
  960. }
  961. fWR.Write (&nChangedYCNum, sizeof(int));
  962. for (int i=0; i<nYCNum; i++)
  963. {
  964. if (bRTUMea)
  965. {
  966. if (YCInfoAry1[i]->bChanged || bSaveAll)
  967. {
  968. fWR.Write (&(YCInfoAry1[i]->DBID), sizeof(DBID));
  969. fWR.Write (&YCInfoAry1[i]->fVal, sizeof (float));
  970. }
  971. }
  972. else
  973. {
  974. if (YCInfoAry3[i]->bChanged || bSaveAll)
  975. {
  976. fWR.Write (&(YCInfoAry3[i]->DBID), sizeof(DBID));
  977. fWR.Write (&YCInfoAry3[i]->fVal, sizeof (float));
  978. }
  979. }
  980. }
  981. fWR.Write (&nChangedYXNum, sizeof(int));
  982. for (i=0; i<nYXNum; i++)
  983. {
  984. if (bRTUMea)
  985. {
  986. if (YXInfoAry1[i]->bChanged || bSaveAll)
  987. {
  988. fWR.Write (&(YXInfoAry1[i]->DBID), sizeof(DBID));
  989. fWR.Write (&YXInfoAry1[i]->bVal, sizeof (BYTE));
  990. }
  991. }
  992. else
  993. {
  994. if (YXInfoAry3[i]->bChanged || bSaveAll)
  995. {
  996. fWR.Write (&(YXInfoAry3[i]->DBID), sizeof(DBID));
  997. fWR.Write (&YXInfoAry3[i]->bVal, sizeof (BYTE));
  998. }
  999. }
  1000. }
  1001. fWR.Close();
  1002.   }
  1003.   catch(...){return FALSE;}
  1004.   bSaveAll = FALSE;
  1005.   return TRUE;
  1006. }
  1007. void FreeRTUYXYCInfo()
  1008. {
  1009. int nRTUNum = RtuAry.GetSize();
  1010. for (int i=0; i<nRTUNum; i++) delete RtuAry[i];
  1011. RtuAry.RemoveAll();
  1012. int nYCNum = YCInfoAry1.GetSize();
  1013. for (i=0; i<nYCNum; i++) delete YCInfoAry1[i];
  1014. YCInfoAry1.RemoveAll();
  1015. int nYXNum = YXInfoAry1.GetSize();
  1016. for (i=0; i<nYXNum; i++) delete YXInfoAry1[i];
  1017. YXInfoAry1.RemoveAll();
  1018. }
  1019. void FreeFileYXYCInfo()
  1020. {
  1021. int nYCNum = YCInfoAry2.GetSize();
  1022. for (int i=0; i<nYCNum; i++) delete YCInfoAry2[i];
  1023. YCInfoAry2.RemoveAll();
  1024. int nYXNum = YXInfoAry2.GetSize();
  1025. for (i=0; i<nYXNum; i++) delete YXInfoAry2[i];
  1026. YXInfoAry2.RemoveAll();
  1027. }
  1028. void FreeMeaCoefInfo()
  1029. {
  1030. int nStaNum = StaParaAry.GetSize();
  1031. for (int i=0; i<nStaNum; i++) delete StaParaAry[i];
  1032. StaParaAry.RemoveAll();
  1033. int nCTNum = CTParaAry.GetSize();
  1034. for (i=0; i<nCTNum; i++) delete CTParaAry[i];
  1035. CTParaAry.RemoveAll();
  1036. int nPTNum = PTParaAry.GetSize();
  1037. for (i=0; i<nPTNum; i++) delete PTParaAry[i];
  1038. PTParaAry.RemoveAll();
  1039. int nVAMeaNum = VAMeaParaAry.GetSize();
  1040. for (i=0; i<nVAMeaNum; i++) delete VAMeaParaAry[i];
  1041. VAMeaParaAry.RemoveAll();
  1042. int nCBNum = CBParaAry.GetSize();
  1043. for (i=0; i<nCBNum; i++) delete CBParaAry[i];
  1044. CBParaAry.RemoveAll();
  1045. int nDisNum = DisParaAry.GetSize();
  1046. for (i=0; i<nDisNum; i++) delete DisParaAry[i];
  1047. DisParaAry.RemoveAll();
  1048. int nTranNum = TranParaAry.GetSize();
  1049. for (i=0; i<nTranNum; i++) delete TranParaAry[i];
  1050. TranParaAry.RemoveAll();
  1051. int nYCNum = YCInfoAry3.GetSize();
  1052. for (i=0; i<nYCNum; i++) delete YCInfoAry3[i];
  1053. YCInfoAry3.RemoveAll();
  1054. int nYXNum = YXInfoAry3.GetSize();
  1055. for (i=0; i<nYXNum; i++) delete YXInfoAry3[i];
  1056. YXInfoAry3.RemoveAll();
  1057. };
  1058. BOOL ReadMeaCoefInfo()
  1059. {
  1060. FreeMeaCoefInfo();
  1061. // 电网参数
  1062. CPwrNet PwrNet;
  1063. if (PwrNet.Open(CRecordset::forwardOnly, NULL, CRecordset::readOnly))
  1064. {
  1065. PWRNETPARA PwrNetPara;
  1066. lstrcpyn(PwrNetPara.szName, PwrNet.m_MingZi, PwrNet.m_MingZi.GetLength()+1);
  1067. CutSpaceChar(PwrNetPara.szName, 32);
  1068. PwrNetPara.fPCoef = PwrNet.m_PCoef;
  1069. PwrNetPara.fQCoef = PwrNet.m_QCoef;
  1070. PwrNetPara.fFCoef = 100.f;
  1071. PwrNet.Close();
  1072. }
  1073. else
  1074. return FALSE;
  1075. // 合肥电话 0551-3701024
  1076. // 厂站参数
  1077. CStation Station;
  1078. Station.m_strSort = ("ID");
  1079. Station.m_strFilter = ("ID>0");
  1080. if (Station.Open(CRecordset::forwardOnly, NULL, CRecordset::readOnly))
  1081. {
  1082. while(!Station.IsEOF())
  1083. {
  1084. LPSTATIONPARA pStaPara = new STATIONPARA;
  1085. lstrcpyn(pStaPara->szName, Station.m_MingZi, Station.m_MingZi.GetLength()+1);
  1086. CutSpaceChar(pStaPara->szName, 32);
  1087. pStaPara->ID = Station.m_ID;
  1088. pStaPara->fPCoef = Station.m_PCoef;
  1089. pStaPara->fQCoef = Station.m_QCoef;
  1090. pStaPara->fFCoef = 100.f;
  1091. StaParaAry.Add(pStaPara);
  1092. Station.MoveNext();
  1093. }
  1094. Station.Close();
  1095. }
  1096. else
  1097. return FALSE;
  1098. // CT参数
  1099. CCT CT;
  1100. CT.m_strSort = ("ID");
  1101. CT.m_strFilter = ("ID>0");
  1102. if (CT.Open(CRecordset::forwardOnly, NULL, CRecordset::readOnly))
  1103. {
  1104. while(!CT.IsEOF())
  1105. {
  1106. LPCTPARA pCTPara = new CTPARA;
  1107. lstrcpyn(pCTPara->szName, CT.m_MingZi, CT.m_MingZi.GetLength()+1);
  1108. CutSpaceChar(pCTPara->szName, 32);
  1109. pCTPara->ID = CT.m_ID;
  1110. pCTPara->fPCoef = CT.m_PCoef;
  1111. pCTPara->fQCoef = CT.m_QCoef;
  1112. pCTPara->fPOffSet = CT.m_POffset;
  1113. pCTPara->fQOffSet = CT.m_QOffset;
  1114. #ifdef NEW_SYSTEM
  1115. pCTPara->fIACoef = CT.m_IACoef;
  1116. pCTPara->fIAOffSet = CT.m_IAOffset;
  1117. pCTPara->fIBCoef = CT.m_IBCoef;
  1118. pCTPara->fIBOffSet = CT.m_IBOffset;
  1119. pCTPara->fICCoef = CT.m_ICCoef;
  1120. pCTPara->fICOffSet = CT.m_ICOffset;
  1121. #else
  1122. pCTPara->fICoef = CT.m_ICoef;
  1123. pCTPara->fIOffSet = CT.m_IOffset;
  1124. #endif
  1125. CTParaAry.Add(pCTPara);
  1126. CT.MoveNext();
  1127. }
  1128. CT.Close();
  1129. }
  1130. else
  1131. return FALSE;
  1132. // PT参数
  1133. CPT PT;
  1134. PT.m_strSort = ("ID");
  1135. PT.m_strFilter = ("ID>0");
  1136. if (PT.Open(CRecordset::forwardOnly, NULL, CRecordset::readOnly))
  1137. {
  1138. while(!PT.IsEOF())
  1139. {
  1140. LPPTPARA pPTPara = new PTPARA;
  1141. lstrcpyn(pPTPara->szName, PT.m_MingZi, PT.m_MingZi.GetLength()+1);
  1142. CutSpaceChar(pPTPara->szName, 32);
  1143. pPTPara->ID = PT.m_ID;
  1144. pPTPara->fVACoef = PT.m_VACoef;
  1145. pPTPara->fVBCoef = PT.m_VBCoef;
  1146. pPTPara->fVCCoef = PT.m_VCCoef;
  1147. pPTPara->fVAOffSet = PT.m_VAOffset;
  1148. pPTPara->fVBOffSet = PT.m_VBOffset;
  1149. pPTPara->fVBOffSet = PT.m_VCOffset;
  1150. #ifdef NEW_SYSTEM
  1151. pPTPara->fVABCoef = PT.m_VXABCoef;
  1152. pPTPara->fVABOffSet = PT.m_VXABOffset;
  1153. pPTPara->fVBCCoef = PT.m_VXBCCoef;
  1154. pPTPara->fVBCOffSet = PT.m_VXBCOffset;
  1155. pPTPara->fVACCoef = PT.m_VXBCCoef;
  1156. pPTPara->fVACOffSet = PT.m_VXBCOffset;
  1157. #else
  1158. pPTPara->fVXCoef = PT.m_VXCoef;
  1159. pPTPara->fVXOffSet = PT.m_VXOffset;
  1160. #endif
  1161. PTParaAry.Add(pPTPara);
  1162. PT.MoveNext();
  1163. }
  1164. PT.Close();
  1165. }
  1166. else
  1167. return FALSE;
  1168. // 虚拟量参数
  1169. CAMea VAMea;
  1170. VAMea.m_strSort = ("ID");
  1171. VAMea.m_strFilter = ("ID>0");
  1172. if (VAMea.Open(CRecordset::forwardOnly, NULL, CRecordset::readOnly))
  1173. {
  1174. while(!VAMea.IsEOF())
  1175. {
  1176. LPVAMEAPARA pVAMeaPara = new VAMEAPARA;
  1177. lstrcpyn(pVAMeaPara->szName, VAMea.m_MingZi, VAMea.m_MingZi.GetLength()+1);
  1178. CutSpaceChar(pVAMeaPara->szName, 32);
  1179. pVAMeaPara->ID = VAMea.m_ID;
  1180. pVAMeaPara->fCoef = VAMea.m_Coef;
  1181. pVAMeaPara->fOffSet = VAMea.m_OffSetVal;
  1182. VAMeaParaAry.Add(pVAMeaPara);
  1183. VAMea.MoveNext();
  1184. }
  1185. VAMea.Close();
  1186. }
  1187. else
  1188. return FALSE;
  1189. // 开关参数
  1190. CCB CBRec;
  1191. CBRec.m_strSort = ("ID");
  1192. CBRec.m_strFilter = ("ID>0");
  1193. if (CBRec.Open(CRecordset::forwardOnly, NULL, CRecordset::readOnly))
  1194. {
  1195. while(!CBRec.IsEOF())
  1196. {
  1197. LPCBPARA pCBPara = new CBPARA;
  1198. lstrcpyn(pCBPara->szName, CBRec.m_MingZi, CBRec.m_MingZi.GetLength()+1);
  1199. CutSpaceChar(pCBPara->szName, 32);
  1200. pCBPara->ID = CBRec.m_ID;
  1201. pCBPara->bNot = CBRec.m_YXConnect;
  1202. pCBPara->bTwoBit = CBRec.m_YXCMode;
  1203. CBParaAry.Add(pCBPara);
  1204. CBRec.MoveNext();
  1205. }
  1206. CBRec.Close();
  1207. }
  1208. else
  1209. return FALSE;
  1210. // 刀闸参数
  1211. CDisCon DisRec;
  1212. DisRec.m_strSort = ("ID");
  1213. DisRec.m_strFilter = ("ID>0");
  1214. if (DisRec.Open(CRecordset::forwardOnly, NULL, CRecordset::readOnly))
  1215. {
  1216. while(!DisRec.IsEOF())
  1217. {
  1218. LPDISPARA pDisPara = new DISPARA;
  1219. lstrcpyn(pDisPara->szName, DisRec.m_MingZi, DisRec.m_MingZi.GetLength()+1);
  1220. CutSpaceChar(pDisPara->szName, 32);
  1221. pDisPara->ID = DisRec.m_ID;
  1222. pDisPara->bNot = DisRec.m_Nots;
  1223. DisParaAry.Add(pDisPara);
  1224. DisRec.MoveNext();
  1225. }
  1226. DisRec.Close();
  1227. }
  1228. else
  1229. return FALSE;
  1230. // 变压器参数
  1231. CTran TranRec;
  1232. TranRec.m_strSort = ("ID");
  1233. TranRec.m_strFilter = ("ID>0");
  1234. if (TranRec.Open(CRecordset::forwardOnly, NULL, CRecordset::readOnly))
  1235. {
  1236. while(!TranRec.IsEOF())
  1237. {
  1238. LPTRANPARA pTranPara = new TRANPARA;
  1239. lstrcpyn(pTranPara->szName, TranRec.m_MingZi, TranRec.m_MingZi.GetLength()+1);
  1240. CutSpaceChar(pTranPara->szName, 32);
  1241. pTranPara->ID = TranRec.m_ID;
  1242. pTranPara->bLTC = TranRec.m_DYMode;
  1243. pTranPara->fTapCoef = TranRec.m_DWCoef;
  1244. TranParaAry.Add(pTranPara);
  1245. TranRec.MoveNext();
  1246. }
  1247. TranRec.Close();
  1248. }
  1249. else
  1250. return FALSE;
  1251. CreateMeaAryFromPwrNet();
  1252. return TRUE;
  1253. };
  1254. BOOL GetMeaCoef(PDBID pDBID, float* pCoef, float* pOffSet, CString& strInfo)
  1255. {
  1256. *pCoef = 1.f; *pOffSet = 0.f;
  1257. if (pDBID->byBjType == DianWangTab_ID)
  1258. {
  1259. if (pDBID->byCShType == DW_P)
  1260. {
  1261. *pCoef = PwrNetPara.fPCoef;
  1262. strInfo = "电网有功";
  1263. }
  1264. else if (pDBID->byCShType == DW_Q)
  1265. {
  1266. *pCoef = PwrNetPara.fQCoef;
  1267. strInfo = "电网无功";
  1268. }
  1269. else if (pDBID->byCShType == DW_PinLu)
  1270. {
  1271. *pCoef = PwrNetPara.fFCoef;
  1272. strInfo = "电网频率";
  1273. }
  1274. }
  1275. else if (pDBID->byBjType == ChangZhanTab_ID)
  1276. {
  1277. int nStaNum = StaParaAry.GetSize();
  1278. if (nStaNum<1) return FALSE;
  1279. int nStart = 0, nEnd = nStaNum-1;
  1280. LPSTATIONPARA pStaPara = NULL;
  1281. do
  1282. {
  1283. int nMid = (nStart+nEnd)/2;
  1284. if (StaParaAry[nMid]->ID == pDBID->nBjID)
  1285. {
  1286. pStaPara = StaParaAry[nMid]; break;
  1287. }
  1288. else if (StaParaAry[nStart]->ID == pDBID->nBjID)
  1289. {
  1290. pStaPara = StaParaAry[nStart]; break;
  1291. }
  1292. else if (StaParaAry[nEnd]->ID == pDBID->nBjID)
  1293. {
  1294. pStaPara = StaParaAry[nEnd]; break;
  1295. }
  1296. else if (StaParaAry[nMid]->ID > pDBID->nBjID)
  1297. nEnd = nMid;
  1298. else 
  1299. nStart = nMid; 
  1300. if (nStart == nEnd || nStart+1 == nEnd) break;
  1301. }while (TRUE);
  1302. if (pStaPara)
  1303. {
  1304. if (pDBID->byCShType == CZ_P)
  1305. {
  1306. *pCoef = pStaPara->fPCoef;
  1307. strInfo.Format("%s--%s", pStaPara->szName, "有功");
  1308. }
  1309. else if (pDBID->byCShType == CZ_Q)
  1310. {
  1311. *pCoef = pStaPara->fQCoef;
  1312. strInfo.Format("%s--%s", pStaPara->szName, "无功");
  1313. }
  1314. else if (pDBID->byCShType == CZ_PinLu)
  1315. {
  1316. *pCoef = pStaPara->fFCoef;
  1317. strInfo.Format("%s--%s", pStaPara->szName, "频率");
  1318. }
  1319. }
  1320. else
  1321. return FALSE;
  1322. }
  1323. else if (pDBID->byBjType == CTTab_ID)
  1324. {
  1325. int nCTNum = CTParaAry.GetSize();
  1326. if (nCTNum<1) return FALSE;
  1327. int nStart = 0, nEnd = nCTNum-1;
  1328. LPCTPARA pCTPara = NULL;
  1329. do
  1330. {
  1331. int nMid = (nStart+nEnd)/2;
  1332. if (CTParaAry[nMid]->ID == pDBID->nBjID)
  1333. {
  1334. pCTPara = CTParaAry[nMid]; break;
  1335. }
  1336. else if (CTParaAry[nStart]->ID == pDBID->nBjID)
  1337. {
  1338. pCTPara = CTParaAry[nStart]; break;
  1339. }
  1340. else if (CTParaAry[nEnd]->ID == pDBID->nBjID)
  1341. {
  1342. pCTPara = CTParaAry[nEnd]; break;
  1343. }
  1344. else if (CTParaAry[nMid]->ID > pDBID->nBjID)
  1345. nEnd = nMid;
  1346. else 
  1347. nStart = nMid; 
  1348. if (nStart == nEnd || nStart+1 == nEnd) break;
  1349. }while (TRUE);
  1350. if (pCTPara)
  1351. {
  1352. if (pDBID->byCShType == CT_P)
  1353. {
  1354. *pCoef = pCTPara->fPCoef;
  1355. *pOffSet = pCTPara->fPOffSet;
  1356. strInfo.Format("%s--%s", pCTPara->szName, "有功");
  1357. }
  1358. else if (pDBID->byCShType == CT_Q)
  1359. {
  1360. *pCoef = pCTPara->fQCoef;
  1361. *pOffSet = pCTPara->fQOffSet;
  1362. strInfo.Format("%s--%s", pCTPara->szName, "无功");
  1363. }
  1364. #ifdef NEW_SYSTEM
  1365. else if (pDBID->byCShType == CT_Ia)
  1366. {
  1367. *pCoef = pCTPara->fIACoef;
  1368. *pOffSet = pCTPara->fIAOffSet;
  1369. strInfo.Format("%s--%s", pCTPara->szName, "A相电流");
  1370. }
  1371. else if (pDBID->byCShType == CT_Ib)
  1372. {
  1373. *pCoef = pCTPara->fIBCoef;
  1374. *pOffSet = pCTPara->fIBOffSet;
  1375. strInfo.Format("%s--%s", pCTPara->szName, "B相电流");
  1376. }
  1377. else if (pDBID->byCShType == CT_Ic)
  1378. {
  1379. *pCoef = pCTPara->fICCoef;
  1380. *pOffSet = pCTPara->fICOffSet;
  1381. strInfo.Format("%s--%s", pCTPara->szName, "C相电流");
  1382. }
  1383. #else
  1384. else if (pDBID->byCShType == CT_I)
  1385. {
  1386. *pCoef = pCTPara->fICoef;
  1387. *pOffSet = pCTPara->fIOffSet;
  1388. strInfo.Format("%s--%s", pCTPara->szName, "电流");
  1389. }
  1390. #endif
  1391. }
  1392. else
  1393. return FALSE;
  1394. }
  1395. else if (pDBID->byBjType == PTTab_ID)
  1396. {
  1397. int nPTNum = PTParaAry.GetSize();
  1398. if (nPTNum<1) return FALSE;
  1399. int nStart = 0, nEnd = nPTNum-1;
  1400. LPPTPARA pPTPara = NULL;
  1401. do
  1402. {
  1403. int nMid = (nStart+nEnd)/2;
  1404. if (PTParaAry[nMid]->ID == pDBID->nBjID)
  1405. {
  1406. pPTPara = PTParaAry[nMid]; break;
  1407. }
  1408. else if (PTParaAry[nStart]->ID == pDBID->nBjID)
  1409. {
  1410. pPTPara = PTParaAry[nStart]; break;
  1411. }
  1412. else if (PTParaAry[nEnd]->ID == pDBID->nBjID)
  1413. {
  1414. pPTPara = PTParaAry[nEnd]; break;
  1415. }
  1416. else if (PTParaAry[nMid]->ID > pDBID->nBjID)
  1417. nEnd = nMid;
  1418. else 
  1419. nStart = nMid; 
  1420. if (nStart == nEnd || nStart+1 == nEnd) break;
  1421. }while (TRUE);
  1422. if (pPTPara)
  1423. {
  1424. if (pDBID->byCShType == PT_VA)
  1425. {
  1426. *pCoef = pPTPara->fVACoef;
  1427. *pOffSet = pPTPara->fVAOffSet;
  1428. strInfo.Format("%s--%s", pPTPara->szName, "A相电压");
  1429. }
  1430. else if (pDBID->byCShType == PT_VB)
  1431. {
  1432. *pCoef = pPTPara->fVBCoef;
  1433. *pOffSet = pPTPara->fVBOffSet;
  1434. strInfo.Format("%s--%s", pPTPara->szName, "B相电压");
  1435. }
  1436. else if (pDBID->byCShType == PT_VC)
  1437. {
  1438. *pCoef = pPTPara->fVCCoef;
  1439. *pOffSet = pPTPara->fVCOffSet;
  1440. strInfo.Format("%s--%s", pPTPara->szName, "C相电压");
  1441. }
  1442. #ifdef NEW_SYSTEM
  1443. else if (pDBID->byCShType == PT_VabX)
  1444. {
  1445. *pCoef = pPTPara->fVABCoef;
  1446. *pOffSet = pPTPara->fVABOffSet;
  1447. strInfo.Format("%s--%s", pPTPara->szName, "AB线电压");
  1448. }
  1449. else if (pDBID->byCShType == PT_VbcX)
  1450. {
  1451. *pCoef = pPTPara->fVBCCoef;
  1452. *pOffSet = pPTPara->fVBCOffSet;
  1453. strInfo.Format("%s--%s", pPTPara->szName, "BC线电压");
  1454. }
  1455. else if (pDBID->byCShType == PT_VcaX)
  1456. {
  1457. *pCoef = pPTPara->fVACCoef;
  1458. *pOffSet = pPTPara->fVACOffSet;
  1459. strInfo.Format("%s--%s", pPTPara->szName, "AC线电压");
  1460. }
  1461. #else
  1462. else if (pDBID->byCShType == PT_VX)
  1463. {
  1464. *pCoef = pPTPara->fVXCoef;
  1465. *pOffSet = pPTPara->fVXOffSet;
  1466. strInfo.Format("%s--%s", pPTPara->szName, "线电压");
  1467. }
  1468. #endif
  1469. }
  1470. else
  1471. return FALSE;
  1472. }
  1473. else if (pDBID->byBjType == XuNiDMNLiangTab_ID)
  1474. {
  1475. int nVAMeaNum = VAMeaParaAry.GetSize();
  1476. if (nVAMeaNum<1) return FALSE;
  1477. int nStart = 0, nEnd = nVAMeaNum-1;
  1478. LPVAMEAPARA pVAMeaPara = NULL;
  1479. do
  1480. {
  1481. int nMid = (nStart+nEnd)/2;
  1482. if (VAMeaParaAry[nMid]->ID == pDBID->nBjID)
  1483. {
  1484. pVAMeaPara = VAMeaParaAry[nMid]; break;
  1485. }
  1486. else if (VAMeaParaAry[nStart]->ID == pDBID->nBjID)
  1487. {
  1488. pVAMeaPara = VAMeaParaAry[nStart]; break;
  1489. }
  1490. else if (VAMeaParaAry[nEnd]->ID == pDBID->nBjID)
  1491. {
  1492. pVAMeaPara = VAMeaParaAry[nEnd]; break;
  1493. }
  1494. else if (VAMeaParaAry[nMid]->ID > pDBID->nBjID)
  1495. nEnd = nMid;
  1496. else 
  1497. nStart = nMid; 
  1498. if (nStart == nEnd || nStart+1 == nEnd) break;
  1499. }while (TRUE);
  1500. if (pVAMeaPara)
  1501. {
  1502. if (pDBID->byCShType == XN_XNValue)
  1503. {
  1504. *pCoef = pVAMeaPara->fCoef;
  1505. *pOffSet = pVAMeaPara->fOffSet;
  1506. strInfo.Format("%s--%s", pVAMeaPara->szName, "数值");
  1507. }
  1508. }
  1509. else
  1510. return FALSE;
  1511. }
  1512. else if (pDBID->byBjType == KaiGuanTab_ID)
  1513. {
  1514. *pCoef = 0.f;
  1515. int nCBNum = CBParaAry.GetSize();
  1516. if (nCBNum<1) return FALSE;
  1517. int nStart = 0, nEnd = nCBNum-1;
  1518. LPCBPARA pCBPara = NULL;
  1519. do
  1520. {
  1521. int nMid = (nStart+nEnd)/2;
  1522. if (CBParaAry[nMid]->ID == pDBID->nBjID)
  1523. {
  1524. pCBPara = CBParaAry[nMid]; break;
  1525. }
  1526. else if (CBParaAry[nStart]->ID == pDBID->nBjID)
  1527. {
  1528. pCBPara = CBParaAry[nStart]; break;
  1529. }
  1530. else if (CBParaAry[nEnd]->ID == pDBID->nBjID)
  1531. {
  1532. pCBPara = CBParaAry[nEnd]; break;
  1533. }
  1534. else if (CBParaAry[nMid]->ID > pDBID->nBjID)
  1535. nEnd = nMid;
  1536. else 
  1537. nStart = nMid; 
  1538. if (nStart == nEnd || nStart+1 == nEnd) break;
  1539. }while (TRUE);
  1540. if (pCBPara)
  1541. {
  1542. if (pDBID->byCShType == KG_RTUKG1)
  1543. {
  1544. strInfo.Format("%s--%s", pCBPara->szName, "开关状态1");
  1545. *pCoef = float(pCBPara->bNot);
  1546. }
  1547. else if (pDBID->byCShType == KG_RTUKG2)
  1548. {
  1549. strInfo.Format("%s--%s", pCBPara->szName, "开关状态2");
  1550. *pCoef = float(pCBPara->bNot);
  1551. }
  1552. }
  1553. else
  1554. return FALSE;
  1555. }
  1556. else if (pDBID->byBjType == DaoZhaTab_ID)
  1557. {
  1558. *pCoef = 0.f;
  1559. int nDisNum = DisParaAry.GetSize();
  1560. if (nDisNum<1) return FALSE;
  1561. int nStart = 0, nEnd = nDisNum-1;
  1562. LPDISPARA pDisPara = NULL;
  1563. do
  1564. {
  1565. int nMid = (nStart+nEnd)/2;
  1566. if (DisParaAry[nMid]->ID == pDBID->nBjID)
  1567. {
  1568. pDisPara = DisParaAry[nMid]; break;
  1569. }
  1570. else if (DisParaAry[nStart]->ID == pDBID->nBjID)
  1571. {
  1572. pDisPara = DisParaAry[nStart]; break;
  1573. }
  1574. else if (DisParaAry[nEnd]->ID == pDBID->nBjID)
  1575. {
  1576. pDisPara = DisParaAry[nEnd]; break;
  1577. }
  1578. else if (DisParaAry[nMid]->ID > pDBID->nBjID)
  1579. nEnd = nMid;
  1580. else 
  1581. nStart = nMid; 
  1582. if (nStart == nEnd || nStart+1 == nEnd) break;
  1583. }while (TRUE);
  1584. if (pDisPara)
  1585. {
  1586. if (pDBID->byCShType == DZ_DZState)
  1587. {
  1588. *pCoef = float(pDisPara->bNot);
  1589. strInfo.Format("%s--%s", pDisPara->szName, "刀闸状态");
  1590. }
  1591. }
  1592. else
  1593. return FALSE;
  1594. }
  1595. return TRUE;
  1596. }
  1597. BOOL LoadRTDataFromFile(LPCSTR lpFName)
  1598. {
  1599. if (bYXYCAryBusy) return FALSE;
  1600. CFile fRD;
  1601. if (lpFName == NULL) return FALSE;
  1602. BOOL bOper = fRD.Open(lpFName, CFile::modeRead);
  1603. if (!bOper) return FALSE;
  1604. bYXYCAryBusy = TRUE;
  1605. FreeFileYXYCInfo();
  1606. char szFile[] = "c:\ies500\tmp\YC-YX数据信息.INF";
  1607. FILE* pFile = fopen(szFile, "w");
  1608. // 数值项个数
  1609. float fCoef, fOffSet;
  1610. CString strInfo;
  1611. int nYCNum, nYXNum;
  1612. try
  1613. {
  1614. fRD.Read(&nYCNum, sizeof(int));
  1615. if (pFile) fprintf(pFile, "YC数目:%dnn", nYCNum);
  1616. if (nYCNum>0)
  1617. {
  1618. for (int i=0; i<nYCNum; i++)
  1619. {
  1620. PRTUYC pRTUYC = new RTUYC;
  1621. fRD.Read(&(pRTUYC->DBID), sizeof(DBID));
  1622. fRD.Read(&(pRTUYC->fVal), sizeof(float));
  1623. //dtting
  1624. if (GetMeaCoef(&(pRTUYC->DBID), &fCoef, &fOffSet, strInfo))
  1625. {
  1626. pRTUYC->fVal = pRTUYC->fVal/fCoef;
  1627. }
  1628. else
  1629. {
  1630. fprintf(pFile,"部件类型:%d  ID:%d  参数:%dn",pRTUYC->DBID.byBjType,pRTUYC->DBID.nBjID,pRTUYC->DBID.byCShType);
  1631. pRTUYC->fVal = pRTUYC->fVal/fCoef;
  1632. }
  1633. YCInfoAry2.Add(pRTUYC);
  1634. }
  1635. }
  1636. fRD.Read(&nYXNum, sizeof(int));
  1637. if (pFile) fprintf(pFile, "YX数目:%dnn", nYXNum);
  1638. if (nYXNum>0)
  1639. {
  1640. for (int i=0; i<nYXNum; i++)
  1641. {
  1642. PRTUYX pRTUYX = new RTUYX;
  1643. fRD.Read(&(pRTUYX->DBID), sizeof(DBID));
  1644. YXInfoAry2.Add(pRTUYX);
  1645. fRD.Read(&pRTUYX->bVal, sizeof(BYTE));
  1646. PRTUYX pRTUYX2 = NULL;
  1647. // 开关状态的处理(KG_RTUKG1, KG_RTUKG2)
  1648. if (pRTUYX->DBID.byBjType == KaiGuanTab_ID && 
  1649. pRTUYX->DBID.byCShType == KG_RTUKG1)
  1650. pRTUYX->bVal = pRTUYX->bVal & 1;
  1651. else if (pRTUYX->DBID.byBjType == KaiGuanTab_ID && 
  1652. pRTUYX->DBID.byCShType == KG_RTUKG2)
  1653. pRTUYX->bVal = (pRTUYX->bVal&2)/2;
  1654. else if (pRTUYX->DBID.byBjType == KaiGuanTab_ID && 
  1655. pRTUYX->DBID.byCShType == KG_KGState)
  1656. {
  1657. pRTUYX->DBID.byCShType = KG_RTUKG1;
  1658. pRTUYX->bVal = pRTUYX->bVal & 1;
  1659. pRTUYX2 = new RTUYX;
  1660. memcpy(pRTUYX2, pRTUYX, sizeof(RTUYX));
  1661. pRTUYX2->bVal = (pRTUYX->bVal&2)/2;
  1662. pRTUYX2->DBID.byCShType = KG_RTUKG2;
  1663. YXInfoAry2.Add(pRTUYX2);
  1664. }
  1665. GetMeaCoef(&(pRTUYX->DBID), &fCoef, &fOffSet, strInfo);
  1666. if (fCoef == 1.f) pRTUYX->bVal = !pRTUYX->bVal;
  1667. if (pRTUYX2 && fCoef == 1.f) pRTUYX2->bVal = !pRTUYX2->bVal;
  1668. }
  1669. }
  1670. if (pFile) fclose(pFile);
  1671. fRD.Close();
  1672. }
  1673. catch(...) {return FALSE;}
  1674. bYXYCAryBusy = FALSE;
  1675. return TRUE;
  1676. }
  1677. CSEventSequence CSEvtSeq(ALL_TYPE); // 声明一参数事项队类(指针)
  1678. CSEVENT csEvent;
  1679. // 保存电网数据事项触发 2001.8.1 TIANFZ
  1680. // 检查变压器分接头调整、开关变位、刀闸变位事项
  1681. BOOL BeSCADAEventProcess()
  1682. {
  1683. BOOL bEvtPrc = FALSE;
  1684. int EvtLeftNum = CSEvtSeq.GetEventNum(); // 此时的未处理事项的数目
  1685. while(EvtLeftNum>0)
  1686. {
  1687. //返回值为真, 则有事项存在且未处理,读完全部事项
  1688. if(CSEvtSeq.ReadaEvent(&csEvent, EvtLeftNum))
  1689. {
  1690. // 为避免重复,只判断非 SOE 事项
  1691. if(csEvent.SOEFlag) continue;
  1692. if(csEvent.EventType == BYQEvent)
  1693. {
  1694. if(csEvent.CSType == BYQFJT) bEvtPrc = TRUE;
  1695. }
  1696. else if(csEvent.EventType == KGEvent)
  1697. {
  1698. if(csEvent.CSType == KG) bEvtPrc = TRUE;
  1699. }
  1700. else if(csEvent.EventType == DZEvent)
  1701. {
  1702. if(csEvent.CSType == DZ) bEvtPrc = TRUE;
  1703. }
  1704. }
  1705. };
  1706. return bEvtPrc;
  1707. }
  1708. void Ary2ToAry1()
  1709. {
  1710. int nYC2 = YCInfoAry2.GetSize();
  1711. int nYX2 = YXInfoAry2.GetSize();
  1712. int nYC1 = YCInfoAry1.GetSize();
  1713. int nYX1 = YXInfoAry1.GetSize();
  1714. for (int i=0; i<nYC1; i++) YCInfoAry1[i]->bChanged = 0;
  1715. for (i=0; i<nYX1; i++) YXInfoAry1[i]->bChanged = 0;
  1716. PRTUYC pRTUYC = NULL;
  1717. for (i=0; i<nYC2; i++)
  1718. {
  1719. BOOL bFound = FALSE;
  1720. pRTUYC = YCInfoAry2[i];
  1721. for (int j=0; j<nYC1; j++)
  1722. {
  1723. if (memcmp(&(pRTUYC->DBID), &(YCInfoAry1[j]->DBID), sizeof(DBID)) == 0)
  1724. {
  1725. bFound = TRUE; break;
  1726. }
  1727. }
  1728. if (bFound)
  1729. {
  1730. if (fabs(YCInfoAry1[j]->fVal - pRTUYC->fVal)>0.01)
  1731. {
  1732. YCInfoAry1[j]->fVal = pRTUYC->fVal;
  1733. YCInfoAry1[j]->bChanged = 1;
  1734. }
  1735. }
  1736. }
  1737. PRTUYX pRTUYX = NULL;
  1738. for (i=0; i<nYX2; i++)
  1739. {
  1740. BOOL bFound = FALSE;
  1741. pRTUYX = YXInfoAry2[i];
  1742. for (int j=0; j<nYX1; j++)
  1743. {
  1744. if (memcmp(&(pRTUYX->DBID), &(YXInfoAry1[j]->DBID), sizeof(DBID)) == 0)
  1745. {
  1746. bFound = TRUE; break;
  1747. }
  1748. }
  1749. if (bFound)
  1750. {
  1751. if (YXInfoAry1[j]->bVal != pRTUYX->bVal)
  1752. {
  1753. YXInfoAry1[j]->bVal = pRTUYX->bVal;
  1754. YXInfoAry1[j]->bChanged = 1;
  1755. }
  1756. }
  1757. }
  1758. }