From 1a116557a4a46c4dbae6b2a35e9678f2555f663e Mon Sep 17 00:00:00 2001 From: Diego <2248356998@qq.com> Date: Mon, 14 Oct 2024 19:06:09 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=EF=BC=9A=E7=A7=BB=E5=85=A5?= =?UTF-8?q?=E9=83=A8=E5=88=86=E9=A1=B9=E7=9B=AE=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Configuration/App.json | 4 +- src/Directory.Build.props | 4 +- .../CSharpScriptEngineExtension.cs | 134 +++ .../ExpressionEvaluatorExtension.cs | 170 ++++ .../ThingsGateway.CSScript.csproj | 16 + .../DebugPages/AdapterDebugBase.cs | 115 +++ .../DebugPages/AdapterDebugComponent.razor | 120 +++ .../DebugPages/AdapterDebugComponent.razor.cs | 129 +++ .../ChannelDataDebugComponent.razor | 48 + .../ChannelDataDebugComponent.razor.cs | 144 +++ .../DebugPages/LogConsole.razor | 44 + .../DebugPages/LogConsole.razor.cs | 223 +++++ .../Locales/en-US.json | 68 ++ .../Locales/zh-CN.json | 75 ++ .../Locales/zh-TW.json | 67 ++ .../Services/HybridPlatformService.cs | 39 + .../Services/IPlatformService.cs | 21 + .../ThingsGateway.Foundation.Razor/Startup.cs | 22 + .../ThingsGateway.Foundation.Razor.csproj | 31 + .../GlobalUsings.cs | 9 + .../SourceGenerator/Utils.cs | 121 +++ .../SourceGenerator/VariableCodeBuilder.cs | 128 +++ .../VariableObjectSourceGenerator.cs | 88 ++ .../SourceGenerator/VariableSyntaxReceiver.cs | 116 +++ ...sGateway.Foundation.SourceGenerator.csproj | 13 + .../tools/install.ps1 | 49 + .../tools/uninstall.ps1 | 56 ++ .../GlobalUsings.cs | 13 + .../ThingsGateway.Foundation.Variable.csproj | 25 + .../VariableObject.cs | 211 ++++ .../VariableObjectHelper.cs | 39 + .../VariableRuntimeAttribute.cs | 38 + .../VariableRuntimeProperty.cs | 45 + .../Channel/ChannelData.cs | 135 +++ .../Extension/ChannelConfigExtensions.cs | 201 ++++ .../Channel/IAdapterObject.cs | 23 + .../Channel/IChannel.cs | 95 ++ .../Channel/IClientChannel.cs | 33 + .../Channel/Plugin/DtuPlugin.cs | 82 ++ .../Plugin/HeartbeatAndReceivePlugin.cs | 93 ++ .../Channel/Plugin/IDtu.cs | 20 + .../Channel/Plugin/IDtuClient.cs | 30 + .../Channel/Plugin/ITcpService.cs | 20 + .../Channel/Plugin/PluginUtil.cs | 75 ++ .../Channel/SerialPortChannel.cs | 149 +++ .../Channel/TcpClientChannel.cs | 142 +++ .../Channel/TcpServiceChannel.cs | 229 +++++ .../Channel/TcpSessionClientChannel.cs | 141 +++ .../Channel/UdpSessionChannel.cs | 157 +++ .../Common/IncrementCount.cs | 127 +++ .../Common/TimeTick.cs | 60 ++ .../Common/WaitLock.cs | 89 ++ .../JsonStringToClassSerializerFormatter.cs | 59 ++ .../Converter/StringConverter.cs | 45 + .../Converter/StringToEncodingConverter.cs | 60 ++ .../Converter/ThingsGatewayStringConverter.cs | 31 + .../DataHandleAdapter/IResultMessage.cs | 60 ++ .../DataHandleAdapter/ISendMessage.cs | 18 + .../DataHandleAdapter/MessageBase.cs | 60 ++ .../ProtocolSingleStreamDataHandleAdapter.cs | 197 ++++ .../ProtocolUdpDataHandleAdapter.cs | 183 ++++ .../Enums/BcdFormatEnum.cs | 32 + .../Enums/ChannelEnum.cs | 42 + .../Enums/DataFormatEnum.cs | 29 + .../Enums/DataTypeEnum.cs | 56 ++ .../Extensions/BoolExtensions.cs | 38 + .../Extensions/ByteExtensions.cs | 232 +++++ .../Extensions/CollectionExtensions.cs | 55 + .../Extensions/DataTypeExtensions.cs | 89 ++ .../Extensions/DateTimeExtensions.cs | 31 + .../Extensions/ExceptionExtensions.cs | 34 + .../Extensions/ExpandoObjectExtensions.cs | 85 ++ .../Extensions/GenericExtensions.cs | 244 +++++ .../Extensions/JsonExtensions.cs | 61 ++ .../Extensions/LoggerExtensions.cs | 131 +++ .../Extensions/StringExtensions.cs | 257 +++++ .../Extensions/TypeExtensions.cs | 97 ++ .../ThingsGateway.Foundation/GlobalUsings.cs | 12 + .../Locales/DefaultResource.cs | 38 + .../Locales/en-US.json | 56 ++ .../Locales/zh-CN.json | 57 ++ .../Locales/zh-TW.json | 55 + .../Localization/JsonLocalizer.cs | 108 ++ .../Logger/TextFileLogger.cs | 137 +++ .../Logger/TextFileReader.cs | 338 +++++++ .../OperResult/ErrorCodeEnum.cs | 32 + .../OperResult/IOperResult.cs | 75 ++ .../OperResult/OperResult.cs | 602 +++++++++++ .../OperResult/OperResultExtension.cs | 80 ++ .../OperResult/OperResultUtil.cs | 47 + .../OperResult/ReturnErrorException.cs | 28 + .../Protocol/IProtocol.cs | 493 +++++++++ .../Protocol/ProtocolBase.cs | 859 ++++++++++++++++ .../Protocol/ProtocolBaseExtension.cs | 91 ++ .../ProtocolWaitDataStatusExtension.cs | 39 + .../Protocol/StructContentPraseExtensions.cs | 56 ++ .../ThingsGateway.Foundation.csproj | 18 + .../Trans/EncodingConverter.cs | 61 ++ .../Trans/IThingsGatewayBitConverter.cs | 341 +++++++ .../Trans/ThingsGatewayBitConverter.cs | 937 ++++++++++++++++++ .../ThingsGatewayBitConverterExtension.cs | 329 ++++++ .../Utils/CRC16Utils.cs | 63 ++ .../Utils/DataTransUtil.cs | 453 +++++++++ .../Utils/JTokenUtil.cs | 97 ++ .../Utils/LocalizerUtil.cs | 43 + .../Variable/IVariable.cs | 61 ++ .../Variable/IVariableSource.cs | 47 + .../Variable/VariableClass.cs | 75 ++ .../Variable/VariableSourceClass.cs | 53 + src/FoundationVersion.props | 9 + .../Attributes/DynamicMethodAttribute.cs | 0 .../Attributes/DynamicPropertyAttribute.cs | 0 .../Attributes/EducationPluginAttribute.cs | 0 .../Attributes/OnlyWindowsSupportAttribute.cs | 0 .../Common/DoTask.cs | 0 .../Common/EncodingMapper.cs | 0 .../Const/ExportString.cs | 0 .../Const/ThingsGatewayCacheConst.cs | 0 .../Controler/ConfigInfoControler.cs | 0 .../Controler/ControlControler.cs | 0 .../Controler/GatewayExportController.cs | 0 .../Controler/RuntimeInfoControler.cs | 0 .../Entity/BackendLog.cs | 0 .../Entity/Channel.cs | 0 .../Entity/Device.cs | 0 .../Entity/RpcLog.cs | 0 .../Entity/Variable.cs | 0 .../Enums/AlarmTypeEnum.cs | 0 .../Enums/DeviceStatusEnum.cs | 0 .../Enums/EventTypeEnum.cs | 0 .../Enums/PluginTypeEnum.cs | 0 .../Enums/ProtectTypeEnum.cs | 0 .../Enums/RedundantTypeEnum.cs | 0 .../Enums/ThreadRunReturnTypeEnum.cs | 0 .../Extensions/LogExtensions.cs | 0 .../Extensions/ResourceExtensions.cs | 0 ...erviceCollectionHostedServiceExtensions.cs | 0 .../FodyWeavers.xml | 0 .../GlobalData/GlobalData.cs | 0 .../GlobalUsings.cs | 0 .../HostService/AlarmHostedService.cs | 0 .../Device/BusinessDeviceHostedService.cs | 0 .../Device/CollectDeviceHostedService.cs | 14 +- .../HostService/Device/DeviceHostedService.cs | 0 .../Device/IBusinessDeviceHostedService.cs | 0 .../Device/ICollectDeviceHostedService.cs | 0 .../Device/IDeviceHostedService.cs | 0 .../HostService/IAlarmHostedService.cs | 0 .../Job/LogJob/LogJob.cs | 0 .../Locales/en-US.json | 0 .../Locales/zh-CN.json | 0 .../Locales/zh-TW.json | 0 .../BackendLogDatabaseLoggingWriter.cs | 0 .../Model/AlarmVariable.cs | 0 .../Model/CollectDeviceRunTime.cs | 0 .../Model/DeviceData.cs | 0 .../Model/DeviceRunTime.cs | 0 .../Model/DriverMethodInfo.cs | 0 .../Model/VariableData.cs | 0 .../Model/VariableMethod.cs | 0 .../Model/VariableRunTime.cs | 0 .../Model/VariableSourceRead.cs | 0 .../Plugin/Business/BusinessBase.cs | 0 .../Plugin/Business/BusinessPropertyBase.cs | 0 .../Cache/BusinessBaseWithCacheAlarmModel.cs | 0 .../Cache/BusinessBaseWithCacheDeviceModel.cs | 0 .../BusinessBaseWithCacheVariableModel.cs | 0 .../Cache/BusinessPropertyWithCache.cs | 0 ...BusinessBaseWithCacheIntervalAlarmModel.cs | 0 ...usinessBaseWithCacheIntervalDeviceModel.cs | 0 .../BusinessBaseWithCacheIntervalScript.cs | 0 ...inessBaseWithCacheIntervalVariableModel.cs | 0 .../BusinessPropertyWithCacheInterval.cs | 0 ...sinessPropertyWithCacheIntervalDBScript.cs | 0 ...BusinessPropertyWithCacheIntervalScript.cs | 0 .../Plugin/Business/Cache/TopicJson.cs | 0 .../Business/DB/BusinessDatabaseUtil.cs | 0 .../Business/DB/DBHistoryAlarmPageInput.cs | 0 .../Business/DB/DBHistoryValuePageInput.cs | 0 .../Plugin/Business/DB/IDBHistoryAlarm.cs | 0 .../Business/DB/IDBHistoryAlarmService.cs | 0 .../Plugin/Business/DB/IDBHistoryValue.cs | 0 .../Business/DB/IDBHistoryValueService.cs | 0 .../Plugin/Business/IDriverUIBase.cs | 0 .../Plugin/Business/VariablePropertyBase.cs | 0 .../Plugin/CacheDB/CacheDB.cs | 0 .../Plugin/CacheDB/CacheDBItem.cs | 0 .../Plugin/CacheDB/CacheDBOption.cs | 0 .../Plugin/CacheDB/CacheDBUtil.cs | 0 .../Plugin/ChannelThread.cs | 0 .../Plugin/Collect/CollectBase.cs | 0 .../Plugin/Collect/CollectPropertyBase.cs | 0 .../Plugin/DriverBase.cs | 0 .../Plugin/DriverBaseExtension.cs | 0 .../Plugin/DriverPropertyBase.cs | 0 .../Plugin/DynamicModelExtension.cs | 0 .../Gateway/seed_gateway_resource.json | 0 .../Gateway/seed_gateway_resourcebutton.json | 0 .../SeedData/SysRelationSeedData.cs | 0 .../SeedData/SysResourceSeedData.cs | 0 .../Services/Channel/ChannelService.cs | 0 .../Services/Channel/IChannelService.cs | 0 .../Services/Device/DeviceService.cs | 0 .../Services/Device/Dto/DeviceInput.cs | 0 .../Services/Device/IDeviceService.cs | 0 .../GatewayExport/GatewayExportService.cs | 0 .../GatewayExport/IGatewayExportService.cs | 0 .../Services/GatewayLogs/BackendLogService.cs | 0 .../Services/GatewayLogs/Dto/LogInput.cs | 0 .../Services/GatewayLogs/Dto/LogOutput.cs | 0 .../GatewayLogs/IBackendLogService.cs | 0 .../Services/GatewayLogs/IRpcLogService.cs | 0 .../Services/GatewayLogs/RpcLogService.cs | 0 .../Plugin/Dto/InternalTableColumn.cs | 0 .../Services/Plugin/Dto/PluginInput.cs | 0 .../Services/Plugin/Dto/PluginOutput.cs | 0 .../Services/Plugin/IPluginService.cs | 0 .../Services/Plugin/PluginService.cs | 0 .../Services/Plugin/PluginServiceUtil.cs | 0 .../Services/Rpc/IRpcService.cs | 0 .../Services/Rpc/RpcService.cs | 0 .../Services/Variable/Dto/VariableInput.cs | 0 .../Services/Variable/IVariableService.cs | 0 .../Services/Variable/VariableService.cs | 0 .../Startup.cs | 0 .../ThingsGateway.Gateway.Application.csproj | 7 +- .../Components/QuickActions.razor | 0 .../Components/QuickActions.razor.cs | 0 .../Components/QuickActions.razor.css | 0 .../Components/QuickActions.razor.js | 0 .../ThingsGatewayModuleComponentBase.cs | 0 .../GlobalUsings.cs | 0 .../Locales/en-US.json | 0 .../Locales/zh-CN.json | 0 .../Locales/zh-TW.json | 0 .../Config/Channel/ChannelEditComponent.razor | 0 .../Channel/ChannelEditComponent.razor.cs | 0 .../Channel/ChannelEditComponent.razor.css | 0 .../Pages/Config/Channel/ChannelPage.razor | 0 .../Pages/Config/Channel/ChannelPage.razor.cs | 0 .../Pages/Config/Device/BusinessDevicePage.cs | 0 ...PropertyWithCacheIntervalScriptRazor.razor | 0 ...pertyWithCacheIntervalScriptRazor.razor.cs | 0 .../Pages/Config/Device/CollectDevicePage.cs | 0 .../Config/Device/DeviceEditComponent.razor | 0 .../Device/DeviceEditComponent.razor.cs | 0 .../Device/DeviceEditComponent.razor.css | 0 .../Pages/Config/Device/DevicePage.razor | 0 .../Pages/Config/Device/DevicePage.razor.cs | 0 .../Pages/Config/Device/ScriptCheck.razor | 0 .../Pages/Config/Device/ScriptCheck.razor.cs | 0 .../Pages/Config/DriverDebugPage.razor | 0 .../Pages/Config/DriverDebugPage.razor.cs | 0 .../Pages/Config/Plugin/PluginPage.razor | 0 .../Pages/Config/Plugin/PluginPage.razor.cs | 0 .../Pages/Config/Plugin/SavePlugin.razor | 0 .../Pages/Config/Plugin/SavePlugin.razor.cs | 0 .../Variable/VariableEditComponent.razor | 0 .../Variable/VariableEditComponent.razor.cs | 0 .../Variable/VariableEditComponent.razor.css | 0 .../Pages/Config/Variable/VariablePage.razor | 0 .../Config/Variable/VariablePage.razor.cs | 0 .../Runtime/DeviceStatus/DeviceStatus.razor | 0 .../DeviceStatus.razor.Parameter.cs | 0 .../DeviceStatus/DeviceStatus.razor.cs | 0 .../DeviceStatus/DeviceStatus.razor.css | 0 .../Runtime/DeviceStatus/DeviceStatus1.razor | 0 .../DeviceStatus/DeviceStatus1.razor.cs | 0 .../DeviceStatus/DeviceStatus1.razor.css | 0 .../Runtime/DeviceStatus/DeviceStatus2.razor | 0 .../DeviceStatus/DeviceStatus2.razor.cs | 0 .../DeviceStatus/DeviceStatus2.razor.css | 0 .../Runtime/DeviceStatus/DeviceStatus3.razor | 0 .../DeviceStatus/DeviceStatus3.razor.cs | 0 .../DeviceStatus/DeviceStatus3.razor.css | 0 .../DeviceStatus/DeviceStatusPage.razor | 0 .../DeviceStatus/DeviceStatusPage.razor.cs | 0 .../DeviceStatus/DeviceStatusPage.razor.css | 0 .../Pages/Runtime/RealAlarmPage.razor | 0 .../Pages/Runtime/RealAlarmPage.razor.cs | 0 .../Pages/Runtime/VariableRuntimePage.razor | 0 .../Runtime/VariableRuntimePage.razor.cs | 0 .../Pages/_Log/BackendLogPage.razor | 0 .../Pages/_Log/BackendLogPage.razor.cs | 0 .../Pages/_Log/RpcLogPage.razor | 0 .../Pages/_Log/RpcLogPage.razor.cs | 0 .../Services/PlatformService.cs | 0 .../ThingsGateway.Gateway.Razor/Startup.cs | 0 .../TcpServicePage/TcpServicePage.razor | 0 .../TcpServicePage/TcpServicePage.razor.cs | 0 .../ThingsGateway.Gateway.Razor.csproj | 2 +- .../_Imports.razor | 0 .../_Imports.razor.cs | 0 src/PluginBase.sln | 72 +- src/ThingsGateway.Photino/Startup.cs | 10 +- .../ThingsGateway.Photino.csproj | 4 +- .../Configuration/App.json | 6 +- src/ThingsGateway.Server/Program/Startup.cs | 11 +- .../ThingsGateway.Server.csproj | 6 +- .../ThingsGateway.Winform.csproj | 4 +- src/ThingsGateway.sln | 70 +- src/Version.props | 2 +- 302 files changed, 12487 insertions(+), 63 deletions(-) create mode 100644 src/Foundation/ThingsGateway.CSScript/CSharpScriptEngineExtension.cs create mode 100644 src/Foundation/ThingsGateway.CSScript/ExpressionEvaluatorExtension.cs create mode 100644 src/Foundation/ThingsGateway.CSScript/ThingsGateway.CSScript.csproj create mode 100644 src/Foundation/ThingsGateway.Foundation.Razor/DebugPages/AdapterDebugBase.cs create mode 100644 src/Foundation/ThingsGateway.Foundation.Razor/DebugPages/AdapterDebugComponent.razor create mode 100644 src/Foundation/ThingsGateway.Foundation.Razor/DebugPages/AdapterDebugComponent.razor.cs create mode 100644 src/Foundation/ThingsGateway.Foundation.Razor/DebugPages/ChannelDataDebugComponent.razor create mode 100644 src/Foundation/ThingsGateway.Foundation.Razor/DebugPages/ChannelDataDebugComponent.razor.cs create mode 100644 src/Foundation/ThingsGateway.Foundation.Razor/DebugPages/LogConsole.razor create mode 100644 src/Foundation/ThingsGateway.Foundation.Razor/DebugPages/LogConsole.razor.cs create mode 100644 src/Foundation/ThingsGateway.Foundation.Razor/Locales/en-US.json create mode 100644 src/Foundation/ThingsGateway.Foundation.Razor/Locales/zh-CN.json create mode 100644 src/Foundation/ThingsGateway.Foundation.Razor/Locales/zh-TW.json create mode 100644 src/Foundation/ThingsGateway.Foundation.Razor/Services/HybridPlatformService.cs create mode 100644 src/Foundation/ThingsGateway.Foundation.Razor/Services/IPlatformService.cs create mode 100644 src/Foundation/ThingsGateway.Foundation.Razor/Startup.cs create mode 100644 src/Foundation/ThingsGateway.Foundation.Razor/ThingsGateway.Foundation.Razor.csproj create mode 100644 src/Foundation/ThingsGateway.Foundation.SourceGenerator/GlobalUsings.cs create mode 100644 src/Foundation/ThingsGateway.Foundation.SourceGenerator/SourceGenerator/Utils.cs create mode 100644 src/Foundation/ThingsGateway.Foundation.SourceGenerator/SourceGenerator/VariableCodeBuilder.cs create mode 100644 src/Foundation/ThingsGateway.Foundation.SourceGenerator/SourceGenerator/VariableObjectSourceGenerator.cs create mode 100644 src/Foundation/ThingsGateway.Foundation.SourceGenerator/SourceGenerator/VariableSyntaxReceiver.cs create mode 100644 src/Foundation/ThingsGateway.Foundation.SourceGenerator/ThingsGateway.Foundation.SourceGenerator.csproj create mode 100644 src/Foundation/ThingsGateway.Foundation.SourceGenerator/tools/install.ps1 create mode 100644 src/Foundation/ThingsGateway.Foundation.SourceGenerator/tools/uninstall.ps1 create mode 100644 src/Foundation/ThingsGateway.Foundation.Variable/GlobalUsings.cs create mode 100644 src/Foundation/ThingsGateway.Foundation.Variable/ThingsGateway.Foundation.Variable.csproj create mode 100644 src/Foundation/ThingsGateway.Foundation.Variable/VariableObject.cs create mode 100644 src/Foundation/ThingsGateway.Foundation.Variable/VariableObjectHelper.cs create mode 100644 src/Foundation/ThingsGateway.Foundation.Variable/VariableRuntimeAttribute.cs create mode 100644 src/Foundation/ThingsGateway.Foundation.Variable/VariableRuntimeProperty.cs create mode 100644 src/Foundation/ThingsGateway.Foundation/Channel/ChannelData.cs create mode 100644 src/Foundation/ThingsGateway.Foundation/Channel/Extension/ChannelConfigExtensions.cs create mode 100644 src/Foundation/ThingsGateway.Foundation/Channel/IAdapterObject.cs create mode 100644 src/Foundation/ThingsGateway.Foundation/Channel/IChannel.cs create mode 100644 src/Foundation/ThingsGateway.Foundation/Channel/IClientChannel.cs create mode 100644 src/Foundation/ThingsGateway.Foundation/Channel/Plugin/DtuPlugin.cs create mode 100644 src/Foundation/ThingsGateway.Foundation/Channel/Plugin/HeartbeatAndReceivePlugin.cs create mode 100644 src/Foundation/ThingsGateway.Foundation/Channel/Plugin/IDtu.cs create mode 100644 src/Foundation/ThingsGateway.Foundation/Channel/Plugin/IDtuClient.cs create mode 100644 src/Foundation/ThingsGateway.Foundation/Channel/Plugin/ITcpService.cs create mode 100644 src/Foundation/ThingsGateway.Foundation/Channel/Plugin/PluginUtil.cs create mode 100644 src/Foundation/ThingsGateway.Foundation/Channel/SerialPortChannel.cs create mode 100644 src/Foundation/ThingsGateway.Foundation/Channel/TcpClientChannel.cs create mode 100644 src/Foundation/ThingsGateway.Foundation/Channel/TcpServiceChannel.cs create mode 100644 src/Foundation/ThingsGateway.Foundation/Channel/TcpSessionClientChannel.cs create mode 100644 src/Foundation/ThingsGateway.Foundation/Channel/UdpSessionChannel.cs create mode 100644 src/Foundation/ThingsGateway.Foundation/Common/IncrementCount.cs create mode 100644 src/Foundation/ThingsGateway.Foundation/Common/TimeTick.cs create mode 100644 src/Foundation/ThingsGateway.Foundation/Common/WaitLock.cs create mode 100644 src/Foundation/ThingsGateway.Foundation/Converter/JsonStringToClassSerializerFormatter.cs create mode 100644 src/Foundation/ThingsGateway.Foundation/Converter/StringConverter.cs create mode 100644 src/Foundation/ThingsGateway.Foundation/Converter/StringToEncodingConverter.cs create mode 100644 src/Foundation/ThingsGateway.Foundation/Converter/ThingsGatewayStringConverter.cs create mode 100644 src/Foundation/ThingsGateway.Foundation/DataHandleAdapter/IResultMessage.cs create mode 100644 src/Foundation/ThingsGateway.Foundation/DataHandleAdapter/ISendMessage.cs create mode 100644 src/Foundation/ThingsGateway.Foundation/DataHandleAdapter/MessageBase.cs create mode 100644 src/Foundation/ThingsGateway.Foundation/DataHandleAdapter/ProtocolSingleStreamDataHandleAdapter.cs create mode 100644 src/Foundation/ThingsGateway.Foundation/DataHandleAdapter/ProtocolUdpDataHandleAdapter.cs create mode 100644 src/Foundation/ThingsGateway.Foundation/Enums/BcdFormatEnum.cs create mode 100644 src/Foundation/ThingsGateway.Foundation/Enums/ChannelEnum.cs create mode 100644 src/Foundation/ThingsGateway.Foundation/Enums/DataFormatEnum.cs create mode 100644 src/Foundation/ThingsGateway.Foundation/Enums/DataTypeEnum.cs create mode 100644 src/Foundation/ThingsGateway.Foundation/Extensions/BoolExtensions.cs create mode 100644 src/Foundation/ThingsGateway.Foundation/Extensions/ByteExtensions.cs create mode 100644 src/Foundation/ThingsGateway.Foundation/Extensions/CollectionExtensions.cs create mode 100644 src/Foundation/ThingsGateway.Foundation/Extensions/DataTypeExtensions.cs create mode 100644 src/Foundation/ThingsGateway.Foundation/Extensions/DateTimeExtensions.cs create mode 100644 src/Foundation/ThingsGateway.Foundation/Extensions/ExceptionExtensions.cs create mode 100644 src/Foundation/ThingsGateway.Foundation/Extensions/ExpandoObjectExtensions.cs create mode 100644 src/Foundation/ThingsGateway.Foundation/Extensions/GenericExtensions.cs create mode 100644 src/Foundation/ThingsGateway.Foundation/Extensions/JsonExtensions.cs create mode 100644 src/Foundation/ThingsGateway.Foundation/Extensions/LoggerExtensions.cs create mode 100644 src/Foundation/ThingsGateway.Foundation/Extensions/StringExtensions.cs create mode 100644 src/Foundation/ThingsGateway.Foundation/Extensions/TypeExtensions.cs create mode 100644 src/Foundation/ThingsGateway.Foundation/GlobalUsings.cs create mode 100644 src/Foundation/ThingsGateway.Foundation/Locales/DefaultResource.cs create mode 100644 src/Foundation/ThingsGateway.Foundation/Locales/en-US.json create mode 100644 src/Foundation/ThingsGateway.Foundation/Locales/zh-CN.json create mode 100644 src/Foundation/ThingsGateway.Foundation/Locales/zh-TW.json create mode 100644 src/Foundation/ThingsGateway.Foundation/Localization/JsonLocalizer.cs create mode 100644 src/Foundation/ThingsGateway.Foundation/Logger/TextFileLogger.cs create mode 100644 src/Foundation/ThingsGateway.Foundation/Logger/TextFileReader.cs create mode 100644 src/Foundation/ThingsGateway.Foundation/OperResult/ErrorCodeEnum.cs create mode 100644 src/Foundation/ThingsGateway.Foundation/OperResult/IOperResult.cs create mode 100644 src/Foundation/ThingsGateway.Foundation/OperResult/OperResult.cs create mode 100644 src/Foundation/ThingsGateway.Foundation/OperResult/OperResultExtension.cs create mode 100644 src/Foundation/ThingsGateway.Foundation/OperResult/OperResultUtil.cs create mode 100644 src/Foundation/ThingsGateway.Foundation/OperResult/ReturnErrorException.cs create mode 100644 src/Foundation/ThingsGateway.Foundation/Protocol/IProtocol.cs create mode 100644 src/Foundation/ThingsGateway.Foundation/Protocol/ProtocolBase.cs create mode 100644 src/Foundation/ThingsGateway.Foundation/Protocol/ProtocolBaseExtension.cs create mode 100644 src/Foundation/ThingsGateway.Foundation/Protocol/ProtocolWaitDataStatusExtension.cs create mode 100644 src/Foundation/ThingsGateway.Foundation/Protocol/StructContentPraseExtensions.cs create mode 100644 src/Foundation/ThingsGateway.Foundation/ThingsGateway.Foundation.csproj create mode 100644 src/Foundation/ThingsGateway.Foundation/Trans/EncodingConverter.cs create mode 100644 src/Foundation/ThingsGateway.Foundation/Trans/IThingsGatewayBitConverter.cs create mode 100644 src/Foundation/ThingsGateway.Foundation/Trans/ThingsGatewayBitConverter.cs create mode 100644 src/Foundation/ThingsGateway.Foundation/Trans/ThingsGatewayBitConverterExtension.cs create mode 100644 src/Foundation/ThingsGateway.Foundation/Utils/CRC16Utils.cs create mode 100644 src/Foundation/ThingsGateway.Foundation/Utils/DataTransUtil.cs create mode 100644 src/Foundation/ThingsGateway.Foundation/Utils/JTokenUtil.cs create mode 100644 src/Foundation/ThingsGateway.Foundation/Utils/LocalizerUtil.cs create mode 100644 src/Foundation/ThingsGateway.Foundation/Variable/IVariable.cs create mode 100644 src/Foundation/ThingsGateway.Foundation/Variable/IVariableSource.cs create mode 100644 src/Foundation/ThingsGateway.Foundation/Variable/VariableClass.cs create mode 100644 src/Foundation/ThingsGateway.Foundation/Variable/VariableSourceClass.cs create mode 100644 src/FoundationVersion.props rename src/{ => Gateway}/ThingsGateway.Gateway.Application/Attributes/DynamicMethodAttribute.cs (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Application/Attributes/DynamicPropertyAttribute.cs (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Application/Attributes/EducationPluginAttribute.cs (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Application/Attributes/OnlyWindowsSupportAttribute.cs (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Application/Common/DoTask.cs (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Application/Common/EncodingMapper.cs (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Application/Const/ExportString.cs (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Application/Const/ThingsGatewayCacheConst.cs (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Application/Controler/ConfigInfoControler.cs (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Application/Controler/ControlControler.cs (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Application/Controler/GatewayExportController.cs (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Application/Controler/RuntimeInfoControler.cs (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Application/Entity/BackendLog.cs (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Application/Entity/Channel.cs (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Application/Entity/Device.cs (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Application/Entity/RpcLog.cs (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Application/Entity/Variable.cs (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Application/Enums/AlarmTypeEnum.cs (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Application/Enums/DeviceStatusEnum.cs (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Application/Enums/EventTypeEnum.cs (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Application/Enums/PluginTypeEnum.cs (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Application/Enums/ProtectTypeEnum.cs (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Application/Enums/RedundantTypeEnum.cs (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Application/Enums/ThreadRunReturnTypeEnum.cs (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Application/Extensions/LogExtensions.cs (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Application/Extensions/ResourceExtensions.cs (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Application/Extensions/ServiceCollectionHostedServiceExtensions.cs (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Application/FodyWeavers.xml (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Application/GlobalData/GlobalData.cs (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Application/GlobalUsings.cs (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Application/HostService/AlarmHostedService.cs (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Application/HostService/Device/BusinessDeviceHostedService.cs (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Application/HostService/Device/CollectDeviceHostedService.cs (97%) rename src/{ => Gateway}/ThingsGateway.Gateway.Application/HostService/Device/DeviceHostedService.cs (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Application/HostService/Device/IBusinessDeviceHostedService.cs (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Application/HostService/Device/ICollectDeviceHostedService.cs (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Application/HostService/Device/IDeviceHostedService.cs (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Application/HostService/IAlarmHostedService.cs (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Application/Job/LogJob/LogJob.cs (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Application/Locales/en-US.json (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Application/Locales/zh-CN.json (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Application/Locales/zh-TW.json (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Application/Logging/BackendLogDatabaseLoggingWriter.cs (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Application/Model/AlarmVariable.cs (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Application/Model/CollectDeviceRunTime.cs (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Application/Model/DeviceData.cs (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Application/Model/DeviceRunTime.cs (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Application/Model/DriverMethodInfo.cs (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Application/Model/VariableData.cs (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Application/Model/VariableMethod.cs (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Application/Model/VariableRunTime.cs (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Application/Model/VariableSourceRead.cs (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Application/Plugin/Business/BusinessBase.cs (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Application/Plugin/Business/BusinessPropertyBase.cs (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Application/Plugin/Business/Cache/BusinessBaseWithCacheAlarmModel.cs (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Application/Plugin/Business/Cache/BusinessBaseWithCacheDeviceModel.cs (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Application/Plugin/Business/Cache/BusinessBaseWithCacheVariableModel.cs (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Application/Plugin/Business/Cache/BusinessPropertyWithCache.cs (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Application/Plugin/Business/Cache/Interval/BusinessBaseWithCacheIntervalAlarmModel.cs (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Application/Plugin/Business/Cache/Interval/BusinessBaseWithCacheIntervalDeviceModel.cs (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Application/Plugin/Business/Cache/Interval/BusinessBaseWithCacheIntervalScript.cs (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Application/Plugin/Business/Cache/Interval/BusinessBaseWithCacheIntervalVariableModel.cs (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Application/Plugin/Business/Cache/Interval/BusinessPropertyWithCacheInterval.cs (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Application/Plugin/Business/Cache/Interval/BusinessPropertyWithCacheIntervalDBScript.cs (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Application/Plugin/Business/Cache/Interval/BusinessPropertyWithCacheIntervalScript.cs (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Application/Plugin/Business/Cache/TopicJson.cs (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Application/Plugin/Business/DB/BusinessDatabaseUtil.cs (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Application/Plugin/Business/DB/DBHistoryAlarmPageInput.cs (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Application/Plugin/Business/DB/DBHistoryValuePageInput.cs (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Application/Plugin/Business/DB/IDBHistoryAlarm.cs (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Application/Plugin/Business/DB/IDBHistoryAlarmService.cs (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Application/Plugin/Business/DB/IDBHistoryValue.cs (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Application/Plugin/Business/DB/IDBHistoryValueService.cs (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Application/Plugin/Business/IDriverUIBase.cs (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Application/Plugin/Business/VariablePropertyBase.cs (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Application/Plugin/CacheDB/CacheDB.cs (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Application/Plugin/CacheDB/CacheDBItem.cs (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Application/Plugin/CacheDB/CacheDBOption.cs (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Application/Plugin/CacheDB/CacheDBUtil.cs (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Application/Plugin/ChannelThread.cs (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Application/Plugin/Collect/CollectBase.cs (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Application/Plugin/Collect/CollectPropertyBase.cs (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Application/Plugin/DriverBase.cs (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Application/Plugin/DriverBaseExtension.cs (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Application/Plugin/DriverPropertyBase.cs (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Application/Plugin/DynamicModelExtension.cs (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Application/SeedData/Gateway/seed_gateway_resource.json (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Application/SeedData/Gateway/seed_gateway_resourcebutton.json (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Application/SeedData/SysRelationSeedData.cs (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Application/SeedData/SysResourceSeedData.cs (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Application/Services/Channel/ChannelService.cs (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Application/Services/Channel/IChannelService.cs (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Application/Services/Device/DeviceService.cs (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Application/Services/Device/Dto/DeviceInput.cs (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Application/Services/Device/IDeviceService.cs (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Application/Services/GatewayExport/GatewayExportService.cs (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Application/Services/GatewayExport/IGatewayExportService.cs (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Application/Services/GatewayLogs/BackendLogService.cs (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Application/Services/GatewayLogs/Dto/LogInput.cs (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Application/Services/GatewayLogs/Dto/LogOutput.cs (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Application/Services/GatewayLogs/IBackendLogService.cs (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Application/Services/GatewayLogs/IRpcLogService.cs (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Application/Services/GatewayLogs/RpcLogService.cs (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Application/Services/Plugin/Dto/InternalTableColumn.cs (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Application/Services/Plugin/Dto/PluginInput.cs (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Application/Services/Plugin/Dto/PluginOutput.cs (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Application/Services/Plugin/IPluginService.cs (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Application/Services/Plugin/PluginService.cs (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Application/Services/Plugin/PluginServiceUtil.cs (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Application/Services/Rpc/IRpcService.cs (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Application/Services/Rpc/RpcService.cs (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Application/Services/Variable/Dto/VariableInput.cs (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Application/Services/Variable/IVariableService.cs (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Application/Services/Variable/VariableService.cs (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Application/Startup.cs (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Application/ThingsGateway.Gateway.Application.csproj (82%) rename src/{ => Gateway}/ThingsGateway.Gateway.Razor/Components/QuickActions.razor (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Razor/Components/QuickActions.razor.cs (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Razor/Components/QuickActions.razor.css (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Razor/Components/QuickActions.razor.js (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Razor/Components/ThingsGatewayModuleComponentBase.cs (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Razor/GlobalUsings.cs (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Razor/Locales/en-US.json (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Razor/Locales/zh-CN.json (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Razor/Locales/zh-TW.json (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Razor/Pages/Config/Channel/ChannelEditComponent.razor (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Razor/Pages/Config/Channel/ChannelEditComponent.razor.cs (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Razor/Pages/Config/Channel/ChannelEditComponent.razor.css (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Razor/Pages/Config/Channel/ChannelPage.razor (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Razor/Pages/Config/Channel/ChannelPage.razor.cs (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Razor/Pages/Config/Device/BusinessDevicePage.cs (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Razor/Pages/Config/Device/BusinessPropertyWithCacheIntervalScriptRazor.razor (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Razor/Pages/Config/Device/BusinessPropertyWithCacheIntervalScriptRazor.razor.cs (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Razor/Pages/Config/Device/CollectDevicePage.cs (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Razor/Pages/Config/Device/DeviceEditComponent.razor (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Razor/Pages/Config/Device/DeviceEditComponent.razor.cs (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Razor/Pages/Config/Device/DeviceEditComponent.razor.css (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Razor/Pages/Config/Device/DevicePage.razor (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Razor/Pages/Config/Device/DevicePage.razor.cs (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Razor/Pages/Config/Device/ScriptCheck.razor (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Razor/Pages/Config/Device/ScriptCheck.razor.cs (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Razor/Pages/Config/DriverDebugPage.razor (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Razor/Pages/Config/DriverDebugPage.razor.cs (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Razor/Pages/Config/Plugin/PluginPage.razor (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Razor/Pages/Config/Plugin/PluginPage.razor.cs (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Razor/Pages/Config/Plugin/SavePlugin.razor (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Razor/Pages/Config/Plugin/SavePlugin.razor.cs (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Razor/Pages/Config/Variable/VariableEditComponent.razor (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Razor/Pages/Config/Variable/VariableEditComponent.razor.cs (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Razor/Pages/Config/Variable/VariableEditComponent.razor.css (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Razor/Pages/Config/Variable/VariablePage.razor (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Razor/Pages/Config/Variable/VariablePage.razor.cs (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Razor/Pages/Runtime/DeviceStatus/DeviceStatus.razor (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Razor/Pages/Runtime/DeviceStatus/DeviceStatus.razor.Parameter.cs (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Razor/Pages/Runtime/DeviceStatus/DeviceStatus.razor.cs (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Razor/Pages/Runtime/DeviceStatus/DeviceStatus.razor.css (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Razor/Pages/Runtime/DeviceStatus/DeviceStatus1.razor (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Razor/Pages/Runtime/DeviceStatus/DeviceStatus1.razor.cs (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Razor/Pages/Runtime/DeviceStatus/DeviceStatus1.razor.css (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Razor/Pages/Runtime/DeviceStatus/DeviceStatus2.razor (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Razor/Pages/Runtime/DeviceStatus/DeviceStatus2.razor.cs (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Razor/Pages/Runtime/DeviceStatus/DeviceStatus2.razor.css (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Razor/Pages/Runtime/DeviceStatus/DeviceStatus3.razor (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Razor/Pages/Runtime/DeviceStatus/DeviceStatus3.razor.cs (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Razor/Pages/Runtime/DeviceStatus/DeviceStatus3.razor.css (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Razor/Pages/Runtime/DeviceStatus/DeviceStatusPage.razor (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Razor/Pages/Runtime/DeviceStatus/DeviceStatusPage.razor.cs (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Razor/Pages/Runtime/DeviceStatus/DeviceStatusPage.razor.css (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Razor/Pages/Runtime/RealAlarmPage.razor (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Razor/Pages/Runtime/RealAlarmPage.razor.cs (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Razor/Pages/Runtime/VariableRuntimePage.razor (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Razor/Pages/Runtime/VariableRuntimePage.razor.cs (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Razor/Pages/_Log/BackendLogPage.razor (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Razor/Pages/_Log/BackendLogPage.razor.cs (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Razor/Pages/_Log/RpcLogPage.razor (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Razor/Pages/_Log/RpcLogPage.razor.cs (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Razor/Services/PlatformService.cs (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Razor/Startup.cs (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Razor/TcpServicePage/TcpServicePage.razor (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Razor/TcpServicePage/TcpServicePage.razor.cs (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Razor/ThingsGateway.Gateway.Razor.csproj (87%) rename src/{ => Gateway}/ThingsGateway.Gateway.Razor/_Imports.razor (100%) rename src/{ => Gateway}/ThingsGateway.Gateway.Razor/_Imports.razor.cs (100%) diff --git a/src/DebugTool/ThingsGateway.Debug.Photino/Configuration/App.json b/src/DebugTool/ThingsGateway.Debug.Photino/Configuration/App.json index a88b59ea7..0f550cfb2 100644 --- a/src/DebugTool/ThingsGateway.Debug.Photino/Configuration/App.json +++ b/src/DebugTool/ThingsGateway.Debug.Photino/Configuration/App.json @@ -10,8 +10,8 @@ // nuget动态加载的程序集 "SupportPackageNamePrefixs": [ - "ThingsGateway.Foundation.Razor", - "ThingsGateway.Debug.Razor", + "ThingsGateway.Admin.Application", + "ThingsGateway.Admin.Razor", "ThingsGateway.Core", "ThingsGateway.Razor" diff --git a/src/Directory.Build.props b/src/Directory.Build.props index dac7088a4..bf637d10a 100644 --- a/src/Directory.Build.props +++ b/src/Directory.Build.props @@ -2,8 +2,8 @@ 7.0.1.0 - 9.0.1.0 - 9.0.1.0 + 9.0.1.1 + 9.0.1.1 diff --git a/src/Foundation/ThingsGateway.CSScript/CSharpScriptEngineExtension.cs b/src/Foundation/ThingsGateway.CSScript/CSharpScriptEngineExtension.cs new file mode 100644 index 000000000..b1ec988a8 --- /dev/null +++ b/src/Foundation/ThingsGateway.CSScript/CSharpScriptEngineExtension.cs @@ -0,0 +1,134 @@ +//------------------------------------------------------------------------------ +// 此代码版权声明为全文件覆盖,如有原作者特别声明,会在下方手动补充 +// 此代码版权(除特别声明外的代码)归作者本人Diego所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议 +// Gitee源代码仓库:https://gitee.com/diego2098/ThingsGateway +// Github源代码仓库:https://github.com/kimdiego2098/ThingsGateway +// 使用文档:https://thingsgateway.cn/ +// QQ群:605534569 +//------------------------------------------------------------------------------ + +using System.Reflection; +using System.Text; + +using CSScripting; + +using CSScriptLib; + +using ThingsGateway.NewLife.Caching; +using ThingsGateway.NewLife.Threading; + +namespace ThingsGateway.Gateway.Application; + + +/// +/// 脚本扩展方法 +/// +public static class CSharpScriptEngineExtension +{ + private static string CacheKey = $"{nameof(CSharpScriptEngineExtension)}-{nameof(Do)}"; + + private static object m_waiterLock = new object(); + + /// 清理计时器 + private static TimerX? _clearTimer; + static CSharpScriptEngineExtension() + { + if (_clearTimer == null) + { + _clearTimer = new TimerX(RemoveNotAlive, null, 30 * 1000, 60 * 1000) { Async = true }; + } + } + + private static void RemoveNotAlive(Object? state) + { + //检测缓存 + try + { + var data = Instance.GetAll(); + lock (m_waiterLock) + { + + foreach (var item in data) + { + if (item.Value!.ExpiredTime < item.Value.VisitTime + 1800_000) + { + Instance.Remove(item.Key); + item.Value?.Value?.GetType().Assembly.Unload(); + GC.Collect(); + } + } + } + } + catch + { + } + + } + + private static MemoryCache Instance { get; set; } = new MemoryCache(); + + /// + /// 执行脚本获取返回值 + /// + public static T Do(string source, params Assembly[] assemblies) where T : class + { + var field = $"{CacheKey}-{source}"; + var runScript = Instance.Get(field); + if (runScript == null) + { + lock (m_waiterLock) + { + runScript = Instance.Get(field); + if (runScript == null) + { + + var src = source.Split(Environment.NewLine.ToCharArray(), StringSplitOptions.RemoveEmptyEntries); + var _using = new StringBuilder(); + var _body = new StringBuilder(); + src.ToList().ForEach(l => + { + if (l.StartsWith("using ")) + { + _using.AppendLine(l); + } + else + { + _body.AppendLine(l); + } + + }); + var evaluator = CSScript.Evaluator; + foreach (var item in assemblies) + { + evaluator = evaluator.ReferenceAssembly(item.Location); + } + // 动态加载并执行代码 + runScript = evaluator.With(eval => eval.IsAssemblyUnloadingEnabled = true).LoadCode( + $@" + using System; + using System.Linq; + using System.Collections.Generic; + using ThingsGateway.Gateway.Application; + using ThingsGateway.NewLife; + using ThingsGateway.NewLife.Extension; + using ThingsGateway.Gateway.Application.Extensions; + {_using} + {_body} + "); + GC.Collect(); + Instance.Set(field, runScript); + } + } + + } + Instance.SetExpire(field, TimeSpan.FromHours(1)); + + return runScript; + } + + + +} + + diff --git a/src/Foundation/ThingsGateway.CSScript/ExpressionEvaluatorExtension.cs b/src/Foundation/ThingsGateway.CSScript/ExpressionEvaluatorExtension.cs new file mode 100644 index 000000000..6a1ac5b02 --- /dev/null +++ b/src/Foundation/ThingsGateway.CSScript/ExpressionEvaluatorExtension.cs @@ -0,0 +1,170 @@ +//------------------------------------------------------------------------------ +// 此代码版权声明为全文件覆盖,如有原作者特别声明,会在下方手动补充 +// 此代码版权(除特别声明外的代码)归作者本人Diego所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议 +// Gitee源代码仓库:https://gitee.com/diego2098/ThingsGateway +// Github源代码仓库:https://github.com/kimdiego2098/ThingsGateway +// 使用文档:https://thingsgateway.cn/ +// QQ群:605534569 +//------------------------------------------------------------------------------ + +using CSScripting; + +using CSScriptLib; + +using System.Text; + +using ThingsGateway.NewLife.Caching; +using ThingsGateway.NewLife.Threading; + +namespace ThingsGateway.Gateway.Application.Extensions; + +/// +/// 读写表达式脚本 +/// +public interface ReadWriteExpressions +{ + /// + /// 获取新值 + /// + /// + /// + object GetNewValue(object a); +} + +/// +/// 表达式扩展 +/// +public static class ExpressionEvaluatorExtension +{ + private static string CacheKey = $"{nameof(ExpressionEvaluatorExtension)}-{nameof(GetReadWriteExpressions)}"; + + private static object m_waiterLock = new object(); + + /// 清理计时器 + private static TimerX? _clearTimer; + static ExpressionEvaluatorExtension() + { + if (_clearTimer == null) + { + _clearTimer = new TimerX(RemoveNotAlive, null, 30 * 1000, 60 * 1000) { Async = true }; + } + } + + private static void RemoveNotAlive(Object? state) + { + //检测缓存 + try + { + var data = Instance.GetAll(); + lock (m_waiterLock) + { + + foreach (var item in data) + { + if (item.Value!.ExpiredTime < item.Value.VisitTime + 1800_000) + { + Instance.Remove(item.Key); + item.Value?.Value?.GetType().Assembly.Unload(); + GC.Collect(); + } + } + } + } + catch + { + } + + } + + private static MemoryCache Instance { get; set; } = new MemoryCache(); + + /// + /// 添加或获取脚本,非线程安全 + /// + /// + /// + public static ReadWriteExpressions GetOrAddScript(string source) + { + var field = $"{CacheKey}-{source}"; + var runScript = Instance.Get(field); + if (runScript == null) + { + if (!source.Contains("return")) + { + source = $"return {source}";//只判断简单脚本中可省略return字符串 + } + + var src = source.Split(Environment.NewLine.ToCharArray(), StringSplitOptions.RemoveEmptyEntries); + var _using = new StringBuilder(); + var _body = new StringBuilder(); + src.ToList().ForEach(l => + { + if (l.StartsWith("using ")) + { + _using.AppendLine(l); + } + else + { + _body.AppendLine(l); + } + + }); + // 动态加载并执行代码 + runScript = CSScript.Evaluator.With(eval => eval.IsAssemblyUnloadingEnabled = true).LoadCode( + $@" + using System; + using System.Linq; + using System.Collections.Generic; + using ThingsGateway.Gateway.Application; + using ThingsGateway.NewLife; + using ThingsGateway.NewLife.Extension; + using ThingsGateway.Gateway.Application.Extensions; + {_using} + public class Script:ReadWriteExpressions + {{ + public object GetNewValue(object raw) + {{ + {_body}; + }} + }} + "); + GC.Collect(); + Instance.Set(field, runScript); + } + return runScript; + } + + /// + /// 计算表达式:例如:(int)raw*100,raw为原始值 + /// + public static object GetExpressionsResult(this string expressions, object rawvalue) + { + if (string.IsNullOrWhiteSpace(expressions)) + { + return rawvalue; + } + var readWriteExpressions = GetReadWriteExpressions(expressions); + var value = readWriteExpressions.GetNewValue(rawvalue); + return value; + } + + /// + /// 执行脚本获取返回值ReadWriteExpressions + /// + public static ReadWriteExpressions GetReadWriteExpressions(string source) + { + var field = $"{CacheKey}-{source}"; + var runScript = Instance.Get(field); + if (runScript == null) + { + lock (m_waiterLock) + { + runScript = GetOrAddScript(source); + } + } + Instance.SetExpire(field, TimeSpan.FromHours(1)); + + return runScript; + } +} diff --git a/src/Foundation/ThingsGateway.CSScript/ThingsGateway.CSScript.csproj b/src/Foundation/ThingsGateway.CSScript/ThingsGateway.CSScript.csproj new file mode 100644 index 000000000..333f841ec --- /dev/null +++ b/src/Foundation/ThingsGateway.CSScript/ThingsGateway.CSScript.csproj @@ -0,0 +1,16 @@ + + + + + + netstandard2.0;net8.0;net6.0; + + + + + + + + + + diff --git a/src/Foundation/ThingsGateway.Foundation.Razor/DebugPages/AdapterDebugBase.cs b/src/Foundation/ThingsGateway.Foundation.Razor/DebugPages/AdapterDebugBase.cs new file mode 100644 index 000000000..90ac6e40b --- /dev/null +++ b/src/Foundation/ThingsGateway.Foundation.Razor/DebugPages/AdapterDebugBase.cs @@ -0,0 +1,115 @@ +//------------------------------------------------------------------------------ +// 此代码版权声明为全文件覆盖,如有原作者特别声明,会在下方手动补充 +// 此代码版权(除特别声明外的代码)归作者本人Diego所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议 +// Gitee源代码仓库:https://gitee.com/diego2098/ThingsGateway +// Github源代码仓库:https://github.com/kimdiego2098/ThingsGateway +// 使用文档:https://thingsgateway.cn/ +// QQ群:605534569 +//------------------------------------------------------------------------------ + +namespace ThingsGateway.Debug; + +using Microsoft.AspNetCore.Components; +using Microsoft.Extensions.Localization; + +using ThingsGateway.Foundation; +using ThingsGateway.Foundation.Json.Extension; + +using TouchSocket.Core; + +/// +/// 调试UI +/// +public abstract class AdapterDebugBase : ComponentBase, IDisposable +{ + /// + ~AdapterDebugBase() + { + this.SafeDispose(); + } + + /// + /// 长度 + /// + public int ArrayLength { get; set; } = 1; + + /// + /// 默认读写设备 + /// + [Parameter] + public IProtocol Plc { get; set; } + + /// + /// 变量地址 + /// + public string RegisterAddress { get; set; } = "400001"; + + /// + /// 写入值 + /// + public string WriteValue { get; set; } + + /// + /// 数据类型 + /// + protected DataTypeEnum DataType { get; set; } = DataTypeEnum.Int16; + + [Inject] + private IStringLocalizer Localizer { get; set; } + + /// + public void Dispose() + { + Plc?.SafeDispose(); + GC.SuppressFinalize(this); + } + + /// + public virtual async Task ReadAsync() + { + if (Plc != null) + { + try + { + var data = await Plc.ReadAsync(RegisterAddress, ArrayLength, DataType); + if (data.IsSuccess) + { + Plc.Logger?.LogInformation(data.Content.ToJsonNetString()); + } + else + { + Plc.Logger?.Warning(data.ToString()); + } + } + catch (Exception ex) + { + Plc.Logger?.Exception(ex); + } + } + } + + /// + public virtual async Task WriteAsync() + { + if (Plc != null) + { + try + { + var data = await Plc.WriteAsync(RegisterAddress, WriteValue.GetJTokenFromString(), DataType); + if (data.IsSuccess) + { + Plc.Logger?.LogInformation($" {WriteValue.GetJTokenFromString()} {Localizer["WriteSuccess"]}"); + } + else + { + Plc.Logger?.Warning(data.ToString()); + } + } + catch (Exception ex) + { + Plc.Logger?.Exception(ex); + } + } + } +} diff --git a/src/Foundation/ThingsGateway.Foundation.Razor/DebugPages/AdapterDebugComponent.razor b/src/Foundation/ThingsGateway.Foundation.Razor/DebugPages/AdapterDebugComponent.razor new file mode 100644 index 000000000..c368b6d64 --- /dev/null +++ b/src/Foundation/ThingsGateway.Foundation.Razor/DebugPages/AdapterDebugComponent.razor @@ -0,0 +1,120 @@ +@using Microsoft.AspNetCore.Components.Web; +@using Microsoft.JSInterop; +@using ThingsGateway.Extension +@using ThingsGateway.Foundation +@using ThingsGateway.Foundation.Json.Extension +@using BootstrapBlazor.Components +@namespace ThingsGateway.Debug +@inherits AdapterDebugBase + +
+ +
+ + + @if (ShowDefaultReadWriteContent) + { + + + + +
+ +
+ +
+ + +