first commit

This commit is contained in:
CoderShen
2025-08-05 15:29:54 +08:00
commit c2c155a32b
44 changed files with 1885 additions and 0 deletions

View File

@@ -0,0 +1 @@
{"RootPath":"D:\\personal data\\S7CommPlus协议研究资料\\S7CommPlusDriver-master\\src\\DriverTest","ProjectFileName":"DriverTest.csproj","Configuration":"Debug|x86","FrameworkPath":"","Sources":[{"SourceFile":"Program.cs"},{"SourceFile":"Properties\\AssemblyInfo.cs"},{"SourceFile":"TestPlcTag.cs"},{"SourceFile":"obj\\x86\\Debug\\.NETFramework,Version=v4.7.2.AssemblyAttributes.cs"}],"References":[{"Reference":"D:\\personal data\\S7CommPlus协议研究资料\\S7CommPlusDriver-master\\src\\packages\\BouncyCastle.1.8.9\\lib\\BouncyCastle.Crypto.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.7.2\\Microsoft.CSharp.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.7.2\\mscorlib.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"D:\\personal data\\S7CommPlus协议研究资料\\S7CommPlusDriver-master\\src\\S7CommPlusDriver\\bin\\x86\\Debug\\S7CommPlusDriver.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":true,"ProjectPath":"D:\\personal data\\S7CommPlus协议研究资料\\S7CommPlusDriver-master\\src\\S7CommPlusDriver\\bin\\x86\\Debug\\S7CommPlusDriver.dll"},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.7.2\\System.Core.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.7.2\\System.Data.DataSetExtensions.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.7.2\\System.Data.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.7.2\\System.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.7.2\\System.Net.Http.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.7.2\\System.Xml.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.7.2\\System.Xml.Linq.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""}],"Analyzers":[],"Outputs":[{"OutputItemFullPath":"D:\\personal data\\S7CommPlus协议研究资料\\S7CommPlusDriver-master\\src\\DriverTest\\bin\\x86\\Debug\\DriverTest.exe","OutputItemRelativePath":"DriverTest.exe"},{"OutputItemFullPath":"","OutputItemRelativePath":""}],"CopyToOutputEntries":[]}

6
DriverTest/App.config Normal file
View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2"/>
</startup>
</configuration>

View File

@@ -0,0 +1,112 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{94755B6A-7E0D-40F9-A2ED-48FF0C0FEA2B}</ProjectGuid>
<OutputType>Exe</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>DriverTest</RootNamespace>
<AssemblyName>DriverTest</AssemblyName>
<TargetFrameworkVersion>v4.7.2</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
<TargetFrameworkProfile />
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'">
<DebugSymbols>true</DebugSymbols>
<OutputPath>bin\x64\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<DebugType>full</DebugType>
<PlatformTarget>x64</PlatformTarget>
<LangVersion>7.3</LangVersion>
<ErrorReport>prompt</ErrorReport>
<Prefer32Bit>true</Prefer32Bit>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'">
<OutputPath>bin\x64\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<Optimize>true</Optimize>
<DebugType>pdbonly</DebugType>
<PlatformTarget>x64</PlatformTarget>
<LangVersion>7.3</LangVersion>
<ErrorReport>prompt</ErrorReport>
<Prefer32Bit>true</Prefer32Bit>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'">
<DebugSymbols>true</DebugSymbols>
<OutputPath>bin\x86\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<DebugType>full</DebugType>
<PlatformTarget>AnyCPU</PlatformTarget>
<LangVersion>7.3</LangVersion>
<ErrorReport>prompt</ErrorReport>
<Prefer32Bit>false</Prefer32Bit>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'">
<OutputPath>bin\x86\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<Optimize>true</Optimize>
<DebugType>pdbonly</DebugType>
<PlatformTarget>AnyCPU</PlatformTarget>
<LangVersion>7.3</LangVersion>
<ErrorReport>prompt</ErrorReport>
<Prefer32Bit>false</Prefer32Bit>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|AnyCPU'">
<DebugSymbols>true</DebugSymbols>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<DebugType>full</DebugType>
<PlatformTarget>AnyCPU</PlatformTarget>
<LangVersion>7.3</LangVersion>
<ErrorReport>prompt</ErrorReport>
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
<Prefer32Bit>true</Prefer32Bit>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|AnyCPU'">
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<Optimize>true</Optimize>
<DebugType>pdbonly</DebugType>
<PlatformTarget>AnyCPU</PlatformTarget>
<LangVersion>7.3</LangVersion>
<ErrorReport>prompt</ErrorReport>
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
<Prefer32Bit>true</Prefer32Bit>
</PropertyGroup>
<ItemGroup>
<Reference Include="S7CommPlusDriver">
<HintPath>..\Lib\S7CommPlusDriver.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Data" />
<Reference Include="System.Net.Http" />
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="Program.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup>
<ItemGroup>
<None Include="App.config" />
<None Include="packages.config" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<PropertyGroup>
<PostBuildEvent>
</PostBuildEvent>
</PropertyGroup>
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild">
</Target>
<Target Name="AfterBuild">
</Target>
-->
</Project>

183
DriverTest/Program.cs Normal file
View File

@@ -0,0 +1,183 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Security.Cryptography;
using System.Text;
using S7CommPlusDriver;
using S7CommPlusDriver.ClientApi;
namespace DriverTest
{
class Program
{
static void Main(string[] args)
{
string HostIp = "192.168.0.250";
string Password = "";
int res;
List<ItemAddress> readlist = new List<ItemAddress>();
Console.WriteLine("Main - START");
// Als Parameter lässt sich die IP-Adresse übergeben, sonst Default-Wert von oben
if (args.Length >= 1) {
HostIp = args[0];
}
// Als Parameter lässt sich das Passwort übergeben, sonst Default-Wert von oben (kein Passwort)
if (args.Length >= 2) {
Password = args[1];
}
Console.WriteLine("Main - Versuche Verbindungsaufbau zu: " + HostIp);
S7CommPlusConnection conn = new S7CommPlusConnection();
res = conn.Connect(HostIp, Password);
if (res == 0)
{
Console.WriteLine("Main - Connect fertig");
#region Variablenhaushalt browsen
Console.WriteLine("Main - Starte Browse...");
// Variablenhaushalt auslesen
List<VarInfo> vars = new List<VarInfo>();
res = conn.Browse(out vars);
Console.WriteLine("Main - Browse res=" + res);
#endregion
List<VarInfo> vars_ = vars.GetRange(0,1000);
#region Werte aller Variablen einlesen
Console.WriteLine("Main - Lese Werte aller Variablen aus");
List<PlcTag> taglist = new List<PlcTag>();
PlcTags tags = new PlcTags();
foreach (var v in vars_)
{
taglist.Add(PlcTags.TagFactory(v.Name, new ItemAddress(v.AccessSequence), v.Softdatatype));
}
foreach (var t in taglist)
{
tags.AddTag(t);
}
if (res == 0)
{
Console.WriteLine("====================== VARIABLENHAUSHALT ======================");
string formatstring = "{0,-80}{1,-30}{2,-20}{3,-20}";
Console.WriteLine(String.Format(formatstring, "SYMBOLIC-NAME", "ACCESS-SEQUENCE", "TYP", "QC: VALUE"));
for (int i = 0; i < vars_.Count; i++)
{
string s;
s = String.Format(formatstring, taglist[i].Name, taglist[i].Address.GetAccessString(), Softdatatype.Types[taglist[i].Datatype], taglist[i].ToString());
Console.WriteLine(s);
}
}
#endregion
Console.WriteLine("按任意键开始读");
Console.ReadKey();
while (res == 0)
{
System.Diagnostics.Stopwatch stopwatch = new System.Diagnostics.Stopwatch();
stopwatch.Start();
res = tags.ReadTags(conn);
stopwatch.Stop();
long ms = stopwatch.ElapsedMilliseconds;
if (res == 0)
{
string header = $"读取{vars_.Count}个变量耗时{ms}毫秒";
Console.WriteLine(header);
}
}
#region Werte aller Variablen einlesen
Console.WriteLine("Main - Lese Werte aller Variablen aus");
foreach (var v in vars)
{
readlist.Add(new ItemAddress(v.AccessSequence));
}
List<object> values = new List<object>();
List<UInt64> errors = new List<UInt64>();
// Fehlerhafte Variable setzen
//readlist[2].LID[0] = 123;
res = conn.ReadValues(readlist, out values, out errors);
#endregion
#region Variablenhaushalt mit Werten ausgeben
if (res == 0)
{
Console.WriteLine("====================== VARIABLENHAUSHALT ======================");
// Liste ausgeben
string formatstring = "{0,-80}{1,-30}{2,-20}{3,-20}";
Console.WriteLine(String.Format(formatstring, "SYMBOLIC-NAME", "ACCESS-SEQUENCE", "TYP", "VALUE"));
for (int i = 0; i < vars.Count; i++)
{
string s = String.Format(formatstring, vars[i].Name, vars[i].AccessSequence, Softdatatype.Types[vars[i].Softdatatype], values[i]);
Console.WriteLine(s);
}
Console.WriteLine("===============================================================");
}
#endregion
/*
#region Test: Wert schreiben
List<PValue> writevalues = new List<PValue>();
PValue writeValue = new ValueInt(8888);
writevalues.Add(writeValue);
List<ItemAddress> writelist = new List<ItemAddress>();
writelist.Add(new ItemAddress("8A0E0001.F"));
errors.Clear();
res = conn.WriteValues(writelist, writevalues, out errors);
Console.WriteLine("res=" + res);
#endregion
*/
/*
#region Test: Absolutadressen lesen
// Daten aus nicht "optimierten" Datenbausteinen lesen
readlist.Clear();
ItemAddress absAdr = new ItemAddress();
absAdr.SetAccessAreaToDatablock(100); // DB 100
absAdr.SymbolCrc = 0;
absAdr.AccessSubArea = Ids.DB_ValueActual;
absAdr.LID.Add(3); // LID_OMS_STB_ClassicBlob
absAdr.LID.Add(0); // Blob Start Offset, Anfangsadresse
absAdr.LID.Add(20); // 20 Bytes
readlist.Add(absAdr);
values.Clear();
errors.Clear();
res = conn.ReadValues(readlist, out values, out errors);
Console.WriteLine(values.ToString());
#endregion
*/
#region Test: SPS in Stopp setzen
Console.WriteLine("Setze SPS in STOP...");
conn.SetPlcOperatingState(1);
Console.WriteLine("Taste drücken um wieder in RUN zu setzen...");
Console.ReadKey();
Console.WriteLine("Setze SPS in RUN...");
conn.SetPlcOperatingState(3);
#endregion
conn.Disconnect();
}
else
{
Console.WriteLine("Main - Connect fehlgeschlagen!");
}
Console.WriteLine("Main - ENDE. Bitte Taste drücken.");
Console.ReadKey();
}
}
}

View File

@@ -0,0 +1,36 @@
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// General Information about an assembly is controlled through the following
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
[assembly: AssemblyTitle("DriverTest")]
[assembly: AssemblyDescription("S7CommPlusDriver Test")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("DriverTest")]
[assembly: AssemblyCopyright("Copyright © 2023, Thomas Wiens")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// Setting ComVisible to false makes the types in this assembly not visible
// to COM components. If you need to access a type in this assembly from
// COM, set the ComVisible attribute to true on that type.
[assembly: ComVisible(false)]
// The following GUID is for the ID of the typelib if this project is exposed to COM
[assembly: Guid("94755b6a-7e0d-40f9-a2ed-48ff0c0fea2b")]
// Version information for an assembly consists of the following four values:
//
// Major Version
// Minor Version
// Build Number
// Revision
//
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("0.1.0.0")]
[assembly: AssemblyFileVersion("0.1.0.0")]

Binary file not shown.

View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2"/>
</startup>
</configuration>

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,3 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
</packages>

BIN
Lib/S7CommPlusAuth.dll Normal file

Binary file not shown.

BIN
Lib/S7CommPlusDriver.dll Normal file

Binary file not shown.

BIN
Lib/S7Family0.dll Normal file

Binary file not shown.

BIN
Lib/S7PublicKeys.dll Normal file

Binary file not shown.

BIN
Lib/S7Utilities.dll Normal file

Binary file not shown.

BIN
Lib/zlib.net.dll Normal file

Binary file not shown.

51
S7CommPlusDriver.sln Normal file
View File

@@ -0,0 +1,51 @@
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 15
VisualStudioVersion = 15.0.35714.111
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "S7CommPlusGUIBrowser", "S7CommPlusGUIBrowser\S7CommPlusGUIBrowser.csproj", "{BEB37276-B3B3-4DEE-A1EA-D95EB774223B}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DriverTest", "DriverTest\DriverTest.csproj", "{94755B6A-7E0D-40F9-A2ED-48FF0C0FEA2B}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Debug|x64 = Debug|x64
Debug|x86 = Debug|x86
Release|Any CPU = Release|Any CPU
Release|x64 = Release|x64
Release|x86 = Release|x86
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{BEB37276-B3B3-4DEE-A1EA-D95EB774223B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{BEB37276-B3B3-4DEE-A1EA-D95EB774223B}.Debug|Any CPU.Build.0 = Debug|Any CPU
{BEB37276-B3B3-4DEE-A1EA-D95EB774223B}.Debug|x64.ActiveCfg = Debug|x64
{BEB37276-B3B3-4DEE-A1EA-D95EB774223B}.Debug|x64.Build.0 = Debug|x64
{BEB37276-B3B3-4DEE-A1EA-D95EB774223B}.Debug|x86.ActiveCfg = Debug|x86
{BEB37276-B3B3-4DEE-A1EA-D95EB774223B}.Debug|x86.Build.0 = Debug|x86
{BEB37276-B3B3-4DEE-A1EA-D95EB774223B}.Release|Any CPU.ActiveCfg = Release|Any CPU
{BEB37276-B3B3-4DEE-A1EA-D95EB774223B}.Release|Any CPU.Build.0 = Release|Any CPU
{BEB37276-B3B3-4DEE-A1EA-D95EB774223B}.Release|x64.ActiveCfg = Release|x64
{BEB37276-B3B3-4DEE-A1EA-D95EB774223B}.Release|x64.Build.0 = Release|x64
{BEB37276-B3B3-4DEE-A1EA-D95EB774223B}.Release|x86.ActiveCfg = Release|x86
{BEB37276-B3B3-4DEE-A1EA-D95EB774223B}.Release|x86.Build.0 = Release|x86
{94755B6A-7E0D-40F9-A2ED-48FF0C0FEA2B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{94755B6A-7E0D-40F9-A2ED-48FF0C0FEA2B}.Debug|Any CPU.Build.0 = Debug|Any CPU
{94755B6A-7E0D-40F9-A2ED-48FF0C0FEA2B}.Debug|x64.ActiveCfg = Debug|x64
{94755B6A-7E0D-40F9-A2ED-48FF0C0FEA2B}.Debug|x64.Build.0 = Debug|x64
{94755B6A-7E0D-40F9-A2ED-48FF0C0FEA2B}.Debug|x86.ActiveCfg = Debug|x86
{94755B6A-7E0D-40F9-A2ED-48FF0C0FEA2B}.Debug|x86.Build.0 = Debug|x86
{94755B6A-7E0D-40F9-A2ED-48FF0C0FEA2B}.Release|Any CPU.ActiveCfg = Release|Any CPU
{94755B6A-7E0D-40F9-A2ED-48FF0C0FEA2B}.Release|Any CPU.Build.0 = Release|Any CPU
{94755B6A-7E0D-40F9-A2ED-48FF0C0FEA2B}.Release|x64.ActiveCfg = Release|x64
{94755B6A-7E0D-40F9-A2ED-48FF0C0FEA2B}.Release|x64.Build.0 = Release|x64
{94755B6A-7E0D-40F9-A2ED-48FF0C0FEA2B}.Release|x86.ActiveCfg = Release|x86
{94755B6A-7E0D-40F9-A2ED-48FF0C0FEA2B}.Release|x86.Build.0 = Release|x86
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {54F7646F-145F-47BA-9558-5A8A57627F7D}
EndGlobalSection
EndGlobal

View File

@@ -0,0 +1 @@
{"RootPath":"D:\\personal data\\S7CommPlus协议研究资料\\S7CommPlusDriver-master\\src\\S7CommPlusGUIBrowser","ProjectFileName":"S7CommPlusGUIBrowser.csproj","Configuration":"Debug|x86","FrameworkPath":"","Sources":[{"SourceFile":"Form1.cs"},{"SourceFile":"Form1.Designer.cs"},{"SourceFile":"Program.cs"},{"SourceFile":"Properties\\AssemblyInfo.cs"},{"SourceFile":"Properties\\Resources.Designer.cs"},{"SourceFile":"Properties\\Settings.Designer.cs"},{"SourceFile":"obj\\x86\\Debug\\.NETFramework,Version=v4.7.2.AssemblyAttributes.cs"}],"References":[{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.7.2\\Microsoft.CSharp.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.7.2\\mscorlib.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"D:\\personal data\\S7CommPlus协议研究资料\\S7CommPlusDriver-master\\src\\S7CommPlusDriver\\bin\\x86\\Debug\\S7CommPlusDriver.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":true,"ProjectPath":"D:\\personal data\\S7CommPlus协议研究资料\\S7CommPlusDriver-master\\src\\S7CommPlusDriver\\bin\\x86\\Debug\\S7CommPlusDriver.dll"},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.7.2\\System.Core.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.7.2\\System.Data.DataSetExtensions.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.7.2\\System.Data.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.7.2\\System.Deployment.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.7.2\\System.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.7.2\\System.Drawing.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.7.2\\System.Net.Http.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.7.2\\System.Windows.Forms.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.7.2\\System.Xml.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.7.2\\System.Xml.Linq.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""}],"Analyzers":[],"Outputs":[{"OutputItemFullPath":"D:\\personal data\\S7CommPlus协议研究资料\\S7CommPlusDriver-master\\src\\S7CommPlusGUIBrowser\\bin\\x86\\Debug\\S7CommPlusGUIBrowser.exe","OutputItemRelativePath":"S7CommPlusGUIBrowser.exe"},{"OutputItemFullPath":"","OutputItemRelativePath":""}],"CopyToOutputEntries":[]}

View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" />
</startup>
</configuration>

346
S7CommPlusGUIBrowser/Form1.Designer.cs generated Normal file
View File

@@ -0,0 +1,346 @@
namespace S7CommPlusGUIBrowser {
partial class Form1 {
/// <summary>
/// Erforderliche Designervariable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Verwendete Ressourcen bereinigen.
/// </summary>
/// <param name="disposing">True, wenn verwaltete Ressourcen gelöscht werden sollen; andernfalls False.</param>
protected override void Dispose(bool disposing) {
if (disposing && (components != null)) {
components.Dispose();
}
base.Dispose(disposing);
}
#region Vom Windows Form-Designer generierter Code
/// <summary>
/// Erforderliche Methode für die Designerunterstützung.
/// Der Inhalt der Methode darf nicht mit dem Code-Editor geändert werden.
/// </summary>
private void InitializeComponent() {
this.components = new System.ComponentModel.Container();
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Form1));
this.groupBox1 = new System.Windows.Forms.GroupBox();
this.lbStatus = new System.Windows.Forms.Label();
this.label6 = new System.Windows.Forms.Label();
this.btnDisconnect = new System.Windows.Forms.Button();
this.btnConnect = new System.Windows.Forms.Button();
this.label2 = new System.Windows.Forms.Label();
this.tbPassword = new System.Windows.Forms.TextBox();
this.label1 = new System.Windows.Forms.Label();
this.tbIpAddress = new System.Windows.Forms.TextBox();
this.treeView1 = new System.Windows.Forms.TreeView();
this.imageListTreeIcons = new System.Windows.Forms.ImageList(this.components);
this.groupBox2 = new System.Windows.Forms.GroupBox();
this.btnRead = new System.Windows.Forms.Button();
this.tbValue = new System.Windows.Forms.TextBox();
this.label5 = new System.Windows.Forms.Label();
this.tbSymbolicAddress = new System.Windows.Forms.TextBox();
this.label4 = new System.Windows.Forms.Label();
this.tbSymbol = new System.Windows.Forms.TextBox();
this.label3 = new System.Windows.Forms.Label();
this.statusStrip1 = new System.Windows.Forms.StatusStrip();
this.txt_plcInfo = new System.Windows.Forms.ToolStripStatusLabel();
this.groupBox1.SuspendLayout();
this.groupBox2.SuspendLayout();
this.statusStrip1.SuspendLayout();
this.SuspendLayout();
//
// groupBox1
//
this.groupBox1.Controls.Add(this.lbStatus);
this.groupBox1.Controls.Add(this.label6);
this.groupBox1.Controls.Add(this.btnDisconnect);
this.groupBox1.Controls.Add(this.btnConnect);
this.groupBox1.Controls.Add(this.label2);
this.groupBox1.Controls.Add(this.tbPassword);
this.groupBox1.Controls.Add(this.label1);
this.groupBox1.Controls.Add(this.tbIpAddress);
this.groupBox1.Location = new System.Drawing.Point(12, 11);
this.groupBox1.Name = "groupBox1";
this.groupBox1.Size = new System.Drawing.Size(171, 131);
this.groupBox1.TabIndex = 0;
this.groupBox1.TabStop = false;
this.groupBox1.Text = "Connection";
//
// lbStatus
//
this.lbStatus.Location = new System.Drawing.Point(44, 114);
this.lbStatus.Name = "lbStatus";
this.lbStatus.Size = new System.Drawing.Size(116, 15);
this.lbStatus.TabIndex = 7;
//
// label6
//
this.label6.AutoSize = true;
this.label6.Location = new System.Drawing.Point(6, 114);
this.label6.Name = "label6";
this.label6.Size = new System.Drawing.Size(47, 12);
this.label6.TabIndex = 6;
this.label6.Text = "Status:";
//
// btnDisconnect
//
this.btnDisconnect.Location = new System.Drawing.Point(85, 90);
this.btnDisconnect.Name = "btnDisconnect";
this.btnDisconnect.Size = new System.Drawing.Size(75, 21);
this.btnDisconnect.TabIndex = 5;
this.btnDisconnect.Text = "Disconnect";
this.btnDisconnect.UseVisualStyleBackColor = true;
this.btnDisconnect.Click += new System.EventHandler(this.btnDisconnect_Click);
//
// btnConnect
//
this.btnConnect.Location = new System.Drawing.Point(9, 90);
this.btnConnect.Name = "btnConnect";
this.btnConnect.Size = new System.Drawing.Size(75, 21);
this.btnConnect.TabIndex = 4;
this.btnConnect.Text = "Connect";
this.btnConnect.UseVisualStyleBackColor = true;
this.btnConnect.Click += new System.EventHandler(this.btnConnect_Click);
//
// label2
//
this.label2.AutoSize = true;
this.label2.Location = new System.Drawing.Point(6, 51);
this.label2.Name = "label2";
this.label2.Size = new System.Drawing.Size(125, 12);
this.label2.TabIndex = 3;
this.label2.Text = "Password (optional):";
//
// tbPassword
//
this.tbPassword.Location = new System.Drawing.Point(9, 66);
this.tbPassword.Name = "tbPassword";
this.tbPassword.PasswordChar = '*';
this.tbPassword.Size = new System.Drawing.Size(151, 21);
this.tbPassword.TabIndex = 2;
//
// label1
//
this.label1.AutoSize = true;
this.label1.Location = new System.Drawing.Point(6, 15);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(71, 12);
this.label1.TabIndex = 1;
this.label1.Text = "IP-Address:";
//
// tbIpAddress
//
this.tbIpAddress.Location = new System.Drawing.Point(9, 30);
this.tbIpAddress.Name = "tbIpAddress";
this.tbIpAddress.Size = new System.Drawing.Size(151, 21);
this.tbIpAddress.TabIndex = 0;
this.tbIpAddress.Text = "192.168.0.250";
//
// treeView1
//
this.treeView1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
| System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.treeView1.ImageIndex = 0;
this.treeView1.ImageList = this.imageListTreeIcons;
this.treeView1.Location = new System.Drawing.Point(12, 148);
this.treeView1.Name = "treeView1";
this.treeView1.SelectedImageIndex = 0;
this.treeView1.Size = new System.Drawing.Size(776, 242);
this.treeView1.TabIndex = 1;
this.treeView1.AfterExpand += new System.Windows.Forms.TreeViewEventHandler(this.treeView1_AfterExpand);
this.treeView1.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.treeView1_AfterSelect);
//
// imageListTreeIcons
//
this.imageListTreeIcons.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("imageListTreeIcons.ImageStream")));
this.imageListTreeIcons.TransparentColor = System.Drawing.Color.Transparent;
this.imageListTreeIcons.Images.SetKeyName(0, "Default");
this.imageListTreeIcons.Images.SetKeyName(1, "Datablock");
this.imageListTreeIcons.Images.SetKeyName(2, "Tag");
this.imageListTreeIcons.Images.SetKeyName(3, "Boolean");
this.imageListTreeIcons.Images.SetKeyName(4, "Boolean1");
this.imageListTreeIcons.Images.SetKeyName(5, "Boolean2");
this.imageListTreeIcons.Images.SetKeyName(6, "Any");
this.imageListTreeIcons.Images.SetKeyName(7, "Binary");
this.imageListTreeIcons.Images.SetKeyName(8, "Binary2");
this.imageListTreeIcons.Images.SetKeyName(9, "Date");
this.imageListTreeIcons.Images.SetKeyName(10, "Integer");
this.imageListTreeIcons.Images.SetKeyName(11, "Integer2");
this.imageListTreeIcons.Images.SetKeyName(12, "Number");
this.imageListTreeIcons.Images.SetKeyName(13, "Number2");
this.imageListTreeIcons.Images.SetKeyName(14, "Time");
this.imageListTreeIcons.Images.SetKeyName(15, "Datetime");
this.imageListTreeIcons.Images.SetKeyName(16, "Datetimezone");
this.imageListTreeIcons.Images.SetKeyName(17, "Duration");
this.imageListTreeIcons.Images.SetKeyName(18, "Timer");
this.imageListTreeIcons.Images.SetKeyName(19, "Char");
this.imageListTreeIcons.Images.SetKeyName(20, "Text");
this.imageListTreeIcons.Images.SetKeyName(21, "Text2");
this.imageListTreeIcons.Images.SetKeyName(22, "Text3");
this.imageListTreeIcons.Images.SetKeyName(23, "Structure");
this.imageListTreeIcons.Images.SetKeyName(24, "Currency");
this.imageListTreeIcons.Images.SetKeyName(25, "Percentage");
this.imageListTreeIcons.Images.SetKeyName(26, "UserDataType");
this.imageListTreeIcons.Images.SetKeyName(27, "UserDefinedDataType");
this.imageListTreeIcons.Images.SetKeyName(28, "CountCollection");
this.imageListTreeIcons.Images.SetKeyName(29, "FolderOpened");
this.imageListTreeIcons.Images.SetKeyName(30, "FolderClosed");
this.imageListTreeIcons.Images.SetKeyName(31, "FolderTopPanel");
this.imageListTreeIcons.Images.SetKeyName(32, "Indexer");
this.imageListTreeIcons.Images.SetKeyName(33, "Library");
this.imageListTreeIcons.Images.SetKeyName(34, "NamedSet");
this.imageListTreeIcons.Images.SetKeyName(35, "TypeDefinition");
//
// groupBox2
//
this.groupBox2.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.groupBox2.Controls.Add(this.btnRead);
this.groupBox2.Controls.Add(this.tbValue);
this.groupBox2.Controls.Add(this.label5);
this.groupBox2.Controls.Add(this.tbSymbolicAddress);
this.groupBox2.Controls.Add(this.label4);
this.groupBox2.Controls.Add(this.tbSymbol);
this.groupBox2.Controls.Add(this.label3);
this.groupBox2.Location = new System.Drawing.Point(189, 11);
this.groupBox2.Name = "groupBox2";
this.groupBox2.Size = new System.Drawing.Size(599, 131);
this.groupBox2.TabIndex = 2;
this.groupBox2.TabStop = false;
this.groupBox2.Text = "Data";
//
// btnRead
//
this.btnRead.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.btnRead.Location = new System.Drawing.Point(518, 28);
this.btnRead.Name = "btnRead";
this.btnRead.Size = new System.Drawing.Size(75, 21);
this.btnRead.TabIndex = 11;
this.btnRead.Text = "Read";
this.btnRead.UseVisualStyleBackColor = true;
this.btnRead.Click += new System.EventHandler(this.btnRead_Click);
//
// tbValue
//
this.tbValue.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.tbValue.Location = new System.Drawing.Point(6, 102);
this.tbValue.Name = "tbValue";
this.tbValue.ReadOnly = true;
this.tbValue.Size = new System.Drawing.Size(587, 21);
this.tbValue.TabIndex = 10;
//
// label5
//
this.label5.AutoSize = true;
this.label5.Location = new System.Drawing.Point(6, 87);
this.label5.Name = "label5";
this.label5.Size = new System.Drawing.Size(41, 12);
this.label5.TabIndex = 9;
this.label5.Text = "Value:";
//
// tbSymbolicAddress
//
this.tbSymbolicAddress.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.tbSymbolicAddress.Location = new System.Drawing.Point(6, 66);
this.tbSymbolicAddress.Name = "tbSymbolicAddress";
this.tbSymbolicAddress.ReadOnly = true;
this.tbSymbolicAddress.Size = new System.Drawing.Size(587, 21);
this.tbSymbolicAddress.TabIndex = 8;
//
// label4
//
this.label4.AutoSize = true;
this.label4.Location = new System.Drawing.Point(6, 51);
this.label4.Name = "label4";
this.label4.Size = new System.Drawing.Size(107, 12);
this.label4.TabIndex = 7;
this.label4.Text = "Symbolic address:";
//
// tbSymbol
//
this.tbSymbol.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.tbSymbol.Location = new System.Drawing.Point(6, 30);
this.tbSymbol.Name = "tbSymbol";
this.tbSymbol.Size = new System.Drawing.Size(506, 21);
this.tbSymbol.TabIndex = 6;
//
// label3
//
this.label3.AutoSize = true;
this.label3.Location = new System.Drawing.Point(6, 15);
this.label3.Name = "label3";
this.label3.Size = new System.Drawing.Size(47, 12);
this.label3.TabIndex = 0;
this.label3.Text = "Symbol:";
//
// statusStrip1
//
this.statusStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.txt_plcInfo});
this.statusStrip1.Location = new System.Drawing.Point(0, 393);
this.statusStrip1.Name = "statusStrip1";
this.statusStrip1.Size = new System.Drawing.Size(800, 22);
this.statusStrip1.TabIndex = 3;
this.statusStrip1.Text = "statusStrip1";
//
// txt_plcInfo
//
this.txt_plcInfo.Name = "txt_plcInfo";
this.txt_plcInfo.Size = new System.Drawing.Size(60, 17);
this.txt_plcInfo.Text = "PLCType:";
//
// Form1
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(800, 415);
this.Controls.Add(this.statusStrip1);
this.Controls.Add(this.groupBox2);
this.Controls.Add(this.treeView1);
this.Controls.Add(this.groupBox1);
this.Name = "Form1";
this.Text = "S7CommPlusGUIBrowser";
this.FormClosed += new System.Windows.Forms.FormClosedEventHandler(this.Form1_FormClosed);
this.groupBox1.ResumeLayout(false);
this.groupBox1.PerformLayout();
this.groupBox2.ResumeLayout(false);
this.groupBox2.PerformLayout();
this.statusStrip1.ResumeLayout(false);
this.statusStrip1.PerformLayout();
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.GroupBox groupBox1;
private System.Windows.Forms.Label label1;
private System.Windows.Forms.TextBox tbIpAddress;
private System.Windows.Forms.Label label2;
private System.Windows.Forms.TextBox tbPassword;
private System.Windows.Forms.Button btnDisconnect;
private System.Windows.Forms.Button btnConnect;
private System.Windows.Forms.TreeView treeView1;
private System.Windows.Forms.GroupBox groupBox2;
private System.Windows.Forms.TextBox tbValue;
private System.Windows.Forms.Label label5;
private System.Windows.Forms.TextBox tbSymbolicAddress;
private System.Windows.Forms.Label label4;
private System.Windows.Forms.TextBox tbSymbol;
private System.Windows.Forms.Label label3;
private System.Windows.Forms.Label lbStatus;
private System.Windows.Forms.Label label6;
private System.Windows.Forms.Button btnRead;
private System.Windows.Forms.ImageList imageListTreeIcons;
private System.Windows.Forms.StatusStrip statusStrip1;
private System.Windows.Forms.ToolStripStatusLabel txt_plcInfo;
}
}

View File

@@ -0,0 +1,406 @@
using S7CommPlusDriver;
using S7CommPlusDriver.ClientApi;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;
using System.Windows.Forms;
namespace S7CommPlusGUIBrowser
{
public partial class Form1 : Form
{
private S7CommPlusConnection conn = null;
public Form1()
{
InitializeComponent();
string[] args = Environment.GetCommandLineArgs();
// 1st argument can be the plc ip-address, otherwise use default
if (args.Length >= 2)
{
tbIpAddress.Text = args[1];
}
// 2nd argument can be the plc password, otherwise use default (no password)
if (args.Length >= 3)
{
tbPassword.Text = args[2];
}
}
private void setStatus(string status)
{
lbStatus.Text = status;
lbStatus.Refresh();
}
private void btnConnect_Click(object sender, EventArgs e)
{
setStatus("connecting...");
if (conn != null) conn.Disconnect();
conn = new S7CommPlusConnection();
int res = conn.Connect(tbIpAddress.Text, tbPassword.Text);
if (res != 0)
{
setStatus("error");
return;
}
setStatus("connected");
txt_plcInfo.Text = $"PLCType: {conn.PLCInformation.PLCType}";
treeView1.Nodes.Clear();
setStatus("loading...");
List<S7CommPlusConnection.DatablockInfo> dbInfoList;
res = conn.GetListOfDatablocks(out dbInfoList);
if (res != 0)
{
setStatus("error");
return;
}
TreeNode tn;
foreach (S7CommPlusConnection.DatablockInfo dbInfo in dbInfoList)
{
tn = treeView1.Nodes.Add(dbInfo.db_name);
tn.Nodes.Add("Loading...");
tn.Tag = dbInfo.db_block_ti_relid;
tn.ImageKey = "Datablock";
tn.SelectedImageKey = tn.ImageKey;
}
// Inputs
tn = treeView1.Nodes.Add("Inputs");
tn.Nodes.Add("Loading...");
tn.Tag = 0x90010000;
tn.ImageKey = "Default";
tn.SelectedImageKey = tn.ImageKey;
// Outputs
tn = treeView1.Nodes.Add("Outputs");
tn.Nodes.Add("Loading...");
tn.Tag = 0x90020000;
tn.ImageKey = "Default";
tn.SelectedImageKey = tn.ImageKey;
// Merker
tn = treeView1.Nodes.Add("Merker");
tn.Nodes.Add("Loading...");
tn.Tag = 0x90030000;
tn.ImageKey = "Default";
tn.SelectedImageKey = tn.ImageKey;
// S7Timers
tn = treeView1.Nodes.Add("S7Timers");
tn.Nodes.Add("Loading...");
tn.Tag = 0x90050000;
tn.ImageKey = "Default";
tn.SelectedImageKey = tn.ImageKey;
// S7Counters
tn = treeView1.Nodes.Add("S7Counters");
tn.Nodes.Add("Loading...");
tn.Tag = 0x90060000;
tn.ImageKey = "Default";
tn.SelectedImageKey = tn.ImageKey;
setStatus("connected");
}
private void btnDisconnect_Click(object sender, EventArgs e)
{
setStatus("disconnecting...");
if (conn != null) conn.Disconnect();
conn = null;
treeView1.Nodes.Clear();
txt_plcInfo.Text = "PLCType:";
setStatus("disconnected");
}
private void Form1_FormClosed(object sender, FormClosedEventArgs e)
{
if (conn != null) conn.Disconnect();
}
private void treeView1_AfterExpand(object sender, TreeViewEventArgs e)
{
if (e.Node.Nodes.Count < 0 || e.Node.Nodes[0].Text != "Loading...") return;
setStatus("loading...");
e.Node.Nodes.Clear();
uint relTiId = (uint)e.Node.Tag;
PObject pObj = conn.getTypeInfoByRelId(relTiId);
setStatus("connected");
if (pObj == null || pObj.VarnameList == null) return;
TreeNode tn;
TreeNode tnarr;
for (int i = 0; i < pObj.VarnameList.Names.Count; ++i)
{
tn = e.Node.Nodes.Add(pObj.VarnameList.Names[i]);
SetImageKey(ref tn, pObj.VartypeList.Elements[i]);
if (pObj.VartypeList.Elements[i].OffsetInfoType.Is1Dim())
{
var ioitarr = (IOffsetInfoType_1Dim)pObj.VartypeList.Elements[i].OffsetInfoType;
uint arrayElementCount = ioitarr.GetArrayElementCount();
int arrayLowerBounds = ioitarr.GetArrayLowerBounds();
for (int j = 0; j < arrayElementCount; ++j)
{
tnarr = tn.Nodes.Add(pObj.VarnameList.Names[i] + "[" + (j + arrayLowerBounds) + "]");
SetImageKey(ref tnarr, pObj.VartypeList.Elements[i]);
if (pObj.VartypeList.Elements[i].OffsetInfoType.HasRelation())
{
var ioit = (IOffsetInfoType_Relation)pObj.VartypeList.Elements[i].OffsetInfoType;
tnarr.Nodes.Add("Loading...");
tnarr.Tag = ioit.GetRelationId();
SetImageKey(ref tnarr, pObj.VartypeList.Elements[i]);
}
}
tn.Tag = (uint)0; // is array
}
else if (pObj.VartypeList.Elements[i].OffsetInfoType.IsMDim())
{
var ioitarrm = (IOffsetInfoType_MDim)pObj.VartypeList.Elements[i].OffsetInfoType;
uint[] MdimArrayElementCount = ioitarrm.GetMdimArrayElementCount();
int[] MdimArrayLowerBounds = ioitarrm.GetMdimArrayLowerBounds();
int dimCount = MdimArrayElementCount.Aggregate(0, (acc, act) => acc += (act > 0) ? 1 : 0);
int[] indexes = new int[dimCount];
bool stop = false;
while (!stop)
{
string arrIdxStr = "";
for (int j = dimCount - 1; j >= 0; --j)
{
arrIdxStr += (arrIdxStr != "" ? "," : "") + (indexes[j] + MdimArrayLowerBounds[j]);
}
tnarr = tn.Nodes.Add(pObj.VarnameList.Names[i] + "[" + arrIdxStr + "]");
SetImageKey(ref tnarr, pObj.VartypeList.Elements[i]);
if (pObj.VartypeList.Elements[i].OffsetInfoType.HasRelation())
{
var ioit = (IOffsetInfoType_Relation)pObj.VartypeList.Elements[i].OffsetInfoType;
tnarr.Nodes.Add("Loading...");
tnarr.Tag = ioit.GetRelationId();
SetImageKey(ref tnarr, pObj.VartypeList.Elements[i]);
}
++indexes[0];
for (int j = 0; j < dimCount; ++j)
{
if (indexes[j] >= MdimArrayElementCount[j])
{
if (j + 1 < dimCount)
{
indexes[j] = 0;
++indexes[j + 1];
}
else
{
stop = true;
}
}
else
{
break;
}
}
}
tn.Tag = (uint)0; // is array
}
else
{
if (pObj.VartypeList.Elements[i].OffsetInfoType.HasRelation())
{
var ioit = (IOffsetInfoType_Relation)pObj.VartypeList.Elements[i].OffsetInfoType;
tn.Nodes.Add("Loading...");
tn.Tag = ioit.GetRelationId();
SetImageKey(ref tn, pObj.VartypeList.Elements[i]);
}
}
}
}
private void SetImageKey(ref TreeNode tn, PVartypeListElement vte)
{
string sk = "Tag";
switch (vte.Softdatatype)
{
case Softdatatype.S7COMMP_SOFTDATATYPE_BOOL:
case Softdatatype.S7COMMP_SOFTDATATYPE_BBOOL:
sk = "Boolean";
break;
case Softdatatype.S7COMMP_SOFTDATATYPE_INT:
case Softdatatype.S7COMMP_SOFTDATATYPE_DINT:
case Softdatatype.S7COMMP_SOFTDATATYPE_ULINT:
case Softdatatype.S7COMMP_SOFTDATATYPE_LINT:
case Softdatatype.S7COMMP_SOFTDATATYPE_USINT:
case Softdatatype.S7COMMP_SOFTDATATYPE_UINT:
case Softdatatype.S7COMMP_SOFTDATATYPE_UDINT:
case Softdatatype.S7COMMP_SOFTDATATYPE_SINT:
// Derived types
case Softdatatype.S7COMMP_SOFTDATATYPE_BLOCKFB:
case Softdatatype.S7COMMP_SOFTDATATYPE_BLOCKFC:
case Softdatatype.S7COMMP_SOFTDATATYPE_OBANY:
case Softdatatype.S7COMMP_SOFTDATATYPE_OBDELAY:
case Softdatatype.S7COMMP_SOFTDATATYPE_OBTOD:
case Softdatatype.S7COMMP_SOFTDATATYPE_OBCYCLIC:
case Softdatatype.S7COMMP_SOFTDATATYPE_OBATT:
case Softdatatype.S7COMMP_SOFTDATATYPE_PORT:
case Softdatatype.S7COMMP_SOFTDATATYPE_RTM:
case Softdatatype.S7COMMP_SOFTDATATYPE_PIP:
case Softdatatype.S7COMMP_SOFTDATATYPE_OBPCYCLE:
case Softdatatype.S7COMMP_SOFTDATATYPE_OBHWINT:
case Softdatatype.S7COMMP_SOFTDATATYPE_OBDIAG:
case Softdatatype.S7COMMP_SOFTDATATYPE_OBTIMEERROR:
case Softdatatype.S7COMMP_SOFTDATATYPE_OBSTARTUP:
case Softdatatype.S7COMMP_SOFTDATATYPE_DBANY:
case Softdatatype.S7COMMP_SOFTDATATYPE_DBWWW:
case Softdatatype.S7COMMP_SOFTDATATYPE_DBDYN:
sk = "Integer2";
break;
case Softdatatype.S7COMMP_SOFTDATATYPE_BYTE:
case Softdatatype.S7COMMP_SOFTDATATYPE_WORD:
case Softdatatype.S7COMMP_SOFTDATATYPE_DWORD:
case Softdatatype.S7COMMP_SOFTDATATYPE_LWORD:
// Derived types
case Softdatatype.S7COMMP_SOFTDATATYPE_AOMIDENT:
case Softdatatype.S7COMMP_SOFTDATATYPE_EVENTANY:
case Softdatatype.S7COMMP_SOFTDATATYPE_EVENTATT:
case Softdatatype.S7COMMP_SOFTDATATYPE_AOMLINK:
case Softdatatype.S7COMMP_SOFTDATATYPE_HWANY:
case Softdatatype.S7COMMP_SOFTDATATYPE_HWIOSYSTEM:
case Softdatatype.S7COMMP_SOFTDATATYPE_HWDPMASTER:
case Softdatatype.S7COMMP_SOFTDATATYPE_HWDEVICE:
case Softdatatype.S7COMMP_SOFTDATATYPE_HWDPSLAVE:
case Softdatatype.S7COMMP_SOFTDATATYPE_HWIO:
case Softdatatype.S7COMMP_SOFTDATATYPE_HWMODULE:
case Softdatatype.S7COMMP_SOFTDATATYPE_HWSUBMODULE:
case Softdatatype.S7COMMP_SOFTDATATYPE_HWHSC:
case Softdatatype.S7COMMP_SOFTDATATYPE_HWPWM:
case Softdatatype.S7COMMP_SOFTDATATYPE_HWPTO:
case Softdatatype.S7COMMP_SOFTDATATYPE_HWINTERFACE:
case Softdatatype.S7COMMP_SOFTDATATYPE_HWIEPORT:
case Softdatatype.S7COMMP_SOFTDATATYPE_CONNANY:
case Softdatatype.S7COMMP_SOFTDATATYPE_CONNPRG:
case Softdatatype.S7COMMP_SOFTDATATYPE_CONNOUC:
case Softdatatype.S7COMMP_SOFTDATATYPE_CONNRID:
sk = "Binary2";
break;
case Softdatatype.S7COMMP_SOFTDATATYPE_REAL:
case Softdatatype.S7COMMP_SOFTDATATYPE_LREAL:
sk = "Number2";
break;
case Softdatatype.S7COMMP_SOFTDATATYPE_CHAR:
case Softdatatype.S7COMMP_SOFTDATATYPE_WCHAR:
sk = "Char";
break;
case Softdatatype.S7COMMP_SOFTDATATYPE_STRING:
case Softdatatype.S7COMMP_SOFTDATATYPE_WSTRING:
sk = "Text";
break;
case Softdatatype.S7COMMP_SOFTDATATYPE_DATE:
sk = "Date";
break;
case Softdatatype.S7COMMP_SOFTDATATYPE_TIMEOFDAY:
case Softdatatype.S7COMMP_SOFTDATATYPE_LTOD:
sk = "Time";
break;
case Softdatatype.S7COMMP_SOFTDATATYPE_TIME:
case Softdatatype.S7COMMP_SOFTDATATYPE_LTIME:
case Softdatatype.S7COMMP_SOFTDATATYPE_S5TIME:
case Softdatatype.S7COMMP_SOFTDATATYPE_TIMER:
sk = "Timer"; // Duration
break;
case Softdatatype.S7COMMP_SOFTDATATYPE_DATEANDTIME:
case Softdatatype.S7COMMP_SOFTDATATYPE_LDT:
case Softdatatype.S7COMMP_SOFTDATATYPE_DTL:
sk = "DateTime";
break;
case Softdatatype.S7COMMP_SOFTDATATYPE_ANY:
case Softdatatype.S7COMMP_SOFTDATATYPE_POINTER:
case Softdatatype.S7COMMP_SOFTDATATYPE_REMOTE:
sk = "Any";
break;
}
if (vte.OffsetInfoType.HasRelation())
{
sk = "Structure";
}
tn.ImageKey = sk;
tn.SelectedImageKey = tn.ImageKey;
}
private string escapeTiaString(string str, bool isRootNode, bool isArray)
{
if (isRootNode) return '"' + str + '"';
Regex re = new Regex("(^[0-9]|[^0-9A-Za-z_])");
if (isArray)
{
Regex reArr = new Regex("^([^\"]*)(\\[[0-9, ]+\\])$");
Match m = reArr.Match(str);
if (!m.Success) return str;
if (re.Match(m.Groups[1].Value).Success) return '"' + m.Groups[1].Value + '"' + m.Groups[2].Value;
return str;
}
if (re.IsMatch(str)) return '"' + str + '"';
return str;
}
private void readTagBySymbol()
{
tbValue.Text = "";
tbSymbolicAddress.Text = "";
setStatus("loading...");
PlcTag tag = conn.getPlcTagBySymbol(tbSymbol.Text);
setStatus("connected");
if (tag == null) return;
tbSymbolicAddress.Text = tag.Address.GetAccessString();
PlcTags tags = new PlcTags();
tags.AddTag(tag);
if (tags.ReadTags(conn) != 0) return;
tbValue.Text = tag.ToString();
}
private void treeView1_AfterSelect(object sender, TreeViewEventArgs e)
{
if (e.Node.Tag != null) return; // has relId
string name = "";
TreeNode tn = e.Node;
while (tn != null)
{
bool isArray = false;
string nodeText = tn.Text;
tn = tn.Parent;
if (tn != null && tn.Tag != null)
{ // is array
if ((uint)tn.Tag == 0)
{
isArray = true;
tn = tn.Parent; // skip array parent
}
}
if (tn != null && tn.Tag != null)
{ // don't add in/out/merker area as tag
uint relId = (uint)tn.Tag;
if (relId == 0x90010000 || relId == 0x90020000 || relId == 0x90030000) tn = null;
}
name = escapeTiaString(nodeText, tn == null, isArray) + (name != "" ? "." : "") + name;
}
tbSymbol.Text = name;
readTagBySymbol();
}
private void btnRead_Click(object sender, EventArgs e)
{
if (tbSymbol.Text == "") return;
try
{
readTagBySymbol();
}
catch (Exception ex)
{
MessageBox.Show("ERROR: " + ex.Message);
}
}
}
}

View File

@@ -0,0 +1,316 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<metadata name="imageListTreeIcons.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>17, 17</value>
</metadata>
<data name="imageListTreeIcons.ImageStream" mimetype="application/x-microsoft.net.object.binary.base64">
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w
LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0
ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAAC4
KgAAAk1TRnQBSQFMAgEBJAEAAagBAAGoAQABEAEAARABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo
AwABQAMAAaADAAEBAQABCAYAASgYAAGAAgABgAMAAoABAAGAAwABgAEAAYABAAKAAgADwAEAAcAB3AHA
AQAB8AHKAaYBAAEzBQABMwEAATMBAAEzAQACMwIAAxYBAAMcAQADIgEAAykBAANVAQADTQEAA0IBAAM5
AQABgAF8Af8BAAJQAf8BAAGTAQAB1gEAAf8B7AHMAQABxgHWAe8BAAHWAucBAAGQAakBrQIAAf8BMwMA
AWYDAAGZAwABzAIAATMDAAIzAgABMwFmAgABMwGZAgABMwHMAgABMwH/AgABZgMAAWYBMwIAAmYCAAFm
AZkCAAFmAcwCAAFmAf8CAAGZAwABmQEzAgABmQFmAgACmQIAAZkBzAIAAZkB/wIAAcwDAAHMATMCAAHM
AWYCAAHMAZkCAALMAgABzAH/AgAB/wFmAgAB/wGZAgAB/wHMAQABMwH/AgAB/wEAATMBAAEzAQABZgEA
ATMBAAGZAQABMwEAAcwBAAEzAQAB/wEAAf8BMwIAAzMBAAIzAWYBAAIzAZkBAAIzAcwBAAIzAf8BAAEz
AWYCAAEzAWYBMwEAATMCZgEAATMBZgGZAQABMwFmAcwBAAEzAWYB/wEAATMBmQIAATMBmQEzAQABMwGZ
AWYBAAEzApkBAAEzAZkBzAEAATMBmQH/AQABMwHMAgABMwHMATMBAAEzAcwBZgEAATMBzAGZAQABMwLM
AQABMwHMAf8BAAEzAf8BMwEAATMB/wFmAQABMwH/AZkBAAEzAf8BzAEAATMC/wEAAWYDAAFmAQABMwEA
AWYBAAFmAQABZgEAAZkBAAFmAQABzAEAAWYBAAH/AQABZgEzAgABZgIzAQABZgEzAWYBAAFmATMBmQEA
AWYBMwHMAQABZgEzAf8BAAJmAgACZgEzAQADZgEAAmYBmQEAAmYBzAEAAWYBmQIAAWYBmQEzAQABZgGZ
AWYBAAFmApkBAAFmAZkBzAEAAWYBmQH/AQABZgHMAgABZgHMATMBAAFmAcwBmQEAAWYCzAEAAWYBzAH/
AQABZgH/AgABZgH/ATMBAAFmAf8BmQEAAWYB/wHMAQABzAEAAf8BAAH/AQABzAEAApkCAAGZATMBmQEA
AZkBAAGZAQABmQEAAcwBAAGZAwABmQIzAQABmQEAAWYBAAGZATMBzAEAAZkBAAH/AQABmQFmAgABmQFm
ATMBAAGZATMBZgEAAZkBZgGZAQABmQFmAcwBAAGZATMB/wEAApkBMwEAApkBZgEAA5kBAAKZAcwBAAKZ
Af8BAAGZAcwCAAGZAcwBMwEAAWYBzAFmAQABmQHMAZkBAAGZAswBAAGZAcwB/wEAAZkB/wIAAZkB/wEz
AQABmQHMAWYBAAGZAf8BmQEAAZkB/wHMAQABmQL/AQABzAMAAZkBAAEzAQABzAEAAWYBAAHMAQABmQEA
AcwBAAHMAQABmQEzAgABzAIzAQABzAEzAWYBAAHMATMBmQEAAcwBMwHMAQABzAEzAf8BAAHMAWYCAAHM
AWYBMwEAAZkCZgEAAcwBZgGZAQABzAFmAcwBAAGZAWYB/wEAAcwBmQIAAcwBmQEzAQABzAGZAWYBAAHM
ApkBAAHMAZkBzAEAAcwBmQH/AQACzAIAAswBMwEAAswBZgEAAswBmQEAA8wBAALMAf8BAAHMAf8CAAHM
Af8BMwEAAZkB/wFmAQABzAH/AZkBAAHMAf8BzAEAAcwC/wEAAcwBAAEzAQAB/wEAAWYBAAH/AQABmQEA
AcwBMwIAAf8CMwEAAf8BMwFmAQAB/wEzAZkBAAH/ATMBzAEAAf8BMwH/AQAB/wFmAgAB/wFmATMBAAHM
AmYBAAH/AWYBmQEAAf8BZgHMAQABzAFmAf8BAAH/AZkCAAH/AZkBMwEAAf8BmQFmAQAB/wKZAQAB/wGZ
AcwBAAH/AZkB/wEAAf8BzAIAAf8BzAEzAQAB/wHMAWYBAAH/AcwBmQEAAf8CzAEAAf8BzAH/AQAC/wEz
AQABzAH/AWYBAAL/AZkBAAL/AcwBAAJmAf8BAAFmAf8BZgEAAWYC/wEAAf8CZgEAAf8BZgH/AQAC/wFm
AQABIQEAAaUBAANfAQADdwEAA4YBAAOWAQADywEAA7IBAAPXAQAD3QEAA+MBAAPqAQAD8QEAA/gBAAHw
AfsB/wEAAaQCoAEAA4ADAAH/AgAB/wMAAv8BAAH/AwAB/wEAAf8BAAL/AgAD//8A/wD/AP8ANQAJ9AcA
BfQGABX0EAAB9AcUCfQDFAH0BgAB9AMUAvQEFAH0BBQB9AQUAfQBAAH/A/QGAAP0Af8BAAH0ARQF9AEU
AfQGFAL0ARQD9AYAA/QBFAL0ARQC9AEUAfQBFAL0ARQB9AEUAvQBFAH0AQAB9AFtARQB8wYAAfQBFAFt
AfQBAAH0ARQF9AEUBvQBFAL0ARQB9AoAAfQBFAL0BBQB9AQUAfQEFAH0AQAB8wEUAZIB9AYAAfQBkgEU
AfMB/wH0ARQF9AEUBvQBFAL0ARQB9AoAAfQBFAL0ARQC9AEUAfQBFAL0ARQB9AEUAvQBFAH0AQAB8wEU
CfQB8wEUAfQBAAH0ARQF9AEUAfQEFAH0ARQC9AEUAfQKAAH0ARQC9AQUAfQEFAH0BBQC9AGSARQC9AIU
AvQCFAH0AfMBFAGSAvQBFAX0ARQG9AEUAvQBFAH0CgAB9AEUAvQEFAH0BBQB9AQUAvQBFAFtAvQCFAL0
AhQC9AFtARQC9AcUBvQBFAL0ARQB9AoAAfQBFAL0BBQB9AQUAfQEFAH0AfMBFAFtCvQBbQEUCvQEFAH0
ARQC9AEUAfQKAAH0ARQC9AQUAfQEFAH0BBQB9AHzAZIBFAH0Af8HAAH0ARQBkgH0BAAB9AEUCPQBFAL0
ARQB9AoAAfQBFAL0ARQC9AEUAfQEFAH0ARQC9AEUAfQBAAHzARQB9AgAAfMBFAH0BQAB9AEUCPQBFAL0
ARQB9AoAAfQBFAL0ARQC9AEUAfQEFAH0ARQC9AEUAfQBAAHzARQBkgH0BgAB9AGSARQB8wUAAfQBFAH0
BhQB9AEUAvQBFAP0BgAD9AEUAvQEFAH0ARQC9AEUAfQEFAH0AQAB9AFtARQB9AYAAfQBFAFtAfQFAAH0
ARQI9AEUAvQDFAH0BgAB9AMUB/QEFAb0AQAB/wP0BgAD9AH/BQAB9AEUCPQBFAb0BgAF9AUABvQZAAH0
ChQB9DQADPQBAAv0NQAB9AEUAfQDFAH0AxQB9CUADfQDAAH0ARQB9AEUBfQBFAH0BAAO9AH/AQAP9AEA
D/QCAAH0ARQB9AMUAvQCFAb0ApkKeQEaAfQBAAH0AZkLeQGZAfQBAAH0DJkBeQH0AQAC9AEUA/QBFAP0
ARQB9AMUAvQBeQEaCnkBmQH0AQAB9A15AfQBAAH0AZkL9AF5AfQBAAH0AhQB9AMUAfQDFAP0ARQC9AF5
AfMLeQEbAvQNeQH0AQAB9AGZC/QBeQH0AQAO9AEUAvQBeQH0AZkKeQEaAvQNeQH0AQAB9AGZC/QBeQH0
BAAB9AEUBPQBFAT0ARQC9AF5AfQBGgp5AZkC9A15AfQBAAH0AZkL9AF5AfQEAAH0BhQE9AEUAvQBeQv0
AXkD9A15AfQBAAH0DXkB9AQAC/QBFAL0AXkL9AF5A/QNeQH0AQAB9A15AfQFAAH0ARQD9AEUBPQBFAL0
AXkL9AF5AfQBAAH0DXkB9AEAAfQNeQH0BQAB9AEUA/QGFAL0AXkG9AEaBHkBmQH0AQAB9Ax5AZkB9AEA
AfQNeQH0BQAB9AEUC/QBeQb0AZkBGgX0AQAB9AF5BvQBGgGZBfQBAAH0CHkBmQX0BQAB9AEUBPQBFAH0
BAAB8wGZBnkBmQT0Af8CAAH0AZkHeQEbAfQFAAH0CHkBGgH0CQAB9AYUAfQEAAr0BgAK9AH/BQAK9AH/
CQAI9AUAAf8H9AH/LQAB7AHzCQABBwHqAfIEAAH/AewD6gHsAfQB/wX0Af8MAA30AwAB9AEHBOoBBwH0
BwAB/wHsAW0B/wMAAe8B6gHvAfIB7wHqAewB9AHbA7MB2wH0DAAB9AsUAfQDAAHwBuoB6wH0BwAB8gHq
Ae8DAAHqAW0DAAGSAeoB9AWzAfQMAAH0ARQJ9AEUAfQDAALwAfQBAAHsAfIB7wHqAfcIAAHvAeoB8wIA
AeoBkgMAAbwB6gH0BbMB9AwAAfQBFAn0ARQB9AcAAewB8wH0AuoIAAH/AW0B7AH/AQAB6gHsAwABBwHq
AfQBswHbAdwB2wGzCvQDAAH0ARQJ9AEUAfQHAAHsAfMB8gHqAesJAAHwAeoBBwEAAewB6gHzAQAB/wHs
AeoB9AGzA/QBswf0ApIB9AMAAfQBFAn0ARQB9AcAAewB7wLqAfAKAAGSAeoB9AHyAuoB7AFtAeoBBwH0
AdwDswHcBvQB8gHqAfAP9AEUAfQFAAH0AQcD6gEHBgAB/wHxAbwB8gEAAf8B6gHsAQAB8wHvApIBvAEA
Af8F9AFtAewB8gL0AfEBbQHsAfQBAAH0BxQG9AEUAfQEAAHyA+oB9wH0BgAB9AFtA+oB7QH/AbwB6gG8
CwAB9AHzAW0BEwJtARQB7QH0Af8BAAH0ARQB7QH0Ae0BFAH0ARQG9AEUAfQDAAH0AuoB7wHrAfMHAAHs
AeoBvAH0AQcB6gEHAQAB7AFtAf8KAAH0AfIBEwHvAfQB8gGSAW0B9AH/AQAB9AEUAfQBFAH0ARQB9AEU
BvQBFAH0AwABBwHqAQcBAAHsAfMHAAHqAewDAAHsAeoBAAHzAeoBkgoAAfQB7QHsBPQBbQEHAfQBAAH0
ARQB9AETAfQBFAH0ARQC9AUUAfQDAAEHAeoB8AEAAewB8wcAAeoBvAMAAe8B6gH0AQABBwHqAfEJAAH0
AW0BBwT0ApIB9AEAAfQBFAHtAfQB7QHqAfQBFAL0ARQC9AHxARQB9AMAAfEB6gHsAfQB7AHzAfQBBwH0
BAAB6gHvAwAB7AHqAf8BAAH/AewBbQH/CAAB9AHsAfcE9AHsAe8B9AEAAfQHFAL0ARQB9AHxARQB8wH0
BAAB9wbqAfQEAAFtAeoB9AEAAfMB6gHsAwAB8gHqAe8IAAH0AfABEwEHAvQB9wHqAfMB/wEACvQBFAHx
ARQB8wH0BgAB8AHrA+oBBwH/BAAB8QLqAewC6gHxBAAB7wHqAfMIAAH0AQcB6gIUAW0B8AH0BQAB9AgU
AfMB9AkAAewB8wgAAfMB7wGSAe8B8gUAAf8BvAHxCQAG9AYACvQOAAH/AvQB/zsAAbwBbQISAW0B8jkA
AfIBEgH3AfMB9AHyAfQhAAb0AgAG9AEAAv8EAAH0Af8BAAGSAW0B/yUAAfQEigH0AgAB9ASKAfQBAALs
AwAB8wESAfEBAAHrAfcFAAH/D/QB/w/0AQAB9ASKAfQCAAH0BIoB9AEAAbwBEgHzAvQB9wFtAf8BAAHr
AZIFAAH0AZIDFAH0ARQB7AEUAewC8QHsAhQC9AGSAxQB9AEUAewBFAHsAvEB7AIUAfQBAAH0BIoB9AIA
AfQEigH0AQAB/wFtBBIB7wIAAQcBbQH0BAAB9AEUAu8BFAH0AhQB8AEUAfcB7QEUAfEBBwL0ARQC7wEU
AfQCFAHwARQB9wHtARQB8QEHAfQBAAH0BIoB9AIAAfQEigH0AgABkgHsAfQB8QESAfED9ALrAbwB8QG8
AvQB8wFtAhQB9AEUAe8B9AFtAewBbQHsBPQB8wFtAhQB9AEUAe8B9AFtAewBbQHsA/QBAAb0AgAG9AIA
AfIBEgH0AfcB6wMSAW0BBwGSAW0BEgFtAfEB9AEHAe8B7AEUAfQCFAEHARQB9wHvARMB7wH3AvQBBwHv
AewBFAH0AhQBBwEUAfcB7wETAe8B9wH0AQAO9AIAAf8BbQEHAW0BBwESAbwB9AHvARIB8wP/AQAB9AG8
AhQB7QH0ARQBkgEUAewC8wH3AhQC9AG8AhQB7QH0ARQBkgEUAewC8wH3AhQB9AEAAfQMigH0AwABBwFt
ARIB8gESAfABAAH0ARIB8QQAAf8F9AEUAbwC9AH/BfQB/wX0ARQBvAL0Af8F9AEAAfQMigH0AwAB8wES
AZIB/wESAe0B7wLrAfQJAAH0ARQBvAH0DAAB9AEUAbwB9AgAAfQMigH0BAAB9AH/AfQBEgHtAZIBbQHy
CgAE9AwABPQIAAH0DIoB9AYAAfQBEgHxAQAB7wFtAf8lAA70BgAB9AESAQcB8QGSAW0B/zkAAfQCEgFt
AewB8zgAAfEB7AHvAewC8wG7ArQBtQHzBgAB8wHvAewB6wHsAe8B9BUABvQBAAn0AgABBwHtAfMBkgHz
AbwBtAHwAv8B8AG0AbwDAAH/AQcB7AHvAfEB8wHxAe8B7AEHAf8IAAf0BAAB9AGSAhQBbQH0AQAB9AGS
BRQBvAH0AQAB8QHsAQcB8QH3AfIBtAH0Bf8BtAHzAgABBwHsAfQF/wH0AewBBwYAAf8B9AEHAW0DFAFt
AQcB9AH/AgAB9AHyAewBEwHzAfQBAAH0AfMBbQIUAeoBBwL0Af8B7AHxAe8C7AGuAbwG/wHwAbUBAAHz
AewB9Af/AfQB7AHzBQAB9AGSAeoBBwP0AQcB6gGSAfQDAAH0AfIBFAHwAfQBAAH/AfQBEwIUAe8B9AIA
AfAB7wL/Ae0B/wG0AfQC/wPrAv8BtAEAAu8J/wLvBAAB9AEHAeoB8gX0AfIB6gEHAfQDAAH0AW0B7AP0
Ae8CFAETAfMB/wIAAZIB8gL/AewB/wG0A/8B6wT/AbQBAAHsAfEJ/wHxAewEAAH0AW0BBwf0AQcBbQH0
AwAB9AHvBxQB7AH0AwAB7AP/Ae0B/wG1AfAC/wHrA/8B8AG1AQAB6wHzBP8E6wH/AfMB6wQAAfQBFAP0
AZIBEwGSA/QBFAH0AwAB/wH0ARMB7wH0AfIDFAHwAfQDAAHsBusBtAL/AesD/wG0AfABAAHsAfEE/wHr
BP8B8QHsBAAB8gEUA/QDFAP0ARQB9AQAAfQB7QFtAfQB7QIUAW0B9AQAAewD/wHtAv8BvAG0AfAC/wHw
AbQBBwH0AQAC7wT/AesE/wLvBAAB9AEUA/QB7AEUAewD9AEUAfQEAAH0AfIBFAHwARMCFAHvAfQEAAH3
AfEC/wHsA/8B8gG1AbMBrQGRAfEB/wHxAQAB8gHsAfQD/wHrA/8B9AHsAfMEAAH0AW0BBwL0AQcBFAEH
AvQBBwFtAfQFAAH0AW0B6gIUARMB8wH/BAAB8AHvAv8B7Qb/AfAB7wL/Ae8CAAHvAewB8wL/AesC/wHz
AewB7wUAAfQBBwHqAfIC9AEUAvQB8gHqAQcB9AUAAfQB7wMUAewB9AUAAf8B7AHxAQcD7APrA+wB7wHw
AewCAAH/Ae8B7AHvAfEB8wHxAe8B7AHvAf8GAAH0AZIB6gEHAfQBFAH0AQcB6gGSAfQGAAH/AfQBEwIU
AfAB9AYAAfIB7AEHAfAB9wX/AewB8wG8AewB8wQAAfMB7wHsAesB7AHvAfMIAAH/AfQBBwFtAxQBbQEH
AfQB/wcAAfQB7QEUAW0B9AgAAfAB7QHzAZIB8wP/AgcB8gHsAfEHAAPrDAAC9AMUAvQJAAH0AfIBFAHv
AfQJAAHyAewB9wHsAfIB/wHwAewB7wHsAfMIAAPrDAAB9AUUAfQKAAP0Af8KAAH/AfEB9wLrAewB7wHx
Af8IAAXrCwAH9DgAAfQBCQS0AbwB9A0AAfQBuwK0AbsB9CMAAf8BvAG0AbUBCQLwAQkBtQG0AbwB/wIA
COsBrgG0AQkC9AHwAbQBvARtAeoB9AHsAe0B/wHtAm0B6gJtAfIGAAH/AfQJAAH/AbsBtAHwBv8B8AG0
AbsB/wEAAesD/wHvAv8B8wG0Bv8BtAGSAe8BbQLsAf8B7AHtAf8B7wHqAuwC7wH0AwAE9AHwB/QCAAG8
AbQB8wj/AfMBtAG8AQAB6wP/Ae8C/wG1AQkG/wHdAQAB9AFtAe8FAAH/AuwB8wYAAfQBFAGSAewBFAH3
BBQBvAH0AQAB9AG0AfEK/wHxAbQB/wHrBv8BtAP/A+sC/wEAAfQBbQHvAf8FAAH0AewB6wYAAfQBFAGS
AfMB9wHzAhMBBwG8AfMB9AEAAbwBtQz/AbUBvAHrAu8B/wNMAa4D/wHrBP8BAAH0AW0B7wH/BgAB/wFt
AfMEAAL0ARQBkgP0Ae8BFAHqAfAB9AH/AQABtAEJBf8DbQHrAe0C/wEJAbQB6wP/AUwC/wG1AQkC/wHr
A/8B3QEAAfQBbQHvAf8HAAHtAewB9AIAA/QBFAGSAfQBAAL0AfACEwHzAf8BAAG0AfEF/wFtBv8B8QG0
AesD/wFMAv8B9AG0Av8B6wP/AbQBAAH0AW0B7wH/BwAB9AHrAe0B/wEAAfQB7wHsARQBkgH0AQAB9AG8
AfQBkgEUAbwB9AEAAbQB8QX/AW0G/wHxAbQB6wP/AUwD/wGNAbQB8AL0AfABtAGuAQAB9AFtAe8B/wgA
AQcB6gH0AQAB9AH3AhQBkgH0AQAB9AQUAfAB/wEAAbQBCQX/AW0G/wEJAbQB6wLvAf8FTAHzBLQB9wHr
AfQB/wFtAe8B/wMAAv8DAAG8AeoB8gEAAvQB8AHsAe8B9AEAAfQBvAHtAewBBwH0AgABvAG1Bf8BbQb/
AbUBvAHrC/8B7wL/AusBkgFtAe8B/wMAAf8B8gEHAf8B9AHsAeoB9AMABPQCAAT0AwAB9AG0AfEE/wFt
Bf8B8QG0Af8B6wP/Ae8D/wHvA/8B7wL/AesBkgHrAeoB7wH/BAAB8gFtAesBbQHqAQcB/xEAAbwBtAHz
A/8B8AT/AfMBtAG8AQAB6wP/Ae8D/wHvA/8B7wL/AesC/wHzAfIB/wQAAv8B8QHtAfMB/xIAAf8BuwG0
AfAG/wHwAbQBuwH/AQAQ6yIAAf8BvAG0AbUBCQLwAQkBtQG0AbwB/wIAEOskAAH0AbwBtQK0AbUBvAH/
BAAQ6xAAEOsLAAH0AfIB8yIAAesD/wHvA/8B7wP/Ae8D/wMAAf8GAAG8AxIB7AH0IAAB6wP/Ae8D/wHv
A/8B7wP/AgABBwESAf8FAAHxAfQB/wHyAesBkhAAEPQB6wP/Ae8L/wIAAQcBEgH/CQABBwESAQAB/wj0
A/8DAAH0DhQB9AHrBu8B/wVMAf8C7wIAAQcBEgH/CAAB/wGSAesBAAH0CPMB9ALzAvQBAAH0ARQM9AEU
AfQB6wP/Ae8D/wFMA/8BTAP/AgABBwESBv8BAAG8AewBbQHsAfQBAAH0AbwBFAHwAfQDFAFtAfQCFAHq
AfEB/wH0BBQB9AEUAfQDFAH0ARQB9AEUAfQB6wP/Ae8D/wFMA/8BTAP/AgABBwESAQcFEgEAAfIBBwGS
AewB9AEAAfQBvAEUAfAB9AETAW0BBwHwAfQB8AG8ARQB9wL0AhQB9AEUAfQBFAH0ARQB9AEUAfQBFAH0
ARQB9AHrA/8B7wP/AUwD/wFMA/8CAAEHARIBvAESAfED8gQAAewB9wL0AbwBFAHwAfQBBwETAW0B8wH0
Ae0C6gHwAvQCFAH0ARQB9AEUAfQBFAH0ARQB9AEUAfQBFAH0AesG7wH/BUwB/wLvAfQBAAEHARIB/wLs
Af8GAAHrAewB9AHxAe8BFAHwAvQB8AEUAZIB9ALwAW0B9AH/AfQEFAH0ARQB9AMUAfQBFAH0ARQB9AHr
A/8B7wv/AQcB6wGSARIC/wHsAesB9AIAAW0B7AHrARIB8QH0AZICFAHwAfQB6gGSARQB7QH0AewBbQEU
AbwC9AEUDPQBFAH0AesD/wHvA/8B7wP/Ae8E/wG8AesBEgH/AQAB/wHvAW0B9AEAAfECBwHzAQAB9AHz
AfcBFAHwAfQBkgEUAewB8QH0AewBbQHtAfQBAAH0DhQB9AHrA/8B7wP/Ae8D/wHvA/8CAAH/AbwEAAH3
AW0HAAH/DPQB/wEAEPQQ6wgAAfIBEgHyJQAQ6wQAAfMB8gIAAbwBEgHzJQAQ6wQAAfMBEgLsARIBkiYA
EOsFAAH0AbwBBwG8RwAQ6wcAAvQXAAHvBBIB7wQSAe8B7ANtAfMB6w7/AesGAAH0AvAB9AYAEPQB/wH0
ARIBvAL0AesBBwL0Af8B8wL/AZIC6w7/AesFAAH0AfACEwHwAfQFAAH0DhQB9AEAAfQBEgHxAgAB9AHr
AbwFAAHvAW0B6wL/CusC/wHrBAAB9AHwBBMB8AH0BAAB9AQUAW0CFAb0ARQB9AEAAfQBEgHxAwAB9AHr
AbwBAAH/Ae8BkgFtAbwB6w7/AesDAAH/AfQB6gETAvACEwHwAfQDAAH0AhQBEwEHAfQBEwEUAvQBFAFt
AvQBFAH0AQAB9AESAfEEAAHzARIB8wH/Ae8B9wHsAfQB6w7/AesCAAH/AvQC8AL0AfACEwHwAfQCAAH0
ARQBEwG8AfQBbQIUA/QBFAFtAfQBFAH0AQAB9AESAfEFAAHrAe8DAAHrAfcB6w7/AesBAAH/AvMC9ALz
AvQB8AITAfAB9AEAAfQBFAG8BfQFFAHvARQB9AEHAewBEgHxAQAB9AGSAfEBvAESArwC8QFtAfcB6wL/
CusC/wHrAf8B9AJtAvMCbQP0AfACEwH0AQAB9AEUAe8F9AUUAe8BFAL0AbwBkgHyAgAB7wLrAe8BAAHx
AusBkgH0AesO/wHrAQAB9AHvARQCbQEUAe8B9AH/AQAB9AHwAQcB9AEAAfQCFAHvAfQBbQIUA/QBFAFt
AfQBFAH0ARIB8QIAAf8DEgHqAZIB9AH/AQcB6wESAZIB6w7/AesCAAH0AfcCFAH3AfQB/wMAAvQCAAH0
AxQB7wH0ARMBFAL0ARQBbQL0ARQB9AHvAewCAAHzAhICAAHtAe8BBwHsAfMB/wHzAesO/wHrAQAB9AHz
AfcCFAH3AfMB9AcAAfQEFAFtAhQG9AEUAfQBAAQSAbwBEgEAAf8B9wEHAeoB9AMAAesC/wrrAv8B6wH/
AfQBbQEUAu8BFAFtAvQGAAH0DhQB9AEAARIB8gH/ARIB9AMSAfcB/wESAf8DAAHrDv8B6wEAAfQB8AHv
AvQC7wH0BwAQ9AEAAfIBEgHzARIBAAESAQAB/wHsAf8BbQHzAwAB6w7/AesCAAL0Af8BAAL0GQAB/wFt
ARIB7wEAARIBAAH/AeoB9AG8AewB8wEAAfQB6w7/AesiAAG8ARIB/wEAAxIB7QH/AQAB8AHrARIB7BDr
EwAB/wj0Af8JAAH/EAAB8gH0GQAC9AEJAdsEswHbAQkC9AcAA/QOAAH0ArQB/wYAD/QDAAH0AboIswG6
AfQGAAH0AfEB6wHyAfQMAAH/AbQCrQG1Af8FAAH0AZkLeQGZAfQDAAH0CrMB9AUAAfQB8QHqAesBbQHy
BfQGAAH/AbQBrQG0AbMBrQEHBQAB9A15AfQDAAH0CrMB9AQAAfQB8QHqAe8B9AGSAW0B8gHsARMB7AHx
AfQEAAH/AbUCrQHyAfACrQHyBAAB9A15AfQDAAH0CrMB9AMAAfQB8QHqAe8D9AGSAW0C8gH3ARIB8QH0
AwAB8QKtAfABAAH/AbsBrQG0AfQDAAH0DXkB9AMAAfQKswH0AgAB9AHxAeoB7wX0AZIBbQHyAfQB9wHr
AfQB8wFMARoB8wGtAQkDAAHzAbQBrQG0Af8CAAH0DXkB9AMAAfQKswH0AgAB9ALrB/QBkgFtAvIBEwH0
ARoCTAHyAfQB/wIAAfQBTAHxAbQBrQG7Af8BAAH0DXkB9AMAAfQKswH0AgAB9AHyAW0Bkgf0AZIB6wHy
ARMB9AH/A0wB9AIAAfQBTAGTAQAB8QKtAbwBAAH0DXkB9AMAAfQKswH0AwAB9AHyAW0Bkgf0AQcB9wHr
AfQBAAH0A0wC9AJMAf8BAAH/AbsCrQHzAfQNeQH0AwAB9AqzAfQEAAH0AfIBbQGSBfQB8gH3ARIB8QH0
AgAB9AVMAfMDAAH/AbQBrQG1AfQMeQGZAfQDAAH0A7ME2wOzAfQFAAH0AfIBbQGSA/QB7wETAewB8QH0
BAAB/wNMAZMFAAH0AbsB/wH0AXkG9AEaAZkF9AMAAfQBswEJBvQBCQGzAfQGAAH0AfIBbQGSBPQBBwH0
BAAB9gGTBEwBkwH/BgAB9AGZB3kBGwH0BwAB9AG6AbkBCQEZAvMBGQEJAbkBugH0BwAB9AHyAW0FFAH0
AwABGwNMARoB/wGTAUwBbwH0BQAK9AH/BwAC9AEJAdsEswHbAQkC9AgACPQDAAFvAkwB8gMAAfQBGgH/
GAAB/wj0Af8UAAH0ARoB/wwAAUIBTQE+BwABPgMAASgDAAFAAwABoAMAAQEBAAEBBgABBRYAA/+BAAb/
AQABfwEHAeACAAL/AgABBwHgAgABhwHhAgABBwHgAgABhwHhAgABHwH4AgABhwHgAgABHwH4AgABgAEB
AgABHwH4BgABHwH4BgABHwH4BgABHwH4AgABBwLwAQABHwH4AgABjwHxAfABAAEfAfgCAAGHAeEB8AEA
AQcB4AIAAYcB4QHwAQABBwHgAgABhwHhAfABAAEHAeAB+AEfAv8B8AEABv8B8AEAAYABDwb/AYABDwT/
AYABAwGAAQ8BAAEBAQABAQEAAQEBgAIAAQEBAAEBAQABAQMAAQEBAAEBAQABAQUAAQEBAAEBBQABAQEA
AQEB4AQAAQEBAAEBAeAEAAEBAQABAQHgBAABAQEAAQEB8AIAAQEBAAEBAQABAQHwAgABAQEAAQEBAAEB
AfACAAEBAQABAQEAAQEB8AEPAQABAwEAAR8BAAEfAfABDwEAAT8BAAEfAQABHwHwAQ8BgAE/BP8B/gF/
AccBgAEBAf8B4AEAAeABHwHDAYABAQH/AeABAAHgAQ8B4wGcAQEB/wHgAQAB4gEPAfEBnAEBAf8B4AEA
Af4BDwHwAZwCAAHgAQAB/gEPAfgBiAIAAeABAAH+AQ8B/AUAAfgBHwGEAUEBAAEBAgAB8AE/AQABPwH4
AQECAAHgAX8BAQEfAfgBAQIAAeIBfwE5AR8B+AEBAgAB4gF/ATgBjwH4AQECAAHgAQ8BOAGHAfgBAQIA
AfABDwERAccB+AEBAQABAQH4AQ8BAQHjAfwBAwHgAQMB/gF/AYMB4wH+AQcB4AEHAf8B4Qf/AcAH/wGA
BP8CgQE8AY8E/wKBATgBnwQAAoEBAAGfBAACgQEBAY8EAAKBAYAFAAKBAYAFAAGAAQEBgAEBBAABgAEB
AcABjwQAAYABAQHAAQ8B+AF/AfgBfwGAAQEB4AEfAfgBfwH4AX8BgAEBAfgBjwT/AYABAQH4AQ8G/wH4
AR8G/wHgAQMB8AEfAv8BAgEAAcABAQHAAQcB+AEPAQIBAAGAAQABwAEHAeABAwECAwABgAEDAeABAwGC
AQMCAAGAAQMBwAEBAcABAwIAAYABAwHAAQEBwAEHAgABgAEDAcABAQHAAQcCAAGAAQMBwAEBAeABDwIA
AYABAwHAAQEB4AEPAgABgAEDAcABAQHwAQ8CAAHAAQcBwAEBAfABHwIAAcABBwHgAQMB8AEfAYABAAHw
AR8B4AEDAfgBPwHAAQEB/AF/AfgBDwH4AT8B4AEDAfwBfwH4AQ8B/AE/AfABBwH4AT8B+AEPBv8B8AEP
Af8BgQT/AcABAwQAAfwB/wGAAQEEAAHgAQEBgAEBAgABjwGHAeABAQQAAYcBxwHgAQEEAAGHAeMBwAEB
BAABhwHxAYEBAQQAAYcB8AGBAQEEAAGHAfgBgQEBBAABBwE4AYEBAwQAAQcBAAHhAYcEAAEHAYAC/wGA
AQECAAEHAYEC/wGAAQECAAT/AcABAwIABP8B8AEPAgAC/wIAAf8B4wT/AgAB7wHABP8CAAHHAcAC/wQA
AccB/AGAAQcEAAHHAfgBgAEBBAABwAEgAYAFAAHAASABgAUAAcABPAYAAUAB/AcAAWAGAAEEASEBAAEB
BAABzwE/AYABAQQAAf8BHwT/AgAB8wEfBP8CAAHwAT8E/wIAAfgBfwj/AgAB/gF/Av8EAAH8AT8GAAH4
AR8CAAGMAXwCAAHwAQ8CAAGOASACAAHgAQcCAAGPAwABwAEDAgABjwGcAgABgAEBAgABCAQAAQECAAEM
ASACAAGAASECAAEwAwABwAFzAgABMQGAAgABgAF/AgABgQEHAwABPwIAAYABBwIAAYABfwIAAYUBBwIA
AcQD/wGFAQICAAT/AcQBEAIAAv8B4AEHAf0B/wH+AX8C/wHAAQMB+AH/AfwBPwEAAQEBwAEDAfABfwH4
AR8BAAEBAcABAwHgAQMB8AEfAQABAQHAAQMBwAEBAeABDwEAAQEBwAEDAYABAAHhAQcBAAEBAcABAwIA
AQMBgwEAAQEBwAEDAgABAwEBAQABAQHAAQMCAAEGASEBAAEBAcABAwGAAQABgAEgAQABAQHAAQMBwAEA
AcABcAEAAQEBwAEDAeABAQHgAfgBAAEBAcABAwHwAQMBwAE/AQABHwHAAQMB+AEDAYABHwEAAR8BwAED
AfwBAwGHAR8C/wHgAQcC/wGPAf8L
</value>
</data>
<metadata name="statusStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>182, 17</value>
</metadata>
</root>

View File

@@ -0,0 +1,18 @@
using System;
using System.Windows.Forms;
namespace S7CommPlusGUIBrowser
{
internal static class Program {
/// <summary>
/// Der Haupteinstiegspunkt für die Anwendung.
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
}
}

View File

@@ -0,0 +1,36 @@
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// Allgemeine Informationen über eine Assembly werden über die folgenden
// Attribute gesteuert. Ändern Sie diese Attributwerte, um die Informationen zu ändern,
// die einer Assembly zugeordnet sind.
[assembly: AssemblyTitle("S7CommPlusGUIBrowser")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("S7CommPlusGUIBrowser")]
[assembly: AssemblyCopyright("Copyright © 2024")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// Durch Festlegen von ComVisible auf FALSE werden die Typen in dieser Assembly
// für COM-Komponenten unsichtbar. Wenn Sie auf einen Typ in dieser Assembly von
// COM aus zugreifen müssen, sollten Sie das ComVisible-Attribut für diesen Typ auf "True" festlegen.
[assembly: ComVisible(false)]
// Die folgende GUID bestimmt die ID der Typbibliothek, wenn dieses Projekt für COM verfügbar gemacht wird
[assembly: Guid("beb37276-b3b3-4dee-a1ea-d95eb774223b")]
// Versionsinformationen für eine Assembly bestehen aus den folgenden vier Werten:
//
// Hauptversion
// Nebenversion
// Buildnummer
// Revision
//
// Sie können alle Werte angeben oder Standardwerte für die Build- und Revisionsnummern verwenden,
// indem Sie "*" wie unten gezeigt eingeben:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]

View File

@@ -0,0 +1,62 @@
//------------------------------------------------------------------------------
// <auto-generated>
// Dieser Code wurde von einem Tool generiert.
// Laufzeitversion: 4.0.30319.42000
//
// Änderungen an dieser Datei können fehlerhaftes Verhalten verursachen und gehen verloren, wenn
// der Code neu generiert wird.
// </auto-generated>
//------------------------------------------------------------------------------
namespace S7CommPlusGUIBrowser.Properties {
/// <summary>
/// Eine stark typisierte Ressourcenklasse zum Suchen von lokalisierten Zeichenfolgen usw.
/// </summary>
// Diese Klasse wurde von der StronglyTypedResourceBuilder-Klasse
// über ein Tool wie ResGen oder Visual Studio automatisch generiert.
// Um einen Member hinzuzufügen oder zu entfernen, bearbeiten Sie die .ResX-Datei und führen dann ResGen
// mit der Option /str erneut aus, oder erstellen Sie Ihr VS-Projekt neu.
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
internal class Resources {
private static global::System.Resources.ResourceManager resourceMan;
private static global::System.Globalization.CultureInfo resourceCulture;
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
internal Resources() {
}
/// <summary>
/// Gibt die zwischengespeicherte ResourceManager-Instanz zurück, die von dieser Klasse verwendet wird.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Resources.ResourceManager ResourceManager {
get {
if ((resourceMan == null)) {
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("S7CommPlusGUIBrowser.Properties.Resources", typeof(Resources).Assembly);
resourceMan = temp;
}
return resourceMan;
}
}
/// <summary>
/// Überschreibt die CurrentUICulture-Eigenschaft des aktuellen Threads für alle
/// Ressourcenlookups, die diese stark typisierte Ressourcenklasse verwenden.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Globalization.CultureInfo Culture {
get {
return resourceCulture;
}
set {
resourceCulture = value;
}
}
}
}

View File

@@ -0,0 +1,117 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

View File

@@ -0,0 +1,26 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.42000
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace S7CommPlusGUIBrowser.Properties {
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0")]
internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
public static Settings Default {
get {
return defaultInstance;
}
}
}
}

View File

@@ -0,0 +1,7 @@
<?xml version='1.0' encoding='utf-8'?>
<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)">
<Profiles>
<Profile Name="(Default)" />
</Profiles>
<Settings />
</SettingsFile>

View File

@@ -0,0 +1,6 @@
# S7commPlusGuiBrowser
Dieses kleine Programm soll demonstrieren wie die Library dazu genutzt werden kann um dynamisch durch die in der PLC vorhandenen Symbole / Tags zu browsen.
WICHTIG: Das Programm dient nur als Beispiel und sollte nicht in einer produktiv Umgebung eingesetzt werden!
Um dieses Beispielprogramm möglichst klein und simpel zu halten, erfolgt der Zugriff auf die Library im main Task und blockt daher die GUI.

View File

@@ -0,0 +1,134 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{BEB37276-B3B3-4DEE-A1EA-D95EB774223B}</ProjectGuid>
<OutputType>WinExe</OutputType>
<RootNamespace>S7CommPlusGUIBrowser</RootNamespace>
<AssemblyName>S7CommPlusGUIBrowser</AssemblyName>
<TargetFrameworkVersion>v4.7.2</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
<Deterministic>true</Deterministic>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'">
<DebugSymbols>true</DebugSymbols>
<OutputPath>bin\x64\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<DebugType>full</DebugType>
<PlatformTarget>AnyCPU</PlatformTarget>
<LangVersion>7.3</LangVersion>
<ErrorReport>prompt</ErrorReport>
<Prefer32Bit>false</Prefer32Bit>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'">
<OutputPath>bin\x64\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<Optimize>true</Optimize>
<DebugType>pdbonly</DebugType>
<PlatformTarget>x64</PlatformTarget>
<LangVersion>7.3</LangVersion>
<ErrorReport>prompt</ErrorReport>
<Prefer32Bit>true</Prefer32Bit>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'">
<DebugSymbols>true</DebugSymbols>
<OutputPath>bin\x86\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<DebugType>full</DebugType>
<PlatformTarget>AnyCPU</PlatformTarget>
<LangVersion>7.3</LangVersion>
<ErrorReport>prompt</ErrorReport>
<Prefer32Bit>false</Prefer32Bit>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'">
<OutputPath>bin\x86\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<Optimize>true</Optimize>
<DebugType>pdbonly</DebugType>
<PlatformTarget>AnyCPU</PlatformTarget>
<LangVersion>7.3</LangVersion>
<ErrorReport>prompt</ErrorReport>
<Prefer32Bit>false</Prefer32Bit>
<AllowUnsafeBlocks>false</AllowUnsafeBlocks>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|AnyCPU'">
<DebugSymbols>true</DebugSymbols>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<DebugType>full</DebugType>
<PlatformTarget>AnyCPU</PlatformTarget>
<LangVersion>7.3</LangVersion>
<ErrorReport>prompt</ErrorReport>
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
<Optimize>true</Optimize>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|AnyCPU'">
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<Optimize>true</Optimize>
<DebugType>pdbonly</DebugType>
<PlatformTarget>AnyCPU</PlatformTarget>
<LangVersion>7.3</LangVersion>
<ErrorReport>prompt</ErrorReport>
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
<Prefer32Bit>true</Prefer32Bit>
</PropertyGroup>
<ItemGroup>
<Reference Include="S7CommPlusDriver">
<HintPath>..\Lib\S7CommPlusDriver.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Data" />
<Reference Include="System.Deployment" />
<Reference Include="System.Drawing" />
<Reference Include="System.Net.Http" />
<Reference Include="System.Windows.Forms" />
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="Form1.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="Form1.Designer.cs">
<DependentUpon>Form1.cs</DependentUpon>
</Compile>
<Compile Include="Program.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<EmbeddedResource Include="Form1.resx">
<DependentUpon>Form1.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Properties\Resources.resx">
<Generator>ResXFileCodeGenerator</Generator>
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
<SubType>Designer</SubType>
</EmbeddedResource>
<Compile Include="Properties\Resources.Designer.cs">
<AutoGen>True</AutoGen>
<DependentUpon>Resources.resx</DependentUpon>
</Compile>
<None Include="Properties\Settings.settings">
<Generator>SettingsSingleFileGenerator</Generator>
<LastGenOutput>Settings.Designer.cs</LastGenOutput>
</None>
<Compile Include="Properties\Settings.Designer.cs">
<AutoGen>True</AutoGen>
<DependentUpon>Settings.settings</DependentUpon>
<DesignTimeSharedInput>True</DesignTimeSharedInput>
</Compile>
</ItemGroup>
<ItemGroup>
<None Include="App.config" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<PropertyGroup>
<PostBuildEvent>
</PostBuildEvent>
</PropertyGroup>
</Project>

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" />
</startup>
</configuration>

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.