From 2f75b4c0a67ccc3a443e7cc4f2f0f909defd9a92 Mon Sep 17 00:00:00 2001 From: hutongqing <hutongqing@hnkhzn.com> Date: 星期五, 01 十一月 2024 09:49:23 +0800 Subject: [PATCH] 版本更新 --- WIDESEAWCS_Server/WIDESEAWCS_QuartzJob/ConveyorLine/CommonConveyorLine.cs | 132 +++++++++++++++++++++++++++++++++++++++---- 1 files changed, 119 insertions(+), 13 deletions(-) diff --git a/WIDESEAWCS_Server/WIDESEAWCS_QuartzJob/ConveyorLine/CommonConveyorLine.cs b/WIDESEAWCS_Server/WIDESEAWCS_QuartzJob/ConveyorLine/CommonConveyorLine.cs index 8ba525a..28b40e2 100644 --- a/WIDESEAWCS_Server/WIDESEAWCS_QuartzJob/ConveyorLine/CommonConveyorLine.cs +++ b/WIDESEAWCS_Server/WIDESEAWCS_QuartzJob/ConveyorLine/CommonConveyorLine.cs @@ -30,7 +30,7 @@ namespace WIDESEAWCS_QuartzJob { - [Description("閫氱敤杈撻�佺嚎")] + [Description("杈撻�佺嚎")] public class CommonConveyorLine : IConveyorLine { #region Private Member @@ -38,40 +38,63 @@ /// 鍫嗗灈鏈洪�氳瀵硅薄 /// </summary> private readonly BaseCommunicator _communicator; + /// <summary> /// 鍫嗗灈鏈哄崗璁俊鎭� /// </summary> private readonly List<DeviceProDTO> _deviceProDTOs; + /// <summary> /// 鍫嗗灈鏈哄崗璁槑缁嗕俊鎭� /// </summary> private readonly List<DeviceProtocolDetailDTO> _deviceProtocolDetailDTOs; + /// <summary> /// 璁惧缂栧彿 /// </summary> public readonly string _deviceCode; + /// <summary> /// 璁惧鍚嶇О /// </summary> public readonly string _deviceName; + + private bool _heartStatr = true; + + private bool _isConnected = true; #endregion #region Public Member + /// <summary> + /// 杈撻�佺嚎閫氳瀵硅薄 + /// </summary> public BaseCommunicator Communicator => _communicator; + /// <summary> + /// 杈撻�佺嚎鍗忚淇℃伅 + /// </summary> public List<DeviceProDTO> DeviceProDTOs => _deviceProDTOs; + /// <summary> + /// 杈撻�佺嚎鍗忚鏄庣粏淇℃伅 + /// </summary> public List<DeviceProtocolDetailDTO> DeviceProtocolDetailDTOs => _deviceProtocolDetailDTOs; + /// <summary> + /// 璁惧缂栧彿 + /// </summary> public string DeviceCode => _deviceCode; + /// <summary> + /// 璁惧鍚嶇О + /// </summary> public string DeviceName => _deviceName; - public bool IsFault => false; + /// <summary> + /// 閫氳鏄惁宸茶繛鎺� + /// </summary> + public bool IsConnected => Communicator.IsConnected && _isConnected; - public bool IsConnected => Communicator.IsConnected; - - public DeviceStatus Status => DeviceStatus.Offline; #endregion #region Constructor Function @@ -90,45 +113,105 @@ _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 + /// <summary> + /// 璇诲彇PLC鍗忚鍦板潃鐨勬暟鎹� + /// </summary> + /// <typeparam name="TEnum">鍗忚淇℃伅鐨勬灇涓惧璞′俊鎭��</typeparam> + /// <typeparam name="TRsult">璇诲彇鏁版嵁鐨勭被鍨嬪璞′俊鎭��</typeparam> + /// <param name="value">鏋氫妇鍊�</param> + /// <param name="deviceChildCode">璁惧瀛愮紪鍙�</param> + /// <returns>璇诲彇鍒扮殑鏁版嵁</returns> public TRsult GetValue<TEnum, TRsult>(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() : (TRsult)Communicator.ReadAsObj(devicePro.DeviceProAddress, devicePro.DeviceDataType); } + /// <summary> + /// 涓庤澶囩殑蹇冭烦 + /// </summary> public void Heartbeat() { throw new NotImplementedException(); } - public bool SendCommand(DeviceCommand command, string deviceChildCode) + /// <summary> + /// + /// </summary> + /// <typeparam name="T"></typeparam> + /// <param name="command"></param> + /// <param name="deviceChildCode"></param> + /// <returns></returns> + /// <exception cref="Exception"></exception> + public bool SendCommand<T>(T command, string deviceChildCode) where T : IDataTransfer, new() { - DeviceProDTO? devicePro = _deviceProDTOs.Where(x => x.DeviceProParamType == nameof(DeviceCommand) && x.DeviceChildCode == deviceChildCode).OrderBy(x => x.DeviceProOffset).FirstOrDefault(); - if (devicePro == null) + if(Communicator is SiemensS7) { + if (!IsConnected) throw new Exception($"閫氳杩炴帴閿欒锛岃妫�鏌ョ綉缁�"); + DeviceProDTO? devicePro = _deviceProDTOs.Where(x => x.DeviceProParamType == nameof(DeviceCommand) && x.DeviceChildCode == deviceChildCode).OrderBy(x => x.DeviceProOffset).FirstOrDefault(); + if (devicePro == null) + { + return false; + } + if (Communicator.WriteCustomer(devicePro.DeviceProAddress, command)) + { + return true; + } return false; } - if (Communicator.WriteCustomer(devicePro.DeviceProAddress, command)) + else { - return true; + throw new Exception("鏆備笉鏀寔闄よタ闂ㄥ瓙涔嬪鐨凱LC"); } - return false; } + /// <summary> + /// 璇诲彇PLC鏁版嵁锛岃繑鍥炶嚜瀹氫箟瀵硅薄 + /// </summary> + /// <typeparam name="T">娉涘瀷</typeparam> + /// <param name="deviceChildCode">瀛愯澶囩紪鍙�</param> + /// <returns>杩斿洖鑷畾涔夊璞℃垨鎶涘嚭寮傚父</returns> + /// <exception cref="Exception"></exception> public T ReadCustomer<T>(string deviceChildCode) where T : IDataTransfer, new() { - DeviceProDTO? devicePro = _deviceProDTOs.Where(x => x.DeviceProParamType == nameof(DeviceCommand) && x.DeviceChildCode == deviceChildCode).OrderBy(x => x.DeviceProOffset).FirstOrDefault(); + if (!IsConnected) throw new Exception($"閫氳杩炴帴閿欒锛岃妫�鏌ョ綉缁�"); + DeviceProDTO? devicePro = _deviceProDTOs.Where(x => x.DeviceProParamType == "ReadDeviceCommand" && x.DeviceChildCode == deviceChildCode).OrderBy(x => x.DeviceProOffset).FirstOrDefault(); if (devicePro == null) { - throw new Exception(); + throw new Exception("鏈壘鍒板崗璁俊鎭�"); } else { @@ -136,14 +219,30 @@ } } + /// <summary> + /// 鏍规嵁鍙傛暟鍚嶇О銆佽澶囧瓙缂栧彿鍐欏叆瀵瑰簲鐨勬暟鎹�� + /// </summary> + /// <typeparam name="TEnum">鍙傛暟鍚嶇О鏋氫妇绫诲瀷銆�</typeparam> + /// <typeparam name="TValue">瑕佸啓鍏ョ殑鏁版嵁绫诲瀷銆�</typeparam> + /// <param name="enum">鍙傛暟鍚嶇О銆�</param> + /// <param name="value">瑕佸啓鍏ョ殑鏁版嵁銆�</param> + /// <param name="deviceChildCode">璁惧瀛愮紪鍙峰啓</param> + /// <returns>杩斿洖鍐欏叆鎴愬姛鎴栧け璐�</returns> public bool SetValue<TEnum, TValue>(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() : Communicator.WriteObj(devicePro.DeviceProAddress, devicePro.DeviceDataType, value); } + /// <summary> + /// + /// </summary> + /// <param name="deviceChildCode"></param> + /// <returns></returns> + /// <exception cref="Exception"></exception> public bool IsOccupied(string deviceChildCode) { if (Communicator.IsConnected) @@ -170,6 +269,13 @@ //todo 閫氳鏈繛鎺ユ椂鎶涘嚭寮傚父 return false; } + + public void Dispose() + { + _heartStatr = false; + _communicator.Dispose(); + GC.SuppressFinalize(this); + } #endregion } } -- Gitblit v1.9.3