Sic.Framework/MECF.Framework.RT.Equipment.../HardwareUnits/RFMatchs/AE/AeRfMatchHandler.cs

385 lines
15 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using Aitex.Core.Common.DeviceData;
using MECF.Framework.Common.Communications;
namespace MECF.Framework.RT.EquipmentLibrary.HardwareUnits.RFMatchs.AE
{
public abstract class AeRfMatchHandler : HandlerBase
{
public AeRfMatch Device { get; }
private byte _address;
private byte _command;
protected AeRfMatchHandler(AeRfMatch device, byte address, byte command, byte[] data)
: base(BuildMessage(address, command, data))
{
Device = device;
_address = address;
_command = command;
}
private static byte[] BuildMessage(byte address, byte command, byte[] data)
{
List<byte> buffer = new List<byte>();
buffer.Add((byte)((address << 3) + (data == null ? 0 : data.Length)));
buffer.Add(command);
if (data != null && data.Length > 0)
{
buffer.AddRange(data);
}
buffer.Add(CalcSum(buffer, buffer.Count));
return buffer.ToArray();
}
//host->unit, unit->host(ack), unit->host(csr), host->unit(ack)
public override bool HandleMessage(MessageBase msg, out bool transactionComplete)
{
AeRfMatchMessage response = msg as AeRfMatchMessage;
ResponseMessage = msg;
if (response.IsAck)
{
SetState(EnumHandlerState.Acked);
}
if (response.Address != _address || response.CommandNumber != _command)
{
transactionComplete = false;
return false;
}
if (response.IsResponse)
{
if (response.DataLength >= 1)
{
ParseData(response);
}
SendAck();
SetState(EnumHandlerState.Completed);
transactionComplete = true;
return true;
}
transactionComplete = false;
return false;
}
protected virtual void ParseData(AeRfMatchMessage msg)
{
if (msg.Data[0] != 0)
{
var reason = TranslateCsrCode(msg.Data[0]);
Device.NoteError(reason);
}
}
public void SendAck()
{
Device.Connection.SendMessage(new byte[] { 0x06 });
}
private static byte CalcSum(List<byte> data, int length)
{
byte ret = 0x00;
for (var i = 0; i < length; i++)
{
ret ^= data[i];
}
return ret;
}
protected string TranslateCsrCode(int csrCode)
{
string ret = csrCode.ToString();
switch (csrCode)
{
case 0:
ret = null;//"Command accepted";
break;
case 1:
ret = "Control Code Is Incorrect";
break;
case 2:
ret = "Output Is On(Change Not Allowed)";
break;
case 4:
ret = "Data Is Out Of Range";
break;
case 7:
ret = "Active Fault(s) Exist";
break;
case 9:
ret = "Data Byte Count Is Incorrect";
break;
case 19:
ret = "Recipe Is Active(Change Not Allowed)";
break;
case 50:
ret = "The Frequency Is Out Of Range";
break;
case 51:
ret = "The Duty Cycle Is Out Of Range";
break;
case 53:
ret = "The Device Controlled By The Command Is Not Detected";
break;
case 99:
ret = "Command Not Accepted(There Is No Such Command)";
break;
default:
break;
}
return ret;
}
}
//91 set active preset number
public class AeRfMatchSetActivePresetHandler : AeRfMatchHandler
{
public AeRfMatchSetActivePresetHandler(AeRfMatch device, byte address, byte network, int number)
: base(device, address, 91, BuildData(network, number))
{
Name = "set active preset number";
}
private static byte[] BuildData(byte network, int number)
{
return new byte[] { network, 0, (byte)number, 0 };
}
}
//92 set preset
public class AeRfMatchSetPresetHandler : AeRfMatchHandler
{
public AeRfMatchSetPresetHandler(AeRfMatch device, byte address, byte network, Presets data)
: base(device, address, 92, BuildData(network, data))
{
Name = "set active preset number";
}
private static byte[] BuildData(byte network, Presets data)
{
List<byte> lstData = new List<byte>();
lstData.AddRange(new byte[]{ network, 0, data.PreNo, data.TraSum });
int tempdata = (int)(data.LoadData * 100);
lstData.Add((byte)tempdata);
lstData.Add((byte)(tempdata >> 8));
tempdata = (int)(data.TuneData * 100);
lstData.Add((byte)tempdata);
lstData.Add((byte)(tempdata >> 8));
for (int i = 0; i < data.TraSum; i++)
{
tempdata = (int)(data.TraData[i, 0] * 100);
lstData.Add((byte)tempdata);
lstData.Add((byte)(tempdata >> 8));
tempdata = (int)(data.TraData[i, 1] * 100);
lstData.Add((byte)tempdata);
lstData.Add((byte)(tempdata >> 8));
}
return lstData.ToArray();
}
}
//93 control mode
public class AeRfMatchSetControlModeHandler : AeRfMatchHandler
{
public AeRfMatchSetControlModeHandler(AeRfMatch device, byte address, byte network, EnumRfMatchTuneMode mode)
: base(device, address, 93, BuildData(network, mode))
{
Name = "Set control mode";
}
private static byte[] BuildData(byte network, EnumRfMatchTuneMode mode)
{
byte setpoint = 0;
switch (mode)
{
case EnumRfMatchTuneMode.Auto:
setpoint = 1;
break;
case EnumRfMatchTuneMode.Manual:
setpoint = 2;
break;
}
return new byte[]{network, 0, setpoint, 0};
}
}
//94 enable presets
public class AeRfMatchEnablePresetHandler : AeRfMatchHandler
{
public AeRfMatchEnablePresetHandler(AeRfMatch device, byte address, byte network, bool enable)
: base(device, address, 94, BuildData(network, enable))
{
Name = "enable preset";
}
private static byte[] BuildData(byte network, bool enable)
{
return new byte[] { network, 0, enable?(byte)0x1: (byte)0x0, 0 };
}
}
//98 enable motor move
public class AeRfMatchEnableCapMoveHandler : AeRfMatchHandler
{
public AeRfMatchEnableCapMoveHandler(AeRfMatch device, byte address, byte network, bool enable)
: base(device, address, 98, BuildData(network, enable))
{
Name = "enable motor move";
}
private static byte[] BuildData(byte network, bool enable)
{
return new byte[] { network, 0, enable ? (byte)0x1 : (byte)0x0, 0 };
}
}
//112 set load position
public class AeRfMatchSetLoadPositionHandler : AeRfMatchHandler
{
public AeRfMatchSetLoadPositionHandler(AeRfMatch device, byte address, byte network, float position)
: base(device, address, 112, BuildData(network, position))
{
Name = "set load position";
}
private static byte[] BuildData(byte network, float position)
{
int iposi = (int)(position * 100);
return new byte[] { network, 0, (byte)iposi, (byte)(iposi >> 8) };
}
}
//122 set tune position
public class AeRfMatchSetTunePositionHandler : AeRfMatchHandler
{
public AeRfMatchSetTunePositionHandler(AeRfMatch device, byte address, byte network, float position)
: base(device, address, 122, BuildData(network, position))
{
Name = "set tune position";
}
private static byte[] BuildData(byte network, float position)
{
int iposi = (int)(position * 100);
return new byte[] { network, 0, (byte)iposi, (byte)(iposi >> 8) };
}
}
//161 query preset no
public class AeRfMatchQueryPresetNumberHandler : AeRfMatchHandler
{
public AeRfMatchQueryPresetNumberHandler(AeRfMatch device, byte address)
: base(device, address, 161, null)
{
Name = "query preset mode";
}
protected override void ParseData(AeRfMatchMessage response)
{
if (response.DataLength != 4)
{
Device.NoteError($"{Name}, return data length {response.DataLength}");
}
else
{
Device.NotePresetNumber(response.Data[2] + (response.Data[3] << 8));
}
}
}
//219 query status
public class AeRfMatchQueryStatusHandler : AeRfMatchHandler
{
private AEStatusData _statusData;
public AeRfMatchQueryStatusHandler(AeRfMatch device, byte address)
: base(device, address, 219, null)
{
Name = "query status";
}
protected override void ParseData(AeRfMatchMessage response)
{
if (response.DataLength != 88)
{
Device.NoteError($"{Name}, return data length {response.DataLength}");
}
else
{
var retData = response.Data;
_statusData = new AEStatusData();
_statusData.LoadPosi1 = (retData[4] + (retData[5] << 8)) / 100f;
_statusData.TunePosi1 = (retData[6] + (retData[7] << 8)) / 100f;
_statusData.LoadPosi2 = (retData[12] + (retData[13] << 8)) / 100f;
_statusData.TunePosi2 = (retData[14] + (retData[15] << 8)) / 100f;
_statusData.BiasPeak = (retData[20] + (retData[21] << 8)) / 100f;
_statusData.DCBias = (retData[22] + (retData[23] << 8)) / 100f;
_statusData.ZScanII.R1 = BitConverter.ToSingle(retData.ToArray(), 40);
_statusData.ZScanII.X1 = BitConverter.ToSingle(retData.ToArray(), 44);
_statusData.ZScanII.Voltage1 = BitConverter.ToSingle(retData.ToArray(), 48) * 1.41421f;
_statusData.ZScanII.Current1 = BitConverter.ToSingle(retData.ToArray(), 52);
_statusData.ZScanII.Phase1 = BitConverter.ToSingle(retData.ToArray(), 56);
_statusData.ZScanII.Power1 = BitConverter.ToSingle(retData.ToArray(), 60);
_statusData.ZScanII.R2 = BitConverter.ToSingle(retData.ToArray(), 64);
_statusData.ZScanII.X2 = BitConverter.ToSingle(retData.ToArray(), 68);
_statusData.ZScanII.Voltage2 = BitConverter.ToSingle(retData.ToArray(), 72);
_statusData.ZScanII.Current2 = BitConverter.ToSingle(retData.ToArray(), 76);
_statusData.ZScanII.Phase2 = BitConverter.ToSingle(retData.ToArray(), 80);
_statusData.ZScanII.Power2 = BitConverter.ToSingle(retData.ToArray(), 84);
AnalysisAEMatchStatus(retData);
Device.NoteStatus(_statusData);
}
}
private void AnalysisAEMatchStatus(byte[] sts)
{
_statusData.Status2.Net1OutPutOn = ((sts[0] >> 0) & 0x01) == 0x01 ? true : false;
_statusData.Status2.Net1OutPutTuned = ((sts[0] >> 1) & 0x01) == 0x01 ? true : false;
_statusData.Status2.Net2OutPutOn = ((sts[0] >> 2) & 0x01) == 0x01 ? true : false;
_statusData.Status2.Net2OutPutTuned = ((sts[0] >> 3) & 0x01) == 0x01 ? true : false;
//RecvData.Status2.Net2OutPutOn = ((sts[0] >> 4) & 0x01) == 0x01 ? true : false;
//RecvData.Status2.Net2OutPutTuned = ((sts[0] >> 5) & 0x01) == 0x01 ? true : false;
_statusData.Status2.Net1PresetsActive = ((sts[0] >> 6) & 0x01) == 0x01 ? true : false;
_statusData.Status2.Net1ExtPresetsSelected = ((sts[0] >> 7) & 0x01) == 0x01 ? true : false;
_statusData.Status2.Low24VDetected = ((sts[1] >> 0) & 0x01) == 0x01 ? true : false;
_statusData.Status2.OverTempDetected = ((sts[1] >> 1) & 0x01) == 0x01 ? true : false;
_statusData.Status2.InterlockOpen = ((sts[1] >> 2) & 0x01) == 0x01 ? true : false;
_statusData.Status2.FanFault = ((sts[1] >> 3) & 0x01) == 0x01 ? true : false;
_statusData.Status2.Net1AutoMode = ((sts[1] >> 4) & 0x01) == 0x01 ? true : false;
_statusData.Status2.Net1HostCtrlMode = ((sts[1] >> 5) & 0x01) == 0x01 ? true : false;
_statusData.Status2.Net2AutoMode = ((sts[1] >> 6) & 0x01) == 0x01 ? true : false;
_statusData.Status2.Net2HostCtrlMode = ((sts[1] >> 7) & 0x01) == 0x01 ? true : false;
_statusData.Status2.AuxCapOutputTuned = ((sts[2] >> 0) & 0x01) == 0x01 ? true : false;
_statusData.Status2.AuxCapAutoModed = ((sts[2] >> 1) & 0x01) == 0x01 ? true : false;
_statusData.Status2.AuxCapPresetsActive = ((sts[2] >> 2) & 0x01) == 0x01 ? true : false;
//RecvData.Status2.FanFault = ((sts[1] >> 3) & 0x01) == 0x01 ? true : false;
//RecvData.Status2.Net1AutoMode = ((sts[1] >> 4) & 0x01) == 0x01 ? true : false;
_statusData.Status2.Net1UserCtrlMode = ((sts[2] >> 5) & 0x01) == 0x01 ? true : false;
_statusData.Status2.Net2UserCtrlMode = ((sts[2] >> 6) & 0x01) == 0x01 ? true : false;
//RecvData.Status2.Net2HostCtrlMode = ((sts[2] >> 7) & 0x01) == 0x01 ? true : false;
_statusData.Status2.Faults = ((sts[3] >> 0) & 0x01) == 0x01 ? true : false;
_statusData.Status2.Warning = ((sts[3] >> 1) & 0x01) == 0x01 ? true : false;
_statusData.Status2.InitMotorFailed = ((sts[3] >> 2) & 0x01) == 0x01 ? true : false;
_statusData.Status2.Net2PresetsActive = ((sts[3] >> 3) & 0x01) == 0x01 ? true : false;
_statusData.Status2.Net2ExtPresetsSelected = ((sts[3] >> 4) & 0x01) == 0x01 ? true : false;
_statusData.Status2.VoltageOverLimitFault = ((sts[3] >> 5) & 0x01) == 0x01 ? true : false;
//RecvData.Status2.Net2AutoMode = ((sts[3] >> 6) & 0x01) == 0x01 ? true : false;
//RecvData.Status2.Net2HostCtrlMode = ((sts[3] >> 7) & 0x01) == 0x01 ? true : false;
}
}
}