Files
S7CommPlusV3Driver/DriverTest/Program.cs
CoderShen 40cf60b069 1. Added support for connecting to PLCs when "Only secure PG/PC and HMI communication" option is enabled
2. Fixed connection failure errors when PLC has "Only secure PG/PC and HMI communication" enabled

3. Fixed null reference errors when SessionKey is empty due to connection failures
2025-10-31 15:18:32 +08:00

198 lines
7.9 KiB
C#

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