using Aitex.Core.RT.DataCenter;
using CyberX8_Core;
using MECF.Framework.Common.CommonData;
using MECF.Framework.Common.CommonData.PowerSupplier;
using MECF.Framework.Common.Net;
using MECF.Framework.Common.Utilities;
using MECF.Framework.Simulator.Core.Driver;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Cryptography.X509Certificates;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Timers;
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;
///
/// 电源状态(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 System.Timers.Timer _timer;
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;
}
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);
_powerSupplierDic[1].Current = (int)(_powerSupplierDatas[_currentStep].Current*10);
}
}
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 == 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)
{
_powerSupplierDic[channel].Current = _powerSupplierDic[channel].CurrentSetting * 10;
}
}
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
}
}