#region << 版 本 注 释 >>
/*----------------------------------------------------------------
 * 命名空间:WIDESEAWCS_Communicator
 * 创建者:胡童庆
 * 创建时间:2024/8/2 16:13:36
 * 版本:V1.0.0
 * 描述:自定义通讯异常类,定义了错误类型、错误代码(暂时没定义错误代码表)
 *
 * ----------------------------------------------------------------
 * 修改人:
 * 修改时间:
 * 版本:V1.0.1
 * 修改说明:
 * 
 *----------------------------------------------------------------*/
#endregion << 版 本 注 释 >>
using HslCommunication.LogNet;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace WIDESEAWCS_Communicator
{
    ///   
    /// 工业通信错误类,封装了与PLC通信时可能发生的错误。  
    ///   
    [Serializable] // 确保类支持序列化 
    public class CommunicationException : Exception
    {
        //public static ILogNet logNet = new LogNetFileSize()
        ///   
        /// 错误代码。  
        ///   
        public int? ErrorCode { get; }
        ///   
        /// 通信错误的类型。  
        ///   
        public CommunicationErrorType ErrorType { get; }
        /// 
        /// 错误信息
        /// 
        public override string Message => _message;
        private string _message;
        ///   
        /// 初始化一个新的 CommunicationException 实例。  
        ///   
        /// 错误的描述。  
        /// 错误代码(可选)。  
        /// 导致当前异常的异常(可选)。  
        public CommunicationException(string message, CommunicationErrorType errorType, int? plcErrorCode = null, Exception innerException = null)
            : base(message, innerException)
        {
            ErrorCode = plcErrorCode;
            ErrorType = errorType;
            _message = message;
        }
        ///   
        /// 提供一个更友好的字符串表示形式,包含PLC错误代码(如果可用)和任何内部异常信息。  
        ///   
        /// 异常的字符串表示形式。  
        public override string ToString()
        {
            //string plcCodeInfo = ErrorCode.HasValue ? $"PLC Error Code: {ErrorCode.Value}" : "No PLC Error Code";
            string innerExceptionInfo = InnerException != null ? $"\nInner Exception: {InnerException.Message}" : "";
            return $"{GetType().Name}: {Message}\n{innerExceptionInfo}";
        }
    }
    ///   
    /// 工业通信错误类型枚举。  
    ///   
    public enum CommunicationErrorType
    {
        /// 
        /// IP地址错误
        /// 
        IpAddressError,
        /// 
        /// 连接PLC错误
        /// 
        ConnectionFailed,
        /// 
        /// 未知类型错误
        /// 
        Unknown,
        /// 
        /// 读取失败
        /// 
        ReadFailed,
        /// 
        /// 写入失败
        /// 
        WriteFailed,
        /// 
        /// 类型错误
        /// 
        TypeError,
        /// 
        /// 读取异常
        /// 
        ReadException
    }
    public class CommunicationExceptionMessage
    {
        /// 
        /// Ip地址错误,参数【IP】
        /// 
        public const string IpAddressErrorException = "Ip地址错误,【{0}】";
        /// 
        /// 数据读取失败,参数【数据类型,协议地址,错误信息】
        /// 
        public const string ReadFailedException = "数据读取失败,数据类型:【{0}】,地址:【{1}】,错误信息:【{2}】";
        /// 
        /// 数据写入失败,参数【数据类型,协议地址,写入的数据,错误信息】
        /// 
        public const string WriteFailedException = "数据写入失败,数据类型:【{0}】,地址:【{1}】,写入的数据:【{2}】,错误信息:【{3}】";
        /// 
        /// 数据类型错误,参数【数据类型,协议地址】
        /// 
        public const string DataTypeErrorException = "数据类型错误,未定义该PLC数据类型:【{0}】,地址:【{1}】";
        /// 
        /// 数据读取异常,参数【数据类型,协议地址,错误信息】
        /// 
        public const string ReadException = "数据读取失败,数据类型:【{0}】,地址:【{1}】,错误信息:【{2}】";
        /// 
        /// 数据读取失败,参数【数据类型,协议地址,错误信息】
        /// 
        public const string WriteAndReadCheckFaild = "数据写入后读取校验失败,地址:【{0}】,写入的数据:【{1}】,读取的数据:【{2}】";
        /// 
        /// 数据读取错误,结果为null,参数【协议地址】
        /// 
        public const string ReadDataIsNull = "数据读取错误,未取到数据结果,地址:【{0}】";
        /// 
        /// 连接失败,参数【IP,Port,错误信息】
        /// 
        public const string ConnectFaild = "PLC连接失败,IP:【{0}】,Port:【{1}】,错误信息:【{2}】";
        /// 
        /// 连接异常,参数【IP,Port,错误信息】
        /// 
        public const string ConnectException = "PLC连接异常,IP:【{0}】,Port:【{1}】,错误信息:【{2}】";
        /// 
        /// 数据类型转化错误,参数【数据类型,协议地址,写入的数据,错误信息】
        /// 
        public const string TypeConvertError = "数据类型转换错误,数据类型:【{0}】,地址:【{1}】,写入的数据:【{2}】,错误信息:【{3}】";
    }
    public class CommunicationInfoMessage
    {
        /// 
        /// 数据写入,参数【协议地址,写入的数据】
        /// 
        public const string WriteData = "数据写入,地址:【{0}】,写入的数据:【{1}】";
        /// 
        /// 数据写入后读取,参数【协议地址,读取的数据】
        /// 
        public const string WriteAfterRead = "数据写入后读取,地址:【{0}】,读取的数据:【{1}】";
        /// 
        /// 数据写入后读取校验成功,参数【协议地址,写入的数据,读取的数据】
        /// 
        public const string WriteAndReadCheckSuccess = "数据写入后读取校验成功,地址:【{0}】,写入的数据:【{1}】,读取的数据:【{2}】";
        /// 
        /// 连接成功,参数【IP,Port】
        /// 
        public const string ConnectSuccess = "PLC连接成功,IP:【{0}】,Port:【{1}】";
    }
}