SerialPortImp.cs 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. using System.Text.RegularExpressions;
  2. namespace SHJX.Service.PortClient.TempController
  3. {
  4. public abstract class SerialPortImp
  5. {
  6. protected static readonly ILogger Logger = LogFactory.BuildLogger(typeof(SerialPortImp));
  7. /// <summary>
  8. /// 数据下发
  9. /// </summary>
  10. /// <param name="value"></param>
  11. /// <param name="port"></param>
  12. /// <returns></returns>
  13. protected virtual bool SendDataReturnBool(string value, object port)
  14. {
  15. if (!Rs485Client.IsValid)
  16. {
  17. return false;
  18. }
  19. if (value.Contains("3FL")|| value.Contains("3FS"))
  20. {
  21. string res1 = "";
  22. while (res1 != "0009\r" && res1 != "0209\r")
  23. {
  24. var value1 = $"1SC\r";
  25. if (!Rs485Client.IsValid) return false;
  26. res1 = Rs485Client.SendData(value1, "\r");
  27. if (res1 is null || !(res1.Contains('=')))
  28. {
  29. Thread.Sleep(200);
  30. continue;
  31. }
  32. res1 = res1?.Split('=')[1];
  33. Thread.Sleep(300);
  34. }
  35. res1 = "";
  36. while (res1 != "0009\r" && res1 != "0209\r")
  37. {
  38. var value1 = $"2SC\r";
  39. if (!Rs485Client.IsValid) return false;
  40. res1 = Rs485Client.SendData(value1, "\r");
  41. if (res1 is null || !(res1.Contains('=')))
  42. {
  43. Thread.Sleep(200);
  44. continue;
  45. }
  46. res1 = res1?.Split('=')[1];
  47. Thread.Sleep(200);
  48. }
  49. }
  50. if ( value.Contains("3SO1"))
  51. {
  52. string res1 = "";
  53. while (res1 != "0009\r" && res1 != "0209\r")
  54. {
  55. var value1 = $"3SC\r";
  56. if (!Rs485Client.IsValid) return false;
  57. res1 = Rs485Client.SendData(value1, "\r");
  58. if (res1 is null || !(res1.Contains('=')))
  59. {
  60. Thread.Sleep(200);
  61. continue;
  62. }
  63. res1 = res1?.Split('=')[1];
  64. Thread.Sleep(200);
  65. }
  66. }
  67. string res = Rs485Client.SendData(value, "\r");
  68. return string.Concat(port, '%', '\r').Equals(res, StringComparison.Ordinal);
  69. }
  70. /// <summary>
  71. /// 数据下发
  72. /// </summary>
  73. /// <param name="port"></param>
  74. /// <param name="value"></param>
  75. /// <returns></returns>
  76. protected virtual string SendDataReturnString(string value)
  77. {
  78. return Rs485Client.IsValid ? Rs485Client.SendData(value, "\r") : string.Empty;
  79. }
  80. #region 温度
  81. /// <summary>
  82. /// 读取PV和SV两个值
  83. /// </summary>
  84. /// <param name="pv">实际温度</param>
  85. /// <param name="sv">设定温度</param>
  86. public void ReadPVnSV(byte nodeID, ref double pv, ref double sv)
  87. {
  88. GetDeltaDTC(nodeID).SetAddrNum(nodeID).ReadPVnSV(ref pv, ref sv);
  89. }
  90. /// <summary>
  91. /// 写入一个通道的pid参数值
  92. /// </summary>
  93. /// <param name="pb">比例带(P),0.0~9999.0</param>
  94. /// <param name="ti">积分值(I),0~9999</param>
  95. /// <param name="td">微分值(D),0~9999</param>
  96. /// <param name="tideft">积分量默认值,0.0~100.0 (%)</param>
  97. /// <returns></returns>
  98. protected bool WritePid(byte nodeID, double pb, int ti, int td, double tideft)
  99. {
  100. return GetDeltaDTC(nodeID).SetAddrNum(nodeID).WritePid(pb, ti, td, tideft);
  101. }
  102. /// <summary>
  103. /// 写入温度
  104. /// </summary>
  105. /// <param name="nodeID"></param>
  106. /// <param name="temperatureValue"></param>
  107. /// <returns></returns>
  108. public bool WriteSV(byte nodeID, double temperatureValue)
  109. {
  110. return GetDeltaDTC(nodeID).SetAddrNum(nodeID).WriteSV(temperatureValue);
  111. }
  112. /// <summary>
  113. /// 写入比例
  114. /// </summary>
  115. /// <param name="nodeID"></param>
  116. /// <param name="pb"></param>
  117. /// <returns></returns>
  118. public bool WritePb(byte nodeID, double pb)
  119. {
  120. return GetDeltaDTC(nodeID).SetAddrNum(nodeID).WritePidPb(pb);
  121. }
  122. /// <summary>
  123. /// 写入积分
  124. /// </summary>
  125. /// <param name="nodeID"></param>
  126. /// <param name="ti"></param>
  127. /// <returns></returns>
  128. public bool WriteTi(byte nodeID, int ti)
  129. {
  130. return GetDeltaDTC(nodeID).SetAddrNum(nodeID).WritePidTi(ti);
  131. }
  132. /// <summary>
  133. /// 写入微分
  134. /// </summary>
  135. /// <param name="nodeID"></param>
  136. /// <param name="td"></param>
  137. /// <returns></returns>
  138. public bool WriteTd(byte nodeID, int td)
  139. {
  140. return GetDeltaDTC(nodeID).SetAddrNum(nodeID).WritePidTd(td);
  141. }
  142. /// <summary>
  143. /// 写入积分量默认值
  144. /// </summary>
  145. /// <param name="nodeID"></param>
  146. /// <param name="tideft"></param>
  147. /// <returns></returns>
  148. public bool WriteTiDeft(byte nodeID, double tideft)
  149. {
  150. return GetDeltaDTC(nodeID).SetAddrNum(nodeID).WritePidTiDeft(tideft);
  151. }
  152. private static readonly object dtc_locker = new();
  153. private static readonly ConcurrentDictionary<byte, DeltaDTC> dic_dtcs = new();
  154. protected static DeltaDTC GetDeltaDTC(byte nodeID)
  155. {
  156. if (dic_dtcs.TryGetValue(nodeID, out DeltaDTC value))
  157. {
  158. return value;
  159. }
  160. DeltaDTC delta = default;
  161. lock (dtc_locker)
  162. {
  163. delta = DeltaDTC.StartNew;
  164. dic_dtcs.TryAdd(nodeID, delta);
  165. }
  166. return delta;
  167. }
  168. #endregion
  169. }
  170. }