S7.Net: Ethernet-Kommunikations - Treiber für Siemens SPS

kostenlosKostenloses technisches Material

Dieser Inhalt ist direkt lesbar und eignet sich für das Grundlagenlernen und die Suche.

S7.Net: Ethernet-Kommunikations - Treiber für Siemens SPS

Ü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öchten
  • value: 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 DB
  • startByteAdrGibt 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öchten
  • db: Index der zu lesen DB
  • startByteAdrGibt 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.

Sollte man diese Informationen für ein echtes Projekt verwenden?

Gehen Sie zum Tool Center, um Nachrichten zu analysieren, CRC-Prüfungen und Geräte-Debugging zu erledigen, oder senden Sie Anforderungen für Auswahl - und Zugangsvorschläge.

Ingenieur Mitglied

Verwandeln Sie diesen Artikel in ein umsetzbares Debuggermaterial

Erweiterte Nachrichtenanalyse, Paket-Downloads, Codebeispiele, Engineering-Szenarien und Priority-Technischer Support sind für die Real-Projekt - Bereitstellung möglich.

Unbegrenzte Werkzeuge
Datenpaket und Codepaket
Vollständige Engineering Case-Basis
Vorrangiger Zugang zum technischen Support

Antwort veröffentlichen

Ihre E-Mail - Adresse wird nicht öffentlich gemacht. Erforderliche Elemente wurden verwendet * markiert.