mirror of
https://gitee.com/lircy/S7CommPlusV3Driver
synced 2026-03-23 23:16:34 +08:00
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
198 lines
7.9 KiB
C#
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();
|
|
}
|
|
}
|
|
}
|