1.Resolved multiple issues and defects

2.Implemented a license management system requiring users to obtain updated "license.lic" files from the author
This commit is contained in:
CoderShen
2025-11-08 12:20:08 +08:00
parent 40cf60b069
commit b7d6993fa3
37 changed files with 476 additions and 452 deletions

Binary file not shown.

View File

@@ -10,14 +10,13 @@ using S7CommPlusDriver;
using S7CommPlusDriver.ClientApi;
namespace DriverTest
{
class Program
{
static void Main(string[] args)
{
string HostIp = "192.168.0.1";
string HostIp = "192.168.0.250";
string Password = "";
int res;
List<ItemAddress> readlist = new List<ItemAddress>();
@@ -33,7 +32,8 @@ namespace DriverTest
Console.WriteLine("Main - Versuche Verbindungsaufbau zu: " + HostIp);
S7CommPlusConnection conn = new S7CommPlusConnection();
conn.OnlySecurePGOrPCAndHMI = true;//Only secure PG/PC and HMI communication
conn.OnlySecurePGOrPCAndHMI = false;
System.Diagnostics.Stopwatch stopwatch1 = new System.Diagnostics.Stopwatch();
stopwatch1.Start();
res = conn.Connect(HostIp, Password);
@@ -53,7 +53,7 @@ namespace DriverTest
res = conn.Browse(out vars);
Console.WriteLine("Main - Browse res=" + res);
#endregion
List<VarInfo> vars_ = vars.GetRange(0,50);
List<VarInfo> vars_ = vars.GetRange(0, 1000);
#if _TEST_PLCTAG
#region Werte aller Variablen einlesen
Console.WriteLine("Main - Lese Werte aller Variablen aus");
@@ -63,7 +63,8 @@ namespace DriverTest
foreach (var v in vars_)
{
taglist.Add(PlcTags.TagFactory(v.Name, new ItemAddress(v.AccessSequence), v.Softdatatype));
ItemAddress itemAddress = new ItemAddress(v.AccessSequence);
taglist.Add(PlcTags.TagFactory(v.Name, itemAddress, v.Softdatatype));
}
foreach (var t in taglist)
{
@@ -98,6 +99,7 @@ namespace DriverTest
string header = $"读取{vars_.Count}个变量耗时{ms}毫秒";
Console.WriteLine(header);
}
System.Threading.Thread.Sleep(10);
}
#endif

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -1,5 +0,0 @@
SERVER_HANDSHAKE_TRAFFIC_SECRET 9d2884bb6d1ca343e259a23ffd195961228283a253916cb75661a90dbfa056f0 54afed328765987b013f17d3425b5ad139cd775ded5d8e9bd12fa96f93166508f793dca53267752de04c627218b51e4c
EXPORTER_SECRET 9d2884bb6d1ca343e259a23ffd195961228283a253916cb75661a90dbfa056f0 eaa6ef9882ce9d8c002ab41043f699f94d2a34fae101b9a2cd773dfdf7e6329acb65f2f6301c6894331bb62c35a63429
SERVER_TRAFFIC_SECRET_0 9d2884bb6d1ca343e259a23ffd195961228283a253916cb75661a90dbfa056f0 87149d68005b5512c6efbce24dcfb35146a4c49dcc2cc29d84294c566a45ee66b53df30eafea7c3f4070df9959d7f6be
CLIENT_HANDSHAKE_TRAFFIC_SECRET 9d2884bb6d1ca343e259a23ffd195961228283a253916cb75661a90dbfa056f0 d1d792a9d1a2f49dbda3f09b48a25de60192cef4434efd5cf51a61f73ce9e6d7c4f4dc466a6694a6d5612efd2773f784
CLIENT_TRAFFIC_SECRET_0 9d2884bb6d1ca343e259a23ffd195961228283a253916cb75661a90dbfa056f0 2238f875c69a7f5704c1792f3dec81b98af34d18643b467cccb730efc123c789632303c6e2c48dd2a397652ddfcf890a

View File

@@ -1,5 +0,0 @@
SERVER_HANDSHAKE_TRAFFIC_SECRET ef29f3273eb4c3848fb8e869418198253bb70d55e234e55ed14bf4b4bab5c5b4 5c61d992793df1e85a7f6d9c3ffd27084373954871a262ccd827c65dc9a10b0fb8153392ced7cacdcb5c523d5eac9adb
EXPORTER_SECRET ef29f3273eb4c3848fb8e869418198253bb70d55e234e55ed14bf4b4bab5c5b4 97ed8911dac9e9e8543496c3ebf120a804da5fa88f70854e693a83db5b9f39d45a7c223f2782c6fc6943f18916c797f7
SERVER_TRAFFIC_SECRET_0 ef29f3273eb4c3848fb8e869418198253bb70d55e234e55ed14bf4b4bab5c5b4 3ca5d277257f1f536affba73730ec5561eb3654eddb53146e3935f79f3dde5d9b11220936506aa7c2806ba0fd3df065c
CLIENT_HANDSHAKE_TRAFFIC_SECRET ef29f3273eb4c3848fb8e869418198253bb70d55e234e55ed14bf4b4bab5c5b4 caf02ef79a590b2d9dd78149774174c4a305bc9255fb1df90c66f61e9445be5d74c43b2eff8be2aebfab27ca40751d3c
CLIENT_TRAFFIC_SECRET_0 ef29f3273eb4c3848fb8e869418198253bb70d55e234e55ed14bf4b4bab5c5b4 9d6d6cc9fc091479726907304d7c47d84e718db4b09319871d009dc7eb19c5795487528194c362708cd86faf4452f73b

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,18 @@
<?xml version="1.0" encoding="utf-8"?>
<license id="fe76d797-6ecf-4e79-aa95-e2d30037a4c2" generate="2025-11-03T03:21:24.1952286" expiration="2025-11-10T03:21:24.1952286" type="Standard" AppName="Application" Fingerprint="0E963B0E20A1F6AC">
<name>EasyLicense</name>
<Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
<SignedInfo>
<CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315" />
<SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256" />
<Reference URI="">
<Transforms>
<Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" />
</Transforms>
<DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256" />
<DigestValue>2ARv1/EpdnU8XLyDEGR1br2dBD1EhjPyTuIem87R0YM=</DigestValue>
</Reference>
</SignedInfo>
<SignatureValue>DB6lmvc3b0zI9Y7k+SvGegAroCRxNxbIOAZydZMz7EpFW8yNDy6iIU9uuUBIhSYdk4mEIoroxFA6Ra2Ha9Gc0bShMtJdnyBVw2My+9DNFf1iA0Nzf7qdEUfR3dd4I+w/awgGBfAqO67LxPrCva3i+AitHgSMywadcJ+45lKJDbE=</SignatureValue>
</Signature>
</license>

View File

@@ -3,12 +3,6 @@ C:\Users\ShenX\Desktop\DiscoverDevices\S7CommPlusV3Driver\DriverTest\bin\Debug\D
C:\Users\ShenX\Desktop\DiscoverDevices\S7CommPlusV3Driver\DriverTest\bin\Debug\DriverTest.exe
C:\Users\ShenX\Desktop\DiscoverDevices\S7CommPlusV3Driver\DriverTest\bin\Debug\DriverTest.pdb
C:\Users\ShenX\Desktop\DiscoverDevices\S7CommPlusV3Driver\DriverTest\bin\Debug\S7CommPlusDriver.dll
C:\Users\ShenX\Desktop\DiscoverDevices\S7CommPlusV3Driver\DriverTest\bin\Debug\S7PublicKeys.dll
C:\Users\ShenX\Desktop\DiscoverDevices\S7CommPlusV3Driver\DriverTest\bin\Debug\S7Utilities.dll
C:\Users\ShenX\Desktop\DiscoverDevices\S7CommPlusV3Driver\DriverTest\bin\Debug\zlib.net.dll
C:\Users\ShenX\Desktop\DiscoverDevices\S7CommPlusV3Driver\DriverTest\bin\Debug\S7CommPlusAuth.dll
C:\Users\ShenX\Desktop\DiscoverDevices\S7CommPlusV3Driver\DriverTest\bin\Debug\S7Family0.dll
C:\Users\ShenX\Desktop\DiscoverDevices\S7CommPlusV3Driver\DriverTest\obj\Debug\DriverTest.csproj.CopyComplete
C:\Users\ShenX\Desktop\DiscoverDevices\S7CommPlusV3Driver\DriverTest\obj\Debug\DriverTest.exe
C:\Users\ShenX\Desktop\DiscoverDevices\S7CommPlusV3Driver\DriverTest\obj\Debug\DriverTest.pdb
C:\Users\ShenX\Desktop\DiscoverDevices\S7CommPlusV3Driver\DriverTest\obj\Debug\DriverTest.csprojAssemblyReference.cache

Binary file not shown.

Binary file not shown.

BIN
Lib/License.Lib.dll Normal file

Binary file not shown.

Binary file not shown.

View File

@@ -26,8 +26,7 @@
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.checkBox1 = new System.Windows.Forms.CheckBox();
this.btnDisconnect = new System.Windows.Forms.Button();
this.btnConnect = new System.Windows.Forms.Button();
this.label2 = new System.Windows.Forms.Label();
@@ -45,6 +44,7 @@
this.tbSymbol = new System.Windows.Forms.TextBox();
this.label3 = new System.Windows.Forms.Label();
this.statusStrip1 = new System.Windows.Forms.StatusStrip();
this.lbStatus = new System.Windows.Forms.ToolStripStatusLabel();
this.txt_plcInfo = new System.Windows.Forms.ToolStripStatusLabel();
this.groupBox1.SuspendLayout();
this.groupBox2.SuspendLayout();
@@ -53,8 +53,7 @@
//
// groupBox1
//
this.groupBox1.Controls.Add(this.lbStatus);
this.groupBox1.Controls.Add(this.label6);
this.groupBox1.Controls.Add(this.checkBox1);
this.groupBox1.Controls.Add(this.btnDisconnect);
this.groupBox1.Controls.Add(this.btnConnect);
this.groupBox1.Controls.Add(this.label2);
@@ -68,21 +67,16 @@
this.groupBox1.TabStop = false;
this.groupBox1.Text = "Connection";
//
// lbStatus
// checkBox1
//
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:";
this.checkBox1.AutoSize = true;
this.checkBox1.Location = new System.Drawing.Point(9, 112);
this.checkBox1.Name = "checkBox1";
this.checkBox1.Size = new System.Drawing.Size(156, 16);
this.checkBox1.TabIndex = 12;
this.checkBox1.Text = "Only secure PG/PC -HMI";
this.checkBox1.UseVisualStyleBackColor = true;
this.checkBox1.CheckedChanged += new System.EventHandler(this.checkBox1_CheckedChanged);
//
// btnDisconnect
//
@@ -136,7 +130,7 @@
this.tbIpAddress.Name = "tbIpAddress";
this.tbIpAddress.Size = new System.Drawing.Size(151, 21);
this.tbIpAddress.TabIndex = 0;
this.tbIpAddress.Text = "192.168.0.250";
this.tbIpAddress.Text = "192.168.0.1";
//
// treeView1
//
@@ -282,6 +276,7 @@
// statusStrip1
//
this.statusStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.lbStatus,
this.txt_plcInfo});
this.statusStrip1.Location = new System.Drawing.Point(0, 393);
this.statusStrip1.Name = "statusStrip1";
@@ -289,6 +284,12 @@
this.statusStrip1.TabIndex = 3;
this.statusStrip1.Text = "statusStrip1";
//
// lbStatus
//
this.lbStatus.Name = "lbStatus";
this.lbStatus.Size = new System.Drawing.Size(46, 17);
this.lbStatus.Text = "Status:";
//
// txt_plcInfo
//
this.txt_plcInfo.Name = "txt_plcInfo";
@@ -335,12 +336,12 @@
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;
private System.Windows.Forms.ToolStripStatusLabel lbStatus;
private System.Windows.Forms.CheckBox checkBox1;
}
}

View File

@@ -1,406 +1,412 @@
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);
}
}
}
}
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;
private bool onlySecurePGOrPCAndHMI = false;
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:{status}|";
}
private void btnConnect_Click(object sender, EventArgs e)
{
setStatus("connecting...");
if (conn != null) conn.Disconnect();
conn = new S7CommPlusConnection();
conn.OnlySecurePGOrPCAndHMI = onlySecurePGOrPCAndHMI;
int res = conn.Connect(tbIpAddress.Text, tbPassword.Text);
if (res != 0)
{
setStatus("error");
return;
}
setStatus("connected");
txt_plcInfo.Text = $"PLCType: {conn.PLCInformation.PLCType}|MLFB: {conn.PLCInformation.MLFB}|Firmware: {conn.PLCInformation.Firmware}";
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);
}
}
private void checkBox1_CheckedChanged(object sender, EventArgs e)
{
onlySecurePGOrPCAndHMI = checkBox1.Checked;
}
}
}

View File

@@ -125,7 +125,7 @@
AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w
LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0
ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAAC4
KgAAAk1TRnQBSQFMAgEBJAEAAagBAAGoAQABEAEAARABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo
KgAAAk1TRnQBSQFMAgEBJAEAAbgBAAG4AQABEAEAARABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo
AwABQAMAAaADAAEBAQABCAYAASgYAAGAAgABgAMAAoABAAGAAwABgAEAAYABAAKAAgADwAEAAcAB3AHA
AQAB8AHKAaYBAAEzBQABMwEAATMBAAEzAQACMwIAAxYBAAMcAQADIgEAAykBAANVAQADTQEAA0IBAAM5
AQABgAF8Af8BAAJQAf8BAAGTAQAB1gEAAf8B7AHMAQABxgHWAe8BAAHWAucBAAGQAakBrQIAAf8BMwMA

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,18 @@
<?xml version="1.0" encoding="utf-8"?>
<license id="fe76d797-6ecf-4e79-aa95-e2d30037a4c2" generate="2025-11-03T03:21:24.1952286" expiration="2025-11-10T03:21:24.1952286" type="Standard" AppName="Application" Fingerprint="0E963B0E20A1F6AC">
<name>EasyLicense</name>
<Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
<SignedInfo>
<CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315" />
<SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256" />
<Reference URI="">
<Transforms>
<Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" />
</Transforms>
<DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256" />
<DigestValue>2ARv1/EpdnU8XLyDEGR1br2dBD1EhjPyTuIem87R0YM=</DigestValue>
</Reference>
</SignedInfo>
<SignatureValue>DB6lmvc3b0zI9Y7k+SvGegAroCRxNxbIOAZydZMz7EpFW8yNDy6iIU9uuUBIhSYdk4mEIoroxFA6Ra2Ha9Gc0bShMtJdnyBVw2My+9DNFf1iA0Nzf7qdEUfR3dd4I+w/awgGBfAqO67LxPrCva3i+AitHgSMywadcJ+45lKJDbE=</SignatureValue>
</Signature>
</license>

View File

@@ -10,8 +10,3 @@ C:\Users\ShenX\Desktop\DiscoverDevices\S7CommPlusV3Driver\S7CommPlusGUIBrowser\o
C:\Users\ShenX\Desktop\DiscoverDevices\S7CommPlusV3Driver\S7CommPlusGUIBrowser\obj\Debug\S7CommPlusGUIBrowser.csproj.CopyComplete
C:\Users\ShenX\Desktop\DiscoverDevices\S7CommPlusV3Driver\S7CommPlusGUIBrowser\obj\Debug\S7CommPlusGUIBrowser.exe
C:\Users\ShenX\Desktop\DiscoverDevices\S7CommPlusV3Driver\S7CommPlusGUIBrowser\obj\Debug\S7CommPlusGUIBrowser.pdb
C:\Users\ShenX\Desktop\DiscoverDevices\S7CommPlusV3Driver\S7CommPlusGUIBrowser\bin\Debug\S7PublicKeys.dll
C:\Users\ShenX\Desktop\DiscoverDevices\S7CommPlusV3Driver\S7CommPlusGUIBrowser\bin\Debug\S7Utilities.dll
C:\Users\ShenX\Desktop\DiscoverDevices\S7CommPlusV3Driver\S7CommPlusGUIBrowser\bin\Debug\zlib.net.dll
C:\Users\ShenX\Desktop\DiscoverDevices\S7CommPlusV3Driver\S7CommPlusGUIBrowser\bin\Debug\S7CommPlusAuth.dll
C:\Users\ShenX\Desktop\DiscoverDevices\S7CommPlusV3Driver\S7CommPlusGUIBrowser\bin\Debug\S7Family0.dll