S7.Net:专为西门子PLC设计的以太网통신驱动

무료무료 기술 자료

이 글은 바로 읽을 수 있으며 기초 학습과 검색 유입에 적합합니다.

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:指定您要연결的CPU유형。支持的CPU유형有:
  public enum CpuType {
      S7200 = 0,
      S7300 = 10,
      S7400 = 20,
      S71200 = 30,
      S71500 = 40,
  }
  • ip:指定CPU或外部以太网卡的IP주소。
  • 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 닫기()

例如,以下代码닫기연결:

plc.닫기();

错误处理

任何方法都可能因为各种错误而引发PlcException。您应该实现适当的错误处理。PlcException提供了一个오답Code和一个适当的错误消息。

以下是错误유형的枚举:

public enum 오답Code
{
    No오답 = 0,
    WrongCPU_Type = 1,
    Connection오답 = 2,
    IP주소NotAvailable, 
    WrongVarFormat = 10,
    WrongNumberReceivedBytes = 11, 
    Send데이터 = 20,
    Read데이터 = 30, 
    Write데이터 = 50
}

检查PLC可用性

要检查PLC是否可用(열기一个Socket),您可以使用属性:

public bool IsAvailable

当您检查此属性时,驱动程序将尝试연결到PLC,并在能够연결时返回true,否则返回false。

检查PLC연결

检查PLC연결很简单,因为您需要检查PC套接字是否已연결,还要检查PLC是否仍然연결在套接字的另一端。在这种情况下,您需要检查的属性是:

public bool IsConnected

您可以在调用Open()方法并成功后检查此属性,以보기연결是否仍然活跃。

읽기바이트/쓰기바이트

该库提供了多种읽기변수的方法。最基本且最常用的方法是ReadBytes。

public byte[] ReadBytes(데이터Type 데이터Type, int db, int 시작ByteAdr, int count)

public void WriteBytes(데이터Type 데이터Type, int db, int 시작ByteAdr, byte[] value)

此方法从给定的内存位置읽기您指定的所有바이트。如果바이트数超过了单次请求可以传输的最大바이트数,此方法会自动处理多个请求。

  • 데이터Type:您必须使用枚举데이터Type指定内存位置:
  public enum 데이터Type
  {
      Input = 129,
      Output = 130,
      Memory = 131,
      데이터Block = 132,
      Timer = 29,
      Counter = 28
  }
  • db:데이터Type的주소,例如,如果您想읽기DB1,则此필드为“1”;如果您想읽기T45,则此필드为45。
  • 시작ByteAdr:您要읽기的第一个바이트的주소,例如,如果您想읽기DB1.DBW200,则此为200。
  • count:包含您想要읽기的바이트数。
  • value[]:要从PLC읽기的바이트数组。

예제:此方法읽기DB1的前200个바이트:

var bytes = plc.ReadBytes(데이터Type.데이터Block, 1, 0, 200);

읽기和解码/쓰기已解码

此方法允许您읽기并수신基于提供的varType的已解码结果。这在您읽기多个相同유형的필드时非常有用(例如20个连续的DBW)。如果您指定VarType.Byte,它与ReadBytes具有相同的功能。

public object Read(데이터Type 데이터Type, int db, int 시작ByteAdr, VarType varType, int varCount)

public void Write(데이터Type 데이터Type, int db, int 시작ByteAdr, object value)
  • 데이터Type:您必须使用枚举데이터Type指定内存位置。
  • db:데이터Type的주소,例如,如果您想읽기DB1,则此필드为“1”;如果您想읽기T45,则此필드为45。
  • 시작ByteAdr:您要읽기的第一个바이트的주소,例如,如果您想읽기DB1.DBW200,则此为200。
  • varType:指定您想要将바이트转换为的데이터。
  public enum VarType
  {
      Bit,
      Byte,
      Word,
      DWord,
      Int,
      DInt,
      Real,
      String,
      StringEx,
      Timer,
      Counter
  }
  • count:包含您想要읽기的변수数量。
  • value:要쓰기PLC的值数组。它可以是单个值或数组,只是请记住유형是唯一的(例如,double数组,int数组,shorts数组等)。

예제:此方法읽기DB1的前20个DWord:

var dwords = plc.Read(데이터Type.데이터Block, 1, 0, VarType.DWord, 20);

읽기单个변수/쓰기单个변수

此方法通过분석문자串并返回正确的结果,从PLC읽기单个변수。虽然这是最简单的入门方法,但由于驱动程序为每个변수보내기TCP请求,因此非常低效。

public object Read(string variable)

public void Write(string variable, object value)
  • variable:通过使用문자串如“DB1.DBW20”,“T45”,“C21”,“DB1.DBD400”等来指定要읽기的변수。

예제:这읽기변수DB1.DBW0。结果必须转换为ushort以获得C#中正确的16位형식。

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

읽기结构体/쓰기结构体

此方法从指定的DB읽기所有바이트,以填充C#中的结构体,并返回包含值的结构体。当您想要읽기单个데이터块中的多个변수时,建议使用它。

“읽기结构体”和“쓰기结构体”方法不支持문자串。

public object ReadStruct(Type structType, int db, int 시작ByteAdr = 0)

public void WriteStruct(object structValue, int db, int 시작ByteAdr = 0)
  • structType:要읽기的结构体유형,例如:typeof(MyStruct)
  • db:要읽기的DB的索引
  • 시작ByteAdr:指定要읽기的바이트的第一个주소(默认为零)。

예제:在PLC中定义一个데이터Block,然后在.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읽기데이터Block 1中的结构体
testStruct myTestStruct = (testStruct) plc.ReadStruct(typeof(testStruct), 1, 0);

**읽기类/写

入类**

此方法从指定的DB읽기所有바이트,以填充C#中的类。类作为引用传递,使用反射分配值。当您想要읽기单个데이터块中的多个변수时,建议使用它。

“읽기类”和“쓰기类”方法不支持문자串。

public void ReadClass(object sourceClass, int db, int 시작ByteAdr = 0)

public void WriteClass(object classValue, int db, int 시작ByteAdr = 0)
  • sourceClass:您想要分配值的类的实例
  • db:要읽기的DB的索引
  • 시작ByteAdr:指定要읽기的바이트的第一个주소(默认为零)。

예제:在PLC中定义一个데이터Block,然后在.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읽기데이터Block 1中的类
TestClass myTestClass = new TestClass();
plc.ReadClass(myTestClass, 1, 0);

읽기多个변수

此方法在单个请求中읽기多个변수。변수可以位于相同或不同的데이터块中。

public void Plc.ReadMultibleVars(List<데이터Item> 데이터Items);
  • List<>:您必须指定包含所有要읽기的데이터项的데이터Item列表。

예제:此方法从데이터块中읽기几个변수:

首先定义데이터项:

private static 데이터Item varBit = new 데이터Item()
{
    데이터Type = 데이터Type.데이터Block,
    VarType = VarType.Bit,
    DB = 83,
    BitAdr = 0,
    Count = 1,
    StartByteAdr = 0,
    Value = new object()
};

…(中间省略了与上文重复的데이터项定义)

然后定义一个列表来存储데이터Items:

private static List<데이터Item> 데이터ItemsRead = new List<데이터Item>();

将데이터项추가到列表中:

데이터ItemsRead.Add(varBit);
데이터ItemsRead.Add(varByteArray);
데이터ItemsRead.Add(varInt);
데이터ItemsRead.Add(varReal);
데이터ItemsRead.Add(varString);
데이터ItemsRead.Add(varDateTime);

열기PLC연결并바로읽기项目列表:

myPLC.Open();

// 읽기변수列表
myPLC.ReadMultipleVars(데이터ItemsRead);

// 닫기연결
myPLC.닫기();

// 访问列表的值
Console.WriteLine("Int:" + 데이터ItemsRead[2].Value);

쓰기多个변수

此方法在单个请求中쓰기多个변수。

public void Plc.Write(Array[데이터Item] 데이터Items);
  • Array[] 您必须指定包含所有要쓰기的项目的데이터Item数组。

예제:此方法将多个변수쓰기一个데이터块:

定义데이터项:

private static 데이터Item varWordWrite = new 데이터Item()
{
    // ... (与上文重复的데이터项定义省略)
};

…(中间省略了与上文重复的데이터项定义)

为데이터项分配值。注意使用正确的데이터转换,以适应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<데이터Item> 데이터ItemsWrite = new List<데이터Item>();

// 将데이터项추가到要쓰기的데이터项列表中
데이터ItemsWrite.Add(varWordWrite);
데이터ItemsWrite.Add(varIntWrite);
데이터ItemsWrite.Add(varDWordWrite);
데이터ItemsWrite.Add(varDIntWrite);
데이터ItemsWrite.Add(varRealWrite);
데이터ItemsWrite.Add(varStringWrite);

最后,열기PLC연결并一次性쓰기项目。使用.ToArray()将列表转换为数组:

// 열기연결
myPLC.Open();

// 쓰기项目
myPLC.Write(데이터ItemsWrite.ToArray());

// 닫기연결
myPLC.닫기();

这篇글提供了S7.Net软件的详细介绍,包括其功能、如何开始使用、如何创建PLC实例、연결与断开、错误处理、检查PLC的可用性和연결状态、읽기和쓰기바이트、읽기和쓰기结构体和类、以及如何一次性읽기和쓰기多个변수。希望这篇글能帮助您更好地了解S7.Net。

실제 프로젝트에 이 자료를 활용하시겠습니까?

도구 센터에서 프레임 분석, CRC 검증, 장비 디버깅을 진행하거나 요청을 제출하여 선정 및 연동 제안을 받아보세요.

엔지니어 회원

이 글을 실행 가능한 디버깅 자료로 활용하세요

가입하면 고급 프레임 분석, 자료 패키지 다운로드, 코드 예제, 엔지니어링 사례, 우선 기술 지원을 이용할 수 있어 실제 프로젝트 납품에 적합합니다.

고급 도구 무제한 이용
자료 패키지와 코드 패키지
완전한 엔지니어링 사례 라이브러리
우선 기술 지원 채널

답글 작성

이메일 주소는 공개되지 않습니다. 必填项已用 * 标注