| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180 |
- using System.Text.RegularExpressions;
- namespace SHJX.Service.PortClient.TempController
- {
- public abstract class SerialPortImp
- {
- protected static readonly ILogger Logger = LogFactory.BuildLogger(typeof(SerialPortImp));
- /// <summary>
- /// 数据下发
- /// </summary>
- /// <param name="value"></param>
- /// <param name="port"></param>
- /// <returns></returns>
- 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);
- }
-
- /// <summary>
- /// 数据下发
- /// </summary>
- /// <param name="port"></param>
- /// <param name="value"></param>
- /// <returns></returns>
- protected virtual string SendDataReturnString(string value)
- {
- return Rs485Client.IsValid ? Rs485Client.SendData(value, "\r") : string.Empty;
- }
- #region 温度
- /// <summary>
- /// 读取PV和SV两个值
- /// </summary>
- /// <param name="pv">实际温度</param>
- /// <param name="sv">设定温度</param>
- public void ReadPVnSV(byte nodeID, ref double pv, ref double sv)
- {
- GetDeltaDTC(nodeID).SetAddrNum(nodeID).ReadPVnSV(ref pv, ref sv);
- }
- /// <summary>
- /// 写入一个通道的pid参数值
- /// </summary>
- /// <param name="pb">比例带(P),0.0~9999.0</param>
- /// <param name="ti">积分值(I),0~9999</param>
- /// <param name="td">微分值(D),0~9999</param>
- /// <param name="tideft">积分量默认值,0.0~100.0 (%)</param>
- /// <returns></returns>
- protected bool WritePid(byte nodeID, double pb, int ti, int td, double tideft)
- {
- return GetDeltaDTC(nodeID).SetAddrNum(nodeID).WritePid(pb, ti, td, tideft);
- }
- /// <summary>
- /// 写入温度
- /// </summary>
- /// <param name="nodeID"></param>
- /// <param name="temperatureValue"></param>
- /// <returns></returns>
- public bool WriteSV(byte nodeID, double temperatureValue)
- {
- return GetDeltaDTC(nodeID).SetAddrNum(nodeID).WriteSV(temperatureValue);
- }
- /// <summary>
- /// 写入比例
- /// </summary>
- /// <param name="nodeID"></param>
- /// <param name="pb"></param>
- /// <returns></returns>
- public bool WritePb(byte nodeID, double pb)
- {
- return GetDeltaDTC(nodeID).SetAddrNum(nodeID).WritePidPb(pb);
- }
- /// <summary>
- /// 写入积分
- /// </summary>
- /// <param name="nodeID"></param>
- /// <param name="ti"></param>
- /// <returns></returns>
- public bool WriteTi(byte nodeID, int ti)
- {
- return GetDeltaDTC(nodeID).SetAddrNum(nodeID).WritePidTi(ti);
- }
- /// <summary>
- /// 写入微分
- /// </summary>
- /// <param name="nodeID"></param>
- /// <param name="td"></param>
- /// <returns></returns>
- public bool WriteTd(byte nodeID, int td)
- {
- return GetDeltaDTC(nodeID).SetAddrNum(nodeID).WritePidTd(td);
- }
- /// <summary>
- /// 写入积分量默认值
- /// </summary>
- /// <param name="nodeID"></param>
- /// <param name="tideft"></param>
- /// <returns></returns>
- 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<byte, DeltaDTC> 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
- }
- }
|