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
}
}