DrainPoolUnit.cpp 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248
  1. #include "StdAfx.h"
  2. #include <iostream>
  3. #include <random>
  4. #include "DrainPoolUnit.h"
  5. // 定义给排水单元类实现
  6. CDrainPoolUnit::CDrainPoolUnit()
  7. {
  8. //m_WaterLevel = 0.1+rand()/(double)(RAND_MAX/10); //30-50之间随机浮点数
  9. // 创建一个随机数引擎
  10. std::random_device rd; // 用于获取随机种子
  11. std::mt19937 gen(rd()); // 以随机种子初始化Mersenne Twister生成器
  12. // 定义分布范围
  13. std::uniform_real_distribution<> dis(0, 9.9999); // 随机范围
  14. // 生成随机浮点数
  15. m_WaterLevel = 20.0;
  16. m_bWaterFromTS = FALSE;
  17. m_bLevelChange = FALSE;
  18. m_fWaterLevelAlarmLow = 10.0; //低水位
  19. m_fWaterLevelAlarmHigh = 80.0; //高水位
  20. m_fWaterLevelClose = 30.0; //关泵
  21. m_fWaterLevelOpenOne = 50.0; //单泵
  22. m_fWaterLevelOpenTwo = 70.0; //双泵
  23. m_fWaterLevelOpenThree = 90.0; //三泵
  24. m_fWaterLevelOpenFour = 90.0; //四泵
  25. }
  26. CDrainPoolUnit::~CDrainPoolUnit()
  27. {
  28. }
  29. void CDrainPoolUnit::AddDrainPump( const CString& strPoolStrID, const CString& strPumpStrID, int nType )
  30. {
  31. CDrainPump pump;
  32. pump.m_strPoolStrID = strPoolStrID;
  33. pump.m_strEqpmtStrID = strPumpStrID;
  34. pump.m_nType = nType;
  35. m_mapDrainPump.insert( make_pair(strPumpStrID, pump) );
  36. AddRunPumpType(nType);
  37. }
  38. CString CDrainPoolUnit::GetPumpStrIDByType( int nType )
  39. {
  40. CString strID = _T("");
  41. map< CString, CDrainPump>::iterator iter = m_mapDrainPump.begin();
  42. for ( ; iter != m_mapDrainPump.end(); iter++ )
  43. {
  44. if ( nType == iter->second.m_nType )
  45. {
  46. strID = iter->second.m_strEqpmtStrID;
  47. break;
  48. }
  49. }
  50. return strID;
  51. }
  52. bool CDrainPoolUnit::CheckRunPump( int nType )
  53. {
  54. bool bRet = false;
  55. vector<int>::iterator iterRunType = m_vecRunType.begin();
  56. for ( ; iterRunType != m_vecRunType.end(); iterRunType++ )
  57. {
  58. if ( nType == (*iterRunType) )
  59. {
  60. bRet = true;
  61. break;
  62. }
  63. }
  64. return bRet;
  65. }
  66. void CDrainPoolUnit::AddRunPumpType( int nType )
  67. {
  68. vector<int>::iterator iterRunType = m_vecRunType.begin();
  69. for ( ; iterRunType != m_vecRunType.end(); iterRunType++ )
  70. {
  71. if ( nType == (*iterRunType) )
  72. {
  73. m_vecRunType.erase(iterRunType);
  74. break;
  75. }
  76. }
  77. m_vecRunType.push_back(nType);
  78. }
  79. void CDrainPoolUnit::DelRunPumpType( int nType )
  80. {
  81. vector<int>::iterator iterRunType = m_vecRunType.begin();
  82. for ( ; iterRunType != m_vecRunType.end(); iterRunType++ )
  83. {
  84. if ( nType == (*iterRunType) )
  85. {
  86. m_vecRunType.erase(iterRunType);
  87. break;
  88. }
  89. }
  90. }
  91. void CDrainPoolUnit::AddRunPumpStrID( const CString& strEqpmtID )
  92. {
  93. map< CString, CDrainPump>::iterator iter = m_mapDrainPump.find(strEqpmtID);
  94. if ( iter== m_mapDrainPump.end() )
  95. {
  96. return;
  97. }
  98. AddRunPumpType( iter->second.m_nType);
  99. }
  100. int CDrainPoolUnit::Size()
  101. {
  102. return m_mapDrainPump.size();
  103. }
  104. CString CDrainPoolUnit::GetFirstPumpStrID()
  105. {
  106. CString strRet = _T("");
  107. if ( m_mapDrainPump.empty() )
  108. {
  109. return strRet;
  110. }
  111. map< CString, CDrainPump>::iterator iter = m_mapDrainPump.begin();
  112. if ( m_vecRunType.empty() )
  113. {
  114. strRet = iter->second.m_strEqpmtStrID;
  115. return strRet;
  116. }
  117. int nFirstType = m_vecRunType[0];
  118. for ( ; iter != m_mapDrainPump.end(); iter++ )
  119. {
  120. if ( iter->second.m_nType == nFirstType )
  121. {
  122. strRet = iter->second.m_strEqpmtStrID;
  123. break;
  124. }
  125. }
  126. return strRet;
  127. }
  128. CString CDrainPoolUnit::GetSecondPumpStrID()
  129. {
  130. CString strRet = _T("");
  131. if ( m_mapDrainPump.size() < 2 )
  132. {
  133. return strRet;
  134. }
  135. map< CString, CDrainPump>::iterator iter = m_mapDrainPump.begin();
  136. //iter++;
  137. if ( m_vecRunType.size() < 2 )
  138. {
  139. strRet = iter->second.m_strEqpmtStrID;
  140. return strRet;
  141. }
  142. int nSecondType = m_vecRunType[0];
  143. for ( ; iter != m_mapDrainPump.end(); iter++ )
  144. {
  145. if ( iter->second.m_nType == nSecondType )
  146. {
  147. strRet = iter->second.m_strEqpmtStrID;
  148. break;
  149. }
  150. }
  151. return strRet;
  152. }
  153. int CDrainPoolUnit::GetWaterLevel()
  154. {
  155. int nLevel=-1;
  156. // 超低水位 0-10
  157. // 停泵水位 10-30
  158. // 开单泵水位 30-50
  159. // 开双泵水位 50-80
  160. // 超高水位 80-100
  161. //修改界限值,预留缓冲值 mod by yangs
  162. if (m_WaterLevel >= m_fWaterLevelAlarmLow && m_WaterLevel < m_fWaterLevelClose)
  163. {
  164. nLevel=DrainAlarm_Low;
  165. }
  166. else if (m_WaterLevel >= m_fWaterLevelClose && m_WaterLevel < m_fWaterLevelOpenOne)
  167. {
  168. nLevel=DrainAlarm_Close;
  169. }
  170. else if (m_WaterLevel >= m_fWaterLevelOpenOne
  171. && (m_WaterLevel < m_fWaterLevelOpenTwo || m_fWaterLevelOpenTwo < 0))
  172. {
  173. nLevel=DrainAlarm_OpenOne;
  174. }
  175. else if (m_WaterLevel >= m_fWaterLevelOpenTwo
  176. && (m_WaterLevel < m_fWaterLevelOpenThree || m_fWaterLevelOpenThree < 0))
  177. {
  178. nLevel=DrainAlarm_OpenTwo;
  179. }
  180. else if (m_WaterLevel >= m_fWaterLevelOpenThree
  181. && (m_WaterLevel < m_fWaterLevelOpenFour || m_fWaterLevelOpenFour < 0))
  182. {
  183. nLevel=DrainAlarm_OpenThree;
  184. }
  185. else if (m_WaterLevel >= m_fWaterLevelOpenFour)
  186. {
  187. nLevel = DrainAlarm_OpenFour;
  188. }
  189. else {
  190. nLevel = DrainAlarm_Low;
  191. }
  192. return nLevel;
  193. }
  194. bool CDrainPoolUnit::checkWaterLevelAlarmHigh()
  195. {
  196. return m_WaterLevel >= m_fWaterLevelAlarmHigh;
  197. }
  198. //add by yangs
  199. void CDrainPoolUnit::SetWaterLevelByStatus(int nStatus)
  200. {
  201. switch(nStatus)
  202. {
  203. case DrainAlarm_Low:m_WaterLevel = m_fWaterLevelAlarmLow;
  204. break;
  205. case DrainAlarm_Close:m_WaterLevel = m_fWaterLevelClose;
  206. break;
  207. case DrainAlarm_OpenOne:m_WaterLevel = m_fWaterLevelOpenOne;
  208. break;
  209. case DrainAlarm_OpenTwo:m_WaterLevel = m_fWaterLevelOpenTwo;
  210. break;
  211. case DrainAlarm_OpenThree:m_WaterLevel = m_fWaterLevelOpenThree;
  212. break;
  213. case DrainAlarm_OpenFour:m_WaterLevel = m_fWaterLevelOpenFour;
  214. break;
  215. default:
  216. break;
  217. }
  218. }
  219. void CDrainPoolUnit::SetWaterLevel_FronTS(float fWaterHeightPercent)
  220. {
  221. m_bWaterFromTS = TRUE;
  222. int nPreLevel = GetWaterLevel();
  223. m_WaterLevel = fWaterHeightPercent; //顺序和前面一句代码不能颠倒,否则自己品味
  224. int nCurLevel = GetWaterLevel();
  225. if ( nCurLevel != nPreLevel )
  226. {
  227. m_bLevelChange = TRUE;
  228. }
  229. }