using Aitex.Core.Util; using System; using System.Collections.Generic; using System.IO.Ports; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; using Aitex.Core.RT.DataCenter; using MECF.Framework.Common.Utilities; using MECF.Framework.Common.Layout; using MECF.Framework.Common.Device.ResistivityProbe; using Aitex.Common.Util; using Aitex.Core.RT.Log; using System.Threading; using MECF.Framework.Common.ToolLayout; using System.Security.Claims; using DocumentFormat.OpenXml.Spreadsheet; namespace MECF.Framework.Common.Device.TemperatureController { public class TemperatureConfigManager : Singleton { #region 常量 private string TEMPERATURE_DEVICELIST = "TemperatureDeviceList"; #endregion #region 内部变量 /// /// 模块设备字典 /// private Dictionary _temperatureDeviceDic = new Dictionary(); /// /// 模块串口设备字典 /// private Dictionary _temperatureSerialDevice = new Dictionary(); /// /// 地址模块字典(key-母级模块,value-temperature device模块名称 /// private Dictionary _temperatureDeviceAddressModuleDic = new Dictionary(); /// /// 模块变量变更字典 /// private Dictionary _moduleVariableActionDic = new Dictionary(); /// /// 变量数值字典(key-moduleName.Variable,value-数值) /// private Dictionary _nameVariableValueDic = new Dictionary(); /// /// TC是否在线字典 /// private Dictionary _temperaturePowerConnectDic = new Dictionary(); #endregion /// /// 初始化 /// public void Initialize() { string xmlPath = PathManager.GetCfgDir() + "Devices\\SMCCfg.xml"; TemperatureConfig cfg = CustomXmlSerializer.Deserialize(new FileInfo(xmlPath)); if (cfg != null) { foreach (TemperatureDeviceConfig config in cfg.TemperatureDeviceConfigs) { DATA.Subscribe($"{config.Name}.{TEMPERATURE_DEVICELIST}", () => config, SubscriptionAttribute.FLAG.IgnoreSaveDB); TemperatureSerialDevice temperatureSerialDevice = new TemperatureSerialDevice(config.Name, config.Port, config.BaudRate, (StopBits)config.StopBit, config.Data,SerialPortUtil.GetParity(config.Parity),true,1000); temperatureSerialDevice.Initialize(); temperatureSerialDevice.OnUpdateVariableValueChanged += TemperatureSerialDevice_OnUpdateVariableValueChanged; InitialtemperatureDevice(config, temperatureSerialDevice); } } } /// /// 变量发生变化 /// /// /// /// private void TemperatureSerialDevice_OnUpdateVariableValueChanged(string name,byte address, string variableName, object variableValue) { if ("Alarm".Equals(variableName) && variableValue!=null) { string[] strAry = variableValue.ToString().Split('-'); string binaryString = ""; foreach (string numStr in strAry) { int num = Convert.ToInt32(numStr, 16) - 0x30; string binary = Convert.ToString(num, 2).PadLeft(4, '0'); binaryString += binary; } variableValue = string.Join("-", binaryString.ToCharArray()); } string str = $"{name}_{address}"; if(_temperatureDeviceAddressModuleDic.ContainsKey(str)) { string moduleName = _temperatureDeviceAddressModuleDic[str]; if(_moduleVariableActionDic.ContainsKey($"{moduleName}.{variableName}")) { _nameVariableValueDic[$"{moduleName}.{variableName}"] = variableValue; _moduleVariableActionDic[$"{moduleName}.{variableName}"].Invoke(variableName, variableValue); } } } /// /// 初始化 /// /// private void InitialtemperatureDevice(TemperatureDeviceConfig config, TemperatureSerialDevice temperatureSerialDevice) { if (config.TemperatureDevices != null) { foreach (TemperatureDevice device in config.TemperatureDevices) { device.ReserviorName = ReservoirItemManager.Instance.GetReservoirByTC(device.Name); _temperatureSerialDevice[device.Name] = temperatureSerialDevice; _temperatureDeviceDic[device.Name] = device; _temperatureDeviceAddressModuleDic[$"{config.Name}_{device.Address}"] = device.Name; _temperaturePowerConnectDic[device.Name] = true; //默认TC设备power正常 } } } /// /// 更新TCpowerConnect字典 /// /// /// public void UpdataTCPowerConnectDic(string id,bool value) { _temperaturePowerConnectDic[id] = value; } /// /// 初始化设备 /// /// public void InitialDevice(string name) { if (_temperatureSerialDevice.ContainsKey(name)) { _temperatureSerialDevice[name].Start(); } } /// /// 查询连接状态 /// /// /// public bool GetDeviceConnect(string name) { if (_temperatureSerialDevice.ContainsKey(name)) { return _temperatureSerialDevice[name].Connected; } return false; } /// /// 查询电源连接状态 /// /// /// public bool GetDevicePowerConnect(string name) { if (_temperaturePowerConnectDic.ContainsKey(name)) { return _temperaturePowerConnectDic[name]; } return false; } /// /// 注册变量数值发生变化回调 /// /// /// /// public void SubscribeModuleVariable(string moduleName, string variable, MECF.Framework.Common.TwinCat.BeckhoffDelegate.OnUpdateModuleVariableValue onUpdateModuleVariableValue) { string name = $"{moduleName}.{variable}"; _moduleVariableActionDic[name] = onUpdateModuleVariableValue; if (_nameVariableValueDic.ContainsKey(name)) { _moduleVariableActionDic[name].Invoke(variable, _nameVariableValueDic[name]); } } /// /// 获取外部温度 /// /// /// /// public void ReadReserviorExtendSensorTemperature(string name, byte id) { if (_temperatureSerialDevice.ContainsKey(name)) { if (_temperatureSerialDevice[name].Connected) { _temperatureSerialDevice[name].ReadReserviorExtendSensorTemperature(id); } } } /// /// 获取内部温度 /// /// /// /// public void ReadHeatExchangerInternelSensorTemperature(string name, byte id) { if (_temperatureSerialDevice.ContainsKey(name)) { if (_temperatureSerialDevice[name].Connected) { _temperatureSerialDevice[name].ReadHeatExchangerInternelSensorTemperature(id); } } } /// /// 获取内Alarm /// /// /// /// public void ReadAlarmStatus(string name, byte id) { if (_temperatureSerialDevice.ContainsKey(name)) { if (_temperatureSerialDevice[name].Connected) { _temperatureSerialDevice[name].ReadAlarmStatus(id); } } } /// /// 设置目标温度 /// /// /// /// public void SetTargetTemperature(string name, byte id,double targetTemperature) { if (_temperatureSerialDevice.ContainsKey(name)) { if (_temperatureSerialDevice[name].Connected) { _temperatureSerialDevice[name].SetTargetTemperature(id,targetTemperature); } } } /// /// 读取目标温度 /// /// /// /// public void ReadTargetTemperature(string name, byte id) { if (_temperatureSerialDevice.ContainsKey(name)) { if (_temperatureSerialDevice[name].Connected) { _temperatureSerialDevice[name].ReadTargetTemperature(id); } } } /// /// Disable /// /// /// /// public bool DisableController(string name, byte id,int controlOperationModel) { if (_temperatureSerialDevice.ContainsKey(name)) { if (_temperatureSerialDevice[name].Connected) { _temperatureSerialDevice[name].SetControlOperationModel(id, controlOperationModel); //_temperatureSerialDevice[name].ReadControlOperationModel(id); return true; } else { LOG.WriteLog(eEvent.ERR_TEMPERATURE, name, $"{name} is not connected"); return false; } } else { return false; } } /// /// 启用Controller /// /// /// /// public bool EnableControl(string name, byte id,int controlOperationModel) { if (_temperatureSerialDevice.ContainsKey(name)) { if (_temperatureSerialDevice[name].Connected) { _temperatureSerialDevice[name].SetControlOperationModel(id, controlOperationModel); //_temperatureSerialDevice[name].ReadControlOperationModel(id); return true; } else { LOG.WriteLog(eEvent.ERR_TEMPERATURE, name, $"{name} is not connected"); return false; } } else { return false; } } /// /// 获取操作模式 /// /// /// /// public void ReadControlOperationModel(string name, byte id) { if (_temperatureSerialDevice.ContainsKey(name)) { if (_temperatureSerialDevice[name].Connected) { _temperatureSerialDevice[name].ReadControlOperationModel(id); } } } /// /// 获取Id /// /// /// public byte GetAddress(string name) { if (_temperatureDeviceDic.ContainsKey(name)) { if (byte.TryParse(_temperatureDeviceDic[name].Address, out var address)) { return address; } } return 0; } } }