Monitor.cs 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206
  1. using BroadcastModule;
  2. using DatabaseDLL;
  3. using Monitor;
  4. using NumMachine;
  5. using PLCS7;
  6. using System;
  7. using System.Collections.Generic;
  8. using System.Threading;
  9. using System.Threading.Tasks;
  10. using WebServer;
  11. namespace Monitor
  12. {
  13. public class Monitor : IMonitor
  14. {
  15. /// <summary>
  16. /// 监控模块单例
  17. /// </summary>
  18. public static Monitor ins { get; set; }
  19. /// <summary>
  20. /// 中控系统总状态
  21. /// </summary>
  22. public static bool globalStatus = false;
  23. /// <summary>
  24. /// 初始化步骤
  25. /// </summary>
  26. public static int initializeState = 0;
  27. /// <summary>
  28. /// PLC对象句柄
  29. /// </summary>
  30. public static AbstractPLCLinker PLC = null;
  31. public static string plcIPAddr { get; set; }
  32. public static int plcRack { get; set; }
  33. public static int plcSlot { get; set; }
  34. public static string[] plcDatablockConfig { get; set; }
  35. public static int plcTerminalCount { get; set; }
  36. public static int plcParkingSpaceCount { get; set; }
  37. public static int plcRefreshInterval { get; set; }
  38. public static MainBlockStru mainBlockInfo { get; set; }
  39. public static List<ParkingSpaceStru> parkingSpaceInfo { get; set; }
  40. /// <summary>
  41. /// 远程数据库操作句柄
  42. /// </summary>
  43. public static DBOperation remoteDBOper;
  44. /// <summary>
  45. /// 本地数据库操作句柄
  46. /// </summary>
  47. public static DBOperation localDBOper;
  48. /// <summary>
  49. /// 显示板操作对象句柄
  50. /// </summary>
  51. public static BroadcastBoard allInOneMachine;
  52. public static string allInOneMachineIP { get; set; }
  53. public static int allInOneMachinePort { get; set; }
  54. /// <summary>
  55. /// 号牌机操作句柄
  56. /// </summary>
  57. public static INumMachineLinker numMachineLinker;
  58. public static IntPtr flpHandle;
  59. /// <summary>
  60. /// 本地web操作句柄
  61. /// </summary>
  62. public static IWebServer webServer;
  63. public static int webPort { get; set; }
  64. /// <summary>
  65. /// 系统初始化器句柄
  66. /// </summary>
  67. internal static SystemInitializer sysInitializer;
  68. /// <summary>
  69. /// 系统关闭状态
  70. /// </summary>
  71. bool isClosing;
  72. /// <summary>
  73. /// 车库ID
  74. /// </summary>
  75. public static int garageID;
  76. private void PLCUpdate()
  77. {
  78. while (!isClosing)
  79. {
  80. if (PLC != null && PLC.isConnected)
  81. {
  82. List<object> received = PLC.ReadFromPLC(PLCDataType.terminal, 0);
  83. //首先获取所有终端信息
  84. try
  85. {
  86. //终端总数相同
  87. if (Terminal.Terminal.terminalInfo.Count == plcTerminalCount)
  88. {
  89. for (int i = 0; i < plcTerminalCount; i++)
  90. {
  91. //一旦发现差异立刻更新
  92. if (!Terminal.Terminal.terminalInfo[i].Equals(received[i]))
  93. {
  94. Terminal.Terminal.terminalInfo[i] = (TerminalStru)received[i];
  95. }
  96. }
  97. }
  98. else
  99. {
  100. Terminal.Terminal.terminalInfo.Clear();
  101. for (int i = 0; i < plcTerminalCount; i++)
  102. {
  103. Terminal.Terminal.terminalInfo.Add((TerminalStru)received[i]);
  104. }
  105. }
  106. }
  107. catch (Exception e) { Console.WriteLine("PLC监控终端数据," + e.Message); }
  108. //接下来获取中控监控信息
  109. try
  110. {
  111. received = PLC.ReadFromPLC(PLCDataType.central, 0);
  112. if (received.Count>0&&!mainBlockInfo.Equals(received[0]))
  113. {
  114. mainBlockInfo = (MainBlockStru)received[0];
  115. }
  116. }catch(Exception e) { Console.WriteLine("PLC监控中控数据," + e.Message); }
  117. //最后获得所有车位信息
  118. try
  119. {
  120. received = PLC.ReadFromPLC(PLCDataType.parkingSpace, 0);
  121. //车位总数相同
  122. if (parkingSpaceInfo.Count == plcParkingSpaceCount)
  123. {
  124. for (int i = 0; i < plcParkingSpaceCount; i++)
  125. {
  126. //一旦发现差异立刻更新
  127. if (!parkingSpaceInfo[i].Equals(received[i]))
  128. {
  129. parkingSpaceInfo[i] = (ParkingSpaceStru)received[i];
  130. }
  131. }
  132. }
  133. else
  134. {
  135. parkingSpaceInfo.Clear();
  136. for (int i = 0; i < plcParkingSpaceCount; i++)
  137. {
  138. parkingSpaceInfo.Add((ParkingSpaceStru)received[i]);
  139. }
  140. }
  141. }
  142. catch (Exception e) { Console.WriteLine("PLC监控车位数据," + e.Message); }
  143. }
  144. Thread.Sleep(500);
  145. }
  146. }
  147. //************************************ 公有方法 **********************************
  148. public Monitor(IntPtr flpHandle)
  149. {
  150. Monitor.flpHandle = flpHandle;
  151. parkingSpaceInfo = new List<ParkingSpaceStru>();
  152. mainBlockInfo = new MainBlockStru();
  153. }
  154. public void DisplayPLCInfo()
  155. {
  156. }
  157. public void DisplayTerminalState()
  158. {
  159. }
  160. public void DisplayLicensePlate()
  161. {
  162. }
  163. public void DisplayImage()
  164. {
  165. }
  166. public void Start()
  167. {
  168. if (flpHandle != IntPtr.Zero)
  169. {
  170. //初始化系统
  171. if (sysInitializer == null)
  172. {
  173. sysInitializer = new SystemInitializer();
  174. }
  175. Task.Factory.StartNew(() =>
  176. {
  177. sysInitializer.Init(flpHandle);
  178. });
  179. //更新PLC数据
  180. Task.Factory.StartNew(()=> {
  181. PLCUpdate();
  182. });
  183. }
  184. }
  185. public void Stop()
  186. {
  187. sysInitializer.Stop();
  188. }
  189. }
  190. }