Übersicht
S7.Net ist ein SPS-Treiber, der speziell für Siemens SPS entwickelt wurde und nur Verbindungen über Ethernet unterstützt. Das bedeutet, dass Ihre SPS über eine Profinet-CPU oder eine Profinet-externe Karte (z. B. eine CPxxx-Karte) verfügen muss. S7.Net ist vollständig in C # geschrieben, sodass Sie das Debugging problemlos durchführen können, ohne mit lokalen DLLs zu arbeiten.
Unterstützte PLC-Modelle
S7.Net ist mit folgenden Modellen von Siemens SPS kompatibel: S7 - 200, S7 - 300, S7 - 400, S7 - 1200 und S7 - 1500.
Starten Sie mit S7.Net
Um mit S7.Net zu beginnen, müssen Sie S7.Net.dll herunterladen und in Ihr Projekt einfügen. Sie können dies durch Herunterladen des NuGet-Pakets oder durch Herunterladen des Quellcodes und Kompilieren erreichen.
Erstellen von SPS-Instanzen, Verbinden und Trennen
Beim Erstellen von Treiber-Instanzen müssen Sie die folgenden Konstruktoren verwenden:
public Plc(CpuType cpu, string ip, Int16 rack, Int16 slot)
cpu: Geben Sie den Typ der CPU an, mit der Sie verbinden möchten. Unterstützte CPU-Typen sind:
public enum CpuType {
S7200 = 0,
S7300 = 10,
S7400 = 20,
S71200 = 30,
S71500 = 40,
}ip: Geben Sie die IP-Adresse der CPU oder externer Ethernet-Karten an.rack: Die Racknummer enthält die SPS, die Sie in der Hardware-Konfiguration in Schritt 7 finden können.slot: Dies ist die Steckplatznummer der CPU, die auch in der Hardware-Konfiguration in Schritt 7 gefunden werden kann.
Der folgende Code erstellt beispielsweise ein PLC-Objekt für eine S7-300 PLC mit der IP-Adresse 127.0.0.1 mit einem PLC in Rack 0 und einer CPU in Steck 2:
Plc plc = new Plc(CpuType.S7300, "127.0.0.1", 0, 2);
Verbinden mit einer PLC
public void Open()
Die folgende Codezeile öffnet beispielsweise die Verbindung:
plc.Open();
Trennen Sie die Verbindung vom PLC
public void Close()
Der folgende Code schließt beispielsweise die Verbindung:
plc.Close();
Fehlerbehandlung
Jede Methode kann aufgrund verschiedener Fehler ausgelöst werdenPlcException. Sie sollten eine angemessene Fehlerbehandlung durchführen.PlcExceptionliefert eineErrorCodeund eine entsprechende Fehlermeldung.
Hier ist eine Aufzählung der Fehlertypen:
public enum ErrorCode
{
NoError = 0,
WrongCPU_Type = 1,
ConnectionError = 2,
IPAddressNotAvailable,
WrongVarFormat = 10,
WrongNumberReceivedBytes = 11,
SendData = 20,
ReadData = 30,
WriteData = 50
}Überprüfen der Verfügbarkeit der PLC
Um zu überprüfen, ob die SPS verfügbar ist (eine Socket öffnen), können Sie die Eigenschaft verwenden:
public bool IsAvailable
Wenn Sie diese Eigenschaft überprüfen, versucht der Treiber, eine Verbindung mit der SPS herzustellen und gibt true zurück, wenn eine Verbindung hergestellt werden kann, andernfalls false.
Überprüfen der SPS-Verbindung
Überprüfen der SPS-Verbindung ist einfach, da Sie überprüfen müssen, ob die PC-Sockel angeschlossen ist und ob die SPS am anderen Ende der Sockel noch angeschlossen ist. Die Eigenschaft, die Sie in diesem Fall überprüfen müssen, ist:
public bool IsConnected
Sie können diese Eigenschaft überprüfen, wenn Sie dieOpen()- Methode erfolgreich aufrufen, um zu sehen, ob die Verbindung noch aktiv ist.
Lesebytes / Schreib-Bytes
Diese Bibliothek bietet verschiedene Methoden zum Lesen von Variablen. Die am häufigsten verwendete und grundlegende Methode istReadBytes。
public byte[] ReadBytes(DataType dataType, int db, int startByteAdr, int count) public void WriteBytes(DataType dataType, int db, int startByteAdr, byte[] value)
Diese Methode liest alle von Ihnen angegebenen Bytes von einem gegebenen Speicherort aus. Wenn die Anzahl der Bytes die maximale Anzahl der Bytes überschreitet, die eine einzelne Anforderung übertragen kann, verarbeitet diese Methode automatisch mehrere Anfragen.
dataType: Sie müssen den SpeicherortDataTypeverwenden:
public enum DataType
{
Input = 129,
Output = 130,
Memory = 131,
DataBlock = 132,
Timer = 29,
Counter = 28
}db: die Adresse des datatypes angeben, beispielsweise, wenn Sie DB1 lesen möchten, ist dieses Feld "1"; wenn Sie T45 lesen möchten, ist es 45.startByteAdr: Die Adresse des ersten Bytes, das Sie lesen möchten, beispielsweise 200 wenn Sie DB1.DBW200 lesen möchten.count: enthält die Anzahl der Bytes, die Sie lesen möchten.value[]: Das Byte-Array, das von der PLC gelesen werden soll.
Beispiel: Diese Methode liest die ersten 200 Bytes von DB1:
var bytes = plc.ReadBytes(DataType.DataBlock, 1, 0, 200);
Lesen und dekodieren / schreiben dekodiert
Diese Methode ermöglicht es Ihnen, dekodierte Ergebnisse basierend auf dem bereitgestellten varType zu lesen und zu erhalten. Dies ist sehr nützlich, wenn Sie mehrere Felder des gleichen Typs lesen (z. B. 20 aufeinanderfolgende DBWs). Wenn Sie VarType.Byte angeben, hat es die gleiche Funktion wie ReadBytes.
public object Read(DataType dataType, int db, int startByteAdr, VarType varType, int varCount) public void Write(DataType dataType, int db, int startByteAdr, object value)
dataType: Sie müssen den Speicherort mit der EnumerationDataTypeangeben.db: die Adresse des datatypes, zum Beispiel, wenn Sie DB1 lesen möchten, ist dieses Feld "1"; wenn Sie T45 lesen möchten, ist es 45.startByteAdr: Die Adresse des ersten Bytes, das Sie lesen möchten, wenn Sie beispielsweise DB1.DBW200 lesen möchten, ist dies 200.varType: Geben Sie die Daten an, in die Sie die Bytes konvertieren möchten.
public enum VarType
{
Bit,
Byte,
Word,
DWord,
Int,
DInt,
Real,
String,
StringEx,
Timer,
Counter
}count: Enthält die Anzahl der Variablen, die Sie lesen möchtenvalue: ein Array von Werten, die in das PLC geschrieben werden sollen. Es kann ein einzelner Wert oder ein Array sein, aber bedenken Sie nur, dass der Typ eindeutig ist (z. B. double Array, int Array, shorts Array usw.).
Beispiel: Diese Methode liest die ersten 20 DWords von DB1:
var dwords = plc.Read(DataType.DataBlock, 1, 0, VarType.DWord, 20);
einzelne Variable liest / einzelne Variable schreibt
Diese Methode liest einzelne Variable von der SPS, indem sie die Zeichenfolge analysiert und ein korrektes Ergebnis zurückgibt. Obwohl dies der einfachste Ansatz ist, ist es sehr ineffizient, da der Treiber eine TCP-Anforderung für jede Variable sendet.
public object Read(string variable) public void Write(string variable, object value)
variable: Geben Sie die Variable an, die Sie lesen möchten, indem Sie Zeichenfolgen wie "DB1.DBW20", "T45", "C21", "DB1.DBD400" usw. verwenden.
Beispiel: Dies liest die Variable DB1.DBW0. Das Ergebnis muss in „ushort" konvertiert werden, um das korrekte 16 - Bit-Format in C # zu erhalten.
ushort result = (ushort)plc.Read("DB1.DBW0");Lesen von Strukturen / Schreiben von Strukturen
Diese Methode liest alle Bytes aus der angegebenen DB, um die Strukturen in C # zu füllen und gibt die Strukturen mit Werten zurück. Es wird empfohlen, wenn Sie mehrere Variablen in einem einzelnen Datenblock lesen möchten.
Die Methoden „Lese-Struktur" und „Schreiben-Struktur" unterstützen keine Zeichenfolgen.
public object ReadStruct(Type structType, int db, int startByteAdr = 0) public void WriteStruct(object structValue, int db, int startByteAdr = 0)
structType: Der Typ der Struktur, die gelesen werden soll, z. B.: typeof (MyStruct)db: Index der zu lesen DBstartByteAdrGibt die erste Adresse des zu lesen Bytes an (Standardwert Null).
Beispiel: Definieren Sie einen DataBlock in einer SPS und fügen Sie dann eine Struktur in einer. Net-Anwendung hinzu, die der DB in einer SPS ähnelt:
public struct testStruct
{
public bool varBool0;
public bool varBool1;
public bool varBool2;
public bool varBool3;
public bool varBool4;
public bool varBool5;
public bool varBool6;
public byte varByte0;
public byte varByte1;
public ushort varWord0;
public float varReal0;
public bool varBool7;
public float varReal1;
public byte varByte2;
public UInt32 varDWord;
}Und fügen Sie dann Code hinzu, um die vollständige Struktur zu lesen oder zu schreiben:
// 从起始地址0读取DataBlock 1中的结构体 testStruct myTestStruct = (testStruct) plc.ReadStruct(typeof(testStruct), 1, 0);
* * Leseklasse / Schreiben
in die Klasse * *
Diese Methode liest alle Bytes aus der angegebenen DB, um die Klasse in C # zu füllen. Die Klasse wird als Referenz übergeben und verwendet Reflexionen für die Zuweisung von Werten. Es wird empfohlen, wenn Sie mehrere Variablen in einem einzelnen Datenblock lesen möchten.
Die Methoden "Lese-Klasse" und "Schreiben-Klasse" unterstützen keine Zeichenfolgen.
public void ReadClass(object sourceClass, int db, int startByteAdr = 0) public void WriteClass(object classValue, int db, int startByteAdr = 0)
sourceClass: Die Instanz der Klasse, der Sie einen Wert zuweisen möchtendb: Index der zu lesen DBstartByteAdrGibt die erste Adresse des zu lesen Bytes an (Standardwert Null).
Beispiel: Definieren Sie einen DataBlock in einer SPS und fügen Sie dann eine Klasse in einer. Net-Anwendung hinzu, die DB in einer SPS ähnelt:
public class TestClass
{
public bool varBool0 { get; set;}
public bool varBool1 { get; set;}
public bool varBool2 { get; set;}
public bool varBool3 { get; set;}
public bool varBool4 { get; set;}
public bool varBool5 { get; set;}
public bool varBool6 { get; set;}
public byte varByte0 { get; set;}
public byte varByte1 { get; set;}
public ushort varWord0 { get; set;}
public float varReal0 { get; set;}
public bool varBool7 { get; set;}
public float varReal1 { get; set;}
public byte varByte2 { get; set;}
public UInt32 varDWord { get; set;}
}Fügen Sie dann Code hinzu, um die vollständige Klasse zu lesen oder zu schreiben:
// 从起始地址0读取DataBlock 1中的类 TestClass myTestClass = new TestClass(); plc.ReadClass(myTestClass, 1, 0);
Lesen Sie mehrere Variablen
Diese Methode liest mehrere Variablen in einer einzigen Anfrage. Variablen können sich in denselben oder unterschiedlichen Datenblöcken befinden.
public void Plc.ReadMultibleVars(List<DataItem> dataItems);
List<>: Sie müssen eine DataItem-Liste angeben, die alle zu lesenen Datenelemente enthält.
Beispiel: Diese Methode liest mehrere Variablen aus einem Datenblock:
Zuerst definiert ein Datenelement:
private static DataItem varBit = new DataItem()
{
DataType = DataType.DataBlock,
VarType = VarType.Bit,
DB = 83,
BitAdr = 0,
Count = 1,
StartByteAdr = 0,
Value = new object()
};... (die Definition von Datenelementen wird in der Mitte ausgelassen)
Dann definiert eine Liste, um DataItems zu speichern:
private static List<DataItem> dataItemsRead = new List<DataItem>();
Hinzufügen von Datenelementen zur Liste:
dataItemsRead.Add(varBit); dataItemsRead.Add(varByteArray); dataItemsRead.Add(varInt); dataItemsRead.Add(varReal); dataItemsRead.Add(varString); dataItemsRead.Add(varDateTime);
Öffnen Sie die SPS-Verbindung und lesen Sie sofort die Liste von Elementen:
myPLC.Open();
// 读取变量列表
myPLC.ReadMultipleVars(dataItemsRead);
// 关闭连接
myPLC.Close();
// 访问列表的值
Console.WriteLine("Int:" + dataItemsRead[2].Value);Schreiben mehrerer Variablen
Diese Methode schreibt mehrere Variablen in einer einzigen Anfrage.
public void Plc.Write(Array[DataItem] dataItems);
Array[]Sie müssen ein DataItem-Array angeben, das alle Elemente enthält, die Sie schreiben möchten.
Beispiel: Diese Methode schreibt mehrere Variablen in einen Datenblock:
Definiert Datenelemente:
private static DataItem varWordWrite = new DataItem()
{
// ... (与上文重复的数据项定义省略)
};... (Doppel-Daten - Element-Definitionen werden in der Mitte weggelassen)
Zuweisung von Werten zu Datenelementen. Hinweis: Verwenden Sie die richtige Datenkonvertierung, um den Datentyp S7 anzupassen:
varWordWrite.Value = (ushort)67; varIntWrite.Value = (ushort)33; varDWordWrite.Value = (uint)444; varDIntWrite.Value = 6666; varRealWrite.Value = 77.89; varStringWrite.Value = "Writting";
Dann definieren Sie eine Liste, um Datenelemente zu speichern, und fügen Sie die erstellten Elemente der Liste hinzu:
private static List<DataItem> dataItemsWrite = new List<DataItem>(); // 将数据项添加到要写入的数据项列表中 dataItemsWrite.Add(varWordWrite); dataItemsWrite.Add(varIntWrite); dataItemsWrite.Add(varDWordWrite); dataItemsWrite.Add(varDIntWrite); dataItemsWrite.Add(varRealWrite); dataItemsWrite.Add(varStringWrite);
Schließlich öffnen Sie die PLC-Verbindung und schreiben Sie das Projekt einmal. Umwandeln von Listen in Arrays mit. ToArray ():
// 打开连接 myPLC.Open(); // 写入项目 myPLC.Write(dataItemsWrite.ToArray()); // 关闭连接 myPLC.Close();
Dieser Artikel enthält eine detaillierte Einführung in die S7.Net-Software, einschließlich der Funktionen, wie man einsetzt, wie man eine SPS-Instanz erstellt, Verbindungen und Trennung, Fehlerbehandlung, Überprüfung der Verfügbarkeit und des Verbindungsstatus von SPS, Lesen und Schreiben von Bytes, Lesen und Schreiben von Strukturen und Klassen und wie man mehrere Variablen gleichzeitig liest und schreibt. Wir hoffen, dass dieser Artikel Ihnen helfen wird, S7.Net besser zu verstehen.
Antwort veröffentlichen