using Aitex.Core.RT.SCCore;
using MECF.Framework.Common.Communications;
using MECF.Framework.Common.Equipment;
using System;
using System.Collections.Generic;
using System.Data;
using System.IO.Ports;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Venus_RT.Devices.SMIF
{
///
/// Fortrend PLUS 500
/// Loader/Unloader
/// 执行标准 E84
///
public class FortrendPLUS500
{
private readonly Dictionary SFPair = new Dictionary()
{
//s1
{ FunctionType.Abort,StreamType.SMIFState},
{ FunctionType.Online,StreamType.SMIFState},
{ FunctionType.OnlineData,StreamType.SMIFState},
{ FunctionType.Map,StreamType.SMIFState},
{ FunctionType.MapData,StreamType.SMIFState},
{ FunctionType.Status,StreamType.SMIFState},
{ FunctionType.StatusData,StreamType.SMIFState},
//s2
{ FunctionType.SetReport,StreamType.SMIFControl},
{ FunctionType.SetReportACK,StreamType.SMIFControl},
{ FunctionType.ResetORInit,StreamType.SMIFControl},
{ FunctionType.ResetORInitACK,StreamType.SMIFControl},
{ FunctionType.RemoteCommand,StreamType.SMIFControl},
{ FunctionType.RemoteCommandData,StreamType.SMIFControl},
{ FunctionType.CheckProto,StreamType.SMIFControl},
{ FunctionType.CheckProtoData,StreamType.SMIFControl},
//s3
{ FunctionType.AccessMode,StreamType.LP},
{ FunctionType.AccessModeACK,StreamType.LP},
//s4
{FunctionType.ReadTag,StreamType.TAG},
{FunctionType.ReadTagData,StreamType.TAG},
{FunctionType.WriteTag,StreamType.TAG},
{FunctionType.WriteTagData,StreamType.TAG},
//s5
{FunctionType.AlarmData,StreamType.ALARM },
{FunctionType.AlarmACK,StreamType.ALARM },
{FunctionType.SetAlarm,StreamType.ALARM },
{FunctionType.SetAlarmACK,StreamType.ALARM },
//s6
{FunctionType.DataSend,StreamType.DVDATA},
{FunctionType.DataSendACK,StreamType.DVDATA},
//s9
{FunctionType.UnrecognizedDeviceID,StreamType.COMMANDERROR},
{FunctionType.UnrecognizedStream,StreamType.COMMANDERROR},
{FunctionType.UnrecognizedFunction,StreamType.COMMANDERROR},
{FunctionType.IllegalData,StreamType.COMMANDERROR},
};
public enum FunctionType
{
Abort = 0,
Online = 1,
OnlineData = 2,
Map = 3,
MapData = 4,
Status = 5,
StatusData = 6,
SetReport = 15,
SetReportACK = 16,
ResetORInit = 19,
ResetORInitACK = 20,
RemoteCommand = 21,
RemoteCommandData = 22,
CheckProto = 25,
CheckProtoData = 26,
AccessMode = 27,
AccessModeACK = 27,
ReadTag = 101,
ReadTagData = 102,
WriteTag = 103,
WriteTagData = 104,
AlarmData = 1,
AlarmACK = 2,
SetAlarm = 3,
SetAlarmACK = 4,
DataSend = 3,
DataSendACK = 4,
UnrecognizedDeviceID = 1,
UnrecognizedStream = 3,
UnrecognizedFunction = 5,
IllegalData = 7,
}
public enum StreamType
{
SMIFState = 1,
SMIFControl = 2,
LP = 3,
TAG = 4,
ALARM = 5,
DVDATA = 6,
COMMANDERROR = 9,
RFIDCOMMAND= 18,
SMARTTAG8400COMMAND = 100,
}
private AsyncSerialPort _serialport;
private string _portname;
//connect status
public bool IsConnected;
//online status
public bool IsOnline;
//Load
public bool IsLoaded;
//Lock
public bool IsLocked;
//Error
public bool IsError;
///
/// 构造函数
///
/// 从属的设备 如VCE1 LP1
public FortrendPLUS500(ModuleName DEVICEBelong)
{
_portname = SC.GetStringValue($"{DEVICEBelong}.SMIF.PortNumber");
_serialport = new AsyncSerialPort(_portname, 9600, 8,Parity.None,StopBits.One);
_serialport.Open();
_serialport.OnDataChanged += OnSMIFDataChanged;
}
//检查传入SxFy是否定义在字典中
private bool CheckStreamFunctionPair(string sfstring)
{
string[] sfcodes = sfstring.Split('S','F');
if (sfcodes.Length == 2
&& Enum.TryParse(Convert.ToInt32(sfcodes[0]).ToString(), out StreamType snum)
&& Enum.IsDefined(typeof(StreamType),snum)
&& Enum.TryParse(Convert.ToInt32(sfcodes[1]).ToString(), out FunctionType fnum)
&& Enum.IsDefined(typeof(FunctionType), fnum)
&& SFPair.TryGetValue(fnum,out StreamType _snum)
&& _snum == snum)
{
return true;
}
return false;
}
private void OnSMIFDataChanged(string oneLineMessage)
{
}
public void Load()
{
}
public void Unload()
{
}
public void Lock()
{
}
public void Unlock()
{
}
public void ReadMap()
{
}
///
/// 中断SMIF正在执行的操作
///
public void Abort()
{
}
}
}