123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358 |
- 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<TemperatureConfigManager>
- {
- #region 常量
- private string TEMPERATURE_DEVICELIST = "TemperatureDeviceList";
- #endregion
- #region 内部变量
- /// <summary>
- /// 模块设备字典
- /// </summary>
- private Dictionary<string, TemperatureDevice> _temperatureDeviceDic = new Dictionary<string, TemperatureDevice>();
- /// <summary>
- /// 模块串口设备字典
- /// </summary>
- private Dictionary<string, TemperatureSerialDevice> _temperatureSerialDevice = new Dictionary<string, TemperatureSerialDevice>();
- /// <summary>
- /// 地址模块字典(key-母级模块,value-temperature device模块名称
- /// </summary>
- private Dictionary<string, string> _temperatureDeviceAddressModuleDic = new Dictionary<string, string>();
- /// <summary>
- /// 模块变量变更字典
- /// </summary>
- private Dictionary<string, TwinCat.BeckhoffDelegate.OnUpdateModuleVariableValue> _moduleVariableActionDic = new Dictionary<string, MECF.Framework.Common.TwinCat.BeckhoffDelegate.OnUpdateModuleVariableValue>();
- /// <summary>
- /// 变量数值字典(key-moduleName.Variable,value-数值)
- /// </summary>
- private Dictionary<string, object> _nameVariableValueDic = new Dictionary<string, object>();
- /// <summary>
- /// TC是否在线字典
- /// </summary>
- private Dictionary<string, bool> _temperaturePowerConnectDic = new Dictionary<string, bool>();
- #endregion
- /// <summary>
- /// 初始化
- /// </summary>
- public void Initialize()
- {
- string xmlPath = PathManager.GetCfgDir() + "Devices\\SMCCfg.xml";
- TemperatureConfig cfg = CustomXmlSerializer.Deserialize<TemperatureConfig>(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);
- }
- }
- }
- /// <summary>
- /// 变量发生变化
- /// </summary>
- /// <param name="address"></param>
- /// <param name="variableName"></param>
- /// <param name="variableValue"></param>
- 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);
- }
- }
- }
-
- /// <summary>
- /// 初始化
- /// </summary>
- /// <param name="config"></param>
- 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正常
- }
- }
- }
- /// <summary>
- /// 更新TCpowerConnect字典
- /// </summary>
- /// <param name="id"></param>
- /// <param name="value"></param>
- public void UpdataTCPowerConnectDic(string id,bool value)
- {
- _temperaturePowerConnectDic[id] = value;
- }
- /// <summary>
- /// 初始化设备
- /// </summary>
- /// <param name="name"></param>
- public void InitialDevice(string name)
- {
- if (_temperatureSerialDevice.ContainsKey(name))
- {
- _temperatureSerialDevice[name].Start();
- }
- }
- /// <summary>
- /// 查询连接状态
- /// </summary>
- /// <param name="name"></param>
- /// <returns></returns>
- public bool GetDeviceConnect(string name)
- {
- if (_temperatureSerialDevice.ContainsKey(name))
- {
- return _temperatureSerialDevice[name].Connected;
- }
- return false;
- }
- /// <summary>
- /// 查询电源连接状态
- /// </summary>
- /// <param name="name"></param>
- /// <returns></returns>
- public bool GetDevicePowerConnect(string name)
- {
- if (_temperaturePowerConnectDic.ContainsKey(name))
- {
- return _temperaturePowerConnectDic[name];
- }
- return false;
- }
- /// <summary>
- /// 注册变量数值发生变化回调
- /// </summary>
- /// <param name="moduleName"></param>
- /// <param name="variable"></param>
- /// <param name="onUpdateModuleVariableValue"></param>
- 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]);
- }
- }
- /// <summary>
- /// 获取外部温度
- /// </summary>
- /// <param name="name"></param>
- /// <param name="id"></param>
- /// <param name="linMotOperation"></param>
- public void ReadReserviorExtendSensorTemperature(string name, byte id)
- {
- if (_temperatureSerialDevice.ContainsKey(name))
- {
- if (_temperatureSerialDevice[name].Connected)
- {
- _temperatureSerialDevice[name].ReadReserviorExtendSensorTemperature(id);
- }
- }
- }
- /// <summary>
- /// 获取内部温度
- /// </summary>
- /// <param name="name"></param>
- /// <param name="id"></param>
- /// <param name="linMotOperation"></param>
- public void ReadHeatExchangerInternelSensorTemperature(string name, byte id)
- {
- if (_temperatureSerialDevice.ContainsKey(name))
- {
- if (_temperatureSerialDevice[name].Connected)
- {
- _temperatureSerialDevice[name].ReadHeatExchangerInternelSensorTemperature(id);
- }
- }
- }
- /// <summary>
- /// 获取内Alarm
- /// </summary>
- /// <param name="name"></param>
- /// <param name="id"></param>
- /// <param name="linMotOperation"></param>
- public void ReadAlarmStatus(string name, byte id)
- {
- if (_temperatureSerialDevice.ContainsKey(name))
- {
- if (_temperatureSerialDevice[name].Connected)
- {
- _temperatureSerialDevice[name].ReadAlarmStatus(id);
- }
- }
- }
- /// <summary>
- /// 设置目标温度
- /// </summary>
- /// <param name="name"></param>
- /// <param name="id"></param>
- /// <param name="targetTemperature"></param>
- public void SetTargetTemperature(string name, byte id,double targetTemperature)
- {
- if (_temperatureSerialDevice.ContainsKey(name))
- {
- if (_temperatureSerialDevice[name].Connected)
- {
- _temperatureSerialDevice[name].SetTargetTemperature(id,targetTemperature);
- }
- }
- }
- /// <summary>
- /// 读取目标温度
- /// </summary>
- /// <param name="name"></param>
- /// <param name="id"></param>
- /// <param name="targetTemperature"></param>
- public void ReadTargetTemperature(string name, byte id)
- {
- if (_temperatureSerialDevice.ContainsKey(name))
- {
- if (_temperatureSerialDevice[name].Connected)
- {
- _temperatureSerialDevice[name].ReadTargetTemperature(id);
- }
- }
- }
- /// <summary>
- /// Disable
- /// </summary>
- /// <param name="name"></param>
- /// <param name="id"></param>
- /// <returns></returns>
- 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;
- }
- }
- /// <summary>
- /// 启用Controller
- /// </summary>
- /// <param name="name"></param>
- /// <param name="id"></param>
- /// <returns></returns>
- 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;
- }
- }
- /// <summary>
- /// 获取操作模式
- /// </summary>
- /// <param name="name"></param>
- /// <param name="id"></param>
- /// <param name="linMotOperation"></param>
- public void ReadControlOperationModel(string name, byte id)
- {
- if (_temperatureSerialDevice.ContainsKey(name))
- {
- if (_temperatureSerialDevice[name].Connected)
- {
- _temperatureSerialDevice[name].ReadControlOperationModel(id);
- }
- }
- }
- /// <summary>
- /// 获取Id
- /// </summary>
- /// <param name="name"></param>
- /// <returns></returns>
- public byte GetAddress(string name)
- {
- if (_temperatureDeviceDic.ContainsKey(name))
- {
- if (byte.TryParse(_temperatureDeviceDic[name].Address, out var address))
- {
- return address;
- }
- }
- return 0;
- }
- }
- }
|