|
@@ -29,6 +29,11 @@ namespace Venus_RT.Devices
|
|
|
/// ControlTcFeedback:返回值
|
|
|
/// </summary>
|
|
|
|
|
|
+ public enum ChillerMsgType
|
|
|
+ {
|
|
|
+ Get,
|
|
|
+ Set
|
|
|
+ }
|
|
|
public class SMCChillerDrive
|
|
|
{
|
|
|
|
|
@@ -42,6 +47,7 @@ namespace Venus_RT.Devices
|
|
|
|
|
|
private Dictionary<string,string> _address2Module;//不正确 应该以字典的形式 以头去打印
|
|
|
private Dictionary<string, ChillerData> _addressQuery;
|
|
|
+ private Dictionary<string, Queue<string>> _addressCmdQueue;
|
|
|
private ModuleName Module;//不正确 应该以字典的形式 以头去打印
|
|
|
|
|
|
// --------------------------Constructor-----------------------
|
|
@@ -67,6 +73,7 @@ namespace Venus_RT.Devices
|
|
|
_address2Module = new Dictionary<string, string>();
|
|
|
_addressQuery = new Dictionary<string, ChillerData>();
|
|
|
|
|
|
+
|
|
|
Task.Run(() =>
|
|
|
{
|
|
|
foreach (var data in blockingCollection.GetConsumingEnumerable())
|
|
@@ -178,6 +185,7 @@ namespace Venus_RT.Devices
|
|
|
|
|
|
}
|
|
|
}
|
|
|
+ _addressCmdQueue[header].Dequeue();
|
|
|
_addressQuery[header] = chillerdata;
|
|
|
}
|
|
|
break;
|
|
@@ -199,12 +207,31 @@ namespace Venus_RT.Devices
|
|
|
}
|
|
|
|
|
|
|
|
|
- public void SendCmd(string str)
|
|
|
+ public void SendCmd(ChillerMsgType type,string str)
|
|
|
{
|
|
|
//消息通用格式:开头 + 内容 + LRC + 结尾
|
|
|
//_serial?.Write(":" + str + ModbusUtility.CalculateLrc(ModbusUtility.HexToBytes(str)).ToString("X2") + "\r\n");
|
|
|
- LOG.Write(eEvent.INFO_DEVICE_CHILLER,ModuleName.System, "Send Cmd => :" + str + ModbusUtility.CalculateLrc(ModbusUtility.HexToBytes(str)).ToString("X2"));
|
|
|
- blockingCollection.Add(":" + str + ModbusUtility.CalculateLrc(ModbusUtility.HexToBytes(str)).ToString("X2") + "\r\n");
|
|
|
+ //如果是设置的直接发出无需等待
|
|
|
+ if (type == ChillerMsgType.Set)
|
|
|
+ {
|
|
|
+ blockingCollection.Add(":" + str + ModbusUtility.CalculateLrc(ModbusUtility.HexToBytes(str)).ToString("X2") + "\r\n");
|
|
|
+ }
|
|
|
+
|
|
|
+ //如果是获取的可以慢一些 在数据回复后继续
|
|
|
+ if (type == ChillerMsgType.Get)
|
|
|
+ {
|
|
|
+
|
|
|
+ //每interval获取温度 超过一秒时效性失去意义 500 * 2积累太多数据 同时注意其是与monitor紧密联系的 实际上是每interval就会进来可能导致数组变大
|
|
|
+ //因此每次进来要控制规模 > 2 时 实时性已经失去此时应该等待回复并把头前的清除掉 而且要注意 chiller本身升温很慢 界面上ramp不明显
|
|
|
+
|
|
|
+ _addressCmdQueue[str.Substring(1, 2)].Enqueue(str);
|
|
|
+ if (_addressCmdQueue[str.Substring(1, 2)].Count > 2)
|
|
|
+ _addressCmdQueue[str.Substring(1, 2)].Dequeue();
|
|
|
+ else
|
|
|
+ blockingCollection.Add(":" + _addressCmdQueue[str.Substring(1, 2)].Peek() + ModbusUtility.CalculateLrc(ModbusUtility.HexToBytes(str)).ToString("X2") + "\r\n");
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
}
|
|
|
|
|
|
public void AddAddress(string address, string chillertype)
|
|
@@ -212,6 +239,7 @@ namespace Venus_RT.Devices
|
|
|
//address => "02" chillertype => PMA.OutChiller
|
|
|
_address2Module.Add(address,chillertype);
|
|
|
_addressQuery.Add(address, new ChillerData());
|
|
|
+ _addressCmdQueue.Add(address, new Queue<string>());
|
|
|
}
|
|
|
|
|
|
public ChillerData QueryData(string address)
|