using System.Text.RegularExpressions; namespace SHJX.Service.PortClient.TempController { public abstract class SerialPortImp { protected static readonly ILogger Logger = LogFactory.BuildLogger(typeof(SerialPortImp)); /// /// 数据下发 /// /// /// /// protected virtual bool SendDataReturnBool(string value, object port) { if (!Rs485Client.IsValid) { return false; } if (value.Contains("3FL")|| value.Contains("3FS")) { string res1 = ""; while (res1 != "0009\r" && res1 != "0209\r") { var value1 = $"1SC\r"; if (!Rs485Client.IsValid) return false; res1 = Rs485Client.SendData(value1, "\r"); if (res1 is null || !(res1.Contains('='))) { Thread.Sleep(200); continue; } res1 = res1?.Split('=')[1]; Thread.Sleep(300); } res1 = ""; while (res1 != "0009\r" && res1 != "0209\r") { var value1 = $"2SC\r"; if (!Rs485Client.IsValid) return false; res1 = Rs485Client.SendData(value1, "\r"); if (res1 is null || !(res1.Contains('='))) { Thread.Sleep(200); continue; } res1 = res1?.Split('=')[1]; Thread.Sleep(200); } } if ( value.Contains("3SO1")) { string res1 = ""; while (res1 != "0009\r" && res1 != "0209\r") { var value1 = $"3SC\r"; if (!Rs485Client.IsValid) return false; res1 = Rs485Client.SendData(value1, "\r"); if (res1 is null || !(res1.Contains('='))) { Thread.Sleep(200); continue; } res1 = res1?.Split('=')[1]; Thread.Sleep(200); } } string res = Rs485Client.SendData(value, "\r"); return string.Concat(port, '%', '\r').Equals(res, StringComparison.Ordinal); } /// /// 数据下发 /// /// /// /// protected virtual string SendDataReturnString(string value) { return Rs485Client.IsValid ? Rs485Client.SendData(value, "\r") : string.Empty; } #region 温度 /// /// 读取PV和SV两个值 /// /// 实际温度 /// 设定温度 public void ReadPVnSV(byte nodeID, ref double pv, ref double sv) { GetDeltaDTC(nodeID).SetAddrNum(nodeID).ReadPVnSV(ref pv, ref sv); } /// /// 写入一个通道的pid参数值 /// /// 比例带(P),0.0~9999.0 /// 积分值(I),0~9999 /// 微分值(D),0~9999 /// 积分量默认值,0.0~100.0 (%) /// protected bool WritePid(byte nodeID, double pb, int ti, int td, double tideft) { return GetDeltaDTC(nodeID).SetAddrNum(nodeID).WritePid(pb, ti, td, tideft); } /// /// 写入温度 /// /// /// /// public bool WriteSV(byte nodeID, double temperatureValue) { return GetDeltaDTC(nodeID).SetAddrNum(nodeID).WriteSV(temperatureValue); } /// /// 写入比例 /// /// /// /// public bool WritePb(byte nodeID, double pb) { return GetDeltaDTC(nodeID).SetAddrNum(nodeID).WritePidPb(pb); } /// /// 写入积分 /// /// /// /// public bool WriteTi(byte nodeID, int ti) { return GetDeltaDTC(nodeID).SetAddrNum(nodeID).WritePidTi(ti); } /// /// 写入微分 /// /// /// /// public bool WriteTd(byte nodeID, int td) { return GetDeltaDTC(nodeID).SetAddrNum(nodeID).WritePidTd(td); } /// /// 写入积分量默认值 /// /// /// /// public bool WriteTiDeft(byte nodeID, double tideft) { return GetDeltaDTC(nodeID).SetAddrNum(nodeID).WritePidTiDeft(tideft); } private static readonly object dtc_locker = new(); private static readonly ConcurrentDictionary dic_dtcs = new(); protected static DeltaDTC GetDeltaDTC(byte nodeID) { if (dic_dtcs.TryGetValue(nodeID, out DeltaDTC value)) { return value; } DeltaDTC delta = default; lock (dtc_locker) { delta = DeltaDTC.StartNew; dic_dtcs.TryAdd(nodeID, delta); } return delta; } #endregion } }