using Aitex.Common.Util; using Aitex.Core.RT.ConfigCenter; using Aitex.Core.RT.DataCenter; using Aitex.Core.RT.Log; using Aitex.Core.Util; using CyberX8_Core; using MECF.Framework.Common.CommonData; using MECF.Framework.Common.CommonData.PowerSupplier; using MECF.Framework.Common.Device.PowerSupplier; using MECF.Framework.Common.Device.Wago; using MECF.Framework.Common.Net; using MECF.Framework.Common.Utilities; using MECF.Framework.Simulator.Core.Driver; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Reflection; using System.Security.Cryptography.X509Certificates; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Timers; using System.Xml.Linq; namespace CyberX8_Simulator.Devices { public class PowerSupplierSocketSimulator : SocketDeviceSimulator { private const short POWER_CONTROL_ADDRESS = 0x0113; private const short STEP_PERIOD_ADDRESS = 0x1400; private const short STEP_PERIOD_START_ADDRESS = 0x1640; private const short GOLD_CURRENT_SETTING_ADDRESS = 0x6102; private const short GOLD_STEP_PERIOD_ADDRESS = 0x77D0; private const short GOLD_STEP_PERIOD_START_ADDRESS = 0x7C50; /// /// 电源状态(00-cv输出,01-cc输出) /// private const short POWER_STATUS_ADDRESS = 0x0200; Dictionary _powerSupplierDic = new Dictionary(); private IByteTransform byteTransform = new BigEndianByteTransformBase(); private List _powerSupplierDatas = new List(); private byte _startStep = 1; private byte _endStep = 255; private byte _cycle = 1; private byte _currentStep = 0; private int _currentLength = 0; private DateTime _currentTime = DateTime.Now; private bool _isGoldPower = false; private int _currentSetScale; private System.Timers.Timer _timer; /// /// 记录每次设置的电流值 /// private byte[] _powerSupplierSetPoint = new byte[4]; public PowerSupplierSocketSimulator(int port):base(port) { PowerSupplierData powerSupplierData1 = new PowerSupplierData(); powerSupplierData1.Current = 0; powerSupplierData1.Voltage = 56000; _powerSupplierDic[1] = powerSupplierData1; PowerSupplierData powerSupplierData2 = new PowerSupplierData(); powerSupplierData2.Current = 0; powerSupplierData2.Voltage = 2000; _powerSupplierDic[2] = powerSupplierData2; PowerSupplierData powerSupplierData3 = new PowerSupplierData(); powerSupplierData3.Current = 0; powerSupplierData3.Voltage = 3000; _powerSupplierDic[3] = powerSupplierData3; PowerSupplierData powerSupplierData4 = new PowerSupplierData(); powerSupplierData4.Current = 0; powerSupplierData4.Voltage = 4000; _powerSupplierDic[4] = powerSupplierData4; _timer = new System.Timers.Timer(); _timer.Interval = 1000; _timer.Elapsed += Timer_Elapsed; InitializeParamater(port); } private void InitializeParamater(int port) { try { string oldXmlPath = PathManager.GetCfgDir(); string newXmlPath = oldXmlPath.Replace("CyberX8_Simulator", "CyberX8_RT") + "Devices\\PowerSupplierCfg-Simulator.xml"; PowerSupplierDeviceConfigCfg cfg = CustomXmlSerializer.Deserialize(new FileInfo(newXmlPath)); if (cfg != null) { foreach (PowerSupplierDeviceConfig config in cfg.PowerSupplierDeviceConfigs) { if(config.Port != port) { continue; } else { foreach (PowerSupplierDevice device in config.Devices) { if (device != null) { if (config.Type == 1 && device.UnitSetScale > device.UnitScale) //金槽电源 { _currentSetScale = device.UnitSetScale / device.UnitScale; } else { _currentSetScale = device.UnitScale / device.UnitSetScale; } } break; } break; } } } } catch { LOG.WriteLog(eEvent.ERR_POWERSUPPLIER, "PowerSupplier", "Load power supplier xml failed"); } } private void Timer_Elapsed(object sender, ElapsedEventArgs e) { if(_currentStep>=_cycle*_endStep) { _timer.Stop(); } if(DateTime.Now.Subtract(_currentTime).TotalSeconds>=_currentLength) { _currentStep++; if (_currentStep >= _cycle * _endStep) { _powerSupplierDic[1].Current = 0; _timer.Stop(); return; } _currentTime = DateTime.Now; _currentLength = (int)(_powerSupplierDatas[_currentStep].Hour * 3600 + _powerSupplierDatas[_currentStep].Minute * 60 + _powerSupplierDatas[_currentStep].Second); if (_isGoldPower) { _powerSupplierDic[1].Current = (int)(_powerSupplierDatas[_currentStep].Current); } else { _powerSupplierDic[1].Current = (int)(_powerSupplierDatas[_currentStep].Current * _currentSetScale); } } } protected override void ProcessUnsplitMessage(byte[] data) { short flag = byteTransform.TransInt16(data, 0); byte channel = data[6]; byte command = data[7]; if(!_powerSupplierDic.ContainsKey(channel)) { OnWriteMessage(CreateError(flag,channel, command, 0x02)); return; } if (command == 0x03)//读取 { short startAddress = byteTransform.TransInt16(data, 8); short registerCount = byteTransform.TransInt16(data, 10); if (startAddress == 0x201) { byte[] bytes = new byte[2*registerCount]; Array.Copy(byteTransform.GetBytes(_powerSupplierDic[channel].Voltage), 0, bytes, 0, 4); Array.Copy(byteTransform.GetBytes(_powerSupplierDic[channel].Current), 0, bytes, 4, 4); OnWriteMessage(CreateReadResponse(flag, channel, command, registerCount, bytes)); return; } else if (startAddress == 0x0110) { byte[] bytes = new byte[2]; bytes[0] = 0; bytes[1] = _powerSupplierDic[channel].Enabled?(byte)1:(byte)0; OnWriteMessage(CreateReadResponse(flag, channel, command, registerCount, bytes)); return; } else if (startAddress == POWER_STATUS_ADDRESS) { byte[] bytes = new byte[2]; bytes[0] = 0; bytes[1] = (byte)_powerSupplierDic[channel].PowerStatus; OnWriteMessage(CreateReadResponse(flag, channel, command, registerCount, bytes)); return; } else if (startAddress == 0x0101) { byte[] bytes = new byte[2]; Array.Copy(byteTransform.GetBytes(_powerSupplierDic[channel].CurrentSetting), 0, bytes, 0, bytes.Length); OnWriteMessage(CreateReadResponse(flag, channel, command, registerCount, bytes)); return; } else if(startAddress == GOLD_CURRENT_SETTING_ADDRESS) { _isGoldPower = true; OnWriteMessage(CreateReadResponse(flag, channel, command, registerCount, _powerSupplierSetPoint)); return; } else if (startAddress == 0X80) { byte[] bytes = new byte[2]; bytes[0] = 0; bytes[1] = _powerSupplierDic[channel].OutputSwitchControl; OnWriteMessage(CreateReadResponse(flag, channel, command, registerCount, bytes)); return; } else if (startAddress == 0x0111) { byte[] bytes = new byte[2]; bytes[0] = 0; bytes[1] = (byte)_powerSupplierDic[channel].RunModel; OnWriteMessage(CreateReadResponse(flag, channel, command, registerCount, bytes)); return; } else if (startAddress == POWER_CONTROL_ADDRESS) { byte[] bytes = new byte[2]; bytes[0] = 0; bytes[1] = (byte)_powerSupplierDic[channel].PowerControl; OnWriteMessage(CreateReadResponse(flag, channel, command, registerCount, bytes)); return; } else { OnWriteMessage(CreateError(flag, channel, command, 03)); } } else if (command == 0x06)//设置 { short startAddress = byteTransform.TransInt16(data, 8); short value = byteTransform.TransInt16(data, 10); if(startAddress==0x0110) { UpdateChannelEnable(flag, channel, command, startAddress, data[11]); if (_powerSupplierDic[channel].Enabled) { if (_powerSupplierDic[channel].RunModel == 1) { if (_isGoldPower) { int count = byteTransform.TransInt32(_powerSupplierSetPoint, 0); _powerSupplierDic[channel].Current = count / _currentSetScale; } else { _powerSupplierDic[channel].Current = _powerSupplierDic[channel].CurrentSetting * _currentSetScale; } } } else { _powerSupplierDic[channel].Current = 0; } } else if (startAddress == 0x0101) { UpdateChannelCurrent(flag,channel, command, startAddress, value); } else if (startAddress == POWER_CONTROL_ADDRESS) { UpdateChannelPowerControl(flag, channel, command, startAddress, data[11]); } else if(startAddress== 0x0111) { UpdateChannelRunModel(flag, channel, command, startAddress, data[11]); } else { byte[] errorByt = CreateError(flag, channel, command, 03); OnWriteMessage(errorByt); return; } } else if(command==0x10) //写多个寄存器 { short startAddress = byteTransform.TransInt16(data, 8); short length = byteTransform.TransInt16(data, 10); if (startAddress == STEP_PERIOD_ADDRESS) { _powerSupplierDatas.Clear(); int listCount = length / 6; for(int i=0;i /// 可用性 /// private bool _enabled; public short VoltageSetting { get { return _voltageSetting; } set { _voltageSetting = value; } } public short CurrentSetting { get { return _currentSetting; } set { _currentSetting = value; } } public byte OutputSwitchControl { get { return _outputSwitchControl; } set { _outputSwitchControl = value; } } public int Voltage { get { return _voltage; } set { _voltage = value; } } public int Current { get { return _current; } set { _current = value; } } public short PowerStatus { get { return _powerStatus; } set { _powerStatus = value; } } public short PowerControl { get { return _powerControl; } set { _powerControl = value; } } public short RunModel { get { return _runModel; } set { _runModel = value; } } public bool Enabled { get { return _enabled; } set { _enabled = value; } } } public class PowerSupplierStepPeriodData { #region 内部变量 private double _voltage; private double _current; private ushort _hour; private ushort _minute; private ushort _second; private ushort _microsecond; #endregion #region 属性 public double Voltage { get { return _voltage; } set { _voltage = value; } } public double Current { get { return _current; } set { _current = value; } } public ushort Hour { get { return _hour; } set { _hour = value; } } public ushort Minute { get { return _minute; } set { _minute = value; } } public ushort Second { get { return _second; } set { _second = value; } } public ushort Microsecond { get { return _microsecond; } set { _microsecond = value; } } #endregion } }