C#-S7协议简单通讯

Posted 自控小二哥

tags:

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

一,准备工作

1,安装VS软件(本案例版本2019)

2,下载Snap7 库文件

二,新建项目

在项目中引用S7.NET.dll库

C#-S7协议简单通讯

三,编辑Winform主画面

C#-S7协议简单通讯

四,添加读写类

添加读写类

C#-S7协议简单通讯

以下为详细代码

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;

            }

       }

   }

}

五,编辑主程序代码

C#-S7协议简单通讯

以下为详细代码

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

           }

       }

}

六,程序运行

C#-S7协议简单通讯

总结:

使用开源的Snap7库,跳过繁琐的协议分析,读写轻松。支持PLC类型 S7-200,S7-300,S7-400,S7-1200,S7-1500。



如需获得样例请留言我们!



以上是关于C#-S7协议简单通讯的主要内容,如果未能解决你的问题,请参考以下文章

S7通讯协议是啥?

西门子plc有哪些通讯协议

请教高手关于西门子S7-300的ModbusTCP通讯问题,急!!

西门子PLC有几种通讯方式

西门子S7-1200 PLC与C#(上位机)通讯(TCP协议)

三菱 西门子PLC S7系列通讯协议数据采集读写上位机软件测