C#-S7协议简单通讯
Posted 自控小二哥
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C#-S7协议简单通讯相关的知识,希望对你有一定的参考价值。
一,准备工作
1,安装VS软件(本案例版本2019)
2,下载Snap7 库文件
二,新建项目
在项目中引用S7.NET.dll库
三,编辑Winform主画面
四,添加读写类
添加读写类
以下为详细代码
namespaceSnap7_Smart200
{
public classReadWirtPlc
{
//创建一个PLC对象
Plc plc = newPlc(CpuType.S71200, "192.168.101.250", 0, 1);
//查看是否联机
publicbool IsActiv()
{
return plc.IsConnected;
}
//连接PLC
publicbool PlcOpen()
{
plc.Open();
return plc.IsConnected;
}
//关闭PLC
publicbool PlcClose()
{
plc.Close();
return plc.IsConnected;
}
//读取VW
publicList<ushort>PlcRadeVW(intnumBytes, int db, int startByteAdr)
{
List<ushort> resulVw = new List<ushort>();
int index = startByteAdr;
ushort[] temp = null;
while (numBytes > 0)
{
//最大能读200个
var maxToRead = (int)Math.Min(numBytes, 200);
//从块1的index 开始 读取numBytes个数据
var vwShort = (ushort[])plc.Read(DataType.DataBlock, 1, index, VarType.Word,numBytes);
//判断返回数据个数
if (vwShort == null)
{
returnnull;
}
temp = newushort[vwShort.Length];
for (int i = 0; i < vwShort.Length; i++)
{
temp[i] = (ushort)vwShort[i];
resulVw.Add(temp[i]);
}
//读取数据个数
numBytes -= maxToRead;
index += maxToRead;
}
return resulVw;
}
//写入VW
publicbool PlcWirtVW(ushort[] arayBytes, int db, int startByteAdr)
{
int index = startByteAdr;
if (arayBytes.Length > 0 && arayBytes.Length<= 200)
{
var wirt = plc.Write(DataType.DataBlock, 1, index,arayBytes);
if (wirt != 0)
{
returnfalse;
}
else
{
returntrue;
}
}
else
{
returnfalse;
}
}
}
}
五,编辑主程序代码
以下为详细代码
publicpartialclassForm1 : Form
{
publicForm1()
{
InitializeComponent();
}
//创建一个PLC对象
ReadWirtPlc rwPlc = new ReadWirtPlc();
//读取的数据
List<ushort>readPlc = newList<ushort>();
//写入的数据
ushort[] wirtPlc = { 0, 1, 2, 3 };
//open plc
privatevoid But_OpenPlc_Click(object sender, EventArgse)
{
rwPlc.PlcOpen();
}
//close plc
privatevoid But_ClosePlc_Click(object sender, EventArgse)
{
rwPlc.PlcClose();
}
//定时读取 VW0
privatevoid Timer1_Tick(object sender, EventArgse)
{ //查看是否通讯正常
if (rwPlc.IsActiv())
{
//数组的第一个数就是VW0
readPlc = rwPlc.PlcRadeVW(10,0, 0);
//将读取的第一个数据显示到lable
lab_Vw0.Text=readPlc[0].ToString();
}
}
//确定按钮
privatevoid But_Wirt_Click(object sender, EventArgse)
{
if (rwPlc.IsActiv())
{
//获取Textbox数据
wirtPlc[0] =Convert.ToUInt16(txb_Vw0.Text.Trim());
//写入PLC
rwPlc.PlcWirtVW(wirtPlc, 0, 0);
}
}
}
六,程序运行
总结:
使用开源的Snap7库,跳过繁琐的协议分析,读写轻松。支持PLC类型 S7-200,S7-300,S7-400,S7-1200,S7-1500。
如需获得样例请留言我们!
以上是关于C#-S7协议简单通讯的主要内容,如果未能解决你的问题,请参考以下文章
请教高手关于西门子S7-300的ModbusTCP通讯问题,急!!