using HslCommunication; using System; using System.Collections.Generic; using System.ComponentModel; using System.Linq; using System.Text; using System.Threading.Tasks; using WIDESEAWCS_Communicator; using WIDESEAWCS_QuartzJob.DeviceBase; using WIDESEAWCS_QuartzJob.DTO; namespace WIDESEAWCS_QuartzJob { /// /// 插拔钉机 /// [Description("插拔钉机")] public class PinMachine : IPinMachine { #region Private Member /// /// 拘束机通讯对象 /// private readonly BaseCommunicator _communicator; /// /// 拘束机协议信息 /// private readonly List _deviceProDTOs; /// /// 拘束机协议明细信息 /// private readonly List _deviceProtocolDetailDTOs; /// /// 设备编号 /// public readonly string _deviceCode; /// /// 设备名称 /// public readonly string _deviceName; private bool _heartStatr = true; private bool _isConnected = true; #endregion #region Public Member /// /// 通讯对象 /// public BaseCommunicator Communicator => _communicator; /// /// 协议信息 /// public List DeviceProDTOs => _deviceProDTOs; /// /// 输送线协议明细信息 /// public List DeviceProtocolDetailDTOs => _deviceProtocolDetailDTOs; /// /// 设备编号 /// public string DeviceCode => _deviceCode; /// /// 设备名称 /// public string DeviceName => _deviceName; /// /// 设备是否已连接 /// public bool IsConnected => Communicator.IsConnected && _isConnected; #endregion #region Constructor Function /// /// 构造函数 /// /// 设备通讯对象 /// 设备协议信息 /// 设备协议明细信息 /// 设备编号 /// 设备名称 public PinMachine(BaseCommunicator communicator, List deviceProDTOs, List deviceProtocolDetailDTOs, string deviceCode, string deviceName) { _communicator = communicator; _deviceProDTOs = deviceProDTOs; _deviceProtocolDetailDTOs = deviceProtocolDetailDTOs; _deviceCode = deviceCode; _deviceName = deviceName; CheckConnect(); } #endregion #region Private Method private void CheckConnect() { Task.Run(() => { while (_heartStatr) { try { DeviceProDTO? devicePro = _deviceProDTOs.FirstOrDefault(); if (devicePro == null) _isConnected = false; else Communicator.ReadAsObj(devicePro.DeviceProAddress, devicePro.DeviceDataType); _isConnected = true; } catch (Exception ex) { _isConnected = false; } Thread.Sleep(500); } }); } #endregion #region Public Method /// /// 读取PLC协议地址的数据 /// /// 协议信息的枚举对象信息。 /// 读取数据的类型对象信息。 /// 枚举值 /// 读取到的数据 public TResult GetValue(TEnum value) where TEnum : Enum { if (!IsConnected) throw new Exception($"通讯连接错误,请检查网络"); DeviceProDTO? devicePro = _deviceProDTOs.FirstOrDefault(x => x.DeviceProParamName == value.ToString()); return devicePro == null ? throw new Exception($"读取数据错误,未在协议信息里面找到参数{value.ToString()}") : (TResult)Communicator.ReadAsObj(devicePro.DeviceProAddress, devicePro.DeviceDataType); } /// /// 读取PLC协议地址的数据 /// /// 协议信息的枚举对象信息。 /// 读取数据的类型对象信息。 /// 枚举值 /// 设备子编号 /// 读取到的数据 public TResult GetValue(TEnum value, string deviceChildCode) where TEnum : Enum { if (!IsConnected) throw new Exception($"通讯连接错误,请检查网络"); DeviceProDTO? devicePro = _deviceProDTOs.FirstOrDefault(x => x.DeviceProParamName == value.ToString() && x.DeviceChildCode == deviceChildCode); return devicePro == null ? throw new Exception($"读取数据错误,未在协议信息里面找到参数{value.ToString()}") : (TResult)Communicator.ReadAsObj(devicePro.DeviceProAddress, devicePro.DeviceDataType); } /// /// 与设备的心跳 /// public void Heartbeat() { } /// /// 根据参数名称、设备子编号写入对应的数据。 /// /// 参数名称枚举类型。 /// 要写入的数据类型。 /// 参数名称。 /// 要写入的数据。 /// 设备子编号写 /// 返回写入成功或失败 public bool SetValue(TEnum @enum, TValue value, string deviceChildCode) where TEnum : Enum where TValue : notnull { if (!IsConnected) throw new Exception($"通讯连接错误,请检查网络"); DeviceProDTO? devicePro = _deviceProDTOs.FirstOrDefault(x => x.DeviceProParamName == @enum.ToString() && x.DeviceChildCode == deviceChildCode); return devicePro == null ? throw new Exception($"写入数据错误,未在协议信息里面找到参数{value.ToString()}") : Communicator.WriteObj(devicePro.DeviceProAddress, devicePro.DeviceDataType, value); } /// /// 根据参数名称写入拘束机对应的数据。 /// /// 参数名称枚举类型。 /// 要写入的数据类型。 /// 参数名称。 /// 要写入的数据。 /// 返回写入成功或失败 /// public bool SetValue(TEnum @enum, TValue value) where TEnum : Enum where TValue : notnull { if (!IsConnected) throw new Exception($"通讯连接错误,请检查网络"); DeviceProDTO? devicePro = _deviceProDTOs.FirstOrDefault(x => x.DeviceProParamName == @enum.ToString()); return devicePro == null ? throw new Exception($"写入数据错误,未在协议信息里面找到参数{value.ToString()}") : Communicator.WriteObj(devicePro.DeviceProAddress, devicePro.DeviceDataType, value); } /// /// 释放对象 /// public void Dispose() { _heartStatr = false; _communicator.Dispose(); GC.SuppressFinalize(this); } #endregion } }