1
z8018
2025-03-12 17e4c7e3e7b3ef60d9da6de3b2a39a14a53c38a0
WIDESEAWCS_Server/WIDESEAWCS_QuartzJob/QuartzNet/QuartzNetExtension.cs
@@ -41,7 +41,7 @@
        /// 启动程序自动开启调度服务
        /// </summary>
        /// <returns></returns>
        public async Task StartAsync()
        public virtual async Task StartAsync()
        {
            try
            {
@@ -52,60 +52,69 @@
                {
                    if (!Storage.Devices.Exists(d => d.DeviceCode == x.DeviceCode))
                    {
                        #region 连接PLC
                        // 加载程序集
                        Assembly assembly = Assembly.Load($"WIDESEAWCS_Communicator");
                        // 获取类型
                        Type? type = assembly.GetType($"WIDESEAWCS_Communicator.{x.DevicePlcType}");
                        // 创建实例
                        object? obj = Activator.CreateInstance(type, new object[] { x.DeviceIp, x.DevicePort, x.DeviceName });
                        // 调用连接方法
                        bool? connectResult = (bool)type.InvokeMember("Connect", BindingFlags.Default | BindingFlags.InvokeMethod, null, obj, new object[] { });
                        // 判断连接结果
                        if (connectResult ?? false) ConsoleHelper.WriteSuccessLine(x.DeviceCode + "连接成功"); else ConsoleHelper.WriteErrorLine(x.DeviceCode + "连接失败");
                        #endregion
                        #region 实例化设备对象
                        List<DeviceProDTO> devicePros = x.ProtocolList.Select(d => new DeviceProDTO
                        try
                        {
                            // 设备子编码
                            DeviceChildCode = d.DeviceChildCode,
                            // 设备数据类型
                            DeviceDataType = d.DeviceProDataType,
                            // 设备ID
                            DeviceId = d.DeviceId,
                            // 设备协议ID
                            DeviceProId = d.Id,
                            // 设备协议数据块
                            DeviceProDataBlock = d.DeviceProDataBlock,
                            // 设备协议数据长度
                            DeviceProDataLength = d.DeviceProDataLength,
                            // 设备协议偏移量
                            DeviceProOffset = d.DeviceProOffset,
                            // 设备协议参数描述
                            DeviceProParamDes = d.DeviceProParamDes,
                            // 设备协议参数名称
                            DeviceProParamName = d.DeviceProParamName,
                            // 设备协议参数类型
                            DeviceProParamType = d.DeviceProParamType,
                            // 设备PLC类型
                            DevicePlcType = x.DevicePlcType
                        }).ToList();
                            #region 连接PLC
                            // 加载程序集
                            Assembly assembly = Assembly.Load($"WIDESEAWCS_Communicator");
                            // 获取类型
                            Type? type = assembly.GetType($"WIDESEAWCS_Communicator.{x.DevicePlcType}");
                            // 创建实例
                            object? obj = Activator.CreateInstance(type, new object[] { x.DeviceIp, x.DevicePort, x.DeviceName });
                            // 调用连接方法
                            bool? connectResult = (bool)type.InvokeMember("Connect", BindingFlags.Default | BindingFlags.InvokeMethod, null, obj, new object[] { });
                            // 判断连接结果
                            if (connectResult ?? false) ConsoleHelper.WriteSuccessLine(type.Name + x.DeviceCode + "连接成功"); else ConsoleHelper.WriteErrorLine(type.Name + x.DeviceCode + "连接失败");
                            #endregion
                        // 根据设备类型获取设备协议详情
                        List<DeviceProtocolDetailDTO> deviceProtocolDetails = _deviceProtocolDetailService.GetDeviceProtocolDetailsByDeviceType(x.DeviceType);
                        // 加载设备程序集
                        Assembly assemblyDevice = Assembly.Load($"WIDESEAWCS_QuartzJob");
                        // 获取设备类型对应的类型
                        Type typeDevice = assemblyDevice.GetType($"WIDESEAWCS_QuartzJob.{x.DeviceType}");
                        // 创建设备实例
                        object deviceInstance = Activator.CreateInstance(typeDevice, new object[] { obj, devicePros, deviceProtocolDetails, x.DeviceCode, x.DeviceName });
                        #endregion
                        x.Device = (IDevice)deviceInstance;
                            #region 实例化设备对象
                            List<DeviceProDTO> devicePros = x.ProtocolList.Select(d => new DeviceProDTO
                            {
                                // 设备子编码
                                DeviceChildCode = d.DeviceChildCode,
                                // 设备数据类型
                                DeviceDataType = d.DeviceProDataType,
                                // 设备ID
                                DeviceId = d.DeviceId,
                                // 设备协议ID
                                DeviceProId = d.Id,
                                // 设备协议数据块
                                DeviceProDataBlock = d.DeviceProDataBlock,
                                // 设备协议数据长度
                                DeviceProDataLength = d.DeviceProDataLength,
                                // 设备协议偏移量
                                DeviceProOffset = d.DeviceProOffset,
                                // 设备协议参数描述
                                DeviceProParamDes = d.DeviceProParamDes,
                                // 设备协议参数名称
                                DeviceProParamName = d.DeviceProParamName,
                                // 设备协议参数类型
                                DeviceProParamType = d.DeviceProParamType,
                                // 设备PLC类型
                                DevicePlcType = x.DevicePlcType
                            }).ToList();
                        Storage.Devices.Add((IDevice)deviceInstance);
                            // 根据设备类型获取设备协议详情
                            List<DeviceProtocolDetailDTO> deviceProtocolDetails = _deviceProtocolDetailService.GetDeviceProtocolDetailsByDeviceType(x.DeviceType);
                            // 加载设备程序集
                            Assembly assemblyDevice = Assembly.Load($"WIDESEAWCS_QuartzJob");
                            // 获取设备类型对应的类型
                            Type typeDevice = assemblyDevice.GetType($"WIDESEAWCS_QuartzJob.{x.DeviceType}");
                            // 创建设备实例
                            object deviceInstance = Activator.CreateInstance(typeDevice, new object[] { obj, devicePros, deviceProtocolDetails, x.DeviceCode, x.DeviceName });
                            #endregion
                            x.Device = (IDevice)deviceInstance;
                            Storage.Devices.Add((IDevice)deviceInstance);
                        }
                        catch (Exception ex)
                        {
                            Console.WriteLine("调度服务开启异常" + ex.ToString());
                        }
                    }
                    else
                    {