dc/Common/SECSContext.cs
13118993771@163.com eb23e102b4 大更新
2022-12-16 13:01:24 +08:00

239 lignes
8.0 KiB
C#

// ********************************************************************************
// 文件名字: SECSContext
// 文件描述: SECSContext
// 开发人员: Michael
// 创建时间: 2019/11/8 0:08
//
// 更新历史:
// + 创建 SECSContext.cs 文件. by Michael @2019/11/8 0:08
// ********************************************************************************
using ARI.EAP.HOST;
using ARI.EAP.HOST.Common;
using Glorysoft.SECS.EQP.Utilities;
using Glorysoft.SECSwell;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Threading.Tasks;
namespace Glorysoft.SECS.EQP.Common
{
public class SECSContext
{
public string Name { get; set; }
public short DeviceID { get; set; } = 0;
public eHSMS_CONNECT_MODE ConnectionMode { get; set; } = eHSMS_CONNECT_MODE.ACTIVE;
public string RemoteIPAddress { get; set; } = "127.0.0.1";
public int RemoteIPPort { get; set; } = 6000;
public string LocalIPAddress { get; set; } = "127.0.0.1";
public int LocalIPPort { get; set; } = 20002;
public bool AsciiValueAutoFillSpace { get; set; } = true;
public int T1 { get; set; } = 1;
public int T2 { get; set; } = 2;
public int T3 { get; set; } = 45;
public int T4 { get; set; } = 4;
public int T5 { get; set; } = 10;
public int T6 { get; set; } = 6;
public int T7 { get; set; } = 10;
public int T8 { get; set; } = 5;
public eLOG_LEVEL LogLevel { get; set; } = eLOG_LEVEL.DEBUG;
public string LogPath { get; set; } = @"logs\";
public string SECSLibraryFile { get; set; } = @"Configuration\SECSLibrary.xml";
public bool IsConnected => Port != null && Port.Connected;
private readonly SECSwell.SECSPort Port;
private static Dictionary<string, ISECSMessageHandler> Handlers;
public SECSContext(string name, short deviceId, string remoteIPAddress, int remoteIPPort)
{
LogPath = string.Format(@"{0}{1}\", LogPath, name);
Name = name;
DeviceID = deviceId;
RemoteIPAddress = remoteIPAddress;
RemoteIPPort = remoteIPPort;
SECSwell.SECSPort.SetAsciiValueAutoFillSpace = AsciiValueAutoFillSpace;
Port = new SECSwell.SECSPort(Name)
{
Name = Name,
DeviceID = DeviceID,
LogPath = LogPath,
LogLevel = LogLevel
};
HSMSParameters parameters = new HSMSParameters
{
DeviceID = DeviceID,
ConnectionMode = ConnectionMode,
RemoteIP = RemoteIPAddress,
RemotePort = RemoteIPPort,
LocalIP = LocalIPAddress,
LocalPort = LocalIPPort,
T3 = T3,
T5 = T5,
T6 = T6,
T7 = T7,
T8 = T8
};
Port.Library.Load(SECSLibraryFile);
Port.HsmsParameters = parameters;
Port.IsS9FxCheck = false;
Port.OnSECSEvent += OnRecieved;
Handlers = new Dictionary<string, ISECSMessageHandler>();
foreach (Type item in MethodBase.GetCurrentMethod().DeclaringType.Assembly.GetTypes())
{
if (item.IsClass && item.GetInterface(nameof(ISECSMessageHandler)) != null)
{
Handlers.Add(item.Name, Activator.CreateInstance(item) as ISECSMessageHandler);
}
}
}
private void OnRecieved(SECSEventType type, SECSTransaction trans, SECSErrors err, string errmsg)
{
var msgName = string.Empty;
switch (type)
{
case SECSEventType.HSMSConnected:
msgName = $"{nameof(SECSEventType.HSMSConnected)}Handler";
break;
case SECSEventType.HSMSDisconnected:
msgName = $"{nameof(SECSEventType.HSMSDisconnected)}Handler";
break;
case SECSEventType.PrimaryRcvd:
msgName = $"S{trans.Primary.Stream}F{trans.Primary.Function}Handler";
break;
case SECSEventType.SecondaryRcvd:
msgName = $"S{trans.Secondary.Stream}F{trans.Secondary.Function}Handler";
break;
default:
msgName = $"{nameof(SECSEventType.Error)}Handler";
break;
}
if (Handlers.ContainsKey(msgName))
{
EquipmentStatus.S1F1HeartBit.timer1.Stop();
EquipmentStatus.S1F1HeartBit.timer1.Start();
Task.Run(() => Handlers[msgName].Execute(this, trans, err, errmsg));
}
}
public virtual bool Close()
{
try
{
if (IsConnected)
{
Port.ClosePort();
EquipmentStatus.EqConnectState = ConnectState.disconnected;
return true;
}
return false;
}
catch (Exception e)
{
LoggerService.SECSLogger.Error(e);
return false;
}
}
public virtual bool Open()
{
try
{
if (Port != null)
{
Port.OpenPort();
return Port.Connected;
}
return false;
}
catch (Exception e)
{
LoggerService.SECSLogger.Error(e);
return false;
}
}
public virtual void ReplyMessage(SECSTransaction trans)
{
try
{
if (Port != null && Port.PortIsOpen)
{
Port.Reply(trans);
}
}
catch (Exception e)
{
LoggerService.SECSLogger.Error(e);
}
}
public virtual void SendMessage(SECSTransaction trans)
{
try
{
if (Port != null && Port.PortIsOpen)
{
Port.Send(trans);
}
}
catch (Exception e)
{
LoggerService.SECSLogger.Error(e);
}
}
public virtual void SendMessage(string name)
{
try
{
if (Port != null && Port.PortIsOpen)
{
SECSTransaction transaction = new SECSTransaction
{
Primary = Port.Library.FindMessage(name)
};
transaction.Secondary = Port.Library.FindMessage(transaction.Primary.Stream, transaction.Primary.Function + 1).FirstOrDefault();
Port.Send(transaction);
}
}
catch (Exception e)
{
LoggerService.SECSLogger.Error(e);
}
}
public SECSTransaction GetTransaction(int stream, int function, string msgName = null)
{
try
{
string messageName = string.IsNullOrWhiteSpace(msgName) ? $"S{stream}F{function}" : msgName.ToUpper();
if (Port == null)
{
LoggerService.SECSLogger.Error($"Method: GetTransaction, Port is null!");
return null;
}
if (Port.Library == null)
{
LoggerService.SECSLogger.Error($"Method: GetTransaction, Port.Library is null!");
return null;
}
return Port.Library.FindTransaction(messageName);
}
catch (Exception e)
{
LoggerService.SECSLogger.Error(e);
return null;
}
}
}
}