Compare commits
	
		
			31 Commits
		
	
	
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|   | 27e8653a1a | ||
|   | 863beda82c | ||
|   | bac84c3ecd | ||
|   | 2fca2ad9f8 | ||
|   | dd75286fe0 | ||
|   | 7f91792cf1 | ||
|   | 0e0ccad311 | ||
|   | 0691f72e67 | ||
|   | 7e38a51720 | ||
|   | 34ca8243a3 | ||
|   | 112fea7632 | ||
|   | 378763e4ee | ||
|   | 517bd0394d | ||
|   | 70adb97fb5 | ||
|   | 623d44cabe | ||
|   | 0d479ca00b | ||
|   | 8bc49ef437 | ||
|   | f83fcec786 | ||
|   | 93690ce40d | ||
|   | f82c5f2f27 | ||
|   | a83c1c3899 | ||
|   | 91d6aed109 | ||
|   | db8f8fe51d | ||
|   | 4596004b17 | ||
|   | d5540906cb | ||
|   | 90796a979d | ||
|   | 2190a87772 | ||
|   | c5953b83f8 | ||
|   | 24bc60abf0 | ||
|   | 31eee6b009 | ||
|   | c5da565a8f | 
| @@ -1,6 +1,6 @@ | ||||
| <Project> | ||||
| 	<PropertyGroup> | ||||
| 		<Version>3.0.0.3</Version> | ||||
| 		<Version>3.0.0.13</Version> | ||||
| 		<LangVersion>latest</LangVersion> | ||||
| 		<TargetFrameworks>net6.0;net7.0</TargetFrameworks> | ||||
| 		<Authors>Diego</Authors> | ||||
|   | ||||
| @@ -13,3 +13,4 @@ | ||||
| global using System; | ||||
|  | ||||
| global using ThingsGateway.Components; | ||||
|  | ||||
|   | ||||
| @@ -12,6 +12,8 @@ | ||||
|  | ||||
| using Microsoft.AspNetCore.Components; | ||||
|  | ||||
| using ThingsGateway.Components; | ||||
|  | ||||
| namespace ThingsGateway.Foundation.Demo; | ||||
| using LogLevel = Microsoft.Extensions.Logging.LogLevel; | ||||
| /// <summary> | ||||
| @@ -69,7 +71,7 @@ public abstract class DriverDebugUIBase : ComponentBase, IDisposable | ||||
|         _periodicTimer?.Dispose(); | ||||
|     } | ||||
|     /// <inheritdoc/> | ||||
|     public void LogOut(ThingsGateway.Foundation.LogLevel logLevel, object source, string message, Exception exception) | ||||
|     public void LogOut(ThingsGateway.Foundation.Core.LogLevel logLevel, object source, string message, Exception exception) | ||||
|     { | ||||
|         Messages.Add(((LogLevel)logLevel, | ||||
|             $"{DateTimeExtensions.CurrentDateTime.ToDefaultDateTimeFormat(InitTimezone.TimezoneOffset)} - {message} {exception}")); | ||||
|   | ||||
| @@ -13,7 +13,7 @@ | ||||
| @using BlazorComponent; | ||||
| @using Microsoft.AspNetCore.Components.Web; | ||||
| @using Microsoft.JSInterop; | ||||
| @using ThingsGateway.Foundation; | ||||
| @using ThingsGateway.Foundation.Core; | ||||
| @using Masa.Blazor; | ||||
| @namespace ThingsGateway.Foundation.Demo | ||||
| @inherits DriverDebugUIBase | ||||
|   | ||||
| @@ -15,7 +15,7 @@ | ||||
| @using Microsoft.AspNetCore.Components.Web; | ||||
| @using System.IO.Ports; | ||||
| @using System.Collections.Concurrent; | ||||
| @using ThingsGateway.Foundation; | ||||
| @using ThingsGateway.Foundation.Core; | ||||
| @using Masa.Blazor | ||||
| <MCard Elevation="1" Rounded="false" Class="pa-2" Style="width:100%"> | ||||
|     <div class="mb-4">通道配置</div> | ||||
|   | ||||
| @@ -15,7 +15,7 @@ | ||||
| @using Microsoft.AspNetCore.Components.Web; | ||||
| @using System.IO.Ports; | ||||
| @using System.Collections.Concurrent; | ||||
| @using ThingsGateway.Foundation; | ||||
| @using ThingsGateway.Foundation.Core; | ||||
| @using Masa.Blazor | ||||
|  | ||||
| <MCard Elevation="1" Rounded="false" Class="pa-2" Style="width:100%"> | ||||
|   | ||||
| @@ -15,7 +15,7 @@ | ||||
| @using Microsoft.AspNetCore.Components.Web; | ||||
| @using System.IO.Ports; | ||||
| @using System.Collections.Concurrent; | ||||
| @using ThingsGateway.Foundation; | ||||
| @using ThingsGateway.Foundation.Core; | ||||
| @using Masa.Blazor | ||||
|  | ||||
| <MCard Elevation="1" Rounded="false" Class="pa-2" Style="width:100%"> | ||||
|   | ||||
| @@ -15,5 +15,7 @@ global using System.Threading; | ||||
| global using System.Threading.Tasks; | ||||
|  | ||||
| global using ThingsGateway.Components; | ||||
| global using ThingsGateway.Foundation.Core; | ||||
| global using ThingsGateway.Foundation.Serial; | ||||
| global using ThingsGateway.Foundation.Sockets; | ||||
|  | ||||
|   | ||||
| @@ -124,6 +124,15 @@ public partial class MainLayout | ||||
|         "Title": "OPCUAClient" | ||||
|       } | ||||
|     ] | ||||
|   }, | ||||
|   { | ||||
|     "Title": "Mqtt", | ||||
|     "Children": [ | ||||
|       { | ||||
|         "Href": "/MqttClient", | ||||
|         "Title": "MqttClient" | ||||
|       } | ||||
|     ] | ||||
|   } | ||||
| ] | ||||
|  | ||||
| @@ -135,6 +144,15 @@ public partial class MainLayout | ||||
|         var dataStringPro = | ||||
| """ | ||||
| [ | ||||
|   { | ||||
|     "Title": "Melsec", | ||||
|     "Children": [ | ||||
|       { | ||||
|         "Href": "/QnA3E_Binary", | ||||
|         "Title": "QnA3E_Binary" | ||||
|       } | ||||
|     ] | ||||
|   }, | ||||
|   { | ||||
|     "Title": "ABCIP", | ||||
|     "Children": [ | ||||
|   | ||||
| @@ -4,6 +4,14 @@ | ||||
| 		<DefineConstants>Pro</DefineConstants> | ||||
| 	</PropertyGroup> | ||||
| 	<ItemGroup Condition="'$(SolutionName)'=='ThingsGateway - Pro'"> | ||||
|  | ||||
|  | ||||
|  | ||||
| 		<Compile Include="..\..\PluginPro\ThingsGateway.Plugin.Melsec\Page\QnA3E_BinaryDebugPage.razor.cs" Link="Pages\Melsec\QnA3E_BinaryDebugPage.razor.cs" /> | ||||
| 		<Content Include="..\..\PluginPro\ThingsGateway.Plugin.Melsec\Page\QnA3E_BinaryDebugPage.razor" Link="Pages\Melsec\QnA3E_BinaryDebugPage.razor" /> | ||||
| 		<ProjectReference Include="..\..\FoundationPro\ThingsGateway.Foundation.Adapter.Melsec\ThingsGateway.Foundation.Adapter.Melsec.csproj" /> | ||||
|  | ||||
| 		 | ||||
| 		 | ||||
| 		<Compile Include="..\..\PluginPro\ThingsGateway.Plugin.AllenBradleyCip\Page\AllenBradleyCipTcpDebugPage.razor.cs" Link="Pages\ABCIP\AllenBradleyCipTcpDebugPage.razor.cs" /> | ||||
| 		<Content Include="..\..\PluginPro\ThingsGateway.Plugin.AllenBradleyCip\Page\AllenBradleyCipTcpDebugPage.razor" Link="Pages\ABCIP\AllenBradleyCipTcpDebugPage.razor" /> | ||||
| @@ -45,6 +53,13 @@ | ||||
|  | ||||
| 	<ItemGroup> | ||||
| 		<Compile Include="..\..\Plugin\ThingsGateway.Plugin.DLT645\Page\DLT645_2007DebugPage.razor.cs" Link="Pages\DLT645\DLT645_2007DebugPage.razor.cs" /> | ||||
| 		<Compile Include="..\..\Plugin\ThingsGateway.Plugin.Mqtt\MqttRpcNameVaueWithId.cs" Link="Pages\Mqtt\MqttRpcNameVaueWithId.cs" /> | ||||
| 		<Compile Include="..\..\Plugin\ThingsGateway.Plugin.Mqtt\Page\MqttClientDebugPage.razor.cs" Link="Pages\Mqtt\MqttClientDebugPage.razor.cs" /> | ||||
| 		<Compile Include="..\..\Plugin\ThingsGateway.Plugin.Mqtt\Page\MqttClientPage.razor.cs" Link="Pages\Mqtt\MqttClientPage.razor.cs" /> | ||||
| 		<Compile Include="..\..\Plugin\ThingsGateway.Plugin.Mqtt\PrivateLogger.cs" Link="Pages\Mqtt\PrivateLogger.cs" /> | ||||
| 		<Compile Include="..\..\Plugin\ThingsGateway.Plugin.Mqtt\RpcClass\MqttRpcClient.cs" Link="Pages\Mqtt\MqttRpcClient.cs" /> | ||||
| 		<Compile Include="..\..\Plugin\ThingsGateway.Plugin.Mqtt\RpcClass\MqttRpcClientExtensions.cs" Link="Pages\Mqtt\MqttRpcClientExtensions.cs" /> | ||||
| 		<Compile Include="..\..\Plugin\ThingsGateway.Plugin.Mqtt\RpcClass\MqttRpcTopicPair.cs" Link="Pages\Mqtt\MqttRpcTopicPair.cs" /> | ||||
| 		<Content Include="..\..\Plugin\ThingsGateway.Plugin.DLT645\Page\DLT645_2007DebugPage.razor" Link="Pages\DLT645\DLT645_2007DebugPage.razor" /> | ||||
| 		<Compile Include="..\..\Plugin\ThingsGateway.Plugin.DLT645\Page\DLT645_2007OverTcpDebugPage.razor.cs" Link="Pages\DLT645\DLT645_2007OverTcpDebugPage.razor.cs" /> | ||||
| 		<Content Include="..\..\Plugin\ThingsGateway.Plugin.DLT645\Page\DLT645_2007OverTcpDebugPage.razor" Link="Pages\DLT645\DLT645_2007OverTcpDebugPage.razor" /> | ||||
| @@ -100,12 +115,20 @@ | ||||
| 	</ItemGroup> | ||||
|  | ||||
|  | ||||
| 	<ItemGroup> | ||||
| 		<ProjectReference Include="..\..\Foundation\ThingsGateway.Foundation.Adapter.DLT645\ThingsGateway.Foundation.Adapter.DLT645.csproj" /> | ||||
| 	<ItemGroup > | ||||
| 		<PackageReference Include="ThingsGateway.Foundation.Adapter.DLT645" Version="*" /> | ||||
| 		<PackageReference Include="ThingsGateway.Foundation.Adapter.Modbus" Version="*" /> | ||||
| 		<PackageReference Include="ThingsGateway.Foundation.Adapter.OPCDA" Version="*" /> | ||||
| 		<PackageReference Include="ThingsGateway.Foundation.Adapter.OPCUA" Version="*" /> | ||||
| 		<PackageReference Include="ThingsGateway.Foundation.Adapter.Siemens" Version="*" /> | ||||
| 		<!--<ProjectReference Include="..\..\Foundation\ThingsGateway.Foundation.Adapter.DLT645\ThingsGateway.Foundation.Adapter.DLT645.csproj" /> | ||||
| 		<ProjectReference Include="..\..\Foundation\ThingsGateway.Foundation.Adapter.Modbus\ThingsGateway.Foundation.Adapter.Modbus.csproj" /> | ||||
| 		<ProjectReference Include="..\..\Foundation\ThingsGateway.Foundation.Adapter.OPCDA\ThingsGateway.Foundation.Adapter.OPCDA.csproj" /> | ||||
| 		<ProjectReference Include="..\..\Foundation\ThingsGateway.Foundation.Adapter.OPCUA\ThingsGateway.Foundation.Adapter.OPCUA.csproj" /> | ||||
| 		<ProjectReference Include="..\..\Foundation\ThingsGateway.Foundation.Adapter.Siemens\ThingsGateway.Foundation.Adapter.Siemens.csproj" /> | ||||
| 		<ProjectReference Include="..\..\Foundation\ThingsGateway.Foundation.Adapter.Siemens\ThingsGateway.Foundation.Adapter.Siemens.csproj" />--> | ||||
|  | ||||
| 	</ItemGroup> | ||||
| 	<ItemGroup > | ||||
| 		<ProjectReference Include="..\..\Web\ThingsGateway.Components\ThingsGateway.Components.csproj" /> | ||||
| 	</ItemGroup> | ||||
|  | ||||
| @@ -118,4 +141,12 @@ | ||||
|  | ||||
|  | ||||
|  | ||||
| 	<ItemGroup> | ||||
| 	  <Content Include="..\..\Plugin\ThingsGateway.Plugin.Mqtt\Page\MqttClientDebugPage.razor" Link="Pages\Mqtt\MqttClientDebugPage.razor" /> | ||||
| 	  <Content Include="..\..\Plugin\ThingsGateway.Plugin.Mqtt\Page\MqttClientPage.razor" Link="Pages\Mqtt\MqttClientPage.razor" /> | ||||
| 		<PackageReference Include="MQTTnet" Version="4.3.1.873" /> | ||||
| 	</ItemGroup> | ||||
|  | ||||
|  | ||||
|  | ||||
| </Project> | ||||
|   | ||||
| @@ -19,7 +19,7 @@ | ||||
| @using BlazorComponent | ||||
| @using Masa.Blazor | ||||
| @using Masa.Blazor.Presets | ||||
| @using ThingsGateway.Foundation; | ||||
| @using ThingsGateway.Foundation.Core; | ||||
| @using ThingsGateway.Components; | ||||
| @using ThingsGateway.Core; | ||||
| @using System.Net.Http.Json | ||||
|   | ||||
| @@ -1,9 +1,12 @@ | ||||
| <Project> | ||||
| 	<PropertyGroup> | ||||
| 		<Version>3.0.0.3</Version> | ||||
| 		<Version>3.0.0.13</Version> | ||||
| 		<GenerateDocumentationFile>True</GenerateDocumentationFile> | ||||
| 		<LangVersion>latest</LangVersion> | ||||
| 		<TargetFrameworks>net45;netstandard2.0;net6.0;net7.0</TargetFrameworks> | ||||
| 		<Description> | ||||
| 			ThingsGateway.Foundation是工业设备通讯类库,归属于ThingsGateway边缘网关项目,说明文档:https://diego2098.gitee.io/thingsgateway-docs/ | ||||
| 		</Description> | ||||
| 		<Authors>Diego</Authors> | ||||
| 		<Product>ThingsGateway</Product> | ||||
| 		<Copyright>© 2023-present Diego</Copyright> | ||||
| @@ -16,7 +19,6 @@ | ||||
| 		<PackageReadmeFile>README.md</PackageReadmeFile> | ||||
| 		<PackageIcon>icon.png</PackageIcon> | ||||
| 		<IncludeSymbols>true</IncludeSymbols> | ||||
| 		<SymbolPackageFormat>snupkg</SymbolPackageFormat> | ||||
| 		<PackageLicenseExpression>Apache-2.0</PackageLicenseExpression> | ||||
| 		<PackageProjectUrl>https://diego2098.gitee.io/thingsgateway-docs/</PackageProjectUrl> | ||||
| 		<PackageTags>ThingsGateway;Diego;dotNET China;Blazor;设备采集;边缘网关</PackageTags> | ||||
| @@ -42,5 +44,10 @@ | ||||
| 		</None> | ||||
| 	</ItemGroup> | ||||
|  | ||||
|  | ||||
| 	<PropertyGroup Condition="'$(Configuration)' == 'Release'"> | ||||
| 		<DebugSymbols>True</DebugSymbols> | ||||
| 		<DebugType>Embedded</DebugType> | ||||
| 		<EmbedAllSources>True</EmbedAllSources> | ||||
| 	</PropertyGroup> | ||||
| 	 | ||||
| </Project> | ||||
| @@ -10,7 +10,6 @@ | ||||
| //------------------------------------------------------------------------------ | ||||
| #endregion | ||||
|  | ||||
| using System.Collections.Generic; | ||||
| using System.Text; | ||||
|  | ||||
| using ThingsGateway.Foundation.Extension.Generic; | ||||
|   | ||||
| @@ -10,7 +10,6 @@ | ||||
| //------------------------------------------------------------------------------ | ||||
| #endregion | ||||
|  | ||||
| using System.Collections.Generic; | ||||
| using System.ComponentModel; | ||||
|  | ||||
| using ThingsGateway.Foundation.Extension.Generic; | ||||
|   | ||||
| @@ -20,15 +20,12 @@ public class DLT645_2007Message : MessageBase, IMessage | ||||
|     public override int HeadBytesLength => -1; | ||||
|  | ||||
|     /// <inheritdoc/> | ||||
|     public override bool CheckHeadBytes(byte[] head) | ||||
|     public override bool CheckHeadBytes(byte[] heads) | ||||
|     { | ||||
|         BodyLength = -1; | ||||
|         return true; | ||||
|     } | ||||
|  | ||||
|     /// <inheritdoc/> | ||||
|     protected override void SendBytesThen() | ||||
|     { | ||||
|     } | ||||
|  | ||||
|  | ||||
| } | ||||
| @@ -10,7 +10,6 @@ | ||||
| //------------------------------------------------------------------------------ | ||||
| #endregion | ||||
|  | ||||
| using System.Collections.Generic; | ||||
| using System.ComponentModel; | ||||
|  | ||||
| using ThingsGateway.Foundation.Extension.Generic; | ||||
|   | ||||
| @@ -10,8 +10,6 @@ | ||||
| //------------------------------------------------------------------------------ | ||||
| #endregion | ||||
|  | ||||
| using System.Collections.Generic; | ||||
|  | ||||
| namespace ThingsGateway.Foundation.Adapter.DLT645; | ||||
|  | ||||
| internal static class PackHelper | ||||
|   | ||||
| @@ -11,9 +11,11 @@ | ||||
| #endregion | ||||
|  | ||||
| global using System; | ||||
| global using System.Collections.Generic; | ||||
| global using System.Linq; | ||||
| global using System.Threading; | ||||
| global using System.Threading.Tasks; | ||||
|  | ||||
| global using ThingsGateway.Foundation.Core; | ||||
| global using ThingsGateway.Foundation.Serial; | ||||
| global using ThingsGateway.Foundation.Sockets; | ||||
|   | ||||
| @@ -1,442 +0,0 @@ | ||||
| <?xml version="1.0"?> | ||||
| <doc> | ||||
|     <assembly> | ||||
|         <name>ThingsGateway.Foundation.Adapter.DLT645</name> | ||||
|     </assembly> | ||||
|     <members> | ||||
|         <member name="T:ThingsGateway.Foundation.Adapter.DLT645.DataInfo"> | ||||
|             <summary> | ||||
|             解析参数 | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="P:ThingsGateway.Foundation.Adapter.DLT645.DataInfo.ByteLength"> | ||||
|             <summary> | ||||
|             解析长度 | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="P:ThingsGateway.Foundation.Adapter.DLT645.DataInfo.Digtal"> | ||||
|             <summary> | ||||
|             小数位 | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="P:ThingsGateway.Foundation.Adapter.DLT645.DataInfo.IsSigned"> | ||||
|             <summary> | ||||
|             有符号解析 | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="M:ThingsGateway.Foundation.Adapter.DLT645.DLT645Helper.GetDataInfos(System.Byte[])"> | ||||
|             <summary> | ||||
|             获取返回的解析信息 | ||||
|             </summary> | ||||
|             <param name="buffer"></param> | ||||
|             <returns></returns> | ||||
|         </member> | ||||
|         <member name="M:ThingsGateway.Foundation.Adapter.DLT645.DLT645Helper.GetDLT645_2007Command(System.String,System.Int32,System.Byte,System.String,System.Byte[],System.String[])"> | ||||
|             <summary> | ||||
|             获取DLT645报文 | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="T:ThingsGateway.Foundation.Adapter.DLT645.DLT645_2007"> | ||||
|             <summary> | ||||
|             DLT645_2007 | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="M:ThingsGateway.Foundation.Adapter.DLT645.DLT645_2007.#ctor(ThingsGateway.Foundation.Serial.SerialSession)"> | ||||
|             <summary> | ||||
|             DLT645_2007 | ||||
|             </summary> | ||||
|             <param name="serialSession"></param> | ||||
|         </member> | ||||
|         <member name="P:ThingsGateway.Foundation.Adapter.DLT645.DLT645_2007.EnableFEHead"> | ||||
|             <summary> | ||||
|             增加FE FE FE FE的报文头部 | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="P:ThingsGateway.Foundation.Adapter.DLT645.DLT645_2007.OperCode"> | ||||
|             <summary> | ||||
|             写入需操作员代码 | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="P:ThingsGateway.Foundation.Adapter.DLT645.DLT645_2007.Password"> | ||||
|             <summary> | ||||
|             写入密码 | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="P:ThingsGateway.Foundation.Adapter.DLT645.DLT645_2007.Station"> | ||||
|             <summary> | ||||
|             通讯地址BCD码,一般应该是12个字符 | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="M:ThingsGateway.Foundation.Adapter.DLT645.DLT645_2007.GetAddressDescription"> | ||||
|             <inheritdoc/> | ||||
|         </member> | ||||
|         <member name="M:ThingsGateway.Foundation.Adapter.DLT645.DLT645_2007.ReadAsync(System.String,System.Int32,System.Threading.CancellationToken)"> | ||||
|             <inheritdoc/> | ||||
|         </member> | ||||
|         <member name="M:ThingsGateway.Foundation.Adapter.DLT645.DLT645_2007.SetDataAdapter"> | ||||
|             <inheritdoc/> | ||||
|         </member> | ||||
|         <member name="M:ThingsGateway.Foundation.Adapter.DLT645.DLT645_2007.WriteAsync(System.String,System.String,System.Threading.CancellationToken)"> | ||||
|             <inheritdoc/> | ||||
|         </member> | ||||
|         <member name="M:ThingsGateway.Foundation.Adapter.DLT645.DLT645_2007.WriteAsync(System.String,System.Byte[],System.Threading.CancellationToken)"> | ||||
|             <inheritdoc/> | ||||
|         </member> | ||||
|         <member name="M:ThingsGateway.Foundation.Adapter.DLT645.DLT645_2007.WriteAsync(System.String,System.UInt32,System.Threading.CancellationToken)"> | ||||
|             <inheritdoc/> | ||||
|         </member> | ||||
|         <member name="M:ThingsGateway.Foundation.Adapter.DLT645.DLT645_2007.WriteAsync(System.String,System.Byte,System.Threading.CancellationToken)"> | ||||
|             <inheritdoc/> | ||||
|         </member> | ||||
|         <member name="M:ThingsGateway.Foundation.Adapter.DLT645.DLT645_2007.WriteAsync(System.String,System.Double,System.Threading.CancellationToken)"> | ||||
|             <inheritdoc/> | ||||
|         </member> | ||||
|         <member name="M:ThingsGateway.Foundation.Adapter.DLT645.DLT645_2007.WriteAsync(System.String,System.Single,System.Threading.CancellationToken)"> | ||||
|             <inheritdoc/> | ||||
|         </member> | ||||
|         <member name="M:ThingsGateway.Foundation.Adapter.DLT645.DLT645_2007.WriteAsync(System.String,System.Int64,System.Threading.CancellationToken)"> | ||||
|             <inheritdoc/> | ||||
|         </member> | ||||
|         <member name="M:ThingsGateway.Foundation.Adapter.DLT645.DLT645_2007.WriteAsync(System.String,System.UInt64,System.Threading.CancellationToken)"> | ||||
|             <inheritdoc/> | ||||
|         </member> | ||||
|         <member name="M:ThingsGateway.Foundation.Adapter.DLT645.DLT645_2007.WriteAsync(System.String,System.UInt16,System.Threading.CancellationToken)"> | ||||
|             <inheritdoc/> | ||||
|         </member> | ||||
|         <member name="M:ThingsGateway.Foundation.Adapter.DLT645.DLT645_2007.WriteAsync(System.String,System.Int16,System.Threading.CancellationToken)"> | ||||
|             <inheritdoc/> | ||||
|         </member> | ||||
|         <member name="M:ThingsGateway.Foundation.Adapter.DLT645.DLT645_2007.WriteAsync(System.String,System.Int32,System.Threading.CancellationToken)"> | ||||
|             <inheritdoc/> | ||||
|         </member> | ||||
|         <member name="M:ThingsGateway.Foundation.Adapter.DLT645.DLT645_2007.WriteAsync(System.String,System.Boolean[],System.Threading.CancellationToken)"> | ||||
|             <inheritdoc/> | ||||
|         </member> | ||||
|         <member name="M:ThingsGateway.Foundation.Adapter.DLT645.DLT645_2007.BroadcastTime(System.DateTime,System.Threading.CancellationToken)"> | ||||
|             <summary> | ||||
|             广播校时 | ||||
|             </summary> | ||||
|             <param name="dateTime"></param> | ||||
|             <param name="cancellationToken"></param> | ||||
|             <returns></returns> | ||||
|         </member> | ||||
|         <member name="M:ThingsGateway.Foundation.Adapter.DLT645.DLT645_2007.FreezeAsync(System.DateTime,System.Threading.CancellationToken)"> | ||||
|             <summary> | ||||
|             冻结 | ||||
|             </summary> | ||||
|             <param name="dateTime"></param> | ||||
|             <param name="cancellationToken"></param> | ||||
|             <returns></returns> | ||||
|         </member> | ||||
|         <member name="M:ThingsGateway.Foundation.Adapter.DLT645.DLT645_2007.ReadDeviceStationAsync(System.Threading.CancellationToken)"> | ||||
|             <summary> | ||||
|             读取通信地址 | ||||
|             </summary> | ||||
|             <param name="cancellationToken"></param> | ||||
|             <returns></returns> | ||||
|         </member> | ||||
|         <member name="M:ThingsGateway.Foundation.Adapter.DLT645.DLT645_2007.WriteBaudRateAsync(System.Int32,System.Threading.CancellationToken)"> | ||||
|             <summary> | ||||
|             修改波特率 | ||||
|             </summary> | ||||
|             <param name="baudRate"></param> | ||||
|             <param name="cancellationToken"></param> | ||||
|             <returns></returns> | ||||
|         </member> | ||||
|         <member name="M:ThingsGateway.Foundation.Adapter.DLT645.DLT645_2007.WriteDeviceStationAsync(System.String,System.Threading.CancellationToken)"> | ||||
|             <summary> | ||||
|             更新通信地址 | ||||
|             </summary> | ||||
|             <param name="station"></param> | ||||
|             <param name="cancellationToken"></param> | ||||
|             <returns></returns> | ||||
|         </member> | ||||
|         <member name="M:ThingsGateway.Foundation.Adapter.DLT645.DLT645_2007.WritePasswordAsync(System.Byte,System.String,System.String,System.Threading.CancellationToken)"> | ||||
|             <summary> | ||||
|             修改密码 | ||||
|             </summary> | ||||
|             <param name="level"></param> | ||||
|             <param name="oldPassword"></param> | ||||
|             <param name="newPassword"></param> | ||||
|             <param name="cancellationToken"></param> | ||||
|             <returns></returns> | ||||
|         </member> | ||||
|         <member name="T:ThingsGateway.Foundation.Adapter.DLT645.ControlCode"> | ||||
|             <summary> | ||||
|             控制码 | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="F:ThingsGateway.Foundation.Adapter.DLT645.ControlCode.Read"> | ||||
|             <summary> | ||||
|             读数据 | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="F:ThingsGateway.Foundation.Adapter.DLT645.ControlCode.ReadSub"> | ||||
|             <summary> | ||||
|             读后续数据 | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="F:ThingsGateway.Foundation.Adapter.DLT645.ControlCode.ReadStation"> | ||||
|             <summary> | ||||
|             读站号 | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="F:ThingsGateway.Foundation.Adapter.DLT645.ControlCode.Write"> | ||||
|             <summary> | ||||
|             写数据 | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="F:ThingsGateway.Foundation.Adapter.DLT645.ControlCode.WriteStation"> | ||||
|             <summary> | ||||
|             写站号 | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="F:ThingsGateway.Foundation.Adapter.DLT645.ControlCode.BroadcastTime"> | ||||
|             <summary> | ||||
|             广播校时 | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="F:ThingsGateway.Foundation.Adapter.DLT645.ControlCode.Freeze"> | ||||
|             <summary> | ||||
|             冻结 | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="F:ThingsGateway.Foundation.Adapter.DLT645.ControlCode.WriteBaudRate"> | ||||
|             <summary> | ||||
|             更新波特率 | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="F:ThingsGateway.Foundation.Adapter.DLT645.ControlCode.WritePassword"> | ||||
|             <summary> | ||||
|             更新密码 | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="T:ThingsGateway.Foundation.Adapter.DLT645.DLT645_2007Address"> | ||||
|             <summary> | ||||
|             DLT645_2007Address | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="M:ThingsGateway.Foundation.Adapter.DLT645.DLT645_2007Address.#ctor"> | ||||
|             <summary> | ||||
|             <inheritdoc/> | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="M:ThingsGateway.Foundation.Adapter.DLT645.DLT645_2007Address.#ctor(System.String,System.UInt16)"> | ||||
|             <inheritdoc/> | ||||
|         </member> | ||||
|         <member name="M:ThingsGateway.Foundation.Adapter.DLT645.DLT645_2007Address.#ctor(System.String,System.Byte[])"> | ||||
|             <inheritdoc/> | ||||
|         </member> | ||||
|         <member name="P:ThingsGateway.Foundation.Adapter.DLT645.DLT645_2007Address.DataId"> | ||||
|             <summary> | ||||
|             数据标识 | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="P:ThingsGateway.Foundation.Adapter.DLT645.DLT645_2007Address.Reverse"> | ||||
|             <summary> | ||||
|             反转解析 | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="P:ThingsGateway.Foundation.Adapter.DLT645.DLT645_2007Address.Station"> | ||||
|             <summary> | ||||
|             站号信息 | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="M:ThingsGateway.Foundation.Adapter.DLT645.DLT645_2007Address.Parse(System.String,System.Int32)"> | ||||
|             <inheritdoc/> | ||||
|         </member> | ||||
|         <member name="M:ThingsGateway.Foundation.Adapter.DLT645.DLT645_2007Address.ParseFrom(System.String,System.Int32)"> | ||||
|             <summary> | ||||
|             解析地址 | ||||
|             </summary> | ||||
|             <param name="address"></param> | ||||
|             <param name="length"></param> | ||||
|             <returns></returns> | ||||
|         </member> | ||||
|         <member name="M:ThingsGateway.Foundation.Adapter.DLT645.DLT645_2007Address.ToString"> | ||||
|             <inheritdoc/> | ||||
|         </member> | ||||
|         <member name="T:ThingsGateway.Foundation.Adapter.DLT645.DLT645_2007BitConverter"> | ||||
|             <summary> | ||||
|             DLT645_2007 | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="M:ThingsGateway.Foundation.Adapter.DLT645.DLT645_2007BitConverter.#ctor(ThingsGateway.Foundation.EndianType)"> | ||||
|             <summary> | ||||
|             DLT645_2007 | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="M:ThingsGateway.Foundation.Adapter.DLT645.DLT645_2007BitConverter.ToDouble(System.Byte[],System.Int32)"> | ||||
|             <summary> | ||||
|             DLT645协议转换double | ||||
|             </summary> | ||||
|             <param name="buffer">带数据项标识</param> | ||||
|             <param name="offset"></param> | ||||
|             <returns></returns> | ||||
|         </member> | ||||
|         <member name="M:ThingsGateway.Foundation.Adapter.DLT645.DLT645_2007BitConverter.ToString(System.Byte[])"> | ||||
|             <inheritdoc/> | ||||
|         </member> | ||||
|         <member name="M:ThingsGateway.Foundation.Adapter.DLT645.DLT645_2007BitConverter.ToString(System.Byte[],System.Int32,System.Int32)"> | ||||
|             <inheritdoc/> | ||||
|         </member> | ||||
|         <member name="T:ThingsGateway.Foundation.Adapter.DLT645.DLT645_2007DataHandleAdapter"> | ||||
|             <summary> | ||||
|             DLT645_2007DataHandleAdapter | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="P:ThingsGateway.Foundation.Adapter.DLT645.DLT645_2007DataHandleAdapter.EnableFEHead"> | ||||
|             <summary> | ||||
|             增加FE FE FE FE的报文头部 | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="M:ThingsGateway.Foundation.Adapter.DLT645.DLT645_2007DataHandleAdapter.PackCommand(System.Byte[])"> | ||||
|             <inheritdoc/> | ||||
|         </member> | ||||
|         <member name="M:ThingsGateway.Foundation.Adapter.DLT645.DLT645_2007DataHandleAdapter.GetInstance"> | ||||
|             <inheritdoc/> | ||||
|         </member> | ||||
|         <member name="M:ThingsGateway.Foundation.Adapter.DLT645.DLT645_2007DataHandleAdapter.UnpackResponse(ThingsGateway.Foundation.Adapter.Modbus.DLT645_2007Message,System.Byte[],System.Byte[],System.Byte[])"> | ||||
|             <inheritdoc/> | ||||
|         </member> | ||||
|         <member name="T:ThingsGateway.Foundation.Adapter.DLT645.DLT645_2007OverTcp"> | ||||
|             <summary> | ||||
|             DLT645_2007 | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="M:ThingsGateway.Foundation.Adapter.DLT645.DLT645_2007OverTcp.#ctor(ThingsGateway.Foundation.TcpClient)"> | ||||
|             <summary> | ||||
|             DLT645_2007 | ||||
|             </summary> | ||||
|             <param name="tcpClient"></param> | ||||
|         </member> | ||||
|         <member name="P:ThingsGateway.Foundation.Adapter.DLT645.DLT645_2007OverTcp.EnableFEHead"> | ||||
|             <summary> | ||||
|             增加FE FE FE FE的报文头部 | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="P:ThingsGateway.Foundation.Adapter.DLT645.DLT645_2007OverTcp.OperCode"> | ||||
|             <summary> | ||||
|             写入需操作员代码 | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="P:ThingsGateway.Foundation.Adapter.DLT645.DLT645_2007OverTcp.Password"> | ||||
|             <summary> | ||||
|             写入密码 | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="P:ThingsGateway.Foundation.Adapter.DLT645.DLT645_2007OverTcp.Station"> | ||||
|             <summary> | ||||
|             通讯地址BCD码,一般应该是12个字符 | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="M:ThingsGateway.Foundation.Adapter.DLT645.DLT645_2007OverTcp.GetAddressDescription"> | ||||
|             <inheritdoc/> | ||||
|         </member> | ||||
|         <member name="M:ThingsGateway.Foundation.Adapter.DLT645.DLT645_2007OverTcp.ReadAsync(System.String,System.Int32,System.Threading.CancellationToken)"> | ||||
|             <inheritdoc/> | ||||
|         </member> | ||||
|         <member name="M:ThingsGateway.Foundation.Adapter.DLT645.DLT645_2007OverTcp.SetDataAdapter"> | ||||
|             <inheritdoc/> | ||||
|         </member> | ||||
|         <member name="M:ThingsGateway.Foundation.Adapter.DLT645.DLT645_2007OverTcp.WriteAsync(System.String,System.String,System.Threading.CancellationToken)"> | ||||
|             <inheritdoc/> | ||||
|         </member> | ||||
|         <member name="M:ThingsGateway.Foundation.Adapter.DLT645.DLT645_2007OverTcp.WriteAsync(System.String,System.Byte[],System.Threading.CancellationToken)"> | ||||
|             <inheritdoc/> | ||||
|         </member> | ||||
|         <member name="M:ThingsGateway.Foundation.Adapter.DLT645.DLT645_2007OverTcp.WriteAsync(System.String,System.UInt32,System.Threading.CancellationToken)"> | ||||
|             <inheritdoc/> | ||||
|         </member> | ||||
|         <member name="M:ThingsGateway.Foundation.Adapter.DLT645.DLT645_2007OverTcp.WriteAsync(System.String,System.Byte,System.Threading.CancellationToken)"> | ||||
|             <inheritdoc/> | ||||
|         </member> | ||||
|         <member name="M:ThingsGateway.Foundation.Adapter.DLT645.DLT645_2007OverTcp.WriteAsync(System.String,System.Double,System.Threading.CancellationToken)"> | ||||
|             <inheritdoc/> | ||||
|         </member> | ||||
|         <member name="M:ThingsGateway.Foundation.Adapter.DLT645.DLT645_2007OverTcp.WriteAsync(System.String,System.Single,System.Threading.CancellationToken)"> | ||||
|             <inheritdoc/> | ||||
|         </member> | ||||
|         <member name="M:ThingsGateway.Foundation.Adapter.DLT645.DLT645_2007OverTcp.WriteAsync(System.String,System.Int64,System.Threading.CancellationToken)"> | ||||
|             <inheritdoc/> | ||||
|         </member> | ||||
|         <member name="M:ThingsGateway.Foundation.Adapter.DLT645.DLT645_2007OverTcp.WriteAsync(System.String,System.UInt64,System.Threading.CancellationToken)"> | ||||
|             <inheritdoc/> | ||||
|         </member> | ||||
|         <member name="M:ThingsGateway.Foundation.Adapter.DLT645.DLT645_2007OverTcp.WriteAsync(System.String,System.UInt16,System.Threading.CancellationToken)"> | ||||
|             <inheritdoc/> | ||||
|         </member> | ||||
|         <member name="M:ThingsGateway.Foundation.Adapter.DLT645.DLT645_2007OverTcp.WriteAsync(System.String,System.Int16,System.Threading.CancellationToken)"> | ||||
|             <inheritdoc/> | ||||
|         </member> | ||||
|         <member name="M:ThingsGateway.Foundation.Adapter.DLT645.DLT645_2007OverTcp.WriteAsync(System.String,System.Int32,System.Threading.CancellationToken)"> | ||||
|             <inheritdoc/> | ||||
|         </member> | ||||
|         <member name="M:ThingsGateway.Foundation.Adapter.DLT645.DLT645_2007OverTcp.WriteAsync(System.String,System.Boolean[],System.Threading.CancellationToken)"> | ||||
|             <inheritdoc/> | ||||
|         </member> | ||||
|         <member name="M:ThingsGateway.Foundation.Adapter.DLT645.DLT645_2007OverTcp.BroadcastTime(System.DateTime,System.Threading.CancellationToken)"> | ||||
|             <summary> | ||||
|             广播校时 | ||||
|             </summary> | ||||
|             <param name="dateTime"></param> | ||||
|             <param name="cancellationToken"></param> | ||||
|             <returns></returns> | ||||
|         </member> | ||||
|         <member name="M:ThingsGateway.Foundation.Adapter.DLT645.DLT645_2007OverTcp.FreezeAsync(System.DateTime,System.Threading.CancellationToken)"> | ||||
|             <summary> | ||||
|             冻结 | ||||
|             </summary> | ||||
|             <param name="dateTime"></param> | ||||
|             <param name="cancellationToken"></param> | ||||
|             <returns></returns> | ||||
|         </member> | ||||
|         <member name="M:ThingsGateway.Foundation.Adapter.DLT645.DLT645_2007OverTcp.ReadDeviceStationAsync(System.Threading.CancellationToken)"> | ||||
|             <summary> | ||||
|             读取通信地址 | ||||
|             </summary> | ||||
|             <param name="cancellationToken"></param> | ||||
|             <returns></returns> | ||||
|         </member> | ||||
|         <member name="M:ThingsGateway.Foundation.Adapter.DLT645.DLT645_2007OverTcp.WriteBaudRateAsync(System.Int32,System.Threading.CancellationToken)"> | ||||
|             <summary> | ||||
|             修改波特率 | ||||
|             </summary> | ||||
|             <param name="baudRate"></param> | ||||
|             <param name="cancellationToken"></param> | ||||
|             <returns></returns> | ||||
|         </member> | ||||
|         <member name="M:ThingsGateway.Foundation.Adapter.DLT645.DLT645_2007OverTcp.WriteDeviceStationAsync(System.String,System.Threading.CancellationToken)"> | ||||
|             <summary> | ||||
|             更新通信地址 | ||||
|             </summary> | ||||
|             <param name="station"></param> | ||||
|             <param name="cancellationToken"></param> | ||||
|             <returns></returns> | ||||
|         </member> | ||||
|         <member name="M:ThingsGateway.Foundation.Adapter.DLT645.DLT645_2007OverTcp.WritePasswordAsync(System.Byte,System.String,System.String,System.Threading.CancellationToken)"> | ||||
|             <summary> | ||||
|             修改密码 | ||||
|             </summary> | ||||
|             <param name="level"></param> | ||||
|             <param name="oldPassword"></param> | ||||
|             <param name="newPassword"></param> | ||||
|             <param name="cancellationToken"></param> | ||||
|             <returns></returns> | ||||
|         </member> | ||||
|         <member name="T:ThingsGateway.Foundation.Adapter.Modbus.DLT645_2007Message"> | ||||
|             <summary> | ||||
|             <inheritdoc/> | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="P:ThingsGateway.Foundation.Adapter.Modbus.DLT645_2007Message.HeadBytesLength"> | ||||
|             <inheritdoc/> | ||||
|         </member> | ||||
|         <member name="M:ThingsGateway.Foundation.Adapter.Modbus.DLT645_2007Message.CheckHeadBytes(System.Byte[])"> | ||||
|             <inheritdoc/> | ||||
|         </member> | ||||
|         <member name="M:ThingsGateway.Foundation.Adapter.Modbus.DLT645_2007Message.SendBytesThen"> | ||||
|             <inheritdoc/> | ||||
|         </member> | ||||
|     </members> | ||||
| </doc> | ||||
| @@ -11,9 +11,11 @@ | ||||
| #endregion | ||||
|  | ||||
| global using System; | ||||
| global using System.Collections.Generic; | ||||
| global using System.Linq; | ||||
| global using System.Threading; | ||||
| global using System.Threading.Tasks; | ||||
|  | ||||
| global using ThingsGateway.Foundation.Core; | ||||
| global using ThingsGateway.Foundation.Serial; | ||||
| global using ThingsGateway.Foundation.Sockets; | ||||
|   | ||||
| @@ -91,9 +91,17 @@ internal class ModbusHelper | ||||
|  | ||||
|             if (response[1] >= 0x80)//错误码 | ||||
|                 return new OperResult<byte[], FilterResult>(GetDescriptionByErrorCode(response[2])) { Content2 = FilterResult.Success }; | ||||
|             if ((response.Length < response[2] + 3)) | ||||
|                 return new OperResult<byte[], FilterResult>("数据长度不足" + response.ToHexString()) { Content2 = FilterResult.Cache }; | ||||
|             if (response[1] <= 0x05) | ||||
|             { | ||||
|                 if ((response.Length < response[2] + 3)) | ||||
|                     return new OperResult<byte[], FilterResult>("数据长度不足" + response.ToHexString()) { Content2 = FilterResult.Cache }; | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|                 if ((response.Length < 6)) | ||||
|                     return new OperResult<byte[], FilterResult>("数据长度不足" + response.ToHexString()) { Content2 = FilterResult.Cache }; | ||||
|  | ||||
|             } | ||||
|  | ||||
|             if (send.Length == 0) | ||||
|             { | ||||
| @@ -126,15 +134,20 @@ internal class ModbusHelper | ||||
|  | ||||
|         if (response[1] >= 0x80)//错误码 | ||||
|             return new OperResult<byte[], FilterResult>(GetDescriptionByErrorCode(response[2])) { Content2 = FilterResult.Success }; | ||||
|         if ((response.Length < response[2] + 5)) | ||||
|             return new OperResult<byte[], FilterResult>("数据长度不足" + response.ToHexString()) { Content2 = FilterResult.Cache }; | ||||
|         if (response[1] <= 0x05) | ||||
|         { | ||||
|             if ((response.Length < response[2] + 5)) | ||||
|                 return new OperResult<byte[], FilterResult>("数据长度不足" + response.ToHexString()) { Content2 = FilterResult.Cache }; | ||||
|  | ||||
|         if (response[2] == 0) | ||||
|         } | ||||
|         else | ||||
|         { | ||||
|             if ((response.Length < 8)) | ||||
|                 return new OperResult<byte[], FilterResult>("数据长度不足" + response.ToHexString()) { Content2 = FilterResult.Cache }; | ||||
|  | ||||
|         } | ||||
|  | ||||
|  | ||||
|         var data = response.SelectMiddle(0, response[2] != 0 ? response[2] + 5 : 8); | ||||
|         if (crcCheck && !EasyCRC16.CheckCRC16(data)) | ||||
|             return new OperResult<byte[], FilterResult>("Crc校验失败" + DataTransUtil.ByteToHexString(data, ' ')) { Content2 = FilterResult.Success }; | ||||
|   | ||||
| @@ -10,7 +10,6 @@ | ||||
| //------------------------------------------------------------------------------ | ||||
| #endregion | ||||
|  | ||||
| using System.Collections.Generic; | ||||
| using System.ComponentModel; | ||||
|  | ||||
| namespace ThingsGateway.Foundation.Adapter.Modbus; | ||||
|   | ||||
| @@ -10,7 +10,6 @@ | ||||
| //------------------------------------------------------------------------------ | ||||
| #endregion | ||||
|  | ||||
|  | ||||
| using ThingsGateway.Foundation.Extension.Generic; | ||||
|  | ||||
| namespace ThingsGateway.Foundation.Adapter.Modbus; | ||||
|   | ||||
| @@ -20,15 +20,12 @@ public class ModbusRtuMessage : MessageBase, IMessage | ||||
|     public override int HeadBytesLength => -1; | ||||
|  | ||||
|     /// <inheritdoc/> | ||||
|     public override bool CheckHeadBytes(byte[] head) | ||||
|     public override bool CheckHeadBytes(byte[] heads) | ||||
|     { | ||||
|         BodyLength = -1; | ||||
|         return true; | ||||
|     } | ||||
|  | ||||
|     /// <inheritdoc/> | ||||
|     protected override void SendBytesThen() | ||||
|     { | ||||
|     } | ||||
|  | ||||
|  | ||||
| } | ||||
| @@ -10,7 +10,6 @@ | ||||
| //------------------------------------------------------------------------------ | ||||
| #endregion | ||||
|  | ||||
| using System.Collections.Generic; | ||||
| using System.ComponentModel; | ||||
|  | ||||
|  | ||||
|   | ||||
| @@ -10,7 +10,6 @@ | ||||
| //------------------------------------------------------------------------------ | ||||
| #endregion | ||||
|  | ||||
| using System.Collections.Generic; | ||||
| using System.ComponentModel; | ||||
|  | ||||
| namespace ThingsGateway.Foundation.Adapter.Modbus; | ||||
|   | ||||
| @@ -11,7 +11,6 @@ | ||||
| #endregion | ||||
|  | ||||
| using System.Collections.Concurrent; | ||||
| using System.Collections.Generic; | ||||
|  | ||||
| using ThingsGateway.Foundation.Extension.Bool; | ||||
| using ThingsGateway.Foundation.Extension.Generic; | ||||
| @@ -25,7 +24,7 @@ public class ModbusSerialServer : ReadWriteDevicesSerialSessionBase | ||||
|     /// <summary> | ||||
|     /// 接收外部写入时,传出变量地址/写入字节组/转换规则/客户端 | ||||
|     /// </summary> | ||||
|     public Func<ModbusAddress, byte[], IThingsGatewayBitConverter, SerialSession, OperResult> WriteData; | ||||
|     public Func<ModbusAddress, byte[], IThingsGatewayBitConverter, SerialSession, Task<OperResult>> WriteData; | ||||
|  | ||||
|     /// <summary> | ||||
|     /// 继电器 | ||||
| @@ -268,12 +267,13 @@ public class ModbusSerialServer : ReadWriteDevicesSerialSessionBase | ||||
|     { | ||||
|         return Task.FromResult(Write(address, value)); | ||||
|     } | ||||
|  | ||||
|     /// <inheritdoc/> | ||||
|     protected override void Received(ByteBlock byteBlock, IRequestInfo requestInfo) | ||||
|     protected override async Task Received(SerialSession client, ReceivedDataEventArgs e) | ||||
|     { | ||||
|         try | ||||
|         { | ||||
|  | ||||
|             var requestInfo = e.RequestInfo; | ||||
|             //接收外部报文 | ||||
|             if (requestInfo is ModbusSerialServerMessage modbusServerMessage) | ||||
|             { | ||||
| @@ -313,7 +313,7 @@ public class ModbusSerialServer : ReadWriteDevicesSerialSessionBase | ||||
|                         if (WriteData != null) | ||||
|                         { | ||||
|                             // 接收外部写入时,传出变量地址/写入字节组/转换规则/客户端 | ||||
|                             if ((WriteData(modbusServerMessage.CurModbusAddress, modbusServerMessage.Content, ThingsGatewayBitConverter, SerialSession)).IsSuccess) | ||||
|                             if ((await WriteData(modbusServerMessage.CurModbusAddress, modbusServerMessage.Content, ThingsGatewayBitConverter, SerialSession)).IsSuccess) | ||||
|                             { | ||||
|                                 var result = Write(modbusServerMessage.CurModbusAddress.ToString(), coreData.ByteToBoolArray(modbusServerMessage.Length)); | ||||
|                                 if (result.IsSuccess) | ||||
| @@ -350,7 +350,7 @@ public class ModbusSerialServer : ReadWriteDevicesSerialSessionBase | ||||
|                         if (WriteData != null) | ||||
|                         { | ||||
|  | ||||
|                             if ((WriteData(modbusServerMessage.CurModbusAddress, modbusServerMessage.Content, ThingsGatewayBitConverter, SerialSession)).IsSuccess) | ||||
|                             if ((await WriteData(modbusServerMessage.CurModbusAddress, modbusServerMessage.Content, ThingsGatewayBitConverter, SerialSession)).IsSuccess) | ||||
|                             { | ||||
|                                 var result = Write(modbusServerMessage.CurModbusAddress.ToString(), coreData); | ||||
|                                 if (result.IsSuccess) | ||||
|   | ||||
| @@ -30,14 +30,11 @@ public class ModbusSerialServerMessage : MessageBase, IMessage | ||||
|     public override int HeadBytesLength => -1; | ||||
|  | ||||
|     /// <inheritdoc/> | ||||
|     public override bool CheckHeadBytes(byte[] head) | ||||
|     public override bool CheckHeadBytes(byte[] heads) | ||||
|     { | ||||
|         BodyLength = -1; | ||||
|         return true; | ||||
|     } | ||||
|  | ||||
|     /// <inheritdoc/> | ||||
|     protected override void SendBytesThen() | ||||
|     { | ||||
|     } | ||||
|  | ||||
| } | ||||
| @@ -10,7 +10,6 @@ | ||||
| //------------------------------------------------------------------------------ | ||||
| #endregion | ||||
|  | ||||
| using System.Collections.Generic; | ||||
| using System.ComponentModel; | ||||
|  | ||||
| namespace ThingsGateway.Foundation.Adapter.Modbus; | ||||
|   | ||||
| @@ -23,10 +23,10 @@ public class ModbusTcpMessage : MessageBase, IMessage | ||||
|     /// </summary> | ||||
|     public bool IsCheckMessageId { get; set; } = false; | ||||
|     /// <inheritdoc/> | ||||
|     public override bool CheckHeadBytes(byte[] head) | ||||
|     public override bool CheckHeadBytes(byte[] heads) | ||||
|     { | ||||
|         if (head == null || head.Length <= 0) return false; | ||||
|         HeadBytes = head; | ||||
|         if (heads == null || heads.Length <= 0) return false; | ||||
|         HeadBytes = heads; | ||||
|  | ||||
|         int num = (HeadBytes[4] * 256) + HeadBytes[5]; | ||||
|         BodyLength = num; | ||||
|   | ||||
| @@ -10,7 +10,6 @@ | ||||
| //------------------------------------------------------------------------------ | ||||
| #endregion | ||||
|  | ||||
| using System.Collections.Generic; | ||||
| using System.ComponentModel; | ||||
|  | ||||
| namespace ThingsGateway.Foundation.Adapter.Modbus; | ||||
| @@ -85,15 +84,6 @@ public class ModbusTcpDtu : ReadWriteDevicesTcpServerBase | ||||
|             return new OperResult<byte[]>(ex); | ||||
|         } | ||||
|     } | ||||
|     /// <summary> | ||||
|     /// <inheritdoc/> | ||||
|     /// </summary> | ||||
|     /// <param name="client"></param> | ||||
|     /// <param name="e"></param> | ||||
|     protected override void Connecting(SocketClient client, ConnectingEventArgs e) | ||||
|     { | ||||
|         Logger?.Debug(client.IP + ":" + client.Port + "正在连接"); | ||||
|     } | ||||
|  | ||||
|     /// <inheritdoc/> | ||||
|     public override void SetDataAdapter(object socketClient = null) | ||||
| @@ -196,7 +186,7 @@ public class ModbusTcpDtu : ReadWriteDevicesTcpServerBase | ||||
|                 var item = commandResult.Content; | ||||
|                 if (FrameTime != 0) | ||||
|                     Thread.Sleep(FrameTime); | ||||
|                 var WaitingClientEx = client.GetWaitingClientEx(new() { BreakTrigger = true }); | ||||
|                 var WaitingClientEx = client.GetWaitingClient(new() { ThrowBreakException = true }); | ||||
|                 var result = WaitingClientEx.SendThenResponse(item, TimeOut, cancellationToken); | ||||
|                 return (MessageBase)result.RequestInfo; | ||||
|             } | ||||
| @@ -223,7 +213,7 @@ public class ModbusTcpDtu : ReadWriteDevicesTcpServerBase | ||||
|  | ||||
|                 var item = commandResult.Content; | ||||
|                 await Task.Delay(FrameTime, cancellationToken); | ||||
|                 var WaitingClientEx = client.GetWaitingClientEx(new() { BreakTrigger = true }); | ||||
|                 var WaitingClientEx = client.GetWaitingClient(new() { ThrowBreakException = true }); | ||||
|                 var result = await WaitingClientEx.SendThenResponseAsync(item, TimeOut, cancellationToken); | ||||
|                 return (MessageBase)result.RequestInfo; | ||||
|             } | ||||
|   | ||||
| @@ -11,7 +11,6 @@ | ||||
| #endregion | ||||
|  | ||||
| using System.Collections.Concurrent; | ||||
| using System.Collections.Generic; | ||||
| using System.ComponentModel; | ||||
|  | ||||
| using ThingsGateway.Foundation.Extension.Bool; | ||||
| @@ -26,7 +25,7 @@ public class ModbusTcpServer : ReadWriteDevicesTcpServerBase | ||||
|     /// <summary> | ||||
|     /// 接收外部写入时,传出变量地址/写入字节组/转换规则/客户端 | ||||
|     /// </summary> | ||||
|     public Func<ModbusAddress, byte[], IThingsGatewayBitConverter, SocketClient, OperResult> WriteData; | ||||
|     public Func<ModbusAddress, byte[], IThingsGatewayBitConverter, SocketClient, Task<OperResult>> WriteData; | ||||
|  | ||||
|     /// <summary> | ||||
|     /// 继电器 | ||||
| @@ -285,12 +284,13 @@ public class ModbusTcpServer : ReadWriteDevicesTcpServerBase | ||||
|     { | ||||
|         return Task.FromResult(Write(address, value)); | ||||
|     } | ||||
|  | ||||
|     /// <inheritdoc/> | ||||
|     protected override void Received(SocketClient client, IRequestInfo requestInfo) | ||||
|     protected override async Task Received(SocketClient client, ReceivedDataEventArgs e) | ||||
|     { | ||||
|         try | ||||
|         { | ||||
|  | ||||
|             var requestInfo = e.RequestInfo; | ||||
|             //接收外部报文 | ||||
|             if (requestInfo is ModbusTcpServerMessage modbusServerMessage) | ||||
|             { | ||||
| @@ -331,7 +331,7 @@ public class ModbusTcpServer : ReadWriteDevicesTcpServerBase | ||||
|                         if (WriteData != null) | ||||
|                         { | ||||
|                             // 接收外部写入时,传出变量地址/写入字节组/转换规则/客户端 | ||||
|                             if ((WriteData(modbusServerMessage.CurModbusAddress, modbusServerMessage.Content, ThingsGatewayBitConverter, client)).IsSuccess) | ||||
|                             if ((await WriteData(modbusServerMessage.CurModbusAddress, modbusServerMessage.Content, ThingsGatewayBitConverter, client)).IsSuccess) | ||||
|                             { | ||||
|                                 var result = Write(modbusServerMessage.CurModbusAddress.ToString(), coreData.ByteToBoolArray(modbusServerMessage.Length)); | ||||
|                                 if (result.IsSuccess) | ||||
| @@ -368,7 +368,7 @@ public class ModbusTcpServer : ReadWriteDevicesTcpServerBase | ||||
|                         if (WriteData != null) | ||||
|                         { | ||||
|  | ||||
|                             if ((WriteData(modbusServerMessage.CurModbusAddress, modbusServerMessage.Content, ThingsGatewayBitConverter, client)).IsSuccess) | ||||
|                             if ((await WriteData(modbusServerMessage.CurModbusAddress, modbusServerMessage.Content, ThingsGatewayBitConverter, client)).IsSuccess) | ||||
|                             { | ||||
|                                 var result = Write(modbusServerMessage.CurModbusAddress.ToString(), coreData); | ||||
|                                 if (result.IsSuccess) | ||||
|   | ||||
| @@ -29,10 +29,10 @@ namespace ThingsGateway.Foundation.Adapter.Modbus | ||||
|         /// <inheritdoc/> | ||||
|         public override int HeadBytesLength => 6; | ||||
|         /// <inheritdoc/> | ||||
|         public override bool CheckHeadBytes(byte[] head) | ||||
|         public override bool CheckHeadBytes(byte[] heads) | ||||
|         { | ||||
|             if (head == null || head.Length != 6) return false; | ||||
|             HeadBytes = head; | ||||
|             if (heads == null || heads.Length != 6) return false; | ||||
|             HeadBytes = heads; | ||||
|  | ||||
|             int num = (HeadBytes[4] * 256) + HeadBytes[5]; | ||||
|             BodyLength = num; | ||||
|   | ||||
| @@ -10,7 +10,6 @@ | ||||
| //------------------------------------------------------------------------------ | ||||
| #endregion | ||||
|  | ||||
| using System.Collections.Generic; | ||||
| using System.ComponentModel; | ||||
|  | ||||
| namespace ThingsGateway.Foundation.Adapter.Modbus; | ||||
|   | ||||
| @@ -10,8 +10,6 @@ | ||||
| //------------------------------------------------------------------------------ | ||||
| #endregion | ||||
|  | ||||
| using System.Collections.Generic; | ||||
|  | ||||
| using ThingsGateway.Foundation.Extension.Generic; | ||||
| using ThingsGateway.Foundation.Extension.String; | ||||
|  | ||||
|   | ||||
| @@ -406,7 +406,7 @@ | ||||
|         <member name="M:ThingsGateway.Foundation.Adapter.Modbus.ModbusServer.WriteAsync(System.String,System.Boolean[],System.Threading.CancellationToken)"> | ||||
|             <inheritdoc/> | ||||
|         </member> | ||||
|         <member name="M:ThingsGateway.Foundation.Adapter.Modbus.ModbusServer.Received(ThingsGateway.Foundation.Sockets.SocketClient,ThingsGateway.Foundation.IRequestInfo)"> | ||||
|         <member name="M:ThingsGateway.Foundation.Adapter.Modbus.ModbusServer.Received(ThingsGateway.Foundation.Sockets.SocketClient,ThingsGateway.Foundation.Core.IRequestInfo)"> | ||||
|             <inheritdoc/> | ||||
|         </member> | ||||
|         <member name="T:ThingsGateway.Foundation.Adapter.Modbus.ModbusServerDataHandleAdapter"> | ||||
| @@ -598,7 +598,7 @@ | ||||
|             PackHelper | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="M:ThingsGateway.Foundation.Adapter.Modbus.PackHelper.ModbusLoadSourceRead``2(ThingsGateway.Foundation.IReadWrite,System.Collections.Generic.List{``1},System.Int32)"> | ||||
|         <member name="M:ThingsGateway.Foundation.Adapter.Modbus.PackHelper.ModbusLoadSourceRead``2(ThingsGateway.Foundation.Core.IReadWrite,System.Collections.Generic.List{``1},System.Int32)"> | ||||
|             <summary> | ||||
|             打包变量,添加到<see href="deviceVariableSourceReads"></see> | ||||
|             </summary> | ||||
|   | ||||
| @@ -1,3 +1,4 @@ | ||||
| <Project Sdk="Microsoft.NET.Sdk"> | ||||
|  | ||||
| 	 | ||||
| </Project> | ||||
|   | ||||
| @@ -1,579 +0,0 @@ | ||||
| <?xml version="1.0"?> | ||||
| <doc> | ||||
|     <assembly> | ||||
|         <name>ThingsGateway.Foundation.Adapter.OPCDA</name> | ||||
|     </assembly> | ||||
|     <members> | ||||
|         <member name="M:ThingsGateway.Foundation.Adapter.OPCDA.CollectionExtensions.RemoveWhere``1(System.Collections.Generic.ICollection{``0},System.Func{``0,System.Boolean})"> | ||||
|             <summary> | ||||
|             移除符合条件的元素 | ||||
|             </summary> | ||||
|             <typeparam name="T"></typeparam> | ||||
|             <param name="this"></param> | ||||
|             <param name="where"></param> | ||||
|         </member> | ||||
|         <member name="F:ThingsGateway.Foundation.Adapter.OPCDA.Comn.ComInterop.LOCALE_SYSTEM_DEFAULT"> | ||||
|             <summary> | ||||
|             The WIN32 system default locale. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="F:ThingsGateway.Foundation.Adapter.OPCDA.Comn.ComInterop.LOCALE_USER_DEFAULT"> | ||||
|             <summary> | ||||
|             The WIN32 user default locale. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="M:ThingsGateway.Foundation.Adapter.OPCDA.Comn.ComInterop.CreateInstance(System.Guid,System.String)"> | ||||
|             <summary> | ||||
|             创建一个COM服务器的实例。 | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="M:ThingsGateway.Foundation.Adapter.OPCDA.Comn.ComInterop.GetSystemMessage(System.Int32)"> | ||||
|             <summary> | ||||
|             指定错误消息文本检索系统。 | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="M:ThingsGateway.Foundation.Adapter.OPCDA.Comn.ComInterop.InitializeSecurity"> | ||||
|             <summary> | ||||
|             初始化COM安全。 | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="M:ThingsGateway.Foundation.Adapter.OPCDA.Comn.ComInterop.ReadClasses(ThingsGateway.Foundation.Adapter.OPCDA.Rcw.IOPCEnumGUID)"> | ||||
|             <summary> | ||||
|             从枚举器读取guid。 | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="M:ThingsGateway.Foundation.Adapter.OPCDA.Comn.ComInterop.ReadClasses(ThingsGateway.Foundation.Adapter.OPCDA.Rcw.IEnumGUID)"> | ||||
|             <summary> | ||||
|             从枚举器读取guid。 | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="M:ThingsGateway.Foundation.Adapter.OPCDA.Comn.ComInterop.RealseComServer(System.Object)"> | ||||
|             <summary> | ||||
|             释放 COM 对象 | ||||
|             </summary> | ||||
|             <param name="m_server"></param> | ||||
|         </member> | ||||
|         <member name="F:ThingsGateway.Foundation.Adapter.OPCDA.Comn.Convert.FILETIME_BaseTime"> | ||||
|             <summary> | ||||
|             windows的filetime是从1601-1-1 00:00:00开始的,datetime是从1-1-1 00:00:00开始的 | ||||
|             datetime和filetime的滴答单位都是100ns(100纳秒,千万分之一秒),所以转换时只需要考虑开始时间即可 | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="T:ThingsGateway.Foundation.Adapter.OPCDA.Da.OnDataChangedHandler"> | ||||
|             <summary> | ||||
|             值变化 | ||||
|             </summary> | ||||
|             <param name="opcItems"></param> | ||||
|         </member> | ||||
|         <member name="T:ThingsGateway.Foundation.Adapter.OPCDA.Da.OnReadCompletedHandler"> | ||||
|             <summary> | ||||
|             读取 | ||||
|             </summary> | ||||
|             <param name="opcItems"></param> | ||||
|         </member> | ||||
|         <member name="T:ThingsGateway.Foundation.Adapter.OPCDA.Da.OnWriteCompletedHandler"> | ||||
|             <summary> | ||||
|             写入 | ||||
|             </summary> | ||||
|             <param name="opcItems"></param> | ||||
|         </member> | ||||
|         <member name="T:ThingsGateway.Foundation.Adapter.OPCDA.Da.ItemReadResult"> | ||||
|             <summary> | ||||
|             返回结果 | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="P:ThingsGateway.Foundation.Adapter.OPCDA.Da.ItemReadResult.Name"> | ||||
|             <summary> | ||||
|             ID | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="P:ThingsGateway.Foundation.Adapter.OPCDA.Da.ItemReadResult.Quality"> | ||||
|             <summary> | ||||
|             Quality | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="P:ThingsGateway.Foundation.Adapter.OPCDA.Da.ItemReadResult.TimeStamp"> | ||||
|             <summary> | ||||
|             TimeStamp | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="P:ThingsGateway.Foundation.Adapter.OPCDA.Da.ItemReadResult.Value"> | ||||
|             <summary> | ||||
|             Value | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="M:ThingsGateway.Foundation.Adapter.OPCDA.Da.OpcGroup.InitIoInterfaces(System.Object)"> | ||||
|             <summary> | ||||
|             建立连接 | ||||
|             </summary> | ||||
|             <param name="handle"></param> | ||||
|         </member> | ||||
|         <member name="M:ThingsGateway.Foundation.Adapter.OPCDA.Da.OpcGroup.ReadAsync"> | ||||
|             <summary> | ||||
|             组读取 | ||||
|             </summary> | ||||
|             <exception cref="T:System.Runtime.InteropServices.ExternalException"></exception> | ||||
|         </member> | ||||
|         <member name="T:ThingsGateway.Foundation.Adapter.OPCDA.Da.OpcItem"> | ||||
|             <summary> | ||||
|             OpcItem | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="M:ThingsGateway.Foundation.Adapter.OPCDA.Da.OpcItem.#ctor(System.String)"> | ||||
|             <summary> | ||||
|             OpcItem | ||||
|             </summary> | ||||
|             <param name="itemId"></param> | ||||
|         </member> | ||||
|         <member name="P:ThingsGateway.Foundation.Adapter.OPCDA.Da.OpcItem.AccessPath"> | ||||
|             <summary> | ||||
|             AccessPath | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="P:ThingsGateway.Foundation.Adapter.OPCDA.Da.OpcItem.Blob"> | ||||
|             <summary> | ||||
|             Blob | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="P:ThingsGateway.Foundation.Adapter.OPCDA.Da.OpcItem.BlobSize"> | ||||
|             <summary> | ||||
|             BlobSize | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="P:ThingsGateway.Foundation.Adapter.OPCDA.Da.OpcItem.ClientHandle"> | ||||
|             <summary> | ||||
|             ClientHandle | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="P:ThingsGateway.Foundation.Adapter.OPCDA.Da.OpcItem.IsActive"> | ||||
|             <summary> | ||||
|             active(1) or not(0) | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="P:ThingsGateway.Foundation.Adapter.OPCDA.Da.OpcItem.ItemID"> | ||||
|             <summary> | ||||
|             数据项在opc server的完全名称 | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="P:ThingsGateway.Foundation.Adapter.OPCDA.Da.OpcItem.Quality"> | ||||
|             <summary> | ||||
|             Quality | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="P:ThingsGateway.Foundation.Adapter.OPCDA.Da.OpcItem.RunTimeDataType"> | ||||
|             <summary> | ||||
|             RunTimeDataType | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="P:ThingsGateway.Foundation.Adapter.OPCDA.Da.OpcItem.ServerHandle"> | ||||
|             <summary> | ||||
|             ServerHandle | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="P:ThingsGateway.Foundation.Adapter.OPCDA.Da.OpcItem.TimeStamp"> | ||||
|             <summary> | ||||
|             TimeStamp | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="P:ThingsGateway.Foundation.Adapter.OPCDA.Da.OpcItem.Value"> | ||||
|             <summary> | ||||
|             Value | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="M:ThingsGateway.Foundation.Adapter.OPCDA.Da.OpcServer.AddGroup(System.String,System.Boolean,System.Int32,System.Single)"> | ||||
|             <returns></returns> | ||||
|         </member> | ||||
|         <member name="M:ThingsGateway.Foundation.Adapter.OPCDA.Da.OpcServer.Browse(System.String)"> | ||||
|             <summary> | ||||
|             获取节点 | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="M:ThingsGateway.Foundation.Adapter.OPCDA.Da.OpcServer.GetServerStatus"> | ||||
|             <summary> | ||||
|             服务器状态 | ||||
|             </summary> | ||||
|             <returns></returns> | ||||
|         </member> | ||||
|         <member name="T:ThingsGateway.Foundation.Adapter.OPCDA.Da.ServerStatus"> | ||||
|             <summary> | ||||
|             ServerStatus | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="P:ThingsGateway.Foundation.Adapter.OPCDA.Da.ServerStatus.CurrentTime"> | ||||
|             <summary> | ||||
|             CurrentTime | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="P:ThingsGateway.Foundation.Adapter.OPCDA.Da.ServerStatus.LastUpdateTime"> | ||||
|             <summary> | ||||
|             LastUpdateTime | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="P:ThingsGateway.Foundation.Adapter.OPCDA.Da.ServerStatus.ServerState"> | ||||
|             <summary> | ||||
|             ServerState | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="P:ThingsGateway.Foundation.Adapter.OPCDA.Da.ServerStatus.StartTime"> | ||||
|             <summary> | ||||
|             StartTime | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="P:ThingsGateway.Foundation.Adapter.OPCDA.Da.ServerStatus.VendorInfo"> | ||||
|             <summary> | ||||
|             VendorInfo | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="P:ThingsGateway.Foundation.Adapter.OPCDA.Da.ServerStatus.Version"> | ||||
|             <summary> | ||||
|             Version | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="T:ThingsGateway.Foundation.Adapter.OPCDA.Discovery.OpcDiscovery"> | ||||
|             <summary> | ||||
|             OpcDiscovery | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="M:ThingsGateway.Foundation.Adapter.OPCDA.Discovery.OpcDiscovery.GetOpcServer(System.String,System.String)"> | ||||
|             <summary> | ||||
|             GetOpcServer | ||||
|             </summary> | ||||
|             <param name="serverName"></param> | ||||
|             <param name="host"></param> | ||||
|             <returns></returns> | ||||
|         </member> | ||||
|         <member name="T:ThingsGateway.Foundation.Adapter.OPCDA.Rcw.IConnectionPoint"> | ||||
|             <exclude /> | ||||
|         </member> | ||||
|         <member name="T:ThingsGateway.Foundation.Adapter.OPCDA.Rcw.IConnectionPointContainer"> | ||||
|             <exclude /> | ||||
|         </member> | ||||
|         <member name="T:ThingsGateway.Foundation.Adapter.OPCDA.Rcw.IEnumConnectionPoints"> | ||||
|             <exclude /> | ||||
|         </member> | ||||
|         <member name="T:ThingsGateway.Foundation.Adapter.OPCDA.Rcw.IEnumConnections"> | ||||
|             <exclude /> | ||||
|         </member> | ||||
|         <member name="T:ThingsGateway.Foundation.Adapter.OPCDA.Rcw.IEnumGUID"> | ||||
|             <exclude /> | ||||
|         </member> | ||||
|         <member name="T:ThingsGateway.Foundation.Adapter.OPCDA.Rcw.IEnumString"> | ||||
|             <exclude /> | ||||
|         </member> | ||||
|         <member name="T:ThingsGateway.Foundation.Adapter.OPCDA.Rcw.IEnumUnknown"> | ||||
|             <exclude /> | ||||
|         </member> | ||||
|         <member name="T:ThingsGateway.Foundation.Adapter.OPCDA.Rcw.IOPCCommon"> | ||||
|             <exclude /> | ||||
|         </member> | ||||
|         <member name="T:ThingsGateway.Foundation.Adapter.OPCDA.Rcw.IOPCEnumGUID"> | ||||
|             <exclude /> | ||||
|         </member> | ||||
|         <member name="T:ThingsGateway.Foundation.Adapter.OPCDA.Rcw.IOPCServerList"> | ||||
|             <exclude /> | ||||
|         </member> | ||||
|         <member name="T:ThingsGateway.Foundation.Adapter.OPCDA.Rcw.IOPCServerList2"> | ||||
|             <exclude /> | ||||
|         </member> | ||||
|         <member name="T:ThingsGateway.Foundation.Adapter.OPCDA.Rcw.IOPCShutdown"> | ||||
|             <exclude /> | ||||
|         </member> | ||||
|         <member name="T:ThingsGateway.Foundation.Adapter.OPCDA.Rcw.CONNECTDATA"> | ||||
|             <exclude /> | ||||
|         </member> | ||||
|         <member name="T:ThingsGateway.Foundation.Adapter.OPCDA.Rcw.OPCBROWSEDIRECTION"> | ||||
|             <exclude /> | ||||
|         </member> | ||||
|         <member name="T:ThingsGateway.Foundation.Adapter.OPCDA.Rcw.OPCBROWSEFILTER"> | ||||
|             <exclude /> | ||||
|         </member> | ||||
|         <member name="T:ThingsGateway.Foundation.Adapter.OPCDA.Rcw.OPCBROWSETYPE"> | ||||
|             <exclude /> | ||||
|         </member> | ||||
|         <member name="T:ThingsGateway.Foundation.Adapter.OPCDA.Rcw.OPCDATASOURCE"> | ||||
|             <exclude /> | ||||
|         </member> | ||||
|         <member name="T:ThingsGateway.Foundation.Adapter.OPCDA.Rcw.OPCENUMSCOPE"> | ||||
|             <exclude /> | ||||
|         </member> | ||||
|         <member name="T:ThingsGateway.Foundation.Adapter.OPCDA.Rcw.OPCEUTYPE"> | ||||
|             <exclude /> | ||||
|         </member> | ||||
|         <member name="T:ThingsGateway.Foundation.Adapter.OPCDA.Rcw.OPCNAMESPACETYPE"> | ||||
|             <exclude /> | ||||
|         </member> | ||||
|         <member name="T:ThingsGateway.Foundation.Adapter.OPCDA.Rcw.OPCSERVERSTATE"> | ||||
|             <exclude /> | ||||
|         </member> | ||||
|         <member name="T:ThingsGateway.Foundation.Adapter.OPCDA.Rcw.CATID_OPCDAServer10"> | ||||
|             <exclude /> | ||||
|         </member> | ||||
|         <member name="T:ThingsGateway.Foundation.Adapter.OPCDA.Rcw.CATID_OPCDAServer20"> | ||||
|             <exclude /> | ||||
|         </member> | ||||
|         <member name="T:ThingsGateway.Foundation.Adapter.OPCDA.Rcw.CATID_OPCDAServer30"> | ||||
|             <exclude /> | ||||
|         </member> | ||||
|         <member name="T:ThingsGateway.Foundation.Adapter.OPCDA.Rcw.CATID_XMLDAServer10"> | ||||
|             <exclude /> | ||||
|         </member> | ||||
|         <member name="T:ThingsGateway.Foundation.Adapter.OPCDA.Rcw.IEnumOPCItemAttributes"> | ||||
|             <exclude /> | ||||
|         </member> | ||||
|         <member name="T:ThingsGateway.Foundation.Adapter.OPCDA.Rcw.IOPCAsyncIO"> | ||||
|             <exclude /> | ||||
|         </member> | ||||
|         <member name="T:ThingsGateway.Foundation.Adapter.OPCDA.Rcw.IOPCAsyncIO2"> | ||||
|             <exclude /> | ||||
|         </member> | ||||
|         <member name="T:ThingsGateway.Foundation.Adapter.OPCDA.Rcw.IOPCAsyncIO3"> | ||||
|             <exclude /> | ||||
|         </member> | ||||
|         <member name="T:ThingsGateway.Foundation.Adapter.OPCDA.Rcw.IOPCBrowse"> | ||||
|             <exclude /> | ||||
|         </member> | ||||
|         <member name="T:ThingsGateway.Foundation.Adapter.OPCDA.Rcw.IOPCBrowseServerAddressSpace"> | ||||
|             <exclude /> | ||||
|         </member> | ||||
|         <member name="T:ThingsGateway.Foundation.Adapter.OPCDA.Rcw.IOPCDataCallback"> | ||||
|             <exclude /> | ||||
|         </member> | ||||
|         <member name="T:ThingsGateway.Foundation.Adapter.OPCDA.Rcw.IOPCGroupStateMgt"> | ||||
|             <exclude /> | ||||
|         </member> | ||||
|         <member name="T:ThingsGateway.Foundation.Adapter.OPCDA.Rcw.IOPCGroupStateMgt2"> | ||||
|             <exclude /> | ||||
|         </member> | ||||
|         <member name="T:ThingsGateway.Foundation.Adapter.OPCDA.Rcw.IOPCItemDeadbandMgt"> | ||||
|             <exclude /> | ||||
|         </member> | ||||
|         <member name="T:ThingsGateway.Foundation.Adapter.OPCDA.Rcw.IOPCItemIO"> | ||||
|             <exclude /> | ||||
|         </member> | ||||
|         <member name="T:ThingsGateway.Foundation.Adapter.OPCDA.Rcw.IOPCItemMgt"> | ||||
|             <exclude /> | ||||
|         </member> | ||||
|         <member name="T:ThingsGateway.Foundation.Adapter.OPCDA.Rcw.IOPCItemProperties"> | ||||
|             <exclude /> | ||||
|         </member> | ||||
|         <member name="T:ThingsGateway.Foundation.Adapter.OPCDA.Rcw.IOPCItemSamplingMgt"> | ||||
|             <exclude /> | ||||
|         </member> | ||||
|         <member name="T:ThingsGateway.Foundation.Adapter.OPCDA.Rcw.IOPCPublicGroupStateMgt"> | ||||
|             <exclude /> | ||||
|         </member> | ||||
|         <member name="T:ThingsGateway.Foundation.Adapter.OPCDA.Rcw.IOPCServer"> | ||||
|             <exclude /> | ||||
|         </member> | ||||
|         <member name="T:ThingsGateway.Foundation.Adapter.OPCDA.Rcw.IOPCServerPublicGroups"> | ||||
|             <exclude /> | ||||
|         </member> | ||||
|         <member name="T:ThingsGateway.Foundation.Adapter.OPCDA.Rcw.IOPCSyncIO"> | ||||
|             <exclude /> | ||||
|         </member> | ||||
|         <member name="T:ThingsGateway.Foundation.Adapter.OPCDA.Rcw.IOPCSyncIO2"> | ||||
|             <exclude /> | ||||
|         </member> | ||||
|         <member name="T:ThingsGateway.Foundation.Adapter.OPCDA.Rcw.OPCBROWSEELEMENT"> | ||||
|             <exclude /> | ||||
|         </member> | ||||
|         <member name="T:ThingsGateway.Foundation.Adapter.OPCDA.Rcw.OPCGROUPHEADER"> | ||||
|             <exclude /> | ||||
|         </member> | ||||
|         <member name="T:ThingsGateway.Foundation.Adapter.OPCDA.Rcw.OPCGROUPHEADERWRITE"> | ||||
|             <exclude /> | ||||
|         </member> | ||||
|         <member name="T:ThingsGateway.Foundation.Adapter.OPCDA.Rcw.OPCITEMATTRIBUTES"> | ||||
|             <exclude /> | ||||
|         </member> | ||||
|         <member name="T:ThingsGateway.Foundation.Adapter.OPCDA.Rcw.OPCITEMDEF"> | ||||
|             <exclude /> | ||||
|         </member> | ||||
|         <member name="T:ThingsGateway.Foundation.Adapter.OPCDA.Rcw.OPCITEMHEADER1"> | ||||
|             <exclude /> | ||||
|         </member> | ||||
|         <member name="T:ThingsGateway.Foundation.Adapter.OPCDA.Rcw.OPCITEMHEADER2"> | ||||
|             <exclude /> | ||||
|         </member> | ||||
|         <member name="T:ThingsGateway.Foundation.Adapter.OPCDA.Rcw.OPCITEMHEADERWRITE"> | ||||
|             <exclude /> | ||||
|         </member> | ||||
|         <member name="T:ThingsGateway.Foundation.Adapter.OPCDA.Rcw.OPCITEMPROPERTIES"> | ||||
|             <exclude /> | ||||
|         </member> | ||||
|         <member name="T:ThingsGateway.Foundation.Adapter.OPCDA.Rcw.OPCITEMPROPERTY"> | ||||
|             <exclude /> | ||||
|         </member> | ||||
|         <member name="T:ThingsGateway.Foundation.Adapter.OPCDA.Rcw.OPCITEMRESULT"> | ||||
|             <exclude /> | ||||
|         </member> | ||||
|         <member name="T:ThingsGateway.Foundation.Adapter.OPCDA.Rcw.OPCITEMSTATE"> | ||||
|             <exclude /> | ||||
|         </member> | ||||
|         <member name="T:ThingsGateway.Foundation.Adapter.OPCDA.Rcw.OPCITEMVQT"> | ||||
|             <exclude /> | ||||
|         </member> | ||||
|         <member name="T:ThingsGateway.Foundation.Adapter.OPCDA.Rcw.OPCSERVERSTATUS"> | ||||
|             <exclude /> | ||||
|         </member> | ||||
|         <member name="T:ThingsGateway.Foundation.Adapter.OPCDA.Rcw.Constants"> | ||||
|             <exclude /> | ||||
|         </member> | ||||
|         <member name="T:ThingsGateway.Foundation.Adapter.OPCDA.Rcw.Qualities"> | ||||
|             <exclude /> | ||||
|         </member> | ||||
|         <member name="T:ThingsGateway.Foundation.Adapter.OPCDA.Rcw.Properties"> | ||||
|             <exclude /> | ||||
|         </member> | ||||
|         <member name="T:ThingsGateway.Foundation.Adapter.OPCDA.DataChangedEventHandler"> | ||||
|             <summary> | ||||
|             订阅变化项 | ||||
|             </summary> | ||||
|             <param name="values"></param> | ||||
|         </member> | ||||
|         <member name="T:ThingsGateway.Foundation.Adapter.OPCDA.OPCDAClient"> | ||||
|             <summary> | ||||
|             OPCDAClient | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="F:ThingsGateway.Foundation.Adapter.OPCDA.OPCDAClient.ItemDicts"> | ||||
|             <summary> | ||||
|             当前保存的需订阅列表 | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="M:ThingsGateway.Foundation.Adapter.OPCDA.OPCDAClient.#ctor(ThingsGateway.Foundation.ILog)"> | ||||
|             <summary> | ||||
|             <inheritdoc/> | ||||
|             </summary> | ||||
|             <param name="logger"></param> | ||||
|         </member> | ||||
|         <member name="E:ThingsGateway.Foundation.Adapter.OPCDA.OPCDAClient.DataChangedHandler"> | ||||
|             <summary> | ||||
|             数据变化事件 | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="P:ThingsGateway.Foundation.Adapter.OPCDA.OPCDAClient.IsConnected"> | ||||
|             <summary> | ||||
|             是否连接成功 | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="P:ThingsGateway.Foundation.Adapter.OPCDA.OPCDAClient.OPCNode"> | ||||
|             <summary> | ||||
|             当前配置 | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="M:ThingsGateway.Foundation.Adapter.OPCDA.OPCDAClient.AddItems(System.Collections.Generic.Dictionary{System.String,System.Collections.Generic.List{ThingsGateway.Foundation.Adapter.OPCDA.Da.OpcItem}})"> | ||||
|             <summary> | ||||
|             添加节点,需要在连接成功后执行 | ||||
|             </summary> | ||||
|             <param name="items">组名称/变量节点,注意每次添加的组名称不能相同</param> | ||||
|         </member> | ||||
|         <member name="M:ThingsGateway.Foundation.Adapter.OPCDA.OPCDAClient.AddItemsWithSave(System.Collections.Generic.List{System.String})"> | ||||
|             <summary> | ||||
|             设置节点并保存,每次重连会自动添加节点 | ||||
|             </summary> | ||||
|             <param name="items"></param> | ||||
|             <returns></returns> | ||||
|         </member> | ||||
|         <member name="M:ThingsGateway.Foundation.Adapter.OPCDA.OPCDAClient.Connect"> | ||||
|             <summary> | ||||
|             连接服务器 | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="M:ThingsGateway.Foundation.Adapter.OPCDA.OPCDAClient.Disconnect"> | ||||
|             <summary> | ||||
|             断开连接 | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="M:ThingsGateway.Foundation.Adapter.OPCDA.OPCDAClient.GetBrowseElements(System.String)"> | ||||
|             <summary> | ||||
|             浏览节点 | ||||
|             </summary> | ||||
|             <param name="itemId"></param> | ||||
|             <returns></returns> | ||||
|         </member> | ||||
|         <member name="M:ThingsGateway.Foundation.Adapter.OPCDA.OPCDAClient.GetServerStatus"> | ||||
|             <summary> | ||||
|             获取服务状态 | ||||
|             </summary> | ||||
|             <returns></returns> | ||||
|         </member> | ||||
|         <member name="M:ThingsGateway.Foundation.Adapter.OPCDA.OPCDAClient.Init(ThingsGateway.Foundation.Adapter.OPCDA.OPCNode)"> | ||||
|             <summary> | ||||
|             初始化设置 | ||||
|             </summary> | ||||
|             <param name="node"></param> | ||||
|         </member> | ||||
|         <member name="M:ThingsGateway.Foundation.Adapter.OPCDA.OPCDAClient.ReadItemsWithGroup(System.String)"> | ||||
|             <summary> | ||||
|             按OPC组读取组内变量,结果会在订阅事件中返回 | ||||
|             </summary> | ||||
|             <param name="groupName">组名称,值为null时读取全部组</param> | ||||
|             <returns></returns> | ||||
|         </member> | ||||
|         <member name="M:ThingsGateway.Foundation.Adapter.OPCDA.OPCDAClient.RemoveItems(System.Collections.Generic.List{System.String})"> | ||||
|             <summary> | ||||
|             移除节点 | ||||
|             </summary> | ||||
|             <param name="items"></param> | ||||
|         </member> | ||||
|         <member name="M:ThingsGateway.Foundation.Adapter.OPCDA.OPCDAClient.ToString"> | ||||
|             <inheritdoc/> | ||||
|         </member> | ||||
|         <member name="M:ThingsGateway.Foundation.Adapter.OPCDA.OPCDAClient.WriteItem(System.Collections.Generic.Dictionary{System.String,Newtonsoft.Json.Linq.JToken})"> | ||||
|             <summary> | ||||
|             批量写入值 | ||||
|             </summary> | ||||
|             <returns></returns> | ||||
|         </member> | ||||
|         <member name="M:ThingsGateway.Foundation.Adapter.OPCDA.OPCDAClient.Dispose(System.Boolean)"> | ||||
|             <inheritdoc/> | ||||
|         </member> | ||||
|         <member name="T:ThingsGateway.Foundation.Adapter.OPCDA.OPCNode"> | ||||
|             <summary> | ||||
|             OPCDA连接配置项 | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="P:ThingsGateway.Foundation.Adapter.OPCDA.OPCNode.ActiveSubscribe"> | ||||
|             <summary> | ||||
|             是否订阅 | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="P:ThingsGateway.Foundation.Adapter.OPCDA.OPCNode.CheckRate"> | ||||
|             <summary> | ||||
|             内部检测重连间隔/min | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="P:ThingsGateway.Foundation.Adapter.OPCDA.OPCNode.DeadBand"> | ||||
|             <summary> | ||||
|             死区 | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="P:ThingsGateway.Foundation.Adapter.OPCDA.OPCNode.GroupSize"> | ||||
|             <summary> | ||||
|             分组大小 | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="P:ThingsGateway.Foundation.Adapter.OPCDA.OPCNode.OPCIP"> | ||||
|             <summary> | ||||
|             OPCIP | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="P:ThingsGateway.Foundation.Adapter.OPCDA.OPCNode.OPCName"> | ||||
|             <summary> | ||||
|             OPCNAME | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="P:ThingsGateway.Foundation.Adapter.OPCDA.OPCNode.UpdateRate"> | ||||
|             <summary> | ||||
|             订阅间隔 | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="M:ThingsGateway.Foundation.Adapter.OPCDA.OPCNode.ToString"> | ||||
|             <summary> | ||||
|             <inheritdoc/> | ||||
|             </summary> | ||||
|             <returns></returns> | ||||
|         </member> | ||||
|     </members> | ||||
| </doc> | ||||
| @@ -1,4 +1,4 @@ | ||||
| #region copyright | ||||
| #region copyright | ||||
| //------------------------------------------------------------------------------ | ||||
| //  此代码版权声明为全文件覆盖,如有原作者特别声明,会在下方手动补充 | ||||
| //  此代码版权(除特别声明外的代码)归作者本人Diego所有 | ||||
| @@ -70,6 +70,11 @@ public class OPCNode | ||||
|     /// </summary> | ||||
|     [Description("安全策略")] | ||||
|     public bool IsUseSecurity { get; set; } = false; | ||||
|     /// <summary> | ||||
|     /// 加载服务端数据类型 | ||||
|     /// </summary> | ||||
|     [Description("加载服务端数据类型")] | ||||
|     public bool LoadType { get; set; } = true; | ||||
|     /// <inheritdoc/> | ||||
|     public override string ToString() | ||||
|     { | ||||
|   | ||||
| @@ -1,4 +1,4 @@ | ||||
| #region copyright | ||||
| #region copyright | ||||
| //------------------------------------------------------------------------------ | ||||
| //  此代码版权声明为全文件覆盖,如有原作者特别声明,会在下方手动补充 | ||||
| //  此代码版权(除特别声明外的代码)归作者本人Diego所有 | ||||
| @@ -200,7 +200,7 @@ public class OPCUAClient : IDisposable | ||||
|     /// <summary> | ||||
|     /// 新增订阅,需要指定订阅组名称,订阅的tag名数组 | ||||
|     /// </summary> | ||||
|     public async Task AddSubscriptionAsync(string subscriptionName, string[] items) | ||||
|     public async Task AddSubscriptionAsync(string subscriptionName, string[] items, bool loadType = true) | ||||
|     { | ||||
|         Subscription m_subscription = new(m_session.DefaultSubscription) | ||||
|         { | ||||
| @@ -213,14 +213,14 @@ public class OPCUAClient : IDisposable | ||||
|             DisplayName = subscriptionName | ||||
|         }; | ||||
|         List<MonitoredItem> monitoredItems = new(); | ||||
|         var variableNodes = loadType ? await ReadNodesAsync(items) : null; | ||||
|         for (int i = 0; i < items.Length; i++) | ||||
|         { | ||||
|             try | ||||
|             { | ||||
|                 var variableNode = await ReadNodeAsync(items[i], false); | ||||
|                 var item = new MonitoredItem | ||||
|                 { | ||||
|                     StartNodeId = variableNode.NodeId, | ||||
|                     StartNodeId = loadType ? variableNodes[i].NodeId : items[i], | ||||
|                     AttributeId = Attributes.Value, | ||||
|                     DisplayName = items[i], | ||||
|                     Filter = OPCNode.DeadBand == 0 ? null : new DataChangeFilter() { DeadbandValue = OPCNode.DeadBand, DeadbandType = (int)DeadbandType.Absolute, Trigger = DataChangeTrigger.StatusValue }, | ||||
| @@ -307,11 +307,11 @@ public class OPCUAClient : IDisposable | ||||
|  | ||||
|     } | ||||
|  | ||||
|     private async void Callback(MonitoredItem monitoreditem, MonitoredItemNotificationEventArgs monitoredItemNotificationEventArgs) | ||||
|     private void Callback(MonitoredItem monitoreditem, MonitoredItemNotificationEventArgs monitoredItemNotificationEventArgs) | ||||
|     { | ||||
|         try | ||||
|         { | ||||
|             var variableNode = await ReadNodeAsync(monitoreditem.StartNodeId.ToString(), false); | ||||
|             var variableNode = ReadNode(monitoreditem.StartNodeId.ToString(), false); | ||||
|             foreach (var value in monitoreditem.DequeueValues()) | ||||
|             { | ||||
|                 if (value.Value != null) | ||||
| @@ -532,7 +532,7 @@ public class OPCUAClient : IDisposable | ||||
|  | ||||
|         //如果是订阅模式,连接时添加订阅组 | ||||
|         if (OPCNode.ActiveSubscribe) | ||||
|             await AddSubscriptionAsync(Guid.NewGuid().ToString(), Variables.ToArray()); | ||||
|             await AddSubscriptionAsync(Guid.NewGuid().ToString(), Variables.ToArray(), OPCNode.LoadType); | ||||
|         return m_session; | ||||
|     } | ||||
|  | ||||
| @@ -680,634 +680,67 @@ public class OPCUAClient : IDisposable | ||||
|                 return value; | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         NodeId nodeToRead = new(nodeIdStr); | ||||
|         var node = (VariableNode)await ReadNodeAsync(nodeToRead, NodeClass.Unspecified, false, cancellationToken); | ||||
|         await typeSystem.LoadType(node.DataType, true, false); | ||||
|         var node = (VariableNode)await m_session.ReadNodeAsync(nodeToRead, NodeClass.Variable, false, cancellationToken); | ||||
|         if (OPCNode.LoadType) | ||||
|             await typeSystem.LoadType(node.DataType); | ||||
|         _variableDicts.AddOrUpdate(nodeIdStr, node); | ||||
|         return node; | ||||
|     } | ||||
|  | ||||
|     /// <summary> | ||||
|     /// 从服务器或缓存读取节点 | ||||
|     /// </summary> | ||||
|     private VariableNode ReadNode(string nodeIdStr, bool isOnlyServer = true) | ||||
|     { | ||||
|         if (!isOnlyServer) | ||||
|         { | ||||
|             if (_variableDicts.TryGetValue(nodeIdStr, out var value)) | ||||
|             { | ||||
|                 return value; | ||||
|             } | ||||
|         } | ||||
|         NodeId nodeToRead = new(nodeIdStr); | ||||
|         var node = (VariableNode)m_session.ReadNode(nodeToRead, NodeClass.Variable, false); | ||||
|         _variableDicts.AddOrUpdate(nodeIdStr, node); | ||||
|         return node; | ||||
|     } | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|     #endregion | ||||
|  | ||||
|  | ||||
|     #region session | ||||
|  | ||||
|     /// <inheritdoc/> | ||||
|     public async Task<Node> ReadNodeAsync( | ||||
|         NodeId nodeId, | ||||
|         NodeClass nodeClass, | ||||
|         bool optionalAttributes = true, | ||||
|         CancellationToken ct = default) | ||||
|     { | ||||
|         // build list of attributes. | ||||
|         var attributes = CreateAttributes(nodeClass, optionalAttributes); | ||||
|  | ||||
|         // build list of values to read. | ||||
|         ReadValueIdCollection itemsToRead = new ReadValueIdCollection(); | ||||
|         foreach (uint attributeId in attributes.Keys) | ||||
|         { | ||||
|             ReadValueId itemToRead = new ReadValueId | ||||
|             { | ||||
|                 NodeId = nodeId, | ||||
|                 AttributeId = attributeId | ||||
|             }; | ||||
|             itemsToRead.Add(itemToRead); | ||||
|         } | ||||
|  | ||||
|         // read from server. | ||||
|         ReadResponse readResponse = await m_session.ReadAsync( | ||||
|             null, | ||||
|             0, | ||||
|             TimestampsToReturn.Neither, | ||||
|             itemsToRead, ct).ConfigureAwait(false); | ||||
|  | ||||
|         DataValueCollection values = readResponse.Results; | ||||
|         DiagnosticInfoCollection diagnosticInfos = readResponse.DiagnosticInfos; | ||||
|  | ||||
|         ClientBase.ValidateResponse(values, itemsToRead); | ||||
|         ClientBase.ValidateDiagnosticInfos(diagnosticInfos, itemsToRead); | ||||
|  | ||||
|         return ProcessReadResponse(readResponse.ResponseHeader, attributes, itemsToRead, values, diagnosticInfos); | ||||
|     } | ||||
|  | ||||
|     /// <summary> | ||||
|     /// Creates a Node based on the read response. | ||||
|     /// 从服务器读取节点 | ||||
|     /// </summary> | ||||
|     private Node ProcessReadResponse( | ||||
|         ResponseHeader responseHeader, | ||||
|         IDictionary<uint, DataValue> attributes, | ||||
|         ReadValueIdCollection itemsToRead, | ||||
|         DataValueCollection values, | ||||
|         DiagnosticInfoCollection diagnosticInfos) | ||||
|     private async Task<List<Node>> ReadNodesAsync(string[] nodeIdStrs, CancellationToken cancellationToken = default) | ||||
|     { | ||||
|         // process results. | ||||
|         int? nodeClass = null; | ||||
|  | ||||
|         for (int ii = 0; ii < itemsToRead.Count; ii++) | ||||
|         List<NodeId> nodeIds = new List<NodeId>(); | ||||
|         foreach (var item in nodeIdStrs) | ||||
|         { | ||||
|             uint attributeId = itemsToRead[ii].AttributeId; | ||||
|  | ||||
|             // the node probably does not exist if the node class is not found. | ||||
|             if (attributeId == Attributes.NodeClass) | ||||
|             NodeId nodeToRead = new(item); | ||||
|             nodeIds.Add(nodeToRead); | ||||
|         } | ||||
|         (IList<Node>, IList<ServiceResult>) nodes = await m_session.ReadNodesAsync(nodeIds, NodeClass.Variable, false, cancellationToken); | ||||
|         for (int i = 0; i < nodes.Item1.Count; i++) | ||||
|         { | ||||
|             if (StatusCode.IsGood(nodes.Item2[i].StatusCode)) | ||||
|             { | ||||
|                 if (!DataValue.IsGood(values[ii])) | ||||
|                 { | ||||
|                     throw ServiceResultException.Create(values[ii].StatusCode, ii, diagnosticInfos, responseHeader.StringTable); | ||||
|                 } | ||||
|  | ||||
|                 // check for valid node class. | ||||
|                 nodeClass = values[ii].Value as int?; | ||||
|  | ||||
|                 if (nodeClass == null) | ||||
|                 { | ||||
|                     throw ServiceResultException.Create(StatusCodes.BadUnexpectedError, "Node does not have a valid value for NodeClass: {0}.", values[ii].Value); | ||||
|                 } | ||||
|                 var node = ((VariableNode)nodes.Item1[i]); | ||||
|                 await typeSystem.LoadType(node.DataType); | ||||
|                 _variableDicts.AddOrUpdate(nodeIdStrs[i], node); | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|                 if (!DataValue.IsGood(values[ii])) | ||||
|                 { | ||||
|                     // check for unsupported attributes. | ||||
|                     if (values[ii].StatusCode == StatusCodes.BadAttributeIdInvalid) | ||||
|                     { | ||||
|                         continue; | ||||
|                     } | ||||
|  | ||||
|                     // ignore errors on optional attributes | ||||
|                     if (StatusCode.IsBad(values[ii].StatusCode)) | ||||
|                     { | ||||
|                         if (attributeId == Attributes.AccessRestrictions || | ||||
|                             attributeId == Attributes.Description || | ||||
|                             attributeId == Attributes.RolePermissions || | ||||
|                             attributeId == Attributes.UserRolePermissions || | ||||
|                             attributeId == Attributes.DataTypeDefinition || | ||||
|                             attributeId == Attributes.AccessLevelEx || | ||||
|                             attributeId == Attributes.UserWriteMask || | ||||
|                             attributeId == Attributes.WriteMask) | ||||
|                         { | ||||
|                             continue; | ||||
|                         } | ||||
|                     } | ||||
|  | ||||
|                     // all supported attributes must be readable. | ||||
|                     if (attributeId != Attributes.Value) | ||||
|                     { | ||||
|                         throw ServiceResultException.Create(values[ii].StatusCode, ii, diagnosticInfos, responseHeader.StringTable); | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|  | ||||
|             attributes[attributeId] = values[ii]; | ||||
|         } | ||||
|  | ||||
|         Node node; | ||||
|         DataValue value; | ||||
|         switch ((NodeClass)nodeClass.Value) | ||||
|         { | ||||
|             default: | ||||
|                 { | ||||
|                     throw ServiceResultException.Create(StatusCodes.BadUnexpectedError, "Node does not have a valid value for NodeClass: {0}.", nodeClass.Value); | ||||
|                 } | ||||
|  | ||||
|             case NodeClass.Object: | ||||
|                 { | ||||
|                     ObjectNode objectNode = new ObjectNode(); | ||||
|  | ||||
|                     value = attributes[Attributes.EventNotifier]; | ||||
|  | ||||
|                     if (value == null) | ||||
|                     { | ||||
|                         throw ServiceResultException.Create(StatusCodes.BadUnexpectedError, "Object does not support the EventNotifier attribute."); | ||||
|                     } | ||||
|  | ||||
|                     objectNode.EventNotifier = (byte)value.GetValue(typeof(byte)); | ||||
|                     node = objectNode; | ||||
|                     break; | ||||
|                 } | ||||
|  | ||||
|             case NodeClass.ObjectType: | ||||
|                 { | ||||
|                     ObjectTypeNode objectTypeNode = new ObjectTypeNode(); | ||||
|  | ||||
|                     value = attributes[Attributes.IsAbstract]; | ||||
|  | ||||
|                     if (value == null) | ||||
|                     { | ||||
|                         throw ServiceResultException.Create(StatusCodes.BadUnexpectedError, "ObjectType does not support the IsAbstract attribute."); | ||||
|                     } | ||||
|  | ||||
|                     objectTypeNode.IsAbstract = (bool)value.GetValue(typeof(bool)); | ||||
|                     node = objectTypeNode; | ||||
|                     break; | ||||
|                 } | ||||
|  | ||||
|             case NodeClass.Variable: | ||||
|                 { | ||||
|                     VariableNode variableNode = new VariableNode(); | ||||
|  | ||||
|                     // DataType Attribute | ||||
|                     value = attributes[Attributes.DataType]; | ||||
|  | ||||
|                     if (value == null) | ||||
|                     { | ||||
|                         throw ServiceResultException.Create(StatusCodes.BadUnexpectedError, "Variable does not support the DataType attribute."); | ||||
|                     } | ||||
|  | ||||
|                     variableNode.DataType = (NodeId)value.GetValue(typeof(NodeId)); | ||||
|  | ||||
|                     // ValueRank Attribute | ||||
|                     value = attributes[Attributes.ValueRank]; | ||||
|  | ||||
|                     if (value == null) | ||||
|                     { | ||||
|                         throw ServiceResultException.Create(StatusCodes.BadUnexpectedError, "Variable does not support the ValueRank attribute."); | ||||
|                     } | ||||
|  | ||||
|                     variableNode.ValueRank = (int)value.GetValue(typeof(int)); | ||||
|  | ||||
|                     // ArrayDimensions Attribute | ||||
|                     value = attributes[Attributes.ArrayDimensions]; | ||||
|  | ||||
|                     if (value != null) | ||||
|                     { | ||||
|                         if (value.Value == null) | ||||
|                         { | ||||
|                             variableNode.ArrayDimensions = Array.Empty<uint>(); | ||||
|                         } | ||||
|                         else | ||||
|                         { | ||||
|                             variableNode.ArrayDimensions = (uint[])value.GetValue(typeof(uint[])); | ||||
|                         } | ||||
|                     } | ||||
|  | ||||
|                     // AccessLevel Attribute | ||||
|                     value = attributes[Attributes.AccessLevel]; | ||||
|  | ||||
|                     if (value == null) | ||||
|                     { | ||||
|                         throw ServiceResultException.Create(StatusCodes.BadUnexpectedError, "Variable does not support the AccessLevel attribute."); | ||||
|                     } | ||||
|  | ||||
|                     variableNode.AccessLevel = (byte)value.GetValue(typeof(byte)); | ||||
|  | ||||
|                     // UserAccessLevel Attribute | ||||
|                     value = attributes[Attributes.UserAccessLevel]; | ||||
|  | ||||
|                     if (value == null) | ||||
|                     { | ||||
|                         throw ServiceResultException.Create(StatusCodes.BadUnexpectedError, "Variable does not support the UserAccessLevel attribute."); | ||||
|                     } | ||||
|  | ||||
|                     variableNode.UserAccessLevel = (byte)value.GetValue(typeof(byte)); | ||||
|  | ||||
|                     // Historizing Attribute | ||||
|                     value = attributes[Attributes.Historizing]; | ||||
|  | ||||
|                     if (value == null) | ||||
|                     { | ||||
|                         throw ServiceResultException.Create(StatusCodes.BadUnexpectedError, "Variable does not support the Historizing attribute."); | ||||
|                     } | ||||
|  | ||||
|                     variableNode.Historizing = (bool)value.GetValue(typeof(bool)); | ||||
|  | ||||
|                     // MinimumSamplingInterval Attribute | ||||
|                     value = attributes[Attributes.MinimumSamplingInterval]; | ||||
|  | ||||
|                     if (value != null) | ||||
|                     { | ||||
|                         variableNode.MinimumSamplingInterval = Convert.ToDouble(attributes[Attributes.MinimumSamplingInterval].Value); | ||||
|                     } | ||||
|  | ||||
|                     // AccessLevelEx Attribute | ||||
|                     value = attributes[Attributes.AccessLevelEx]; | ||||
|  | ||||
|                     if (value != null) | ||||
|                     { | ||||
|                         variableNode.AccessLevelEx = (uint)value.GetValue(typeof(uint)); | ||||
|                     } | ||||
|  | ||||
|                     node = variableNode; | ||||
|                     break; | ||||
|                 } | ||||
|  | ||||
|             case NodeClass.VariableType: | ||||
|                 { | ||||
|                     VariableTypeNode variableTypeNode = new VariableTypeNode(); | ||||
|  | ||||
|                     // IsAbstract Attribute | ||||
|                     value = attributes[Attributes.IsAbstract]; | ||||
|  | ||||
|                     if (value == null) | ||||
|                     { | ||||
|                         throw ServiceResultException.Create(StatusCodes.BadUnexpectedError, "VariableType does not support the IsAbstract attribute."); | ||||
|                     } | ||||
|  | ||||
|                     variableTypeNode.IsAbstract = (bool)value.GetValue(typeof(bool)); | ||||
|  | ||||
|                     // DataType Attribute | ||||
|                     value = attributes[Attributes.DataType]; | ||||
|  | ||||
|                     if (value == null) | ||||
|                     { | ||||
|                         throw ServiceResultException.Create(StatusCodes.BadUnexpectedError, "VariableType does not support the DataType attribute."); | ||||
|                     } | ||||
|  | ||||
|                     variableTypeNode.DataType = (NodeId)value.GetValue(typeof(NodeId)); | ||||
|  | ||||
|                     // ValueRank Attribute | ||||
|                     value = attributes[Attributes.ValueRank]; | ||||
|  | ||||
|                     if (value == null) | ||||
|                     { | ||||
|                         throw ServiceResultException.Create(StatusCodes.BadUnexpectedError, "VariableType does not support the ValueRank attribute."); | ||||
|                     } | ||||
|  | ||||
|                     variableTypeNode.ValueRank = (int)value.GetValue(typeof(int)); | ||||
|  | ||||
|                     // ArrayDimensions Attribute | ||||
|                     value = attributes[Attributes.ArrayDimensions]; | ||||
|  | ||||
|                     if (value != null && value.Value != null) | ||||
|                     { | ||||
|                         variableTypeNode.ArrayDimensions = (uint[])value.GetValue(typeof(uint[])); | ||||
|                     } | ||||
|  | ||||
|                     node = variableTypeNode; | ||||
|                     break; | ||||
|                 } | ||||
|  | ||||
|             case NodeClass.Method: | ||||
|                 { | ||||
|                     MethodNode methodNode = new MethodNode(); | ||||
|  | ||||
|                     // Executable Attribute | ||||
|                     value = attributes[Attributes.Executable]; | ||||
|  | ||||
|                     if (value == null) | ||||
|                     { | ||||
|                         throw ServiceResultException.Create(StatusCodes.BadUnexpectedError, "Method does not support the Executable attribute."); | ||||
|                     } | ||||
|  | ||||
|                     methodNode.Executable = (bool)value.GetValue(typeof(bool)); | ||||
|  | ||||
|                     // UserExecutable Attribute | ||||
|                     value = attributes[Attributes.UserExecutable]; | ||||
|  | ||||
|                     if (value == null) | ||||
|                     { | ||||
|                         throw ServiceResultException.Create(StatusCodes.BadUnexpectedError, "Method does not support the UserExecutable attribute."); | ||||
|                     } | ||||
|  | ||||
|                     methodNode.UserExecutable = (bool)value.GetValue(typeof(bool)); | ||||
|  | ||||
|                     node = methodNode; | ||||
|                     break; | ||||
|                 } | ||||
|  | ||||
|             case NodeClass.DataType: | ||||
|                 { | ||||
|                     DataTypeNode dataTypeNode = new DataTypeNode(); | ||||
|  | ||||
|                     // IsAbstract Attribute | ||||
|                     value = attributes[Attributes.IsAbstract]; | ||||
|  | ||||
|                     if (value == null) | ||||
|                     { | ||||
|                         throw ServiceResultException.Create(StatusCodes.BadUnexpectedError, "DataType does not support the IsAbstract attribute."); | ||||
|                     } | ||||
|  | ||||
|                     dataTypeNode.IsAbstract = (bool)value.GetValue(typeof(bool)); | ||||
|  | ||||
|                     // DataTypeDefinition Attribute | ||||
|                     value = attributes[Attributes.DataTypeDefinition]; | ||||
|  | ||||
|                     if (value != null) | ||||
|                     { | ||||
|                         dataTypeNode.DataTypeDefinition = value.Value as ExtensionObject; | ||||
|                     } | ||||
|  | ||||
|                     node = dataTypeNode; | ||||
|                     break; | ||||
|                 } | ||||
|  | ||||
|             case NodeClass.ReferenceType: | ||||
|                 { | ||||
|                     ReferenceTypeNode referenceTypeNode = new ReferenceTypeNode(); | ||||
|  | ||||
|                     // IsAbstract Attribute | ||||
|                     value = attributes[Attributes.IsAbstract]; | ||||
|  | ||||
|                     if (value == null) | ||||
|                     { | ||||
|                         throw ServiceResultException.Create(StatusCodes.BadUnexpectedError, "ReferenceType does not support the IsAbstract attribute."); | ||||
|                     } | ||||
|  | ||||
|                     referenceTypeNode.IsAbstract = (bool)value.GetValue(typeof(bool)); | ||||
|  | ||||
|                     // Symmetric Attribute | ||||
|                     value = attributes[Attributes.Symmetric]; | ||||
|  | ||||
|                     if (value == null) | ||||
|                     { | ||||
|                         throw ServiceResultException.Create(StatusCodes.BadUnexpectedError, "ReferenceType does not support the Symmetric attribute."); | ||||
|                     } | ||||
|  | ||||
|                     referenceTypeNode.Symmetric = (bool)value.GetValue(typeof(bool)); | ||||
|  | ||||
|                     // InverseName Attribute | ||||
|                     value = attributes[Attributes.InverseName]; | ||||
|  | ||||
|                     if (value != null && value.Value != null) | ||||
|                     { | ||||
|                         referenceTypeNode.InverseName = (LocalizedText)value.GetValue(typeof(LocalizedText)); | ||||
|                     } | ||||
|  | ||||
|                     node = referenceTypeNode; | ||||
|                     break; | ||||
|                 } | ||||
|  | ||||
|             case NodeClass.View: | ||||
|                 { | ||||
|                     ViewNode viewNode = new ViewNode(); | ||||
|  | ||||
|                     // EventNotifier Attribute | ||||
|                     value = attributes[Attributes.EventNotifier]; | ||||
|  | ||||
|                     if (value == null) | ||||
|                     { | ||||
|                         throw ServiceResultException.Create(StatusCodes.BadUnexpectedError, "View does not support the EventNotifier attribute."); | ||||
|                     } | ||||
|  | ||||
|                     viewNode.EventNotifier = (byte)value.GetValue(typeof(byte)); | ||||
|  | ||||
|                     // ContainsNoLoops Attribute | ||||
|                     value = attributes[Attributes.ContainsNoLoops]; | ||||
|  | ||||
|                     if (value == null) | ||||
|                     { | ||||
|                         throw ServiceResultException.Create(StatusCodes.BadUnexpectedError, "View does not support the ContainsNoLoops attribute."); | ||||
|                     } | ||||
|  | ||||
|                     viewNode.ContainsNoLoops = (bool)value.GetValue(typeof(bool)); | ||||
|  | ||||
|                     node = viewNode; | ||||
|                     break; | ||||
|                 } | ||||
|         } | ||||
|  | ||||
|         // NodeId Attribute | ||||
|         value = attributes[Attributes.NodeId]; | ||||
|  | ||||
|         if (value == null) | ||||
|         { | ||||
|             throw ServiceResultException.Create(StatusCodes.BadUnexpectedError, "Node does not support the NodeId attribute."); | ||||
|         } | ||||
|  | ||||
|         node.NodeId = (NodeId)value.GetValue(typeof(NodeId)); | ||||
|         node.NodeClass = (NodeClass)nodeClass.Value; | ||||
|  | ||||
|         // BrowseName Attribute | ||||
|         value = attributes[Attributes.BrowseName]; | ||||
|  | ||||
|         if (value == null) | ||||
|         { | ||||
|             throw ServiceResultException.Create(StatusCodes.BadUnexpectedError, "Node does not support the BrowseName attribute."); | ||||
|         } | ||||
|  | ||||
|         node.BrowseName = (QualifiedName)value.GetValue(typeof(QualifiedName)); | ||||
|  | ||||
|         // DisplayName Attribute | ||||
|         value = attributes[Attributes.DisplayName]; | ||||
|  | ||||
|         if (value == null) | ||||
|         { | ||||
|             throw ServiceResultException.Create(StatusCodes.BadUnexpectedError, "Node does not support the DisplayName attribute."); | ||||
|         } | ||||
|  | ||||
|         node.DisplayName = (LocalizedText)value.GetValue(typeof(LocalizedText)); | ||||
|  | ||||
|         // all optional attributes follow | ||||
|  | ||||
|         // Description Attribute | ||||
|         if (attributes.TryGetValue(Attributes.Description, out value) && | ||||
|             value != null && value.Value != null) | ||||
|         { | ||||
|             node.Description = (LocalizedText)value.GetValue(typeof(LocalizedText)); | ||||
|         } | ||||
|  | ||||
|         // WriteMask Attribute | ||||
|         if (attributes.TryGetValue(Attributes.WriteMask, out value) && | ||||
|             value != null) | ||||
|         { | ||||
|             node.WriteMask = (uint)value.GetValue(typeof(uint)); | ||||
|         } | ||||
|  | ||||
|         // UserWriteMask Attribute | ||||
|         if (attributes.TryGetValue(Attributes.UserWriteMask, out value) && | ||||
|             value != null) | ||||
|         { | ||||
|             node.UserWriteMask = (uint)value.GetValue(typeof(uint)); | ||||
|         } | ||||
|  | ||||
|         // RolePermissions Attribute | ||||
|         if (attributes.TryGetValue(Attributes.RolePermissions, out value) && | ||||
|             value != null) | ||||
|         { | ||||
|             ExtensionObject[] rolePermissions = value.Value as ExtensionObject[]; | ||||
|  | ||||
|             if (rolePermissions != null) | ||||
|             { | ||||
|                 node.RolePermissions = new RolePermissionTypeCollection(); | ||||
|  | ||||
|                 foreach (ExtensionObject rolePermission in rolePermissions) | ||||
|                 { | ||||
|                     node.RolePermissions.Add(rolePermission.Body as RolePermissionType); | ||||
|                 } | ||||
|                 _logAction?.Invoke(3, this, $"获取服务器节点信息失败{nodes.Item2[i]}", null); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         // UserRolePermissions Attribute | ||||
|         if (attributes.TryGetValue(Attributes.UserRolePermissions, out value) && | ||||
|             value != null) | ||||
|         { | ||||
|             ExtensionObject[] userRolePermissions = value.Value as ExtensionObject[]; | ||||
|  | ||||
|             if (userRolePermissions != null) | ||||
|             { | ||||
|                 node.UserRolePermissions = new RolePermissionTypeCollection(); | ||||
|  | ||||
|                 foreach (ExtensionObject rolePermission in userRolePermissions) | ||||
|                 { | ||||
|                     node.UserRolePermissions.Add(rolePermission.Body as RolePermissionType); | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         // AccessRestrictions Attribute | ||||
|         if (attributes.TryGetValue(Attributes.AccessRestrictions, out value) && | ||||
|             value != null) | ||||
|         { | ||||
|             node.AccessRestrictions = (ushort)value.GetValue(typeof(ushort)); | ||||
|         } | ||||
|  | ||||
|         return node; | ||||
|         return nodes.Item1.ToList(); | ||||
|     } | ||||
|  | ||||
|  | ||||
|     /// <summary> | ||||
|     /// Create a dictionary of attributes to read for a nodeclass. | ||||
|     /// </summary> | ||||
|     private IDictionary<uint, DataValue> CreateAttributes(NodeClass nodeclass = NodeClass.Unspecified, bool optionalAttributes = true) | ||||
|     { | ||||
|         // Attributes to read for all types of nodes | ||||
|         var attributes = new SortedDictionary<uint, DataValue>() { | ||||
|                 { Attributes.NodeId, null }, | ||||
|                 { Attributes.NodeClass, null }, | ||||
|                 { Attributes.BrowseName, null }, | ||||
|                 { Attributes.DisplayName, null }, | ||||
|             }; | ||||
|  | ||||
|         switch (nodeclass) | ||||
|         { | ||||
|             case NodeClass.Object: | ||||
|                 attributes.Add(Attributes.EventNotifier, null); | ||||
|                 break; | ||||
|  | ||||
|             case NodeClass.Variable: | ||||
|                 attributes.Add(Attributes.DataType, null); | ||||
|                 attributes.Add(Attributes.ValueRank, null); | ||||
|                 attributes.Add(Attributes.ArrayDimensions, null); | ||||
|                 attributes.Add(Attributes.AccessLevel, null); | ||||
|                 attributes.Add(Attributes.UserAccessLevel, null); | ||||
|                 attributes.Add(Attributes.Historizing, null); | ||||
|                 attributes.Add(Attributes.MinimumSamplingInterval, null); | ||||
|                 attributes.Add(Attributes.AccessLevelEx, null); | ||||
|                 break; | ||||
|  | ||||
|             case NodeClass.Method: | ||||
|                 attributes.Add(Attributes.Executable, null); | ||||
|                 attributes.Add(Attributes.UserExecutable, null); | ||||
|                 break; | ||||
|  | ||||
|             case NodeClass.ObjectType: | ||||
|                 attributes.Add(Attributes.IsAbstract, null); | ||||
|                 break; | ||||
|  | ||||
|             case NodeClass.VariableType: | ||||
|                 attributes.Add(Attributes.IsAbstract, null); | ||||
|                 attributes.Add(Attributes.DataType, null); | ||||
|                 attributes.Add(Attributes.ValueRank, null); | ||||
|                 attributes.Add(Attributes.ArrayDimensions, null); | ||||
|                 break; | ||||
|  | ||||
|             case NodeClass.ReferenceType: | ||||
|                 attributes.Add(Attributes.IsAbstract, null); | ||||
|                 attributes.Add(Attributes.Symmetric, null); | ||||
|                 attributes.Add(Attributes.InverseName, null); | ||||
|                 break; | ||||
|  | ||||
|             case NodeClass.DataType: | ||||
|                 attributes.Add(Attributes.IsAbstract, null); | ||||
|                 attributes.Add(Attributes.DataTypeDefinition, null); | ||||
|                 break; | ||||
|  | ||||
|             case NodeClass.View: | ||||
|                 attributes.Add(Attributes.EventNotifier, null); | ||||
|                 attributes.Add(Attributes.ContainsNoLoops, null); | ||||
|                 break; | ||||
|  | ||||
|             default: | ||||
|                 // build complete list of attributes. | ||||
|                 attributes = new SortedDictionary<uint, DataValue> { | ||||
|                         { Attributes.NodeId, null }, | ||||
|                         { Attributes.NodeClass, null }, | ||||
|                         { Attributes.BrowseName, null }, | ||||
|                         { Attributes.DisplayName, null }, | ||||
|                         //{ Attributes.Description, null }, | ||||
|                         //{ Attributes.WriteMask, null }, | ||||
|                         //{ Attributes.UserWriteMask, null }, | ||||
|                         { Attributes.DataType, null }, | ||||
|                         { Attributes.ValueRank, null }, | ||||
|                         { Attributes.ArrayDimensions, null }, | ||||
|                         { Attributes.AccessLevel, null }, | ||||
|                         { Attributes.UserAccessLevel, null }, | ||||
|                         { Attributes.MinimumSamplingInterval, null }, | ||||
|                         { Attributes.Historizing, null }, | ||||
|                         { Attributes.EventNotifier, null }, | ||||
|                         { Attributes.Executable, null }, | ||||
|                         { Attributes.UserExecutable, null }, | ||||
|                         { Attributes.IsAbstract, null }, | ||||
|                         { Attributes.InverseName, null }, | ||||
|                         { Attributes.Symmetric, null }, | ||||
|                         { Attributes.ContainsNoLoops, null }, | ||||
|                         { Attributes.DataTypeDefinition, null }, | ||||
|                         //{ Attributes.RolePermissions, null }, | ||||
|                         //{ Attributes.UserRolePermissions, null }, | ||||
|                         //{ Attributes.AccessRestrictions, null }, | ||||
|                         { Attributes.AccessLevelEx, null } | ||||
|                     }; | ||||
|                 break; | ||||
|         } | ||||
|  | ||||
|         if (optionalAttributes) | ||||
|         { | ||||
|             attributes.Add(Attributes.Description, null); | ||||
|             attributes.Add(Attributes.WriteMask, null); | ||||
|             attributes.Add(Attributes.UserWriteMask, null); | ||||
|             attributes.Add(Attributes.RolePermissions, null); | ||||
|             attributes.Add(Attributes.UserRolePermissions, null); | ||||
|             attributes.Add(Attributes.AccessRestrictions, null); | ||||
|         } | ||||
|  | ||||
|         return attributes; | ||||
|     } | ||||
|  | ||||
|     #endregion | ||||
|  | ||||
|  | ||||
|  | ||||
|     #region 特性 | ||||
|  | ||||
|     /// <summary> | ||||
|   | ||||
| @@ -1,468 +0,0 @@ | ||||
| <?xml version="1.0"?> | ||||
| <doc> | ||||
|     <assembly> | ||||
|         <name>ThingsGateway.Foundation.Adapter.OPCUA</name> | ||||
|     </assembly> | ||||
|     <members> | ||||
|         <member name="M:ThingsGateway.Foundation.Adapter.OPCUA.CollectionExtensions.RemoveWhere``1(System.Collections.Generic.ICollection{``0},System.Func{``0,System.Boolean})"> | ||||
|             <summary> | ||||
|             移除符合条件的元素 | ||||
|             </summary> | ||||
|             <typeparam name="T"></typeparam> | ||||
|             <param name="this"></param> | ||||
|             <param name="where"></param> | ||||
|         </member> | ||||
|         <member name="M:ThingsGateway.Foundation.Adapter.OPCUA.CollectionExtensions.SelectAsync``2(System.Collections.Generic.IEnumerable{``0},System.Func{``0,System.Threading.Tasks.Task{``1}})"> | ||||
|             <summary> | ||||
|             异步Select | ||||
|             </summary> | ||||
|             <typeparam name="T"></typeparam> | ||||
|             <typeparam name="TResult"></typeparam> | ||||
|             <param name="source"></param> | ||||
|             <param name="selector"></param> | ||||
|             <returns></returns> | ||||
|         </member> | ||||
|         <member name="T:ThingsGateway.Foundation.Adapter.OPCUA.FormUtils"> | ||||
|             <summary> | ||||
|             辅助类 | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="M:ThingsGateway.Foundation.Adapter.OPCUA.FormUtils.Browse(Opc.Ua.Client.ISession,Opc.Ua.BrowseDescriptionCollection,System.Boolean)"> | ||||
|             <summary> | ||||
|             Browses the address space and returns the references found. | ||||
|             </summary> | ||||
|             <param name="session">The session.</param> | ||||
|             <param name="nodesToBrowse">The set of browse operations to perform.</param> | ||||
|             <param name="throwOnError">if set to <c>true</c> a exception will be thrown on an error.</param> | ||||
|             <returns> | ||||
|             The references found. Null if an error occurred. | ||||
|             </returns> | ||||
|         </member> | ||||
|         <member name="M:ThingsGateway.Foundation.Adapter.OPCUA.FormUtils.PrepareBrowseNext(Opc.Ua.BrowseResultCollection)"> | ||||
|             <summary> | ||||
|             Create the continuation point collection from the browse result | ||||
|             collection for the BrowseNext service. | ||||
|             </summary> | ||||
|             <param name="browseResultCollection">The browse result collection to use.</param> | ||||
|             <returns>The collection of continuation points for the BrowseNext service.</returns> | ||||
|         </member> | ||||
|         <member name="M:ThingsGateway.Foundation.Adapter.OPCUA.FormUtils.BrowseAsync(Opc.Ua.Client.ISession,Opc.Ua.BrowseDescriptionCollection,System.Boolean,System.Threading.CancellationToken)"> | ||||
|             <summary> | ||||
|             浏览地址空间 | ||||
|             </summary> | ||||
|             <param name="session"></param> | ||||
|             <param name="nodesToBrowse"></param> | ||||
|             <param name="throwOnError"></param> | ||||
|             <param name="cancellationToken"></param> | ||||
|             <returns></returns> | ||||
|             <exception cref="T:Opc.Ua.ServiceResultException"></exception> | ||||
|         </member> | ||||
|         <member name="M:ThingsGateway.Foundation.Adapter.OPCUA.FormUtils.BrowseAsync(Opc.Ua.Client.ISession,Opc.Ua.BrowseDescription,System.Boolean,System.Threading.CancellationToken)"> | ||||
|             <summary> | ||||
|             浏览地址空间 | ||||
|             </summary> | ||||
|             <param name="session"></param> | ||||
|             <param name="nodeToBrowse"></param> | ||||
|             <param name="throwOnError"></param> | ||||
|             <param name="cancellationToken"></param> | ||||
|             <returns></returns> | ||||
|             <exception cref="T:Opc.Ua.ServiceResultException"></exception> | ||||
|         </member> | ||||
|         <member name="M:ThingsGateway.Foundation.Adapter.OPCUA.FormUtils.BrowseSuperTypesAsync(Opc.Ua.Client.ISession,Opc.Ua.NodeId,System.Boolean)"> | ||||
|             <summary> | ||||
|             浏览地址空间并返回指定类型的所有节点 | ||||
|             </summary> | ||||
|             <param name="session"></param> | ||||
|             <param name="typeId"></param> | ||||
|             <param name="throwOnError"></param> | ||||
|             <returns></returns> | ||||
|             <exception cref="T:Opc.Ua.ServiceResultException"></exception> | ||||
|         </member> | ||||
|         <member name="M:ThingsGateway.Foundation.Adapter.OPCUA.FormUtils.CollectFieldsForInstanceAsync(Opc.Ua.Client.ISession,Opc.Ua.NodeId,Opc.Ua.SimpleAttributeOperandCollection,System.Collections.Generic.List{Opc.Ua.NodeId})"> | ||||
|             <summary> | ||||
|             Collects the fields for the instance. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="M:ThingsGateway.Foundation.Adapter.OPCUA.FormUtils.CollectFieldsForType(Opc.Ua.Client.ISession,Opc.Ua.NodeId,Opc.Ua.SimpleAttributeOperandCollection,System.Collections.Generic.List{Opc.Ua.NodeId})"> | ||||
|             <summary> | ||||
|             Collects the fields for the type. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="M:ThingsGateway.Foundation.Adapter.OPCUA.FormUtils.ConstructEventAsync(Opc.Ua.Client.ISession,Opc.Ua.Client.MonitoredItem,Opc.Ua.EventFieldList,System.Collections.Generic.Dictionary{Opc.Ua.NodeId,System.Type},System.Collections.Generic.Dictionary{Opc.Ua.NodeId,Opc.Ua.NodeId})"> | ||||
|             <summary> | ||||
|             Constructs an event object from a notification. | ||||
|             </summary> | ||||
|             <param name="session">The session.</param> | ||||
|             <param name="monitoredItem">The monitored item that produced the notification.</param> | ||||
|             <param name="notification">The notification.</param> | ||||
|             <param name="knownEventTypes">The known event types.</param> | ||||
|             <param name="eventTypeMappings">Mapping between event types and known event types.</param> | ||||
|             <returns> | ||||
|             The event object. Null if the notification is not a valid event type. | ||||
|             </returns> | ||||
|         </member> | ||||
|         <member name="M:ThingsGateway.Foundation.Adapter.OPCUA.FormUtils.DiscoverServers(Opc.Ua.ApplicationConfiguration)"> | ||||
|             <summary> | ||||
|             Discovers the servers on the local machine. | ||||
|             </summary> | ||||
|             <param name="configuration">The configuration.</param> | ||||
|             <returns>A list of server urls.</returns> | ||||
|         </member> | ||||
|         <member name="M:ThingsGateway.Foundation.Adapter.OPCUA.FormUtils.FindEventType(Opc.Ua.Client.MonitoredItem,Opc.Ua.EventFieldList)"> | ||||
|             <summary> | ||||
|             Finds the type of the event for the notification. | ||||
|             </summary> | ||||
|             <param name="monitoredItem">The monitored item.</param> | ||||
|             <param name="notification">The notification.</param> | ||||
|             <returns>The NodeId of the EventType.</returns> | ||||
|         </member> | ||||
|         <member name="M:ThingsGateway.Foundation.Adapter.OPCUA.FormUtils.GetAttributeDisplayText(Opc.Ua.Client.ISession,System.UInt32,Opc.Ua.Variant)"> | ||||
|             <summary> | ||||
|             指定的属性的显示文本。 | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="M:ThingsGateway.Foundation.Adapter.OPCUA.FormUtils.SelectEndpoint(System.String,System.Boolean)"> | ||||
|             <summary> | ||||
|             Finds the endpoint that best matches the current settings. | ||||
|             </summary> | ||||
|             <param name="discoveryUrl">The discovery URL.</param> | ||||
|             <param name="useSecurity">if set to <c>true</c> select an endpoint that uses security.</param> | ||||
|             <returns>The best available endpoint.</returns> | ||||
|         </member> | ||||
|         <member name="M:ThingsGateway.Foundation.Adapter.OPCUA.FormUtils.TranslateBrowsePaths(Opc.Ua.Client.ISession,Opc.Ua.NodeId,Opc.Ua.NamespaceTable,System.Threading.CancellationToken,System.String[])"> | ||||
|             <summary> | ||||
|             返回一组相对路径的节点id | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="M:ThingsGateway.Foundation.Adapter.OPCUA.FormUtils.CollectFieldsAsync(Opc.Ua.Client.ISession,Opc.Ua.NodeId,Opc.Ua.QualifiedNameCollection,Opc.Ua.SimpleAttributeOperandCollection,System.Collections.Generic.List{Opc.Ua.NodeId},System.Collections.Generic.Dictionary{Opc.Ua.NodeId,Opc.Ua.QualifiedNameCollection})"> | ||||
|             <summary> | ||||
|             Collects the fields for the instance node. | ||||
|             </summary> | ||||
|             <param name="session">The session.</param> | ||||
|             <param name="nodeId">The node id.</param> | ||||
|             <param name="parentPath">The parent path.</param> | ||||
|             <param name="fields">The event fields.</param> | ||||
|             <param name="fieldNodeIds">The node id for the declaration of the field.</param> | ||||
|             <param name="foundNodes">The table of found nodes.</param> | ||||
|         </member> | ||||
|         <member name="M:ThingsGateway.Foundation.Adapter.OPCUA.FormUtils.ContainsPath(Opc.Ua.SimpleAttributeOperandCollection,Opc.Ua.QualifiedNameCollection)"> | ||||
|             <summary> | ||||
|             判断指定的select子句包含的浏览路径。 | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="M:ThingsGateway.Foundation.Adapter.OPCUA.FormUtils.GetAccessLevelDisplayText(System.Byte)"> | ||||
|              <summary> | ||||
|             访问级别属性的显示文本。 | ||||
|              </summary> | ||||
|         </member> | ||||
|         <member name="M:ThingsGateway.Foundation.Adapter.OPCUA.FormUtils.GetEventNotifierDisplayText(System.Byte)"> | ||||
|             <summary> | ||||
|             事件通知属性的显示文本 | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="T:ThingsGateway.Foundation.Adapter.OPCUA.JsonUtils"> | ||||
|             <summary> | ||||
|             扩展方法 | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="M:ThingsGateway.Foundation.Adapter.OPCUA.JsonUtils.Decode(Opc.Ua.IServiceMessageContext,Opc.Ua.NodeId,Opc.Ua.BuiltInType,System.Int32,Newtonsoft.Json.Linq.JToken)"> | ||||
|             <summary> | ||||
|             解析获取DataValue | ||||
|             </summary> | ||||
|             <returns></returns> | ||||
|         </member> | ||||
|         <member name="M:ThingsGateway.Foundation.Adapter.OPCUA.JsonUtils.DecoderObject(Opc.Ua.IServiceMessageContext,Opc.Ua.NodeId,Opc.Ua.BuiltInType,System.Int32,Newtonsoft.Json.Linq.JToken)"> | ||||
|             <summary> | ||||
|             解析获取object | ||||
|             </summary> | ||||
|             <returns></returns> | ||||
|         </member> | ||||
|         <member name="M:ThingsGateway.Foundation.Adapter.OPCUA.JsonUtils.DecodeRawData(Opc.Ua.JsonDecoder,Opc.Ua.BuiltInType,System.Int32,System.String)"> | ||||
|             <summary> | ||||
|             DecodeRawData | ||||
|             </summary> | ||||
|             <returns></returns> | ||||
|         </member> | ||||
|         <member name="M:ThingsGateway.Foundation.Adapter.OPCUA.JsonUtils.Encode(Opc.Ua.IServiceMessageContext,Opc.Ua.BuiltInType,System.Object)"> | ||||
|             <summary> | ||||
|             OPCUAValue解析为Jtoken | ||||
|             </summary> | ||||
|             <param name="Context"></param> | ||||
|             <param name="type"></param> | ||||
|             <param name="value"></param> | ||||
|             <returns></returns> | ||||
|         </member> | ||||
|         <member name="M:ThingsGateway.Foundation.Adapter.OPCUA.JsonUtils.CreateEncoder(Opc.Ua.IServiceMessageContext,System.IO.Stream,System.Boolean,System.Boolean,System.Boolean,System.Boolean)"> | ||||
|             <summary> | ||||
|             CreateEncoder | ||||
|             </summary> | ||||
|             <returns></returns> | ||||
|         </member> | ||||
|         <member name="M:ThingsGateway.Foundation.Adapter.OPCUA.JsonUtils.CalculateActualValueRank(Newtonsoft.Json.Linq.JToken)"> | ||||
|             <summary> | ||||
|             维度 | ||||
|             </summary> | ||||
|             <param name="jToken"></param> | ||||
|             <returns></returns> | ||||
|         </member> | ||||
|         <member name="T:ThingsGateway.Foundation.Adapter.OPCUA.OPCNode"> | ||||
|             <summary> | ||||
|             OPCUAClient配置项 | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="P:ThingsGateway.Foundation.Adapter.OPCUA.OPCNode.OPCUrl"> | ||||
|             <summary> | ||||
|             OPCUrl | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="P:ThingsGateway.Foundation.Adapter.OPCUA.OPCNode.UserName"> | ||||
|             <summary> | ||||
|             登录账号 | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="P:ThingsGateway.Foundation.Adapter.OPCUA.OPCNode.Password"> | ||||
|             <summary> | ||||
|             登录密码 | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="P:ThingsGateway.Foundation.Adapter.OPCUA.OPCNode.CheckDomain"> | ||||
|             <summary> | ||||
|             检查域 | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="P:ThingsGateway.Foundation.Adapter.OPCUA.OPCNode.UpdateRate"> | ||||
|             <summary> | ||||
|             更新间隔 | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="P:ThingsGateway.Foundation.Adapter.OPCUA.OPCNode.ActiveSubscribe"> | ||||
|             <summary> | ||||
|             是否订阅 | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="P:ThingsGateway.Foundation.Adapter.OPCUA.OPCNode.GroupSize"> | ||||
|             <summary> | ||||
|             分组大小 | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="P:ThingsGateway.Foundation.Adapter.OPCUA.OPCNode.DeadBand"> | ||||
|             <summary> | ||||
|             死区 | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="P:ThingsGateway.Foundation.Adapter.OPCUA.OPCNode.KeepAliveInterval"> | ||||
|             <summary> | ||||
|             KeepAliveInterval/ms | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="P:ThingsGateway.Foundation.Adapter.OPCUA.OPCNode.IsUseSecurity"> | ||||
|             <summary> | ||||
|             安全策略 | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="M:ThingsGateway.Foundation.Adapter.OPCUA.OPCNode.ToString"> | ||||
|             <inheritdoc/> | ||||
|         </member> | ||||
|         <member name="T:ThingsGateway.Foundation.Adapter.OPCUA.DataChangedEventHandler"> | ||||
|             <summary> | ||||
|             订阅委托 | ||||
|             </summary> | ||||
|             <param name="value"></param> | ||||
|         </member> | ||||
|         <member name="T:ThingsGateway.Foundation.Adapter.OPCUA.OPCUAClient"> | ||||
|             <summary> | ||||
|             OPCUAClient | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="F:ThingsGateway.Foundation.Adapter.OPCUA.OPCUAClient.OPCNode"> | ||||
|             <summary> | ||||
|             当前配置 | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="F:ThingsGateway.Foundation.Adapter.OPCUA.OPCUAClient.ProductUri"> | ||||
|             <summary> | ||||
|             ProductUri | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="F:ThingsGateway.Foundation.Adapter.OPCUA.OPCUAClient.Variables"> | ||||
|             <summary> | ||||
|             当前保存的变量名称列表 | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="F:ThingsGateway.Foundation.Adapter.OPCUA.OPCUAClient._variableDicts"> | ||||
|             <summary> | ||||
|             当前的变量名称/OPC变量节点 | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="F:ThingsGateway.Foundation.Adapter.OPCUA.OPCUAClient.dic_subscriptions"> | ||||
|             <summary> | ||||
|             当前的订阅组,组名称/组 | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="P:ThingsGateway.Foundation.Adapter.OPCUA.OPCUAClient.ReConnectHandler"> | ||||
|             <summary> | ||||
|             SessionReconnectHandler | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="M:ThingsGateway.Foundation.Adapter.OPCUA.OPCUAClient.#ctor(ThingsGateway.Foundation.ILog)"> | ||||
|             <summary> | ||||
|             默认的构造函数,实例化一个新的OPC UA类 | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="E:ThingsGateway.Foundation.Adapter.OPCUA.OPCUAClient.DataChangedHandler"> | ||||
|             <summary> | ||||
|             订阅 | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="P:ThingsGateway.Foundation.Adapter.OPCUA.OPCUAClient.AppConfig"> | ||||
|             <summary> | ||||
|             配置信息 | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="P:ThingsGateway.Foundation.Adapter.OPCUA.OPCUAClient.Connected"> | ||||
|             <summary> | ||||
|             连接状态 | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="P:ThingsGateway.Foundation.Adapter.OPCUA.OPCUAClient.OPCUAName"> | ||||
|             <summary> | ||||
|             OPCUAClient | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="P:ThingsGateway.Foundation.Adapter.OPCUA.OPCUAClient.Session"> | ||||
|             <summary> | ||||
|             当前活动会话。 | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="M:ThingsGateway.Foundation.Adapter.OPCUA.OPCUAClient.AddSubscriptionAsync(System.String,System.String[])"> | ||||
|             <summary> | ||||
|             新增订阅,需要指定订阅组名称,订阅的tag名数组 | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="M:ThingsGateway.Foundation.Adapter.OPCUA.OPCUAClient.RemoveAllSubscription"> | ||||
|             <summary> | ||||
|             移除所有的订阅消息 | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="M:ThingsGateway.Foundation.Adapter.OPCUA.OPCUAClient.RemoveSubscription(System.String)"> | ||||
|             <summary> | ||||
|             移除订阅消息 | ||||
|             </summary> | ||||
|             <param name="subscriptionName">组名称</param> | ||||
|         </member> | ||||
|         <member name="M:ThingsGateway.Foundation.Adapter.OPCUA.OPCUAClient.BrowseNodeReferenceAsync(System.String)"> | ||||
|             <summary> | ||||
|             浏览一个节点的引用 | ||||
|             </summary> | ||||
|             <param name="tag">节点值</param> | ||||
|             <returns>引用节点描述</returns> | ||||
|         </member> | ||||
|         <member name="M:ThingsGateway.Foundation.Adapter.OPCUA.OPCUAClient.CallMethodByNodeId(System.String,System.String,System.Object[])"> | ||||
|             <summary> | ||||
|             调用服务器的方法 | ||||
|             </summary> | ||||
|             <param name="tagParent">方法的父节点tag</param> | ||||
|             <param name="tag">方法的节点tag</param> | ||||
|             <param name="args">传递的参数</param> | ||||
|             <returns>输出的结果值</returns> | ||||
|         </member> | ||||
|         <member name="M:ThingsGateway.Foundation.Adapter.OPCUA.OPCUAClient.ReadHistoryRawDataValues(System.String,System.DateTime,System.DateTime,System.UInt32,System.Boolean,System.Threading.CancellationToken)"> | ||||
|             <summary> | ||||
|             读取历史数据 | ||||
|             </summary> | ||||
|             <param name="tag">节点的索引</param> | ||||
|             <param name="start">开始时间</param> | ||||
|             <param name="end">结束时间</param> | ||||
|             <param name="count">读取的个数</param> | ||||
|             <param name="containBound">是否包含边界</param> | ||||
|             <param name="cancellationToken">cancellationToken</param> | ||||
|             <returns>读取的数据列表</returns> | ||||
|         </member> | ||||
|         <member name="M:ThingsGateway.Foundation.Adapter.OPCUA.OPCUAClient.ConnectAsync"> | ||||
|             <summary> | ||||
|             连接到服务器 | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="M:ThingsGateway.Foundation.Adapter.OPCUA.OPCUAClient.Disconnect"> | ||||
|             <summary> | ||||
|             断开连接。 | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="M:ThingsGateway.Foundation.Adapter.OPCUA.OPCUAClient.ConnectAsync(System.String)"> | ||||
|             <summary> | ||||
|             Creates a new session. | ||||
|             </summary> | ||||
|             <returns>The new session object.</returns> | ||||
|         </member> | ||||
|         <member name="M:ThingsGateway.Foundation.Adapter.OPCUA.OPCUAClient.ReadJTokenValueAsync(System.String[],System.Threading.CancellationToken)"> | ||||
|             <summary> | ||||
|             从服务器读取值 | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="M:ThingsGateway.Foundation.Adapter.OPCUA.OPCUAClient.WriteNodeAsync(System.Collections.Generic.Dictionary{System.String,Newtonsoft.Json.Linq.JToken},System.Threading.CancellationToken)"> | ||||
|             <summary> | ||||
|             异步写opc标签 | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="M:ThingsGateway.Foundation.Adapter.OPCUA.OPCUAClient.ReadJTokenValueAsync(Opc.Ua.NodeId[],System.Threading.CancellationToken)"> | ||||
|             <summary> | ||||
|             从服务器读取值 | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="M:ThingsGateway.Foundation.Adapter.OPCUA.OPCUAClient.ReadNodeAsync(System.String,System.Boolean,System.Threading.CancellationToken)"> | ||||
|             <summary> | ||||
|             从服务器或缓存读取节点 | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="M:ThingsGateway.Foundation.Adapter.OPCUA.OPCUAClient.ReadNoteAttributeAsync(System.String,System.UInt32,System.Threading.CancellationToken)"> | ||||
|             <summary> | ||||
|             读取一个节点的所有属性 | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="M:ThingsGateway.Foundation.Adapter.OPCUA.OPCUAClient.ReadNoteAttributeAsync(System.Collections.Generic.List{System.String},System.Threading.CancellationToken)"> | ||||
|             <summary> | ||||
|             读取节点的所有属性 | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="M:ThingsGateway.Foundation.Adapter.OPCUA.OPCUAClient.ReadNoteAttributes(System.String)"> | ||||
|             <summary> | ||||
|             读取一个节点的所有属性 | ||||
|             </summary> | ||||
|             <param name="tag">节点信息</param> | ||||
|             <returns>节点的特性值</returns> | ||||
|         </member> | ||||
|         <member name="M:ThingsGateway.Foundation.Adapter.OPCUA.OPCUAClient.Dispose(System.Boolean)"> | ||||
|             <inheritdoc/> | ||||
|         </member> | ||||
|         <member name="M:ThingsGateway.Foundation.Adapter.OPCUA.OPCUAClient.Server_ReconnectComplete(System.Object,System.EventArgs)"> | ||||
|             <summary> | ||||
|             连接处理器连接事件处理完成。 | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="T:ThingsGateway.Foundation.Adapter.OPCUA.OPCNodeAttribute"> | ||||
|             <summary> | ||||
|             读取属性过程中用于描述的 | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="P:ThingsGateway.Foundation.Adapter.OPCUA.OPCNodeAttribute.Name"> | ||||
|             <summary> | ||||
|             属性的名称 | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="P:ThingsGateway.Foundation.Adapter.OPCUA.OPCNodeAttribute.StatusCode"> | ||||
|             <summary> | ||||
|             操作结果状态描述 | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="P:ThingsGateway.Foundation.Adapter.OPCUA.OPCNodeAttribute.Type"> | ||||
|             <summary> | ||||
|             属性的类型描述 | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="P:ThingsGateway.Foundation.Adapter.OPCUA.OPCNodeAttribute.Value"> | ||||
|             <summary> | ||||
|             属性的值,如果读取错误,返回文本描述 | ||||
|             </summary> | ||||
|         </member> | ||||
|     </members> | ||||
| </doc> | ||||
| @@ -11,8 +11,10 @@ | ||||
| #endregion | ||||
|  | ||||
| global using System; | ||||
| global using System.Collections.Generic; | ||||
| global using System.Linq; | ||||
| global using System.Threading; | ||||
| global using System.Threading.Tasks; | ||||
|  | ||||
| global using ThingsGateway.Foundation.Core; | ||||
| global using ThingsGateway.Foundation.Sockets; | ||||
|   | ||||
| @@ -10,7 +10,7 @@ | ||||
| //------------------------------------------------------------------------------ | ||||
| #endregion | ||||
|  | ||||
| using ThingsGateway.Foundation.Extension.String; | ||||
| using ThingsGateway.Foundation.Extension; | ||||
|  | ||||
| namespace ThingsGateway.Foundation.Adapter.Siemens; | ||||
| /// <summary> | ||||
|   | ||||
| @@ -10,8 +10,6 @@ | ||||
| //------------------------------------------------------------------------------ | ||||
| #endregion | ||||
|  | ||||
| using System.Collections.Generic; | ||||
|  | ||||
| namespace ThingsGateway.Foundation.Adapter.Siemens; | ||||
|  | ||||
| /// <summary> | ||||
|   | ||||
| @@ -10,8 +10,6 @@ | ||||
| //------------------------------------------------------------------------------ | ||||
| #endregion | ||||
|  | ||||
| using System.Collections.Generic; | ||||
|  | ||||
| namespace ThingsGateway.Foundation.Adapter.Siemens; | ||||
|  | ||||
| internal static class PackHelper | ||||
|   | ||||
| @@ -10,7 +10,6 @@ | ||||
| //------------------------------------------------------------------------------ | ||||
| #endregion | ||||
|  | ||||
| using System.Collections.Generic; | ||||
| using System.Text; | ||||
|  | ||||
| using ThingsGateway.Foundation.Extension.Generic; | ||||
| @@ -68,7 +67,6 @@ namespace ThingsGateway.Foundation.Adapter.Siemens | ||||
|                     break; | ||||
|  | ||||
|             } | ||||
|             tcpClient.Connected += Connected; | ||||
|  | ||||
|         } | ||||
|         /// <summary> | ||||
| @@ -294,8 +292,8 @@ namespace ThingsGateway.Foundation.Adapter.Siemens | ||||
|         /// <inheritdoc/> | ||||
|         public override void SetDataAdapter(object socketClient = null) | ||||
|         { | ||||
|             SiemensS7PLCDataHandleAdapter DataHandleAdapter = new(); | ||||
|             TcpClient.SetDataHandlingAdapter(DataHandleAdapter); | ||||
|             SiemensS7PLCDataHandleAdapter dataHandleAdapter = new(); | ||||
|             TcpClient.SetDataHandlingAdapter(dataHandleAdapter); | ||||
|         } | ||||
|  | ||||
|  | ||||
| @@ -477,17 +475,20 @@ namespace ThingsGateway.Foundation.Adapter.Siemens | ||||
|         } | ||||
|         #endregion | ||||
|  | ||||
|         private void Connected(ITcpClient client, ConnectedEventArgs e) | ||||
|         /// <inheritdoc/> | ||||
|         protected override async Task Connected(ITcpClient client, ConnectedEventArgs e) | ||||
|         { | ||||
|             try | ||||
|             { | ||||
|                 var result1 = SendThenResponse(ISO_CR); | ||||
|                 NormalDataHandlingAdapter dataHandleAdapter = new(); | ||||
|                 TcpClient.SetDataHandlingAdapter(dataHandleAdapter); | ||||
|                 var result1 = await SendThenResponseAsync(ISO_CR); | ||||
|                 if (!result1.IsSuccess) | ||||
|                 { | ||||
|                     Logger?.Warning($"{client.IP} : {client.Port}:ISO_TP握手失败-{result1.Message}"); | ||||
|                     return; | ||||
|                 } | ||||
|                 var result2 = SendThenResponse(S7_PN); | ||||
|                 var result2 = await SendThenResponseAsync(S7_PN); | ||||
|                 if (!result2.IsSuccess) | ||||
|                 { | ||||
|                     Logger?.Warning($"{client.IP} : {client.Port}:PDU初始化失败-{result2.Message}"); | ||||
| @@ -500,7 +501,11 @@ namespace ThingsGateway.Foundation.Adapter.Siemens | ||||
|             { | ||||
|                 Logger.Exception(ex); | ||||
|             } | ||||
|  | ||||
|             finally | ||||
|             { | ||||
|                 SetDataAdapter(); | ||||
|             } | ||||
|             await base.Connected(client, e); | ||||
|         } | ||||
|     } | ||||
| } | ||||
| @@ -10,8 +10,6 @@ | ||||
| //------------------------------------------------------------------------------ | ||||
| #endregion | ||||
|  | ||||
| using System.Collections.Generic; | ||||
|  | ||||
| using ThingsGateway.Foundation.Extension.Generic; | ||||
|  | ||||
| namespace ThingsGateway.Foundation.Adapter.Siemens; | ||||
|   | ||||
| @@ -1,336 +0,0 @@ | ||||
| <?xml version="1.0"?> | ||||
| <doc> | ||||
|     <assembly> | ||||
|         <name>ThingsGateway.Foundation.Adapter.Siemens</name> | ||||
|     </assembly> | ||||
|     <members> | ||||
|         <member name="T:ThingsGateway.Foundation.Adapter.Siemens.S7Area"> | ||||
|             <summary> | ||||
|             区域 | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="F:ThingsGateway.Foundation.Adapter.Siemens.S7Area.PE"> | ||||
|             <inheritdoc/> | ||||
|         </member> | ||||
|         <member name="F:ThingsGateway.Foundation.Adapter.Siemens.S7Area.PA"> | ||||
|             <inheritdoc/> | ||||
|         </member> | ||||
|         <member name="F:ThingsGateway.Foundation.Adapter.Siemens.S7Area.MK"> | ||||
|             <inheritdoc/> | ||||
|         </member> | ||||
|         <member name="F:ThingsGateway.Foundation.Adapter.Siemens.S7Area.DB"> | ||||
|             <inheritdoc/> | ||||
|         </member> | ||||
|         <member name="F:ThingsGateway.Foundation.Adapter.Siemens.S7Area.CT"> | ||||
|             <inheritdoc/> | ||||
|         </member> | ||||
|         <member name="F:ThingsGateway.Foundation.Adapter.Siemens.S7Area.TM"> | ||||
|             <inheritdoc/> | ||||
|         </member> | ||||
|         <member name="F:ThingsGateway.Foundation.Adapter.Siemens.S7Area.AI"> | ||||
|             <inheritdoc/> | ||||
|         </member> | ||||
|         <member name="F:ThingsGateway.Foundation.Adapter.Siemens.S7Area.AQ"> | ||||
|             <inheritdoc/> | ||||
|         </member> | ||||
|         <member name="T:ThingsGateway.Foundation.Adapter.Siemens.SiemensAddress"> | ||||
|             <summary> | ||||
|             西门子PLC地址数据信息 | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="P:ThingsGateway.Foundation.Adapter.Siemens.SiemensAddress.BitCode"> | ||||
|             <summary> | ||||
|             bit位偏移 | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="P:ThingsGateway.Foundation.Adapter.Siemens.SiemensAddress.DataCode"> | ||||
|             <summary> | ||||
|             数据块代码 | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="P:ThingsGateway.Foundation.Adapter.Siemens.SiemensAddress.DbBlock"> | ||||
|             <summary> | ||||
|             DB块数据信息 | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="M:ThingsGateway.Foundation.Adapter.Siemens.SiemensAddress.GetAddressStart(System.String,System.Boolean)"> | ||||
|             <summary> | ||||
|             获取起始地址 | ||||
|             </summary> | ||||
|             <param name="address"></param> | ||||
|             <param name="isCounterOrTimer"></param> | ||||
|             <returns></returns> | ||||
|         </member> | ||||
|         <member name="M:ThingsGateway.Foundation.Adapter.Siemens.SiemensAddress.GetBitCode(System.String)"> | ||||
|             <summary> | ||||
|             获取bit | ||||
|             </summary> | ||||
|             <param name="address"></param> | ||||
|             <returns></returns> | ||||
|         </member> | ||||
|         <member name="M:ThingsGateway.Foundation.Adapter.Siemens.SiemensAddress.ParseFrom(System.String)"> | ||||
|             <summary> | ||||
|             解析地址 | ||||
|             </summary> | ||||
|             <param name="address"></param> | ||||
|             <returns></returns> | ||||
|         </member> | ||||
|         <member name="M:ThingsGateway.Foundation.Adapter.Siemens.SiemensAddress.ParseFrom(System.String,System.Int32)"> | ||||
|             <summary> | ||||
|             解析地址 | ||||
|             </summary> | ||||
|             <param name="address"></param> | ||||
|             <param name="length"></param> | ||||
|             <returns></returns> | ||||
|         </member> | ||||
|         <member name="M:ThingsGateway.Foundation.Adapter.Siemens.SiemensAddress.Parse(System.String,System.Int32)"> | ||||
|             <inheritdoc/> | ||||
|         </member> | ||||
|         <member name="M:ThingsGateway.Foundation.Adapter.Siemens.SiemensAddress.ToString"> | ||||
|             <inheritdoc /> | ||||
|         </member> | ||||
|         <member name="T:ThingsGateway.Foundation.Adapter.Siemens.DateTime"> | ||||
|             <summary> | ||||
|             https://github.com/S7NetPlus/s7netplus/blob/develop/S7.Net/Types/DateTime.cs | ||||
|             Contains the methods to convert between <see cref="T:System.DateTime"/> and S7 representation of datetime values. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="F:ThingsGateway.Foundation.Adapter.Siemens.DateTime.SpecMaximumDateTime"> | ||||
|             <summary> | ||||
|             The maximum <see cref="T:System.DateTime"/> value supported by the specification. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="F:ThingsGateway.Foundation.Adapter.Siemens.DateTime.SpecMinimumDateTime"> | ||||
|             <summary> | ||||
|             The minimum <see cref="T:System.DateTime"/> value supported by the specification. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="M:ThingsGateway.Foundation.Adapter.Siemens.DateTime.FromByteArray(System.Byte[])"> | ||||
|             <summary> | ||||
|             Parses a <see cref="T:System.DateTime"/> value from bytes. | ||||
|             </summary> | ||||
|             <param name="bytes">Input bytes read from PLC.</param> | ||||
|             <returns>A <see cref="T:System.DateTime"/> object representing the value read from PLC.</returns> | ||||
|             <exception cref="T:System.ArgumentOutOfRangeException">Thrown when the length of | ||||
|               <paramref name="bytes"/> is not 8 or any value in <paramref name="bytes"/> | ||||
|               is outside the valid range of values.</exception> | ||||
|         </member> | ||||
|         <member name="M:ThingsGateway.Foundation.Adapter.Siemens.DateTime.ToArray(System.Byte[])"> | ||||
|             <summary> | ||||
|             Parses an array of <see cref="T:System.DateTime"/> values from bytes. | ||||
|             </summary> | ||||
|             <param name="bytes">Input bytes read from PLC.</param> | ||||
|             <returns>An array of <see cref="T:System.DateTime"/> objects representing the values read from PLC.</returns> | ||||
|             <exception cref="T:System.ArgumentOutOfRangeException">Thrown when the length of | ||||
|               <paramref name="bytes"/> is not a multiple of 8 or any value in | ||||
|               <paramref name="bytes"/> is outside the valid range of values.</exception> | ||||
|         </member> | ||||
|         <member name="M:ThingsGateway.Foundation.Adapter.Siemens.DateTime.ToByteArray(System.DateTime)"> | ||||
|             <summary> | ||||
|             Converts a <see cref="T:System.DateTime"/> value to a byte array. | ||||
|             </summary> | ||||
|             <param name="dateTime">The DateTime value to convert.</param> | ||||
|             <returns>A byte array containing the S7 date time representation of <paramref name="dateTime"/>.</returns> | ||||
|             <exception cref="T:System.ArgumentOutOfRangeException">Thrown when the value of | ||||
|               <paramref name="dateTime"/> is before <see cref="P:SpecMinimumDateTime"/> | ||||
|               or after <see cref="P:SpecMaximumDateTime"/>.</exception> | ||||
|         </member> | ||||
|         <member name="M:ThingsGateway.Foundation.Adapter.Siemens.DateTime.ToByteArray(System.DateTime[])"> | ||||
|             <summary> | ||||
|             Converts an array of <see cref="T:System.DateTime"/> values to a byte array. | ||||
|             </summary> | ||||
|             <param name="dateTimes">The DateTime values to convert.</param> | ||||
|             <returns>A byte array containing the S7 date time representations of <paramref name="dateTimes"/>.</returns> | ||||
|             <exception cref="T:System.ArgumentOutOfRangeException">Thrown when any value of | ||||
|               <paramref name="dateTimes"/> is before <see cref="P:SpecMinimumDateTime"/> | ||||
|               or after <see cref="P:SpecMaximumDateTime"/>.</exception> | ||||
|         </member> | ||||
|         <member name="F:ThingsGateway.Foundation.Adapter.Siemens.SiemensHelper.S7_MULRW_HEADER"> | ||||
|             <summary> | ||||
|             S7连读写请求头(包含ISO头和COTP头)  | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="T:ThingsGateway.Foundation.Adapter.Siemens.S7WordLength"> | ||||
|             <summary> | ||||
|             <inheritdoc/> | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="F:ThingsGateway.Foundation.Adapter.Siemens.S7WordLength.Bit"> | ||||
|             <inheritdoc/> | ||||
|         </member> | ||||
|         <member name="F:ThingsGateway.Foundation.Adapter.Siemens.S7WordLength.Byte"> | ||||
|             <inheritdoc/> | ||||
|         </member> | ||||
|         <member name="F:ThingsGateway.Foundation.Adapter.Siemens.S7WordLength.Char"> | ||||
|             <inheritdoc/> | ||||
|         </member> | ||||
|         <member name="F:ThingsGateway.Foundation.Adapter.Siemens.S7WordLength.Word"> | ||||
|             <inheritdoc/> | ||||
|         </member> | ||||
|         <member name="F:ThingsGateway.Foundation.Adapter.Siemens.S7WordLength.Int"> | ||||
|             <inheritdoc/> | ||||
|         </member> | ||||
|         <member name="F:ThingsGateway.Foundation.Adapter.Siemens.S7WordLength.DWord"> | ||||
|             <inheritdoc/> | ||||
|         </member> | ||||
|         <member name="F:ThingsGateway.Foundation.Adapter.Siemens.S7WordLength.DInt"> | ||||
|             <inheritdoc/> | ||||
|         </member> | ||||
|         <member name="F:ThingsGateway.Foundation.Adapter.Siemens.S7WordLength.Real"> | ||||
|             <inheritdoc/> | ||||
|         </member> | ||||
|         <member name="F:ThingsGateway.Foundation.Adapter.Siemens.S7WordLength.Counter"> | ||||
|             <inheritdoc/> | ||||
|         </member> | ||||
|         <member name="F:ThingsGateway.Foundation.Adapter.Siemens.S7WordLength.Timer"> | ||||
|             <inheritdoc/> | ||||
|         </member> | ||||
|         <member name="T:ThingsGateway.Foundation.Adapter.Siemens.SiemensMessage"> | ||||
|             <inheritdoc/> | ||||
|         </member> | ||||
|         <member name="P:ThingsGateway.Foundation.Adapter.Siemens.SiemensMessage.HeadBytesLength"> | ||||
|             <inheritdoc/> | ||||
|         </member> | ||||
|         <member name="M:ThingsGateway.Foundation.Adapter.Siemens.SiemensMessage.CheckHeadBytes(System.Byte[])"> | ||||
|             <inheritdoc/> | ||||
|         </member> | ||||
|         <member name="T:ThingsGateway.Foundation.Adapter.Siemens.SiemensEnum"> | ||||
|             <summary> | ||||
|             <inheritdoc/> | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="F:ThingsGateway.Foundation.Adapter.Siemens.SiemensEnum.S200"> | ||||
|             <inheritdoc/> | ||||
|         </member> | ||||
|         <member name="F:ThingsGateway.Foundation.Adapter.Siemens.SiemensEnum.S200Smart"> | ||||
|             <inheritdoc/> | ||||
|         </member> | ||||
|         <member name="F:ThingsGateway.Foundation.Adapter.Siemens.SiemensEnum.S300"> | ||||
|             <inheritdoc/> | ||||
|         </member> | ||||
|         <member name="F:ThingsGateway.Foundation.Adapter.Siemens.SiemensEnum.S400"> | ||||
|             <inheritdoc/> | ||||
|         </member> | ||||
|         <member name="F:ThingsGateway.Foundation.Adapter.Siemens.SiemensEnum.S1200"> | ||||
|             <inheritdoc/> | ||||
|         </member> | ||||
|         <member name="F:ThingsGateway.Foundation.Adapter.Siemens.SiemensEnum.S1500"> | ||||
|             <inheritdoc/> | ||||
|         </member> | ||||
|         <member name="T:ThingsGateway.Foundation.Adapter.Siemens.SiemensS7PLC"> | ||||
|             <summary> | ||||
|             相关命令含义源自网络资料/Shrap7/s7netplus | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="M:ThingsGateway.Foundation.Adapter.Siemens.SiemensS7PLC.#ctor(ThingsGateway.Foundation.TcpClient,ThingsGateway.Foundation.Adapter.Siemens.SiemensEnum)"> | ||||
|             <summary> | ||||
|             传入PLC类型,程序内会改变相应PLC类型的S7协议LocalTSAP, RemoteTSAP等 | ||||
|             </summary> | ||||
|             <param name="tcpClient"></param> | ||||
|             <param name="siemensPLCEnum"></param> | ||||
|         </member> | ||||
|         <member name="P:ThingsGateway.Foundation.Adapter.Siemens.SiemensS7PLC.CurrentPlc"> | ||||
|             <summary> | ||||
|             当前PLC类型 | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="M:ThingsGateway.Foundation.Adapter.Siemens.SiemensS7PLC.GetAddressDescription"> | ||||
|             <inheritdoc/> | ||||
|         </member> | ||||
|         <member name="M:ThingsGateway.Foundation.Adapter.Siemens.SiemensS7PLC.GetBitOffset(System.String)"> | ||||
|             <summary> | ||||
|             <inheritdoc/> | ||||
|             </summary> | ||||
|             <param name="address"></param> | ||||
|             <returns></returns> | ||||
|         </member> | ||||
|         <member name="P:ThingsGateway.Foundation.Adapter.Siemens.SiemensS7PLC.DestTSAP"> | ||||
|             <summary> | ||||
|             远程TSAP,需重新连接 | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="P:ThingsGateway.Foundation.Adapter.Siemens.SiemensS7PLC.LocalTSAP"> | ||||
|             <summary> | ||||
|             本地TSAP,需重新连接 | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="P:ThingsGateway.Foundation.Adapter.Siemens.SiemensS7PLC.PDULength"> | ||||
|             <summary> | ||||
|             PDULength | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="P:ThingsGateway.Foundation.Adapter.Siemens.SiemensS7PLC.Rack"> | ||||
|             <summary> | ||||
|             机架号,需重新连接 | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="P:ThingsGateway.Foundation.Adapter.Siemens.SiemensS7PLC.Slot"> | ||||
|             <summary> | ||||
|             槽号,需重新连接 | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="M:ThingsGateway.Foundation.Adapter.Siemens.SiemensS7PLC.ReadAsync(System.String,System.Int32,System.Threading.CancellationToken)"> | ||||
|             <inheritdoc/> | ||||
|         </member> | ||||
|         <member name="M:ThingsGateway.Foundation.Adapter.Siemens.SiemensS7PLC.ReadDateAsync(System.String,System.Threading.CancellationToken)"> | ||||
|             <summary> | ||||
|             读取日期 | ||||
|             </summary> | ||||
|             <returns></returns> | ||||
|         </member> | ||||
|         <member name="M:ThingsGateway.Foundation.Adapter.Siemens.SiemensS7PLC.ReadDateTimeAsync(System.String,System.Threading.CancellationToken)"> | ||||
|             <summary> | ||||
|             读取时间 | ||||
|             </summary> | ||||
|             <returns></returns> | ||||
|         </member> | ||||
|         <member name="M:ThingsGateway.Foundation.Adapter.Siemens.SiemensS7PLC.ReadStringAsync(System.String,System.Text.Encoding,System.Threading.CancellationToken)"> | ||||
|             <summary> | ||||
|             读取变长字符串 | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="M:ThingsGateway.Foundation.Adapter.Siemens.SiemensS7PLC.SetDataAdapter"> | ||||
|             <summary> | ||||
|             <inheritdoc/> | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="M:ThingsGateway.Foundation.Adapter.Siemens.SiemensS7PLC.WriteAsync(System.String,System.String,System.Threading.CancellationToken)"> | ||||
|             <inheritdoc/> | ||||
|         </member> | ||||
|         <member name="M:ThingsGateway.Foundation.Adapter.Siemens.SiemensS7PLC.WriteAsync(System.String,System.Byte[],System.Threading.CancellationToken)"> | ||||
|             <inheritdoc/> | ||||
|         </member> | ||||
|         <member name="M:ThingsGateway.Foundation.Adapter.Siemens.SiemensS7PLC.WriteAsync(System.String,System.Boolean[],System.Threading.CancellationToken)"> | ||||
|             <inheritdoc/> | ||||
|         </member> | ||||
|         <member name="M:ThingsGateway.Foundation.Adapter.Siemens.SiemensS7PLC.WriteDateAsync(System.String,System.DateTime,System.Threading.CancellationToken)"> | ||||
|             <summary> | ||||
|             写入日期 | ||||
|             </summary> | ||||
|             <returns></returns> | ||||
|         </member> | ||||
|         <member name="M:ThingsGateway.Foundation.Adapter.Siemens.SiemensS7PLC.WriteDateTimeAsync(System.String,System.DateTime,System.Threading.CancellationToken)"> | ||||
|             <summary> | ||||
|             写入时间 | ||||
|             </summary> | ||||
|             <returns></returns> | ||||
|         </member> | ||||
|         <member name="T:ThingsGateway.Foundation.Adapter.Siemens.SiemensS7PLCDataHandleAdapter"> | ||||
|             <summary> | ||||
|             SiemensS7PLCDataHandleAdapter | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="M:ThingsGateway.Foundation.Adapter.Siemens.SiemensS7PLCDataHandleAdapter.PackCommand(System.Byte[])"> | ||||
|             <inheritdoc/> | ||||
|         </member> | ||||
|         <member name="M:ThingsGateway.Foundation.Adapter.Siemens.SiemensS7PLCDataHandleAdapter.GetInstance"> | ||||
|             <summary> | ||||
|             <inheritdoc/> | ||||
|             </summary> | ||||
|             <returns></returns> | ||||
|         </member> | ||||
|         <member name="M:ThingsGateway.Foundation.Adapter.Siemens.SiemensS7PLCDataHandleAdapter.UnpackResponse(ThingsGateway.Foundation.Adapter.Siemens.SiemensMessage,System.Byte[],System.Byte[],System.Byte[])"> | ||||
|             <inheritdoc/> | ||||
|         </member> | ||||
|     </members> | ||||
| </doc> | ||||
| @@ -10,7 +10,7 @@ | ||||
| //------------------------------------------------------------------------------ | ||||
| #endregion | ||||
|  | ||||
| namespace ThingsGateway.Foundation; | ||||
| namespace ThingsGateway.Foundation.Core; | ||||
|  | ||||
| /// <summary> | ||||
| /// 设备地址数据的信息,对每个协议都建立其变量地址的表示类 | ||||
|   | ||||
| @@ -10,7 +10,7 @@ | ||||
| //------------------------------------------------------------------------------ | ||||
| #endregion | ||||
|  | ||||
| namespace ThingsGateway.Foundation; | ||||
| namespace ThingsGateway.Foundation.Core; | ||||
|  | ||||
| /// <summary> | ||||
| /// 打包读取变量 | ||||
|   | ||||
| @@ -10,7 +10,7 @@ | ||||
| //------------------------------------------------------------------------------ | ||||
| #endregion | ||||
|  | ||||
| namespace ThingsGateway.Foundation; | ||||
| namespace ThingsGateway.Foundation.Core; | ||||
| /// <summary> | ||||
| /// 打包读取变量 | ||||
| /// </summary> | ||||
|   | ||||
| @@ -10,7 +10,7 @@ | ||||
| //------------------------------------------------------------------------------ | ||||
| #endregion | ||||
|  | ||||
| namespace ThingsGateway.Foundation; | ||||
| namespace ThingsGateway.Foundation.Core; | ||||
|  | ||||
| /// <summary> | ||||
| /// 设备读写接口 | ||||
|   | ||||
| @@ -15,7 +15,7 @@ using System.Text; | ||||
|  | ||||
| using ThingsGateway.Foundation.Extension.String; | ||||
|  | ||||
| namespace ThingsGateway.Foundation; | ||||
| namespace ThingsGateway.Foundation.Core; | ||||
|  | ||||
|  | ||||
|  | ||||
|   | ||||
| @@ -10,7 +10,7 @@ | ||||
| //------------------------------------------------------------------------------ | ||||
| #endregion | ||||
|  | ||||
| namespace ThingsGateway.Foundation; | ||||
| namespace ThingsGateway.Foundation.Core; | ||||
|  | ||||
| /// <summary> | ||||
| /// 读写扩展方法 | ||||
|   | ||||
| @@ -10,7 +10,7 @@ | ||||
| //------------------------------------------------------------------------------ | ||||
| #endregion | ||||
|  | ||||
| namespace ThingsGateway.Foundation; | ||||
| namespace ThingsGateway.Foundation.Core; | ||||
|  | ||||
| /// <summary> | ||||
| /// TCP读写设备 | ||||
| @@ -24,8 +24,8 @@ public abstract class ReadWriteDevicesSerialSessionBase : ReadWriteDevicesBase | ||||
|     public ReadWriteDevicesSerialSessionBase(SerialSession serialSession) | ||||
|     { | ||||
|         SerialSession = serialSession; | ||||
|         WaitingClientEx = SerialSession.GetWaitingClientEx(new() { BreakTrigger = true }); | ||||
|         SerialSession.Received += Received; | ||||
|         WaitingClientEx = SerialSession.GetWaitingClient(new() { ThrowBreakException = true }); | ||||
|         SerialSession.Received -= Received; | ||||
|         SerialSession.Connecting -= Connecting; | ||||
|         SerialSession.Connected -= Connected; | ||||
|         SerialSession.Disconnecting -= Disconnecting; | ||||
| @@ -34,26 +34,21 @@ public abstract class ReadWriteDevicesSerialSessionBase : ReadWriteDevicesBase | ||||
|         SerialSession.Connected += Connected; | ||||
|         SerialSession.Disconnecting += Disconnecting; | ||||
|         SerialSession.Disconnected += Disconnected; | ||||
|         SerialSession.Received += Received; | ||||
|         Logger = SerialSession.Logger; | ||||
|     } | ||||
|     /// <summary> | ||||
|     /// 接收解析 | ||||
|     /// </summary> | ||||
|     protected virtual void Received(ByteBlock byteBlock, IRequestInfo requestInfo) | ||||
|     /// <param name="client"></param> | ||||
|     /// <param name="e"></param> | ||||
|     /// <returns></returns> | ||||
|     protected virtual Task Received(SerialSession client, ReceivedDataEventArgs e) | ||||
|     { | ||||
|         return EasyTask.CompletedTask; | ||||
|     } | ||||
|  | ||||
|  | ||||
|     } | ||||
|     private void Received(SerialSession client, ByteBlock byteBlock, IRequestInfo requestInfo) | ||||
|     { | ||||
|         try | ||||
|         { | ||||
|             Received(byteBlock, requestInfo); | ||||
|         } | ||||
|         catch (Exception ex) | ||||
|         { | ||||
|             Logger.Exception(this, ex); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     /// <summary> | ||||
|     /// 串口管理对象 | ||||
| @@ -86,11 +81,12 @@ public abstract class ReadWriteDevicesSerialSessionBase : ReadWriteDevicesBase | ||||
|     /// <inheritdoc/> | ||||
|     public override void Dispose() | ||||
|     { | ||||
|         Disconnect(); | ||||
|         SerialSession.Received -= Received; | ||||
|         SerialSession.Connecting -= Connecting; | ||||
|         SerialSession.Connected -= Connected; | ||||
|         SerialSession.Disconnecting -= Disconnecting; | ||||
|         SerialSession.Disconnected -= Disconnected; | ||||
|         Disconnect(); | ||||
|         if (CascadeDisposal) | ||||
|             SerialSession.SafeDispose(); | ||||
|     } | ||||
| @@ -100,8 +96,8 @@ public abstract class ReadWriteDevicesSerialSessionBase : ReadWriteDevicesBase | ||||
|     { | ||||
|         try | ||||
|         { | ||||
|             waitingOptions ??= new WaitingOptions { BreakTrigger = true, ThrowBreakException = true, AdapterFilter = AdapterFilter.NoneAll }; | ||||
|             ResponsedData result = SerialSession.GetWaitingClientEx(waitingOptions).SendThenResponse(data, TimeOut, cancellationToken); | ||||
|             waitingOptions ??= new WaitingOptions { ThrowBreakException = true }; | ||||
|             ResponsedData result = SerialSession.GetWaitingClient(waitingOptions).SendThenResponse(data, TimeOut, cancellationToken); | ||||
|             return OperResult.CreateSuccessResult(result.Data); | ||||
|         } | ||||
|         catch (Exception ex) | ||||
| @@ -115,8 +111,8 @@ public abstract class ReadWriteDevicesSerialSessionBase : ReadWriteDevicesBase | ||||
|     { | ||||
|         try | ||||
|         { | ||||
|             waitingOptions ??= new WaitingOptions { ThrowBreakException = true, AdapterFilter = AdapterFilter.NoneAll }; | ||||
|             ResponsedData result = await SerialSession.GetWaitingClientEx(waitingOptions).SendThenResponseAsync(data, TimeOut, cancellationToken); | ||||
|             waitingOptions ??= new WaitingOptions { ThrowBreakException = true }; | ||||
|             ResponsedData result = await SerialSession.GetWaitingClient(waitingOptions).SendThenResponseAsync(data, TimeOut, cancellationToken); | ||||
|             return OperResult.CreateSuccessResult(result.Data); | ||||
|         } | ||||
|         catch (Exception ex) | ||||
| @@ -130,24 +126,34 @@ public abstract class ReadWriteDevicesSerialSessionBase : ReadWriteDevicesBase | ||||
|     { | ||||
|         return SerialSession.SerialProperty.ToString(); | ||||
|     } | ||||
|     private void Connected(ISerialSession client, ConnectedEventArgs e) | ||||
|     /// <summary> | ||||
|     /// Connected | ||||
|     /// </summary> | ||||
|     /// <param name="client"></param> | ||||
|     /// <param name="e"></param> | ||||
|     /// <returns></returns> | ||||
|     protected virtual Task Connected(ISerialSession client, ConnectedEventArgs e) | ||||
|     { | ||||
|         Logger?.Debug(client.SerialProperty.ToString() + "连接成功"); | ||||
|         SetDataAdapter(); | ||||
|         return EasyTask.CompletedTask; | ||||
|     } | ||||
|  | ||||
|     private void Connecting(ISerialSession client, SerialConnectingEventArgs e) | ||||
|     private Task Connecting(ISerialSession client, SerialConnectingEventArgs e) | ||||
|     { | ||||
|         Logger?.Debug(client.SerialProperty.ToString() + "正在连接"); | ||||
|         SetDataAdapter(); | ||||
|         return EasyTask.CompletedTask; | ||||
|     } | ||||
|  | ||||
|     private void Disconnected(ISerialSessionBase client, DisconnectEventArgs e) | ||||
|     private Task Disconnected(ISerialSessionBase client, DisconnectEventArgs e) | ||||
|     { | ||||
|         Logger?.Debug(client.SerialProperty.ToString() + "断开连接-" + e.Message); | ||||
|         return EasyTask.CompletedTask; | ||||
|     } | ||||
|  | ||||
|     private void Disconnecting(ISerialSessionBase client, DisconnectEventArgs e) | ||||
|     private Task Disconnecting(ISerialSessionBase client, DisconnectEventArgs e) | ||||
|     { | ||||
|         Logger?.Debug(client.SerialProperty.ToString() + "正在主动断开连接-" + e.Message); | ||||
|         return EasyTask.CompletedTask; | ||||
|     } | ||||
| } | ||||
| @@ -12,7 +12,7 @@ | ||||
|  | ||||
| using System.ComponentModel; | ||||
|  | ||||
| namespace ThingsGateway.Foundation; | ||||
| namespace ThingsGateway.Foundation.Core; | ||||
|  | ||||
| /// <summary> | ||||
| /// TCP读写设备 | ||||
| @@ -23,7 +23,7 @@ public abstract class ReadWriteDevicesTcpClientBase : ReadWriteDevicesBase | ||||
|     public ReadWriteDevicesTcpClientBase(TcpClient tcpClient) | ||||
|     { | ||||
|         TcpClient = tcpClient; | ||||
|         WaitingClientEx = TcpClient.GetWaitingClientEx(new() { BreakTrigger = true }); | ||||
|         WaitingClientEx = TcpClient.GetWaitingClient(new() { ThrowBreakException = true }); | ||||
|         TcpClient.Connecting -= Connecting; | ||||
|         TcpClient.Connected -= Connected; | ||||
|         TcpClient.Disconnecting -= Disconnecting; | ||||
| @@ -59,7 +59,7 @@ public abstract class ReadWriteDevicesTcpClientBase : ReadWriteDevicesBase | ||||
|     /// <inheritdoc/> | ||||
|     public override Task ConnectAsync(CancellationToken cancellationToken) | ||||
|     { | ||||
|         return TcpClient.ConnectAsync(ConnectTimeOut); | ||||
|         return TcpClient.ConnectAsync(ConnectTimeOut, cancellationToken); | ||||
|     } | ||||
|  | ||||
|     /// <inheritdoc/> | ||||
| @@ -72,11 +72,11 @@ public abstract class ReadWriteDevicesTcpClientBase : ReadWriteDevicesBase | ||||
|     /// <inheritdoc/> | ||||
|     public override void Dispose() | ||||
|     { | ||||
|         Disconnect(); | ||||
|         TcpClient.Connecting -= Connecting; | ||||
|         TcpClient.Connected -= Connected; | ||||
|         TcpClient.Disconnecting -= Disconnecting; | ||||
|         TcpClient.Disconnected -= Disconnected; | ||||
|         Disconnect(); | ||||
|         if (CascadeDisposal) | ||||
|             TcpClient.SafeDispose(); | ||||
|     } | ||||
| @@ -86,8 +86,8 @@ public abstract class ReadWriteDevicesTcpClientBase : ReadWriteDevicesBase | ||||
|     { | ||||
|         try | ||||
|         { | ||||
|             waitingOptions ??= new WaitingOptions { BreakTrigger = true, ThrowBreakException = true, AdapterFilter = AdapterFilter.NoneAll }; | ||||
|             ResponsedData result = TcpClient.GetWaitingClientEx(waitingOptions).SendThenResponse(data, TimeOut, cancellationToken); | ||||
|             waitingOptions ??= new WaitingOptions { ThrowBreakException = true, }; | ||||
|             ResponsedData result = TcpClient.GetWaitingClient(waitingOptions).SendThenResponse(data, TimeOut, cancellationToken); | ||||
|             return OperResult.CreateSuccessResult(result.Data); | ||||
|         } | ||||
|         catch (Exception ex) | ||||
| @@ -101,8 +101,8 @@ public abstract class ReadWriteDevicesTcpClientBase : ReadWriteDevicesBase | ||||
|     { | ||||
|         try | ||||
|         { | ||||
|             waitingOptions ??= new WaitingOptions { ThrowBreakException = true, AdapterFilter = AdapterFilter.NoneAll }; | ||||
|             ResponsedData result = await TcpClient.GetWaitingClientEx(waitingOptions).SendThenResponseAsync(data, TimeOut, cancellationToken); | ||||
|             waitingOptions ??= new WaitingOptions { ThrowBreakException = true }; | ||||
|             ResponsedData result = await TcpClient.GetWaitingClient(waitingOptions).SendThenResponseAsync(data, TimeOut, cancellationToken); | ||||
|             return OperResult.CreateSuccessResult(result.Data); | ||||
|         } | ||||
|         catch (Exception ex) | ||||
| @@ -116,24 +116,34 @@ public abstract class ReadWriteDevicesTcpClientBase : ReadWriteDevicesBase | ||||
|     { | ||||
|         return TcpClient.RemoteIPHost.ToString(); | ||||
|     } | ||||
|     private void Connected(ITcpClient client, ConnectedEventArgs e) | ||||
|     /// <summary> | ||||
|     /// Connected | ||||
|     /// </summary> | ||||
|     /// <param name="client"></param> | ||||
|     /// <param name="e"></param> | ||||
|     /// <returns></returns> | ||||
|     protected virtual Task Connected(ITcpClient client, ConnectedEventArgs e) | ||||
|     { | ||||
|         Logger?.Debug(client.RemoteIPHost.ToString() + "连接成功"); | ||||
|         SetDataAdapter(); | ||||
|         return EasyTask.CompletedTask; | ||||
|     } | ||||
|  | ||||
|     private void Connecting(ITcpClient client, ConnectingEventArgs e) | ||||
|     private Task Connecting(ITcpClient client, ConnectingEventArgs e) | ||||
|     { | ||||
|         Logger?.Debug(client.RemoteIPHost.ToString() + "正在连接"); | ||||
|         SetDataAdapter(); | ||||
|         return EasyTask.CompletedTask; | ||||
|     } | ||||
|  | ||||
|     private void Disconnected(ITcpClientBase client, DisconnectEventArgs e) | ||||
|     private Task Disconnected(ITcpClientBase client, DisconnectEventArgs e) | ||||
|     { | ||||
|         Logger?.Debug(client.IP + ":" + client.Port + "断开连接-" + e.Message); | ||||
|         return EasyTask.CompletedTask; | ||||
|     } | ||||
|  | ||||
|     private void Disconnecting(ITcpClientBase client, DisconnectEventArgs e) | ||||
|     private Task Disconnecting(ITcpClientBase client, DisconnectEventArgs e) | ||||
|     { | ||||
|         Logger?.Debug(client.IP + ":" + client.Port + "正在主动断开连接-" + e.Message); | ||||
|         return EasyTask.CompletedTask; | ||||
|     } | ||||
| } | ||||
| @@ -12,7 +12,7 @@ | ||||
|  | ||||
| using System.ComponentModel; | ||||
|  | ||||
| namespace ThingsGateway.Foundation; | ||||
| namespace ThingsGateway.Foundation.Core; | ||||
|  | ||||
| /// <summary> | ||||
| /// 服务设备 | ||||
| @@ -23,9 +23,14 @@ public abstract class ReadWriteDevicesTcpServerBase : ReadWriteDevicesBase | ||||
|     public ReadWriteDevicesTcpServerBase(TcpService tcpService) | ||||
|     { | ||||
|         TcpService = tcpService; | ||||
|         TcpService.Received -= Received; | ||||
|         TcpService.Connecting -= Connecting; | ||||
|         TcpService.Connected -= Connected; | ||||
|         TcpService.Disconnecting -= Disconnecting; | ||||
|         TcpService.Disconnected -= Disconnected; | ||||
|         TcpService.Received += Received; | ||||
|         TcpService.Connecting += Connecting; | ||||
|         TcpService.Connected += Connected; | ||||
|         TcpService.Received += Received; | ||||
|         TcpService.Disconnecting += Disconnecting; | ||||
|         TcpService.Disconnected += Disconnected; | ||||
|         Logger = TcpService.Logger; | ||||
| @@ -63,65 +68,63 @@ public abstract class ReadWriteDevicesTcpServerBase : ReadWriteDevicesBase | ||||
|     /// <inheritdoc/> | ||||
|     public override void Dispose() | ||||
|     { | ||||
|         Disconnect(); | ||||
|         TcpService.Received -= Received; | ||||
|         TcpService.Connecting -= Connecting; | ||||
|         TcpService.Connected -= Connected; | ||||
|         TcpService.Disconnecting -= Disconnecting; | ||||
|         TcpService.Disconnected -= Disconnected; | ||||
|         Disconnect(); | ||||
|         if (CascadeDisposal) | ||||
|             TcpService.SafeDispose(); | ||||
|     } | ||||
|     /// <summary> | ||||
|     /// 接收解析 | ||||
|     /// </summary> | ||||
|     /// <param name="client"></param> | ||||
|     /// <param name="e"></param> | ||||
|     /// <returns></returns> | ||||
|     protected virtual Task Received(SocketClient client, ReceivedDataEventArgs e) | ||||
|     { | ||||
|         return EasyTask.CompletedTask; | ||||
|     } | ||||
|  | ||||
|     /// <inheritdoc/> | ||||
|     public override string ToString() | ||||
|     { | ||||
|         return TcpService.ServerName; | ||||
|     } | ||||
|     /// <summary> | ||||
|     /// 接收解析 | ||||
|     /// </summary> | ||||
|     protected virtual void Received(SocketClient client, IRequestInfo requestInfo) | ||||
|     { | ||||
|  | ||||
|     } | ||||
|     /// <summary> | ||||
|     /// <inheritdoc/> | ||||
|     /// </summary> | ||||
|     /// <param name="client"></param> | ||||
|     /// <param name="e"></param> | ||||
|     protected virtual void Connected(SocketClient client, ConnectedEventArgs e) | ||||
|     protected virtual Task Connected(SocketClient client, ConnectedEventArgs e) | ||||
|     { | ||||
|         Logger?.Debug(client.IP + ":" + client.Port + "连接成功"); | ||||
|         return EasyTask.CompletedTask; | ||||
|     } | ||||
|  | ||||
|     /// <inheritdoc/> | ||||
|     protected virtual void Connecting(SocketClient client, ConnectingEventArgs e) | ||||
|     protected virtual Task Connecting(SocketClient client, ConnectingEventArgs e) | ||||
|     { | ||||
|         Logger?.Debug(client.IP + ":" + client.Port + "正在连接"); | ||||
|         SetDataAdapter(client); | ||||
|         return EasyTask.CompletedTask; | ||||
|     } | ||||
|  | ||||
|     /// <inheritdoc/> | ||||
|     protected virtual void Disconnected(ITcpClientBase client, DisconnectEventArgs e) | ||||
|     protected virtual Task Disconnected(ITcpClientBase client, DisconnectEventArgs e) | ||||
|     { | ||||
|         Logger?.Debug(client.IP + ":" + client.Port + "断开连接-" + e.Message); | ||||
|         return EasyTask.CompletedTask; | ||||
|     } | ||||
|  | ||||
|     /// <inheritdoc/> | ||||
|     protected virtual void Disconnecting(ITcpClientBase client, DisconnectEventArgs e) | ||||
|     protected virtual Task Disconnecting(ITcpClientBase client, DisconnectEventArgs e) | ||||
|     { | ||||
|         Logger?.Debug(client.IP + ":" + client.Port + "正在主动断开连接-" + e.Message); | ||||
|         return EasyTask.CompletedTask; | ||||
|     } | ||||
|  | ||||
|     private void Received(SocketClient client, ByteBlock byteBlock, IRequestInfo requestInfo) | ||||
|     { | ||||
|         try | ||||
|         { | ||||
|             Received(client, requestInfo); | ||||
|         } | ||||
|         catch (Exception ex) | ||||
|         { | ||||
|             Logger.Exception(this, ex); | ||||
|         } | ||||
|     } | ||||
| } | ||||
| @@ -10,7 +10,7 @@ | ||||
| //------------------------------------------------------------------------------ | ||||
| #endregion | ||||
|  | ||||
| namespace ThingsGateway.Foundation; | ||||
| namespace ThingsGateway.Foundation.Core; | ||||
|  | ||||
| /// <summary> | ||||
| /// UDP读写设备 | ||||
| @@ -22,7 +22,7 @@ public abstract class ReadWriteDevicesUdpSessionBase : ReadWriteDevicesBase | ||||
|     { | ||||
|         UdpSession = udpSession; | ||||
|         SetDataAdapter(); | ||||
|         WaitingClientEx = UdpSession.GetWaitingClientEx(new() { BreakTrigger = true }); | ||||
|         WaitingClientEx = UdpSession.GetWaitingClient(new() { ThrowBreakException = true }); | ||||
|     } | ||||
|  | ||||
|     /// <summary> | ||||
| @@ -64,8 +64,8 @@ public abstract class ReadWriteDevicesUdpSessionBase : ReadWriteDevicesBase | ||||
|     { | ||||
|         try | ||||
|         { | ||||
|             waitingOptions ??= new WaitingOptions { ThrowBreakException = true, AdapterFilter = AdapterFilter.NoneAll }; | ||||
|             ResponsedData result = UdpSession.GetWaitingClientEx(waitingOptions).SendThenResponse(data, TimeOut, cancellationToken); | ||||
|             waitingOptions ??= new WaitingOptions { ThrowBreakException = true }; | ||||
|             ResponsedData result = UdpSession.GetWaitingClient(waitingOptions).SendThenResponse(data, TimeOut, cancellationToken); | ||||
|             return OperResult.CreateSuccessResult(result.Data); | ||||
|         } | ||||
|         catch (Exception ex) | ||||
| @@ -79,8 +79,8 @@ public abstract class ReadWriteDevicesUdpSessionBase : ReadWriteDevicesBase | ||||
|     { | ||||
|         try | ||||
|         { | ||||
|             waitingOptions ??= new WaitingOptions { ThrowBreakException = true, AdapterFilter = AdapterFilter.NoneAll }; | ||||
|             ResponsedData result = await UdpSession.GetWaitingClientEx(waitingOptions).SendThenResponseAsync(data, TimeOut, cancellationToken); | ||||
|             waitingOptions ??= new WaitingOptions { ThrowBreakException = true }; | ||||
|             ResponsedData result = await UdpSession.GetWaitingClient(waitingOptions).SendThenResponseAsync(data, TimeOut, cancellationToken); | ||||
|             return OperResult.CreateSuccessResult(result.Data); | ||||
|         } | ||||
|         catch (Exception ex) | ||||
|   | ||||
| @@ -12,7 +12,7 @@ | ||||
|  | ||||
| using System.Collections; | ||||
|  | ||||
| namespace ThingsGateway.Foundation; | ||||
| namespace ThingsGateway.Foundation.Core; | ||||
|  | ||||
| /// <summary> | ||||
| /// 线程安全的LinkedList | ||||
|   | ||||
| @@ -10,7 +10,7 @@ | ||||
| //------------------------------------------------------------------------------ | ||||
| #endregion | ||||
|  | ||||
| namespace ThingsGateway.Foundation; | ||||
| namespace ThingsGateway.Foundation.Core; | ||||
|  | ||||
| /// <summary> | ||||
| /// HSL摘录,用于CRC16验证的类 | ||||
|   | ||||
| @@ -10,7 +10,7 @@ | ||||
| //------------------------------------------------------------------------------ | ||||
| #endregion | ||||
|  | ||||
| namespace ThingsGateway.Foundation; | ||||
| namespace ThingsGateway.Foundation.Core; | ||||
|  | ||||
| /// <summary> | ||||
| /// 自增 | ||||
|   | ||||
| @@ -10,7 +10,7 @@ | ||||
| //------------------------------------------------------------------------------ | ||||
| #endregion | ||||
|  | ||||
| namespace ThingsGateway.Foundation; | ||||
| namespace ThingsGateway.Foundation.Core; | ||||
|  | ||||
| /// <summary> | ||||
| /// EasyLock,使用轻量级SemaphoreSlim锁,只允许一个并发量,并记录并发信息 | ||||
|   | ||||
| @@ -10,7 +10,7 @@ | ||||
| //------------------------------------------------------------------------------ | ||||
| #endregion | ||||
|  | ||||
| namespace ThingsGateway.Foundation; | ||||
| namespace ThingsGateway.Foundation.Core; | ||||
|  | ||||
| /// <summary> | ||||
| /// TimerTick | ||||
|   | ||||
| @@ -10,7 +10,7 @@ | ||||
| //------------------------------------------------------------------------------ | ||||
| #endregion | ||||
|  | ||||
| namespace ThingsGateway.Foundation; | ||||
| namespace ThingsGateway.Foundation.Core; | ||||
|  | ||||
| /// <summary> | ||||
| /// 常量 | ||||
|   | ||||
| @@ -12,7 +12,7 @@ | ||||
|  | ||||
| using ThingsGateway.Foundation.Extension.Generic; | ||||
|  | ||||
| namespace ThingsGateway.Foundation; | ||||
| namespace ThingsGateway.Foundation.Core; | ||||
|  | ||||
| /// <summary> | ||||
| /// TCP/Serial适配器基类 | ||||
| @@ -143,6 +143,21 @@ public abstract class ReadWriteDevicesTcpDataHandleAdapter<TRequest> : CustomDat | ||||
|         GoSend(bytes, 0, bytes.Length); | ||||
|         Logger?.Trace($"{FoundationConst.LogMessageHeader}{ToString()}- 发送:{Request.SendBytes.ToHexString(' ')}"); | ||||
|     } | ||||
|     /// <summary> | ||||
|     /// 发送方法,会重新建立<see cref="Request"/> | ||||
|     /// </summary> | ||||
|     protected async Task GoSendAsync(byte[] item) | ||||
|     { | ||||
|         byte[] bytes; | ||||
|         if (IsSendPackCommand) | ||||
|             bytes = PackCommand(item); | ||||
|         else | ||||
|             bytes = item; | ||||
|         Request = GetInstance(); | ||||
|         Request.SendBytes = bytes; | ||||
|         await GoSendAsync(bytes, 0, bytes.Length); | ||||
|         Logger?.Trace($"{FoundationConst.LogMessageHeader}{ToString()}- 发送:{Request.SendBytes.ToHexString(' ')}"); | ||||
|     } | ||||
|  | ||||
|     /// <inheritdoc/> | ||||
|     protected override void PreviewSend(byte[] buffer, int offset, int length) | ||||
| @@ -150,6 +165,12 @@ public abstract class ReadWriteDevicesTcpDataHandleAdapter<TRequest> : CustomDat | ||||
|         GoSend(buffer); | ||||
|     } | ||||
|  | ||||
|     /// <inheritdoc/> | ||||
|     protected override Task PreviewSendAsync(byte[] buffer, int offset, int length) | ||||
|     { | ||||
|         return GoSendAsync(buffer); | ||||
|     } | ||||
|  | ||||
|     /// <summary> | ||||
|     /// 报文拆包 | ||||
|     /// </summary> | ||||
|   | ||||
| @@ -14,7 +14,7 @@ using System.Net; | ||||
|  | ||||
| using ThingsGateway.Foundation.Extension.Generic; | ||||
|  | ||||
| namespace ThingsGateway.Foundation; | ||||
| namespace ThingsGateway.Foundation.Core; | ||||
|  | ||||
| /// <summary> | ||||
| /// UDP适配器基类 | ||||
| @@ -128,11 +128,6 @@ public abstract class ReadWriteDevicesUdpDataHandleAdapter<TRequest> : UdpDataHa | ||||
|     { | ||||
|         throw new System.NotImplementedException();//因为设置了不支持拼接发送,所以该方法可以不实现。 | ||||
|     } | ||||
|     /// <inheritdoc/> | ||||
|     protected override void PreviewSend(IRequestInfo requestInfo) | ||||
|     { | ||||
|         throw new System.NotImplementedException();//因为设置了不支持,所以该方法可以不实现。 | ||||
|     } | ||||
|  | ||||
|     /// <inheritdoc/> | ||||
|     protected override void Reset() | ||||
|   | ||||
| @@ -10,7 +10,7 @@ | ||||
| //------------------------------------------------------------------------------ | ||||
| #endregion | ||||
|  | ||||
| namespace ThingsGateway.Foundation; | ||||
| namespace ThingsGateway.Foundation.Core; | ||||
|  | ||||
| /// <summary> | ||||
| /// 数据类型 | ||||
|   | ||||
| @@ -12,7 +12,7 @@ | ||||
|  | ||||
| using ThingsGateway.Foundation.Extension.Generic; | ||||
|  | ||||
| namespace ThingsGateway.Foundation; | ||||
| namespace ThingsGateway.Foundation.Core; | ||||
|  | ||||
| /// <inheritdoc/> | ||||
| public static class ByteExtensions | ||||
|   | ||||
| @@ -12,7 +12,7 @@ | ||||
|  | ||||
| using System.Collections.Concurrent; | ||||
|  | ||||
| namespace ThingsGateway.Foundation; | ||||
| namespace ThingsGateway.Foundation.Core; | ||||
|  | ||||
| /// <summary> | ||||
| /// 对象拓展 | ||||
|   | ||||
| @@ -10,7 +10,7 @@ | ||||
| //------------------------------------------------------------------------------ | ||||
| #endregion | ||||
|  | ||||
| namespace ThingsGateway.Foundation; | ||||
| namespace ThingsGateway.Foundation.Core; | ||||
|  | ||||
|  | ||||
| /// <summary> | ||||
|   | ||||
| @@ -12,7 +12,7 @@ | ||||
|  | ||||
| using System.Reflection; | ||||
|  | ||||
| namespace ThingsGateway.Foundation; | ||||
| namespace ThingsGateway.Foundation.Core; | ||||
|  | ||||
| /// <summary> | ||||
| /// Method Info 拓展 | ||||
|   | ||||
| @@ -10,7 +10,7 @@ | ||||
| //------------------------------------------------------------------------------ | ||||
| #endregion | ||||
|  | ||||
| namespace ThingsGateway.Foundation; | ||||
| namespace ThingsGateway.Foundation.Core; | ||||
|  | ||||
| /// <inheritdoc cref="IMessage"/> | ||||
| public abstract class MessageBase : OperResult<byte[]>, IMessage | ||||
| @@ -43,7 +43,7 @@ public abstract class MessageBase : OperResult<byte[]>, IMessage | ||||
|     } | ||||
|  | ||||
|     /// <inheritdoc/> | ||||
|     public abstract bool CheckHeadBytes(byte[] head); | ||||
|     public abstract bool CheckHeadBytes(byte[] heads); | ||||
|  | ||||
|     /// <summary> | ||||
|     /// 写入<see cref="SendBytes"/>后触发此方法 | ||||
|   | ||||
| @@ -10,7 +10,7 @@ | ||||
| //------------------------------------------------------------------------------ | ||||
| #endregion | ||||
|  | ||||
| namespace ThingsGateway.Foundation; | ||||
| namespace ThingsGateway.Foundation.Core; | ||||
|  | ||||
| /// <summary> | ||||
| /// 采集返回消息 | ||||
| @@ -51,7 +51,7 @@ public interface IMessage : IOperResult, IRequestInfo | ||||
|     /// <summary> | ||||
|     /// 检查头子节的合法性,并赋值<see cref="BodyLength"/><br /> | ||||
|     /// </summary> | ||||
|     /// <param name="head">接收的头子节</param> | ||||
|     /// <param name="heads">接收的头子节</param> | ||||
|     /// <returns>是否成功的结果</returns> | ||||
|     bool CheckHeadBytes(byte[] head); | ||||
|     bool CheckHeadBytes(byte[] heads); | ||||
| } | ||||
| @@ -12,7 +12,7 @@ | ||||
|  | ||||
| using Newtonsoft.Json; | ||||
|  | ||||
| namespace ThingsGateway.Foundation; | ||||
| namespace ThingsGateway.Foundation.Core; | ||||
|  | ||||
| /// <inheritdoc/> | ||||
| public class OperResult<T> : OperResult, IOperResult<T> | ||||
|   | ||||
| @@ -10,7 +10,7 @@ | ||||
| //------------------------------------------------------------------------------ | ||||
| #endregion | ||||
|  | ||||
| namespace ThingsGateway.Foundation; | ||||
| namespace ThingsGateway.Foundation.Core; | ||||
|  | ||||
| /// <summary> | ||||
| /// BCD格式化值 | ||||
|   | ||||
| @@ -10,7 +10,7 @@ | ||||
| //------------------------------------------------------------------------------ | ||||
| #endregion | ||||
|  | ||||
| namespace ThingsGateway.Foundation; | ||||
| namespace ThingsGateway.Foundation.Core; | ||||
|  | ||||
| /// <summary> | ||||
| /// 应用于多字节数据的解析或是生成格式<br /> | ||||
|   | ||||
| @@ -21,7 +21,7 @@ using Newtonsoft.Json.Converters; | ||||
| #endif | ||||
| using System.Text; | ||||
|  | ||||
| namespace ThingsGateway.Foundation; | ||||
| namespace ThingsGateway.Foundation.Core; | ||||
|  | ||||
|  | ||||
|  | ||||
|   | ||||
| @@ -18,7 +18,7 @@ using Newtonsoft.Json; | ||||
|  | ||||
| using System.Text; | ||||
|  | ||||
| namespace ThingsGateway.Foundation; | ||||
| namespace ThingsGateway.Foundation.Core; | ||||
|  | ||||
| /// <summary> | ||||
| /// 类型转换 | ||||
|   | ||||
| @@ -15,7 +15,7 @@ using System.Text; | ||||
| using ThingsGateway.Foundation.Extension.Bool; | ||||
| using ThingsGateway.Foundation.Extension.Generic; | ||||
|  | ||||
| namespace ThingsGateway.Foundation; | ||||
| namespace ThingsGateway.Foundation.Core; | ||||
|  | ||||
| /// <summary> | ||||
| /// 将基数据类型转换为指定端的一个字节数组, | ||||
|   | ||||
| @@ -12,7 +12,7 @@ | ||||
|  | ||||
| using System.Text; | ||||
|  | ||||
| namespace ThingsGateway.Foundation; | ||||
| namespace ThingsGateway.Foundation.Core; | ||||
|  | ||||
| /// <summary> | ||||
| /// 所有数据转换类的静态辅助方法 | ||||
|   | ||||
| @@ -12,7 +12,7 @@ | ||||
|  | ||||
| using System.Text; | ||||
|  | ||||
| namespace ThingsGateway.Foundation; | ||||
| namespace ThingsGateway.Foundation.Core; | ||||
|  | ||||
| /// <summary> | ||||
| /// 常用转换 | ||||
|   | ||||
| @@ -11,7 +11,7 @@ | ||||
| #endregion | ||||
|  | ||||
| using System.Text; | ||||
| namespace ThingsGateway.Foundation; | ||||
| namespace ThingsGateway.Foundation.Core; | ||||
| /// <summary> | ||||
| /// FileUtil | ||||
| /// </summary> | ||||
|   | ||||
| @@ -11,7 +11,7 @@ | ||||
| #endregion | ||||
|  | ||||
| using Newtonsoft.Json.Linq; | ||||
| namespace ThingsGateway.Foundation; | ||||
| namespace ThingsGateway.Foundation.Core; | ||||
| /// <summary> | ||||
| /// JTokenUtil | ||||
| /// </summary> | ||||
|   | ||||
| @@ -17,7 +17,7 @@ global using System.Linq; | ||||
| global using System.Threading; | ||||
| global using System.Threading.Tasks; | ||||
|  | ||||
| global using ThingsGateway.Foundation; | ||||
| global using ThingsGateway.Foundation.Core; | ||||
| global using ThingsGateway.Foundation.Http; | ||||
| global using ThingsGateway.Foundation.Rpc; | ||||
| global using ThingsGateway.Foundation.Serial; | ||||
|   | ||||
| @@ -19,5 +19,20 @@ | ||||
| 		<PackageReference Include="System.IO.Ports" Version="7.0.0" /> | ||||
| 	</ItemGroup> | ||||
|  | ||||
|  | ||||
| 	<ItemGroup> | ||||
| 		<EmbeddedResource Include="TouchSocket\WebApi.Swagger\api\favicon-16x16.png" /> | ||||
| 		<EmbeddedResource Include="TouchSocket\WebApi.Swagger\api\favicon-32x32.png" /> | ||||
| 		<EmbeddedResource Include="TouchSocket\WebApi.Swagger\api\index.html" /> | ||||
| 		<EmbeddedResource Include="TouchSocket\WebApi.Swagger\api\oauth2-redirect.html" /> | ||||
| 		<EmbeddedResource Include="TouchSocket\WebApi.Swagger\api\openapi.json" /> | ||||
| 		<EmbeddedResource Include="TouchSocket\WebApi.Swagger\api\swagger-ui-bundle.js" /> | ||||
| 		<EmbeddedResource Include="TouchSocket\WebApi.Swagger\api\swagger-ui-es-bundle-core.js" /> | ||||
| 		<EmbeddedResource Include="TouchSocket\WebApi.Swagger\api\swagger-ui-es-bundle.js" /> | ||||
| 		<EmbeddedResource Include="TouchSocket\WebApi.Swagger\api\swagger-ui-standalone-preset.js" /> | ||||
| 		<EmbeddedResource Include="TouchSocket\WebApi.Swagger\api\swagger-ui.css" /> | ||||
| 		<EmbeddedResource Include="TouchSocket\WebApi.Swagger\api\swagger-ui.js" /> | ||||
| 	</ItemGroup> | ||||
|  | ||||
| </Project> | ||||
|  | ||||
|   | ||||
| @@ -23,7 +23,7 @@ | ||||
| //------------------------------------------------------------------------------ | ||||
| //------------------------------------------------------------------------------ | ||||
|  | ||||
| namespace ThingsGateway.Foundation | ||||
| namespace ThingsGateway.Foundation.Core | ||||
| { | ||||
|     /// <summary> | ||||
|     /// 注册为消息 | ||||
|   | ||||
| @@ -23,7 +23,9 @@ | ||||
| //------------------------------------------------------------------------------ | ||||
| //------------------------------------------------------------------------------ | ||||
|  | ||||
| namespace ThingsGateway.Foundation | ||||
| using System.Collections.Concurrent; | ||||
|  | ||||
| namespace ThingsGateway.Foundation.Core | ||||
| { | ||||
|     /// <summary> | ||||
|     /// 消息通知类。内部全为弱引用。 | ||||
| @@ -31,8 +33,7 @@ namespace ThingsGateway.Foundation | ||||
|     public class AppMessenger | ||||
|     { | ||||
|         private static AppMessenger m_instance; | ||||
|         private readonly ReaderWriterLockSlim m_lockSlim = new ReaderWriterLockSlim(); | ||||
|         private readonly Dictionary<string, List<MessageInstance>> m_tokenAndInstance = new Dictionary<string, List<MessageInstance>>(); | ||||
|         private readonly ConcurrentDictionary<string, List<MessageInstance>> m_tokenAndInstance = new ConcurrentDictionary<string, List<MessageInstance>>(); | ||||
|  | ||||
|         /// <summary> | ||||
|         /// 默认单例实例 | ||||
| @@ -65,42 +66,38 @@ namespace ThingsGateway.Foundation | ||||
|         /// <summary> | ||||
|         /// 添加 | ||||
|         /// </summary> | ||||
|         /// <param name="cancellationToken"></param> | ||||
|         /// <param name="token"></param> | ||||
|         /// <param name="messageInstance"></param> | ||||
|         /// <exception cref="MessageRegisteredException"></exception> | ||||
|         public void Add(string cancellationToken, MessageInstance messageInstance) | ||||
|         public void Add(string token, MessageInstance messageInstance) | ||||
|         { | ||||
|             using (var writeLock = new WriteLock(this.m_lockSlim)) | ||||
|  | ||||
|             if (this.m_tokenAndInstance.TryGetValue(token, out var value)) | ||||
|             { | ||||
|                 if (this.m_tokenAndInstance.ContainsKey(cancellationToken)) | ||||
|                 if (!this.AllowMultiple) | ||||
|                 { | ||||
|                     if (!this.AllowMultiple) | ||||
|                     { | ||||
|                         throw new MessageRegisteredException(TouchSocketCoreResource.TokenExisted.GetDescription(cancellationToken)); | ||||
|                     } | ||||
|                     this.m_tokenAndInstance[cancellationToken].Add(messageInstance); | ||||
|                     throw new MessageRegisteredException(TouchSocketCoreResource.TokenExisted.GetDescription(token)); | ||||
|                 } | ||||
|                 else | ||||
|                 { | ||||
|                     this.m_tokenAndInstance.Add(cancellationToken, new List<MessageInstance>() | ||||
|  | ||||
|                 value.Add(messageInstance); | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|                 this.m_tokenAndInstance.TryAdd(token, new List<MessageInstance>() | ||||
|                     { | ||||
|                      messageInstance | ||||
|                     }); | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         /// <summary> | ||||
|         /// 判断能否触发该消息,意味着该消息是否已经注册。 | ||||
|         /// </summary> | ||||
|         /// <param name="cancellationToken"></param> | ||||
|         /// <param name="token"></param> | ||||
|         /// <returns></returns> | ||||
|         public bool CanSendMessage(string cancellationToken) | ||||
|         public bool CanSendMessage(string token) | ||||
|         { | ||||
|             using (var readLock = new ReadLock(this.m_lockSlim)) | ||||
|             { | ||||
|                 return this.m_tokenAndInstance.ContainsKey(cancellationToken); | ||||
|             } | ||||
|             return this.m_tokenAndInstance.ContainsKey(token); | ||||
|         } | ||||
|  | ||||
|         /// <summary> | ||||
| @@ -108,34 +105,25 @@ namespace ThingsGateway.Foundation | ||||
|         /// </summary> | ||||
|         public void Clear() | ||||
|         { | ||||
|             using (var writeLock = new WriteLock(this.m_lockSlim)) | ||||
|             { | ||||
|                 this.m_tokenAndInstance.Clear(); | ||||
|             } | ||||
|             this.m_tokenAndInstance.Clear(); | ||||
|         } | ||||
|  | ||||
|         /// <summary> | ||||
|         /// 获取所有消息 | ||||
|         /// </summary> | ||||
|         /// <returns></returns> | ||||
|         public string[] GetAllMessage() | ||||
|         public IEnumerable<string> GetAllMessage() | ||||
|         { | ||||
|             using (var readLock = new ReadLock(this.m_lockSlim)) | ||||
|             { | ||||
|                 return this.m_tokenAndInstance.Keys.ToArray(); | ||||
|             } | ||||
|             return this.m_tokenAndInstance.Keys; | ||||
|         } | ||||
|  | ||||
|         /// <summary> | ||||
|         /// 移除 | ||||
|         /// </summary> | ||||
|         /// <param name="cancellationToken"></param> | ||||
|         public void Remove(string cancellationToken) | ||||
|         /// <param name="token"></param> | ||||
|         public void Remove(string token) | ||||
|         { | ||||
|             using (var writeLock = new WriteLock(this.m_lockSlim)) | ||||
|             { | ||||
|                 this.m_tokenAndInstance.Remove(cancellationToken); | ||||
|             } | ||||
|             this.m_tokenAndInstance.TryRemove(token, out _); | ||||
|         } | ||||
|  | ||||
|         /// <summary> | ||||
| @@ -144,132 +132,105 @@ namespace ThingsGateway.Foundation | ||||
|         /// <param name="messageObject"></param> | ||||
|         public void Remove(IMessageObject messageObject) | ||||
|         { | ||||
|             using (var writeLock = new WriteLock(this.m_lockSlim)) | ||||
|             { | ||||
|                 var key = new List<string>(); | ||||
|             var key = new List<string>(); | ||||
|  | ||||
|                 foreach (var item in this.m_tokenAndInstance.Keys) | ||||
|             foreach (var item in this.m_tokenAndInstance.Keys) | ||||
|             { | ||||
|                 foreach (var item2 in this.m_tokenAndInstance[item].ToArray()) | ||||
|                 { | ||||
|                     foreach (var item2 in this.m_tokenAndInstance[item].ToArray()) | ||||
|                     if (messageObject == item2.MessageObject) | ||||
|                     { | ||||
|                         if (messageObject == item2.MessageObject) | ||||
|                         this.m_tokenAndInstance[item].Remove(item2); | ||||
|                         if (this.m_tokenAndInstance[item].Count == 0) | ||||
|                         { | ||||
|                             this.m_tokenAndInstance[item].Remove(item2); | ||||
|                             if (this.m_tokenAndInstance[item].Count == 0) | ||||
|                             { | ||||
|                                 key.Add(item); | ||||
|                             } | ||||
|                             key.Add(item); | ||||
|                         } | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|  | ||||
|                 foreach (var item in key) | ||||
|                 { | ||||
|                     this.m_tokenAndInstance.Remove(item); | ||||
|                 } | ||||
|             foreach (var item in key) | ||||
|             { | ||||
|                 this.m_tokenAndInstance.TryRemove(item, out _); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         /// <summary> | ||||
|         /// 发送消息 | ||||
|         /// </summary> | ||||
|         /// <param name="cancellationToken"></param> | ||||
|         /// <param name="token"></param> | ||||
|         /// <param name="parameters"></param> | ||||
|         /// <exception cref="MessageNotFoundException"></exception> | ||||
|         public Task SendAsync(string cancellationToken, params object[] parameters) | ||||
|         public async Task SendAsync(string token, params object[] parameters) | ||||
|         { | ||||
|             return Task.Run(() => | ||||
|              { | ||||
|                  using (var readLock = new ReadLock(this.m_lockSlim)) | ||||
|                  { | ||||
|                      if (this.m_tokenAndInstance.TryGetValue(cancellationToken, out var list)) | ||||
|                      { | ||||
|                          var clear = new List<MessageInstance>(); | ||||
|             if (this.m_tokenAndInstance.TryGetValue(token, out var list)) | ||||
|             { | ||||
|                 var clear = new List<MessageInstance>(); | ||||
|  | ||||
|                          foreach (var item in list) | ||||
|                          { | ||||
|                              if (!item.Info.IsStatic && !item.WeakReference.TryGetTarget(out _)) | ||||
|                              { | ||||
|                                  clear.Add(item); | ||||
|                                  continue; | ||||
|                              } | ||||
|                              try | ||||
|                              { | ||||
|                                  item.Invoke(item.MessageObject, parameters); | ||||
|                              } | ||||
|                              catch | ||||
|                              { | ||||
|                              } | ||||
|                          } | ||||
|                 foreach (var item in list) | ||||
|                 { | ||||
|                     if (!item.Info.IsStatic && !item.WeakReference.TryGetTarget(out _)) | ||||
|                     { | ||||
|                         clear.Add(item); | ||||
|                         continue; | ||||
|                     } | ||||
|                     await item.InvokeAsync(item.MessageObject, parameters); | ||||
|                 } | ||||
|  | ||||
|                          foreach (var item in clear) | ||||
|                          { | ||||
|                              list.Remove(item); | ||||
|                          } | ||||
|                      } | ||||
|                      else | ||||
|                      { | ||||
|                          throw new MessageNotFoundException(TouchSocketCoreResource.MessageNotFound.GetDescription(cancellationToken)); | ||||
|                      } | ||||
|                  } | ||||
|              }); | ||||
|                 foreach (var item in clear) | ||||
|                 { | ||||
|                     list.Remove(item); | ||||
|                 } | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|                 throw new MessageNotFoundException(TouchSocketCoreResource.MessageNotFound.GetDescription(token)); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         /// <summary> | ||||
|         /// 发送消息,当多播时,只返回最后一个返回值 | ||||
|         /// </summary> | ||||
|         /// <typeparam name="T">返回值类型</typeparam> | ||||
|         /// <param name="cancellationToken"></param> | ||||
|         /// <param name="token"></param> | ||||
|         /// <param name="parameters"></param> | ||||
|         /// <returns></returns> | ||||
|         /// <exception cref="MessageNotFoundException"></exception> | ||||
|         public Task<T> SendAsync<T>(string cancellationToken, params object[] parameters) | ||||
|         public async Task<T> SendAsync<T>(string token, params object[] parameters) | ||||
|         { | ||||
|             return Task.Run(() => | ||||
|              { | ||||
|                  using (var readLock = new ReadLock(this.m_lockSlim)) | ||||
|                  { | ||||
|                      if (this.m_tokenAndInstance.TryGetValue(cancellationToken, out var list)) | ||||
|                      { | ||||
|                          T result = default; | ||||
|                          var clear = new List<MessageInstance>(); | ||||
|                          for (var i = 0; i < list.Count; i++) | ||||
|                          { | ||||
|                              var item = list[i]; | ||||
|                              if (!item.Info.IsStatic && !item.WeakReference.TryGetTarget(out _)) | ||||
|                              { | ||||
|                                  clear.Add(item); | ||||
|                                  continue; | ||||
|                              } | ||||
|             if (this.m_tokenAndInstance.TryGetValue(token, out var list)) | ||||
|             { | ||||
|                 T result = default; | ||||
|                 var clear = new List<MessageInstance>(); | ||||
|                 for (var i = 0; i < list.Count; i++) | ||||
|                 { | ||||
|                     var item = list[i]; | ||||
|                     if (!item.Info.IsStatic && !item.WeakReference.TryGetTarget(out _)) | ||||
|                     { | ||||
|                         clear.Add(item); | ||||
|                         continue; | ||||
|                     } | ||||
|  | ||||
|                              try | ||||
|                              { | ||||
|                                  if (i == list.Count - 1) | ||||
|                                  { | ||||
|                                      result = (T)item.Invoke(item.MessageObject, parameters); | ||||
|                                  } | ||||
|                                  else | ||||
|                                  { | ||||
|                                      item.Invoke(item.MessageObject, parameters); | ||||
|                                  } | ||||
|                              } | ||||
|                              catch | ||||
|                              { | ||||
|                              } | ||||
|                          } | ||||
|                     if (i == list.Count - 1) | ||||
|                     { | ||||
|                         result = await item.InvokeAsync<T>(item.MessageObject, parameters); | ||||
|                     } | ||||
|                     else | ||||
|                     { | ||||
|                         await item.InvokeAsync<T>(item.MessageObject, parameters); | ||||
|                     } | ||||
|                 } | ||||
|  | ||||
|                          foreach (var item in clear) | ||||
|                          { | ||||
|                              list.Remove(item); | ||||
|                          } | ||||
|                          return result; | ||||
|                      } | ||||
|                      else | ||||
|                      { | ||||
|                          throw new MessageNotFoundException(TouchSocketCoreResource.MessageNotFound.GetDescription(cancellationToken)); | ||||
|                      } | ||||
|                  } | ||||
|              }); | ||||
|                 foreach (var item in clear) | ||||
|                 { | ||||
|                     list.Remove(item); | ||||
|                 } | ||||
|                 return result; | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|                 throw new MessageNotFoundException(TouchSocketCoreResource.MessageNotFound.GetDescription(token)); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| } | ||||
| @@ -24,7 +24,7 @@ | ||||
| //------------------------------------------------------------------------------ | ||||
| using System.Reflection; | ||||
|  | ||||
| namespace ThingsGateway.Foundation | ||||
| namespace ThingsGateway.Foundation.Core | ||||
| { | ||||
|     /// <summary> | ||||
|     /// AppMessengerExtensions | ||||
|   | ||||
| @@ -23,7 +23,7 @@ | ||||
| //------------------------------------------------------------------------------ | ||||
| //------------------------------------------------------------------------------ | ||||
|  | ||||
| namespace ThingsGateway.Foundation | ||||
| namespace ThingsGateway.Foundation.Core | ||||
| { | ||||
|     /// <summary> | ||||
|     /// 限定消息的接口 | ||||
|   | ||||
| @@ -24,7 +24,7 @@ | ||||
| //------------------------------------------------------------------------------ | ||||
| using System.Reflection; | ||||
|  | ||||
| namespace ThingsGateway.Foundation | ||||
| namespace ThingsGateway.Foundation.Core | ||||
| { | ||||
|     /// <summary> | ||||
|     /// MessageInstance | ||||
|   | ||||
| @@ -23,7 +23,7 @@ | ||||
| //------------------------------------------------------------------------------ | ||||
| //------------------------------------------------------------------------------ | ||||
|  | ||||
| namespace ThingsGateway.Foundation | ||||
| namespace ThingsGateway.Foundation.Core | ||||
| { | ||||
|     /// <summary> | ||||
|     /// 缓存实体 | ||||
|   | ||||
| @@ -23,7 +23,7 @@ | ||||
| //------------------------------------------------------------------------------ | ||||
| //------------------------------------------------------------------------------ | ||||
|  | ||||
| namespace ThingsGateway.Foundation | ||||
| namespace ThingsGateway.Foundation.Core | ||||
| { | ||||
|     /// <summary> | ||||
|     /// CacheExtensions | ||||
|   | ||||
| @@ -23,7 +23,7 @@ | ||||
| //------------------------------------------------------------------------------ | ||||
| //------------------------------------------------------------------------------ | ||||
|  | ||||
| namespace ThingsGateway.Foundation | ||||
| namespace ThingsGateway.Foundation.Core | ||||
| { | ||||
|     /// <summary> | ||||
|     /// 缓存键值 | ||||
|   | ||||
| @@ -23,7 +23,7 @@ | ||||
| //------------------------------------------------------------------------------ | ||||
| //------------------------------------------------------------------------------ | ||||
|  | ||||
| namespace ThingsGateway.Foundation | ||||
| namespace ThingsGateway.Foundation.Core | ||||
| { | ||||
|     /// <summary> | ||||
|     /// 缓存实体接口 | ||||
|   | ||||
| @@ -25,7 +25,7 @@ | ||||
| using System.Collections; | ||||
| using System.Collections.Concurrent; | ||||
|  | ||||
| namespace ThingsGateway.Foundation | ||||
| namespace ThingsGateway.Foundation.Core | ||||
| { | ||||
|     /// <summary> | ||||
|     /// 一个简单的内存缓存 | ||||
|   | ||||
| @@ -24,7 +24,7 @@ | ||||
| //------------------------------------------------------------------------------ | ||||
| using System.Collections.Concurrent; | ||||
|  | ||||
| namespace ThingsGateway.Foundation | ||||
| namespace ThingsGateway.Foundation.Core | ||||
| { | ||||
|     /// <summary> | ||||
|     /// 安全双向字典 | ||||
|   | ||||
| @@ -24,7 +24,7 @@ | ||||
| //------------------------------------------------------------------------------ | ||||
| using System.Collections; | ||||
|  | ||||
| namespace ThingsGateway.Foundation | ||||
| namespace ThingsGateway.Foundation.Core | ||||
| { | ||||
|     /// <summary> | ||||
|     /// 线程安全的List,其基本操作和List一致。 | ||||
|   | ||||
| @@ -24,7 +24,7 @@ | ||||
| //------------------------------------------------------------------------------ | ||||
| using System.Collections.Concurrent; | ||||
|  | ||||
| namespace ThingsGateway.Foundation | ||||
| namespace ThingsGateway.Foundation.Core | ||||
| { | ||||
|     /// <summary> | ||||
|     /// 三元组合 | ||||
|   | ||||
| @@ -24,7 +24,7 @@ | ||||
| //------------------------------------------------------------------------------ | ||||
| using System.Collections.Concurrent; | ||||
|  | ||||
| namespace ThingsGateway.Foundation | ||||
| namespace ThingsGateway.Foundation.Core | ||||
| { | ||||
|     /// <summary> | ||||
|     /// 智能安全队列 | ||||
|   | ||||
| @@ -24,7 +24,7 @@ | ||||
| //------------------------------------------------------------------------------ | ||||
| using System.Collections.Concurrent; | ||||
|  | ||||
| namespace ThingsGateway.Foundation | ||||
| namespace ThingsGateway.Foundation.Core | ||||
| { | ||||
|     /// <summary> | ||||
|     /// 队列数据 | ||||
|   | ||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user