C#与西门子PLC通讯

Posted 机器人配视觉

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C#与西门子PLC通讯相关的知识,希望对你有一定的参考价值。

S7Net

如下图,ip=“192.168.0.5”。

C#与西门子PLC通讯

如下图,rack为0,slot为1。
C#与西门子PLC通讯

public Plc(CpuType cpu, string ip, short rack, short slot);
public enum CpuType
{
S7200 = 0,
S7300 = 10,
S7400 = 20,
S71200 = 30,
S71500 = 40
}
  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

获取是否连接成功:

public bool IsConnected { get; }
  • 1

连接PLC:

public void Open();
public Task OpenAsync();
  • 1

  • 2

该类库提供了两个用于PLC连接的函数,区别在于第二个为异步连接,在请求连接的过程中,不会导致线程阻塞。我个人比较喜欢第二种方式。
按位写操作:参数db代表访问的DB块编号,如下图所示UISendInt编号为3,UIReadInt编号为4。

C#与西门子PLC通讯

public void WriteBit(DataType dataType, int db, int startByteAdr, int bitAdr, bool value);
public enum DataType
{
Counter = 28,
Timer = 29,
Input = 129,
Output = 130,
Memory = 131,
DataBlock = 132
}
  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

按字节读:count代表读的字节数量。在进行按字节读写时,对于8位的单字节变量来说没有任何问题。但是对于多字节比如在PLC中16位I的INT类型,需要注意大小端问题。在西门子PLC中以大端模式存储数据,但是在Intel的X86架构的PC上,确是以小端模式。所以,在从PLC读取一个INT类型的变量,需要将读取回来的字节数组高低字节调换,后面C#程序中会有详细的实现代码。

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

按字节写:value代表将要传输的数据转换成的字节数组,如果要操作一个INT变量,需要提前将高低字节调换,后面C#程序中会有详细的实现代码。

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

PLC设置

实现外部程序可以访问操作DB块,需要对PLC部分做一些设置。首先对于要读取或者访问的DB块,要将优化的块访问取消,默认为勾选的,选中块右击选择属性。

C#与西门子PLC通讯

同时还要在硬件组态中,设置防护与安全中的连接机制。将“允许来自远程对象的PUT/GET访问”勾选。如下图:
C#与西门子PLC通讯

C#程序

在C#上位机软件中,对通讯类库的函数做一个简单的包装,以方便我们使用。首先新建一个类S7,在项目中需要引用S7.NET,并在该类中包含命名空间。

using S7.Net;
  • 1

定义一个Plc类型变量plc,并定义该类的构造函数和析构函数:

Plc plc;
public S7(S7DataType.CpuType cpuType,string ip,Int16 rack,Int16 slot)
{
plc = new Plc((CpuType)cpuType,ip, rack,slot);
}

~S7()
{
this.plc.Close();
}
  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

定义连接函数以及关闭函数:

public void OpenAsync()
{
this.plc.OpenAsync();
}

public void Close()
{
this.plc.Close();
}
  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

定义读写函数:之所以加lock,是因为在应用中数据通讯很有可能在不同的线程去操作,比如单独开一个线程定时从PLC更新数据。

public byte[] PlcReadBytes(int db, int startByteAdr=0, int count=1)
{
try
{
lock (this)
{
return this.plc.ReadBytes(DataType.DataBlock, db, startByteAdr, count);
}
}
catch
{
return new byte[2];
}

}

public void PlcWriteBytes(int db, byte[] value, int startByteAdr = 0)
{
lock (this)
{
this.plc.WriteBytes(DataType.DataBlock, db, startByteAdr, value);
}
}

public void PlcWriteBit(int db, int bitAdr, bool value, S7DataType.DataType dataType =
S7DataType.DataType.DataBlock)
{
int temp1 = bitAdr / 8;
int temp2 = bitAdr % 8;
lock (this)
{
this.plc.WriteBit((DataType)dataType, db, temp1, temp2, value);
}
}
  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

  • 11

  • 12

  • 13

  • 14

  • 15

  • 16

  • 17

  • 18

  • 19

  • 20

  • 21

  • 22

  • 23

  • 24

  • 25

  • 26

  • 27

  • 28

  • 29

  • 30

  • 31

  • 32

  • 33

  • 34

定义字节和Int16类型之间的转换函数(需要进行高低字节转换):

public static byte[] Int16ToBytes(Int16 data)
{
byte[] temp = new byte[2];
temp[0] =(byte) (data >> 8);
temp[1] = (byte)(data);
return temp;
}

public static Int16 BytesToInt16(byte[] bytes)
{
Int16 temp;
temp =(Int16)( bytes[0] << 8 | bytes[1]);
return temp;
}

C#与西门子PLC通讯
《精彩回顾》

1

2、

3、

4、

5、

6、

7、

8、

9、




文章来源:综合网络,如有侵权,联系删除。

C#与西门子PLC通讯

C#与西门子PLC通讯
点分享
点点赞   
  点在看

以上是关于C#与西门子PLC通讯的主要内容,如果未能解决你的问题,请参考以下文章

如何用C#语言 让pc与plc通过tcp ip互联

C# 编写pc与西门子1500通讯,用modbus tcp协议

西门子PLC与PLC之间如何通讯?

C#以太网上位机如何读取西门子PLC的IO点状态?

VC与西门子plc通信的教程

WinCc7.5与西门子1214怎样连接通讯