C# 使用S7协议连接plc
666号特派员
编辑于 2023年10月23日 07:40
收录于文集
共22篇

// 连接和关闭PLC

代码块
C#
自动换行
复制代码
Plc newPlc = new Plc(CpuType.S71500, "192.168.1.5", 0,1); 
newPlc.Open(); 
newPlc.Close();
复制成功

// 读取数据

代码块
C#
自动换行
复制代码
bool B = (bool)newPlc.Read("DB1.DBX0.0");
复制成功

// 写入数据

代码块
C#
自动换行
复制代码
newPlc.Write("DB1.DBX0.0", true);
复制成功

// 读取字节数组

代码块
C#
自动换行
复制代码
newPlc.ReadBytes(DataType.DataBlock,1, 0, 8); 
// 1.哪一块的位置,2.第几个DB块,3.从哪里开始,4.读几位
复制成功

// 写字节数组

代码块
C#
自动换行
复制代码
byte[] B = new byte[8];
for (int i = 0; i < B.Length; i++)
{
    B[i] = (Byte)i;
}
newPlc.WriteBytes(DataType.DataBlock,1, 0, B);
复制成功

// 写监控表

代码块
C#
自动换行
复制代码
newPlc.Read("I0.0", true); 
newPlc.Read("Q0.0", true);
复制成功

// 写监控表

代码块
C#
自动换行
复制代码
newPlc.Write("I0.0", true);
newPlc.Write("Q0.0", true);
复制成功

// B:字节,W:2字节,D:4字节

// 字节,字符,双字的读写

代码块
C#
自动换行
复制代码
newPlc.Write("MB100",(Byte)70);
newPlc.Write("MW104",(Int16)80);
newPlc.Write("MD108",(Byte)90);
复制成功

// 获取PLC的IP地址

newPlc.IP.ToString();

代码块
C#
自动换行
复制代码
newPlc.IP.ToString();
复制成功

// 实数转换(实测管用,用来获取小数)

代码块
C#
自动换行
复制代码
float allClearance = ((uint)newPlc.Read("DB24.DBD4.0")).ConvertToFloat();
复制成功

在多线程写入和读取的时候会报错:TPKT is incomplete / invalid。(实测有用)

经过多次测试,是使用S7协议写入的时候报错了,原因是多余2个线程在同一时间在写入时,会报此错误,需要在代码上做优化。

C#可以连接PLC,但是无法读写,出现如下报错:(实测有用)

  1. S7.Net.PlcException: 无法将数据写入传输连接: 远程主机强迫关闭了一个现有的连接。

  2. 索引超出范围,请重新输入!

需要开启远程访问权限,处理操作:

  1. 首先在博图TIA查看PLC的属性

  2. 查看权限,设置完全权限

  3. 勾选 允许来自远程对象的PUT/GET通讯访问

  4. 读取DB数据时必须改DB块的属性,去掉优化的块访问的勾选项