You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

239 lines
8.0 KiB

  1. // ********************************************************************************
  2. // 文件名字: SECSContext
  3. // 文件描述: SECSContext
  4. // 开发人员: Michael
  5. // 创建时间: 2019/11/8 0:08
  6. //
  7. // 更新历史:
  8. // + 创建 SECSContext.cs 文件. by Michael @2019/11/8 0:08
  9. // ********************************************************************************
  10. using ARI.EAP.HOST;
  11. using ARI.EAP.HOST.Common;
  12. using Glorysoft.SECS.EQP.Utilities;
  13. using Glorysoft.SECSwell;
  14. using System;
  15. using System.Collections.Generic;
  16. using System.Linq;
  17. using System.Reflection;
  18. using System.Threading.Tasks;
  19. namespace Glorysoft.SECS.EQP.Common
  20. {
  21. public class SECSContext
  22. {
  23. public string Name { get; set; }
  24. public short DeviceID { get; set; } = 0;
  25. public eHSMS_CONNECT_MODE ConnectionMode { get; set; } = eHSMS_CONNECT_MODE.ACTIVE;
  26. public string RemoteIPAddress { get; set; } = "127.0.0.1";
  27. public int RemoteIPPort { get; set; } = 6000;
  28. public string LocalIPAddress { get; set; } = "127.0.0.1";
  29. public int LocalIPPort { get; set; } = 20002;
  30. public bool AsciiValueAutoFillSpace { get; set; } = true;
  31. public int T1 { get; set; } = 1;
  32. public int T2 { get; set; } = 2;
  33. public int T3 { get; set; } = 45;
  34. public int T4 { get; set; } = 4;
  35. public int T5 { get; set; } = 10;
  36. public int T6 { get; set; } = 6;
  37. public int T7 { get; set; } = 10;
  38. public int T8 { get; set; } = 5;
  39. public eLOG_LEVEL LogLevel { get; set; } = eLOG_LEVEL.DEBUG;
  40. public string LogPath { get; set; } = @"logs\";
  41. public string SECSLibraryFile { get; set; } = @"Configuration\SECSLibrary.xml";
  42. public bool IsConnected => Port != null && Port.Connected;
  43. private readonly SECSwell.SECSPort Port;
  44. private static Dictionary<string, ISECSMessageHandler> Handlers;
  45. public SECSContext(string name, short deviceId, string remoteIPAddress, int remoteIPPort)
  46. {
  47. LogPath = string.Format(@"{0}{1}\", LogPath, name);
  48. Name = name;
  49. DeviceID = deviceId;
  50. RemoteIPAddress = remoteIPAddress;
  51. RemoteIPPort = remoteIPPort;
  52. SECSwell.SECSPort.SetAsciiValueAutoFillSpace = AsciiValueAutoFillSpace;
  53. Port = new SECSwell.SECSPort(Name)
  54. {
  55. Name = Name,
  56. DeviceID = DeviceID,
  57. LogPath = LogPath,
  58. LogLevel = LogLevel
  59. };
  60. HSMSParameters parameters = new HSMSParameters
  61. {
  62. DeviceID = DeviceID,
  63. ConnectionMode = ConnectionMode,
  64. RemoteIP = RemoteIPAddress,
  65. RemotePort = RemoteIPPort,
  66. LocalIP = LocalIPAddress,
  67. LocalPort = LocalIPPort,
  68. T3 = T3,
  69. T5 = T5,
  70. T6 = T6,
  71. T7 = T7,
  72. T8 = T8
  73. };
  74. Port.Library.Load(SECSLibraryFile);
  75. Port.HsmsParameters = parameters;
  76. Port.IsS9FxCheck = false;
  77. Port.OnSECSEvent += OnRecieved;
  78. Handlers = new Dictionary<string, ISECSMessageHandler>();
  79. foreach (Type item in MethodBase.GetCurrentMethod().DeclaringType.Assembly.GetTypes())
  80. {
  81. if (item.IsClass && item.GetInterface(nameof(ISECSMessageHandler)) != null)
  82. {
  83. Handlers.Add(item.Name, Activator.CreateInstance(item) as ISECSMessageHandler);
  84. }
  85. }
  86. }
  87. private void OnRecieved(SECSEventType type, SECSTransaction trans, SECSErrors err, string errmsg)
  88. {
  89. var msgName = string.Empty;
  90. switch (type)
  91. {
  92. case SECSEventType.HSMSConnected:
  93. msgName = $"{nameof(SECSEventType.HSMSConnected)}Handler";
  94. break;
  95. case SECSEventType.HSMSDisconnected:
  96. msgName = $"{nameof(SECSEventType.HSMSDisconnected)}Handler";
  97. break;
  98. case SECSEventType.PrimaryRcvd:
  99. msgName = $"S{trans.Primary.Stream}F{trans.Primary.Function}Handler";
  100. break;
  101. case SECSEventType.SecondaryRcvd:
  102. msgName = $"S{trans.Secondary.Stream}F{trans.Secondary.Function}Handler";
  103. break;
  104. default:
  105. msgName = $"{nameof(SECSEventType.Error)}Handler";
  106. break;
  107. }
  108. if (Handlers.ContainsKey(msgName))
  109. {
  110. EquipmentStatus.S1F1HeartBit.timer1.Stop();
  111. EquipmentStatus.S1F1HeartBit.timer1.Start();
  112. Task.Run(() => Handlers[msgName].Execute(this, trans, err, errmsg));
  113. }
  114. }
  115. public virtual bool Close()
  116. {
  117. try
  118. {
  119. if (IsConnected)
  120. {
  121. Port.ClosePort();
  122. EquipmentStatus.EqConnectState = ConnectState.disconnected;
  123. return true;
  124. }
  125. return false;
  126. }
  127. catch (Exception e)
  128. {
  129. LoggerService.SECSLogger.Error(e);
  130. return false;
  131. }
  132. }
  133. public virtual bool Open()
  134. {
  135. try
  136. {
  137. if (Port != null)
  138. {
  139. Port.OpenPort();
  140. return Port.Connected;
  141. }
  142. return false;
  143. }
  144. catch (Exception e)
  145. {
  146. LoggerService.SECSLogger.Error(e);
  147. return false;
  148. }
  149. }
  150. public virtual void ReplyMessage(SECSTransaction trans)
  151. {
  152. try
  153. {
  154. if (Port != null && Port.PortIsOpen)
  155. {
  156. Port.Reply(trans);
  157. }
  158. }
  159. catch (Exception e)
  160. {
  161. LoggerService.SECSLogger.Error(e);
  162. }
  163. }
  164. public virtual void SendMessage(SECSTransaction trans)
  165. {
  166. try
  167. {
  168. if (Port != null && Port.PortIsOpen)
  169. {
  170. Port.Send(trans);
  171. }
  172. }
  173. catch (Exception e)
  174. {
  175. LoggerService.SECSLogger.Error(e);
  176. }
  177. }
  178. public virtual void SendMessage(string name)
  179. {
  180. try
  181. {
  182. if (Port != null && Port.PortIsOpen)
  183. {
  184. SECSTransaction transaction = new SECSTransaction
  185. {
  186. Primary = Port.Library.FindMessage(name)
  187. };
  188. transaction.Secondary = Port.Library.FindMessage(transaction.Primary.Stream, transaction.Primary.Function + 1).FirstOrDefault();
  189. Port.Send(transaction);
  190. }
  191. }
  192. catch (Exception e)
  193. {
  194. LoggerService.SECSLogger.Error(e);
  195. }
  196. }
  197. public SECSTransaction GetTransaction(int stream, int function, string msgName = null)
  198. {
  199. try
  200. {
  201. string messageName = string.IsNullOrWhiteSpace(msgName) ? $"S{stream}F{function}" : msgName.ToUpper();
  202. if (Port == null)
  203. {
  204. LoggerService.SECSLogger.Error($"Method: GetTransaction, Port is null!");
  205. return null;
  206. }
  207. if (Port.Library == null)
  208. {
  209. LoggerService.SECSLogger.Error($"Method: GetTransaction, Port.Library is null!");
  210. return null;
  211. }
  212. return Port.Library.FindTransaction(messageName);
  213. }
  214. catch (Exception e)
  215. {
  216. LoggerService.SECSLogger.Error(e);
  217. return null;
  218. }
  219. }
  220. }
  221. }