S7.Net:専用にシーメンスPLC设计的イーサネット通信驱动

freeFree Technical Resource

This content is free to read, suitable for basic learning and search traffic.

S7.Net:専用にシーメンスPLC设计的イーサネット通信驱动

概述

S7.Net是一个専用にシーメンスPLC设计的PLC驱动程序,仅サポート経由イーサネット(イーサネット)连接。这意味着あなたのPLC必须具备Profinet CPU或Profinet外部卡(如CPxxx卡)。S7.Net完全使用C#编写,因此您可以轻松地进行デバッグ,而无需処理本地DLL。

サポート的PLC型号

S7.Net与以下型号的シーメンスPLC兼容:S7-200、S7-300、S7-400、S7-1200和S7-1500。

开始使用S7.Net

要开始使用S7.Net,您需要下载并包含S7.Net.dll到あなたの项目中。您可以経由下载NuGet包或下载源代码并编译来実装。

作成PLC实例、连接与断开

作成驱动程序实例时,您需要使用以下构造函数:

public Plc(CpuType cpu, string ip, Int16 rack, Int16 slot)
  • cpu:指定您要连接的CPUType。サポート的CPUタイプ有:
  public enum CpuType {
      S7200 = 0,
      S7300 = 10,
      S7400 = 20,
      S71200 = 30,
      S71500 = 40,
  }
  • ip:指定CPU或外部イーサネット(イーサネット)卡的IPaddress。
  • rack:包含PLC的机架号,您可以在Step7的ハードウェアの構成中找到。
  • slot:这是CPU的插槽号,同样可以在Step7的ハードウェアの構成中找到。

例如,以下代码为IPアドレス为127.0.0.1的S7-300 PLC作成了一个PLC对象,PLC位于0号机架,CPU位于2号插槽:

Plc plc = new Plc(CpuType.S7300, "127.0.0.1", 0, 2);

连接到PLC

public void Open()

例如,以下代码行打开连接:

plc.Open();

从PLC切断する

public void Close()

例如,以下代码接続を閉じる:

plc.Close();

エラー処理

任何方法都可能因为各种エラー而引发PlcException。您应该実装适当的エラー処理。PlcException提供了一个ErrorCode和一个适当的エラーメッセージ。

以下是エラータイプ的枚举:

public enum ErrorCode
{
    NoError = 0,
    WrongCPU_Type = 1,
    ConnectionError = 2,
    IPAddressNotAvailable, 
    WrongVarFormat = 10,
    WrongNumberReceivedBytes = 11, 
    SendData = 20,
    ReadData = 30, 
    WriteData = 50
}

チェックPLC可用性

要チェックPLC是否可用(打开一个Socket),您可以使用属性:

public bool IsAvailable

当您チェック此属性时,驱动程序将尝试连接到PLC,并在能够连接时戻るtrue,否则戻るfalse。

チェックPLCconnect

チェックPLC连接很简单,因为您需要チェックPC套接字是否接続された,还要チェックPLC是否仍然连接在套接字的另一端。在这种情况下,您需要チェック的属性是:

public bool IsConnected

您可以在调用Open()方法并成功后チェック此属性,以表示连接是否仍然活跃。

読み取りバイト/写入バイト

该库提供了多种読み取り变量的方法。最基本且最もよく使われる方法是ReadBytes

public byte[] ReadBytes(DataType dataType, int db, int startByteAdr, int count)

public void WriteBytes(DataType dataType, int db, int startByteAdr, byte[] value)

此方法从给定的内存位置読み取り您指定的すべてのバイト。もしBytesの数超过了单次リクエスト可以传输的最大Bytesの数,此方法会自动処理多个リクエスト。

  • dataType:您必须使用枚举DataType指定内存位置:
  public enum DataType
  {
      Input = 129,
      Output = 130,
      Memory = 131,
      DataBlock = 132,
      Timer = 29,
      Counter = 28
  }
  • db:dataType的アドレス,例如,もし您想読み取りDB1,则此字段为“1”;もし您想読み取りT45,则此字段为45。
  • startByteAdr:您要読み取り的第一バイト単位。的アドレス,例如,もし您想読み取りDB1.DBW200,则此为200。
  • count:包含您想要読み取り的Bytesの数。
  • value[]:要从PLC読み取り的Bytesの配列。

example:此方法読み取りDB1的前200バイト単位。:

var bytes = plc.ReadBytes(DataType.DataBlock, 1, 0, 200);

読み取り和解码/写入已解码

此方法允许您読み取り并受信基于提供的varType的已解码结果。这在您読み取り多个相同タイプ的字段时非常有用(例如20个连续的DBW)。もし您指定VarType.Byte,它与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:您必须使用枚举DataType指定内存位置。
  • db:dataType的アドレス,例如,もし您想読み取りDB1,则此字段为“1”;もし您想読み取りT45,则此字段为45。
  • startByteAdr:您要読み取り的第一バイト単位。的アドレス,例如,もし您想読み取りDB1.DBW200,则此为200。
  • varType:指定您想要将バイト转换为的データ。
  public enum VarType
  {
      Bit,
      Byte,
      Word,
      DWord,
      Int,
      DInt,
      Real,
      String,
      StringEx,
      Timer,
      Counter
  }
  • count:包含您想要読み取り的变量数量。
  • value:要写入PLC的值配列。它可以是单个值或配列,只是请记住タイプ是唯一的(例如,double配列,int配列,shorts配列等)。

example:此方法読み取りDB1的前20个DWord:

var dwords = plc.Read(DataType.DataBlock, 1, 0, VarType.DWord, 20);

読み取り单个变量/写入单个变量

此方法経由解析ストリング·ストリング并戻る正确的结果,从PLC読み取り单个变量。虽然这是最简单的入門方法,但由于驱动程序为每个变量送信TCPRequest,因此非常低效。

public object Read(string variable)

public void Write(string variable, object value)
  • variable:経由使用ストリング·ストリング如“DB1.DBW20”,“T45”,“C21”,“DB1.DBD400”等来指定要読み取り的变量。

example:这読み取り变量DB1.DBW0。结果必须转换为ushort以获得C#中正确的16位格式。

ushort result = (ushort)plc.Read("DB1.DBW0");

読み取り構造体/写入構造体

此方法从指定的DB読み取りすべてのバイト,以填充C#中的構造体,并戻る包含值的構造体。当您想要読み取り单个データ块中的多个变量时,建议使用它。

“読み取り構造体”和“写入構造体”方法サポートなし。ストリング·ストリング。

public object ReadStruct(Type structType, int db, int startByteAdr = 0)

public void WriteStruct(object structValue, int db, int startByteAdr = 0)
  • structType:要読み取り的構造体タイプ,例如:typeof(MyStruct)
  • db:要読み取り的DB的索引
  • startByteAdr:指定要読み取り的バイト的第一アドレスはこちら。(デフォルト为零)。

example:在PLC中定义一个DataBlock,然后在.Net应用程序中追加一个类似于PLC中DB的構造体:

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;
}

然后追加代码以読み取り或写入完全的構造体:

// 从開始アドレス0読み取りDataBlock 1中的構造体
testStruct myTestStruct = (testStruct) plc.ReadStruct(typeof(testStruct), 1, 0);

**読み取り类/写

入类**

此方法从指定的DB読み取りすべてのバイト,以填充C#中的类。类作为引用传递,使用反射分配值。当您想要読み取り单个データ块中的多个变量时,建议使用它。

“読み取り类”和“写入类”方法サポートなし。ストリング·ストリング。

public void ReadClass(object sourceClass, int db, int startByteAdr = 0)

public void WriteClass(object classValue, int db, int startByteAdr = 0)
  • sourceClass:您想要分配值的类的实例
  • db:要読み取り的DB的索引
  • startByteAdr:指定要読み取り的バイト的第一アドレスはこちら。(デフォルト为零)。

example:在PLC中定义一个DataBlock,然后在.Net应用程序中追加一个类似于PLC中DB的类:

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;}
}

然后追加代码以読み取り或写入完全的类:

// 从開始アドレス0読み取りDataBlock 1中的类
TestClass myTestClass = new TestClass();
plc.ReadClass(myTestClass, 1, 0);

読み取り多个变量

此方法在单个リクエスト中読み取り多个变量。变量可以位于相同或不同的データ块中。

public void Plc.ReadMultibleVars(List<DataItem> dataItems);
  • List<>:您必须指定包含すべての要読み取り的データ项的DataItemリスト。

example:此方法从データ块中読み取り几个变量:

首先定义データ项:

private static DataItem varBit = new DataItem()
{
    DataType = DataType.DataBlock,
    VarType = VarType.Bit,
    DB = 83,
    BitAdr = 0,
    Count = 1,
    StartByteAdr = 0,
    Value = new object()
};

…(中间省略了与上文重复的データ项定义)

然后定义一个リスト来存储DataItems:

private static List<DataItem> dataItemsRead = new List<DataItem>();

将データ项追加到リスト中:

dataItemsRead.Add(varBit);
dataItemsRead.Add(varByteArray);
dataItemsRead.Add(varInt);
dataItemsRead.Add(varReal);
dataItemsRead.Add(varString);
dataItemsRead.Add(varDateTime);

openPLC连接并立即読み取り项目リスト:

myPLC.Open();

// 読み取り变量リスト
myPLC.ReadMultipleVars(dataItemsRead);

// 接続を閉じる
myPLC.Close();

// アクセスリスト的值
Console.WriteLine("Int:" + dataItemsRead[2].Value);

写入多个变量

此方法在单个リクエスト中写入多个变量。

public void Plc.Write(Array[DataItem] dataItems);
  • Array[] 您必须指定包含すべての要写入的项目的DataItem配列。

example:此方法将多个变量写入一个データ块:

定义データ项:

private static DataItem varWordWrite = new DataItem()
{
    // ... (与上文重复的データ项定义省略)
};

…(中间省略了与上文重复的データ项定义)

为データ项分配值。注意使用正确的データ変換,以适应S7データ型:

varWordWrite.Value = (ushort)67;
varIntWrite.Value = (ushort)33;
varDWordWrite.Value = (uint)444;
varDIntWrite.Value = 6666;
varRealWrite.Value = 77.89;
varStringWrite.Value = "Writting";

然后定义一个リスト来存储データ项,并将作成的项目追加到リスト中:

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);

最后,openPLC连接并一次性写入项目。使用.ToArray()将リスト转换为配列:

// 打开连接
myPLC.Open();

// 写入项目
myPLC.Write(dataItemsWrite.ToArray());

// 接続を閉じる
myPLC.Close();

这件の記事提供了S7.Net软件的详细介绍,包括其功能、如何开始使用、如何作成PLC实例、连接与断开、エラー処理、チェックPLC的可用性和连接ステータス、読み取り和写入バイト、読み取り和写入構造体和类、以及如何一次性読み取り和写入多个变量。希望这件の記事能帮助您更好地了解S7.Net。

Put this resource to use in a real project?

Go to the Tool Center for message parsing, CRC verification and device debugging, or submit your requirements for selection and integration advice.

Engineer Membership

Turn this article into actionable debugging resources

After activation, you can use advanced message parsing, resource pack downloads, code examples, engineering cases and priority technical support, suitable for real project delivery.

Unlimited Advanced Tools
Resource & Code Packs
Complete Engineering Case Library
Priority Technical Support

Leave a Reply

Your email address will not be published. Required fields are marked *.