commit c2c155a32bc448584eaee3c9691ae4ee99299ca5 Author: CoderShen Date: Tue Aug 5 15:29:54 2025 +0800 first commit diff --git a/DriverTest/.vs/DriverTest.csproj.dtbcache.json b/DriverTest/.vs/DriverTest.csproj.dtbcache.json new file mode 100644 index 0000000..d64a0ee --- /dev/null +++ b/DriverTest/.vs/DriverTest.csproj.dtbcache.json @@ -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":[]} \ No newline at end of file diff --git a/DriverTest/App.config b/DriverTest/App.config new file mode 100644 index 0000000..ecdcf8a --- /dev/null +++ b/DriverTest/App.config @@ -0,0 +1,6 @@ + + + + + + diff --git a/DriverTest/DriverTest.csproj b/DriverTest/DriverTest.csproj new file mode 100644 index 0000000..ffe3221 --- /dev/null +++ b/DriverTest/DriverTest.csproj @@ -0,0 +1,112 @@ + + + + + Debug + AnyCPU + {94755B6A-7E0D-40F9-A2ED-48FF0C0FEA2B} + Exe + Properties + DriverTest + DriverTest + v4.7.2 + 512 + true + + + + true + bin\x64\Debug\ + DEBUG;TRACE + full + x64 + 7.3 + prompt + true + + + bin\x64\Release\ + TRACE + true + pdbonly + x64 + 7.3 + prompt + true + + + true + bin\x86\Debug\ + DEBUG;TRACE + full + AnyCPU + 7.3 + prompt + false + + + bin\x86\Release\ + TRACE + true + pdbonly + AnyCPU + 7.3 + prompt + false + + + true + bin\Debug\ + DEBUG;TRACE + full + AnyCPU + 7.3 + prompt + MinimumRecommendedRules.ruleset + true + + + bin\Release\ + TRACE + true + pdbonly + AnyCPU + 7.3 + prompt + MinimumRecommendedRules.ruleset + true + + + + ..\Lib\S7CommPlusDriver.dll + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/DriverTest/Program.cs b/DriverTest/Program.cs new file mode 100644 index 0000000..6b08f66 --- /dev/null +++ b/DriverTest/Program.cs @@ -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 readlist = new List(); + 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 vars = new List(); + res = conn.Browse(out vars); + Console.WriteLine("Main - Browse res=" + res); + #endregion + List vars_ = vars.GetRange(0,1000); + #region Werte aller Variablen einlesen + Console.WriteLine("Main - Lese Werte aller Variablen aus"); + + List taglist = new List(); + 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 values = new List(); + List errors = new List(); + + + // 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 writevalues = new List(); + PValue writeValue = new ValueInt(8888); + writevalues.Add(writeValue); + List writelist = new List(); + 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(); + } + } +} diff --git a/DriverTest/Properties/AssemblyInfo.cs b/DriverTest/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..0c4d45b --- /dev/null +++ b/DriverTest/Properties/AssemblyInfo.cs @@ -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")] diff --git a/DriverTest/bin/Debug/DriverTest.exe b/DriverTest/bin/Debug/DriverTest.exe new file mode 100644 index 0000000..a4dd067 Binary files /dev/null and b/DriverTest/bin/Debug/DriverTest.exe differ diff --git a/DriverTest/bin/Debug/DriverTest.exe.config b/DriverTest/bin/Debug/DriverTest.exe.config new file mode 100644 index 0000000..ecdcf8a --- /dev/null +++ b/DriverTest/bin/Debug/DriverTest.exe.config @@ -0,0 +1,6 @@ + + + + + + diff --git a/DriverTest/bin/Debug/DriverTest.pdb b/DriverTest/bin/Debug/DriverTest.pdb new file mode 100644 index 0000000..79ce2fa Binary files /dev/null and b/DriverTest/bin/Debug/DriverTest.pdb differ diff --git a/DriverTest/bin/Debug/S7CommPlusAuth.dll b/DriverTest/bin/Debug/S7CommPlusAuth.dll new file mode 100644 index 0000000..01e95ba Binary files /dev/null and b/DriverTest/bin/Debug/S7CommPlusAuth.dll differ diff --git a/DriverTest/bin/Debug/S7CommPlusDriver.dll b/DriverTest/bin/Debug/S7CommPlusDriver.dll new file mode 100644 index 0000000..27336d2 Binary files /dev/null and b/DriverTest/bin/Debug/S7CommPlusDriver.dll differ diff --git a/DriverTest/bin/Debug/S7Family0.dll b/DriverTest/bin/Debug/S7Family0.dll new file mode 100644 index 0000000..2488b81 Binary files /dev/null and b/DriverTest/bin/Debug/S7Family0.dll differ diff --git a/DriverTest/bin/Debug/S7PublicKeys.dll b/DriverTest/bin/Debug/S7PublicKeys.dll new file mode 100644 index 0000000..3d8d915 Binary files /dev/null and b/DriverTest/bin/Debug/S7PublicKeys.dll differ diff --git a/DriverTest/bin/Debug/S7Utilities.dll b/DriverTest/bin/Debug/S7Utilities.dll new file mode 100644 index 0000000..0596258 Binary files /dev/null and b/DriverTest/bin/Debug/S7Utilities.dll differ diff --git a/DriverTest/bin/Debug/zlib.net.dll b/DriverTest/bin/Debug/zlib.net.dll new file mode 100644 index 0000000..1ff476c Binary files /dev/null and b/DriverTest/bin/Debug/zlib.net.dll differ diff --git a/DriverTest/packages.config b/DriverTest/packages.config new file mode 100644 index 0000000..037b768 --- /dev/null +++ b/DriverTest/packages.config @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/Lib/S7CommPlusAuth.dll b/Lib/S7CommPlusAuth.dll new file mode 100644 index 0000000..01e95ba Binary files /dev/null and b/Lib/S7CommPlusAuth.dll differ diff --git a/Lib/S7CommPlusDriver.dll b/Lib/S7CommPlusDriver.dll new file mode 100644 index 0000000..27336d2 Binary files /dev/null and b/Lib/S7CommPlusDriver.dll differ diff --git a/Lib/S7Family0.dll b/Lib/S7Family0.dll new file mode 100644 index 0000000..2488b81 Binary files /dev/null and b/Lib/S7Family0.dll differ diff --git a/Lib/S7PublicKeys.dll b/Lib/S7PublicKeys.dll new file mode 100644 index 0000000..3d8d915 Binary files /dev/null and b/Lib/S7PublicKeys.dll differ diff --git a/Lib/S7Utilities.dll b/Lib/S7Utilities.dll new file mode 100644 index 0000000..0596258 Binary files /dev/null and b/Lib/S7Utilities.dll differ diff --git a/Lib/zlib.net.dll b/Lib/zlib.net.dll new file mode 100644 index 0000000..1ff476c Binary files /dev/null and b/Lib/zlib.net.dll differ diff --git a/S7CommPlusDriver.sln b/S7CommPlusDriver.sln new file mode 100644 index 0000000..8c0c362 --- /dev/null +++ b/S7CommPlusDriver.sln @@ -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 diff --git a/S7CommPlusGUIBrowser/.vs/S7CommPlusGUIBrowser.csproj.dtbcache.json b/S7CommPlusGUIBrowser/.vs/S7CommPlusGUIBrowser.csproj.dtbcache.json new file mode 100644 index 0000000..a4d85d0 --- /dev/null +++ b/S7CommPlusGUIBrowser/.vs/S7CommPlusGUIBrowser.csproj.dtbcache.json @@ -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":[]} \ No newline at end of file diff --git a/S7CommPlusGUIBrowser/App.config b/S7CommPlusGUIBrowser/App.config new file mode 100644 index 0000000..56efbc7 --- /dev/null +++ b/S7CommPlusGUIBrowser/App.config @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/S7CommPlusGUIBrowser/Form1.Designer.cs b/S7CommPlusGUIBrowser/Form1.Designer.cs new file mode 100644 index 0000000..f8ae8d5 --- /dev/null +++ b/S7CommPlusGUIBrowser/Form1.Designer.cs @@ -0,0 +1,346 @@ +namespace S7CommPlusGUIBrowser { + partial class Form1 { + /// + /// Erforderliche Designervariable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Verwendete Ressourcen bereinigen. + /// + /// True, wenn verwaltete Ressourcen gelöscht werden sollen; andernfalls False. + protected override void Dispose(bool disposing) { + if (disposing && (components != null)) { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Vom Windows Form-Designer generierter Code + + /// + /// Erforderliche Methode für die Designerunterstützung. + /// Der Inhalt der Methode darf nicht mit dem Code-Editor geändert werden. + /// + 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; + } +} + diff --git a/S7CommPlusGUIBrowser/Form1.cs b/S7CommPlusGUIBrowser/Form1.cs new file mode 100644 index 0000000..a8ccd49 --- /dev/null +++ b/S7CommPlusGUIBrowser/Form1.cs @@ -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 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); + } + } + } +} diff --git a/S7CommPlusGUIBrowser/Form1.resx b/S7CommPlusGUIBrowser/Form1.resx new file mode 100644 index 0000000..56b1bb0 --- /dev/null +++ b/S7CommPlusGUIBrowser/Form1.resx @@ -0,0 +1,316 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + + + 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 + + + + 182, 17 + + \ No newline at end of file diff --git a/S7CommPlusGUIBrowser/Program.cs b/S7CommPlusGUIBrowser/Program.cs new file mode 100644 index 0000000..10f1ef0 --- /dev/null +++ b/S7CommPlusGUIBrowser/Program.cs @@ -0,0 +1,18 @@ +using System; +using System.Windows.Forms; + +namespace S7CommPlusGUIBrowser +{ + internal static class Program { + /// + /// Der Haupteinstiegspunkt für die Anwendung. + /// + [STAThread] + static void Main() + { + Application.EnableVisualStyles(); + Application.SetCompatibleTextRenderingDefault(false); + Application.Run(new Form1()); + } + } +} diff --git a/S7CommPlusGUIBrowser/Properties/AssemblyInfo.cs b/S7CommPlusGUIBrowser/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..df3272c --- /dev/null +++ b/S7CommPlusGUIBrowser/Properties/AssemblyInfo.cs @@ -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")] diff --git a/S7CommPlusGUIBrowser/Properties/Resources.Designer.cs b/S7CommPlusGUIBrowser/Properties/Resources.Designer.cs new file mode 100644 index 0000000..869a851 --- /dev/null +++ b/S7CommPlusGUIBrowser/Properties/Resources.Designer.cs @@ -0,0 +1,62 @@ +//------------------------------------------------------------------------------ +// +// 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. +// +//------------------------------------------------------------------------------ + +namespace S7CommPlusGUIBrowser.Properties { + + + /// + /// Eine stark typisierte Ressourcenklasse zum Suchen von lokalisierten Zeichenfolgen usw. + /// + // 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() { + } + + /// + /// Gibt die zwischengespeicherte ResourceManager-Instanz zurück, die von dieser Klasse verwendet wird. + /// + [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; + } + } + + /// + /// Überschreibt die CurrentUICulture-Eigenschaft des aktuellen Threads für alle + /// Ressourcenlookups, die diese stark typisierte Ressourcenklasse verwenden. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + } +} diff --git a/S7CommPlusGUIBrowser/Properties/Resources.resx b/S7CommPlusGUIBrowser/Properties/Resources.resx new file mode 100644 index 0000000..ffecec8 --- /dev/null +++ b/S7CommPlusGUIBrowser/Properties/Resources.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/S7CommPlusGUIBrowser/Properties/Settings.Designer.cs b/S7CommPlusGUIBrowser/Properties/Settings.Designer.cs new file mode 100644 index 0000000..e62375c --- /dev/null +++ b/S7CommPlusGUIBrowser/Properties/Settings.Designer.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// 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. +// +//------------------------------------------------------------------------------ + +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; + } + } + } +} diff --git a/S7CommPlusGUIBrowser/Properties/Settings.settings b/S7CommPlusGUIBrowser/Properties/Settings.settings new file mode 100644 index 0000000..abf36c5 --- /dev/null +++ b/S7CommPlusGUIBrowser/Properties/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + diff --git a/S7CommPlusGUIBrowser/README.md b/S7CommPlusGUIBrowser/README.md new file mode 100644 index 0000000..e492929 --- /dev/null +++ b/S7CommPlusGUIBrowser/README.md @@ -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. diff --git a/S7CommPlusGUIBrowser/S7CommPlusGUIBrowser.csproj b/S7CommPlusGUIBrowser/S7CommPlusGUIBrowser.csproj new file mode 100644 index 0000000..fac50a2 --- /dev/null +++ b/S7CommPlusGUIBrowser/S7CommPlusGUIBrowser.csproj @@ -0,0 +1,134 @@ + + + + + Debug + AnyCPU + {BEB37276-B3B3-4DEE-A1EA-D95EB774223B} + WinExe + S7CommPlusGUIBrowser + S7CommPlusGUIBrowser + v4.7.2 + 512 + true + true + + + true + bin\x64\Debug\ + DEBUG;TRACE + full + AnyCPU + 7.3 + prompt + false + + + bin\x64\Release\ + TRACE + true + pdbonly + x64 + 7.3 + prompt + true + + + true + bin\x86\Debug\ + DEBUG;TRACE + full + AnyCPU + 7.3 + prompt + false + + + bin\x86\Release\ + TRACE + true + pdbonly + AnyCPU + 7.3 + prompt + false + false + + + true + bin\Debug\ + DEBUG;TRACE + full + AnyCPU + 7.3 + prompt + MinimumRecommendedRules.ruleset + true + + + bin\Release\ + TRACE + true + pdbonly + AnyCPU + 7.3 + prompt + MinimumRecommendedRules.ruleset + true + + + + ..\Lib\S7CommPlusDriver.dll + + + + + + + + + + + + + + + + Form + + + Form1.cs + + + + + Form1.cs + + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + + + True + Resources.resx + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + True + Settings.settings + True + + + + + + + + + + + \ No newline at end of file diff --git a/S7CommPlusGUIBrowser/bin/Debug/S7CommPlusAuth.dll b/S7CommPlusGUIBrowser/bin/Debug/S7CommPlusAuth.dll new file mode 100644 index 0000000..01e95ba Binary files /dev/null and b/S7CommPlusGUIBrowser/bin/Debug/S7CommPlusAuth.dll differ diff --git a/S7CommPlusGUIBrowser/bin/Debug/S7CommPlusDriver.dll b/S7CommPlusGUIBrowser/bin/Debug/S7CommPlusDriver.dll new file mode 100644 index 0000000..27336d2 Binary files /dev/null and b/S7CommPlusGUIBrowser/bin/Debug/S7CommPlusDriver.dll differ diff --git a/S7CommPlusGUIBrowser/bin/Debug/S7CommPlusGUIBrowser.exe b/S7CommPlusGUIBrowser/bin/Debug/S7CommPlusGUIBrowser.exe new file mode 100644 index 0000000..cb1dfcc Binary files /dev/null and b/S7CommPlusGUIBrowser/bin/Debug/S7CommPlusGUIBrowser.exe differ diff --git a/S7CommPlusGUIBrowser/bin/Debug/S7CommPlusGUIBrowser.exe.config b/S7CommPlusGUIBrowser/bin/Debug/S7CommPlusGUIBrowser.exe.config new file mode 100644 index 0000000..56efbc7 --- /dev/null +++ b/S7CommPlusGUIBrowser/bin/Debug/S7CommPlusGUIBrowser.exe.config @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/S7CommPlusGUIBrowser/bin/Debug/S7CommPlusGUIBrowser.pdb b/S7CommPlusGUIBrowser/bin/Debug/S7CommPlusGUIBrowser.pdb new file mode 100644 index 0000000..16c72ca Binary files /dev/null and b/S7CommPlusGUIBrowser/bin/Debug/S7CommPlusGUIBrowser.pdb differ diff --git a/S7CommPlusGUIBrowser/bin/Debug/S7Family0.dll b/S7CommPlusGUIBrowser/bin/Debug/S7Family0.dll new file mode 100644 index 0000000..2488b81 Binary files /dev/null and b/S7CommPlusGUIBrowser/bin/Debug/S7Family0.dll differ diff --git a/S7CommPlusGUIBrowser/bin/Debug/S7PublicKeys.dll b/S7CommPlusGUIBrowser/bin/Debug/S7PublicKeys.dll new file mode 100644 index 0000000..3d8d915 Binary files /dev/null and b/S7CommPlusGUIBrowser/bin/Debug/S7PublicKeys.dll differ diff --git a/S7CommPlusGUIBrowser/bin/Debug/S7Utilities.dll b/S7CommPlusGUIBrowser/bin/Debug/S7Utilities.dll new file mode 100644 index 0000000..0596258 Binary files /dev/null and b/S7CommPlusGUIBrowser/bin/Debug/S7Utilities.dll differ diff --git a/S7CommPlusGUIBrowser/bin/Debug/zlib.net.dll b/S7CommPlusGUIBrowser/bin/Debug/zlib.net.dll new file mode 100644 index 0000000..1ff476c Binary files /dev/null and b/S7CommPlusGUIBrowser/bin/Debug/zlib.net.dll differ