手摸手教你撕碎西门子S7通讯协议13--使用第3方通讯库写数据

1、S7.NET通讯库介绍 

S7.NET是一个广泛应用于.NET平台的西门子PLC通信库,在使用西门子PLC进行工业自动化控制的过程中,经常利用这个工具实现与PLC进行数据交换。它为开发者提供了一系列的API函数,以便在C#、VB.NET等.NET语言中轻松实现与西门子PLC的数据交互。不过要注意的是,他仅支持以太网连接,这就表示你的设备PLC必须profinet cpu或profine外部卡,这个库采用C#编写,是基于.NET Framework或.NET Core的通信库,它通过一系列的COM组件或直接引用Native DLL文件,提供了与西门子S7系列PLC进行数据交换的接口,因此可以轻松进行调用。s7.net支持以下PLC:s7-200,s7-300,s7-400,s7-1200,s7-1500。 

2、开工啦

1、UI布局接上节项目继续

将每个控件的tag属性与plc中的变量名称,这样的目的是什么?你想想,PLC中的变量名称不会相同,控件的tag属性可以绑定任何值,这在后面的程序中可以很好的区别,这是技巧,技巧,绝对的技巧,很高效的区分是哪个控件,这可是经验之谈哦,帅气不?这里要做的8个控件共一个事件处理,而不是8个控件8个事件处理,厉害的不?传统的做法是8个控件8个事件处理,而这里是一个事件处理响应8个控件。

 2、写入代码 

代码没有更好地优化,只是为了表明功能实现,效果还不错,相当流。

完整代码 

using S7.Net;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Configuration;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Reflection;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using static System.Windows.Forms.VisualStyles.VisualStyleElement.TrackBar;

namespace west.s7siemenstest
{
    public partial class Form1 : Form
    {

        //1 ip地址  端口号   机架号 0  插槽 1
        int port;
        short rack = 0;
        short slot = 1;
        string ip = "";
        //2.plc实例
        Plc plc = null;
        //CPU型号
        CpuType cpuType = CpuType.S71500;
        public Form1()
        {
            InitializeComponent();
        }

        /// <summary>
        /// 连接PLC
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnConne_Click(object sender, EventArgs e)
        {
            ip = txtip.Text.Trim();
            port = Convert.ToInt32(txtport.Text.Trim());
            //创建plc实例
            plc = new Plc(cpuType, ip, port, rack, slot);
            if (plc != null)
            {
                plc.Open();//打开连接
                if (plc.IsConnected)
                {
                    this.btnConne.Enabled = false;
                    textBox1.Text = "连接PLC成功";
                    MessageBox.Show("连接PLC成功.");
                }
            }
        }

        /// <summary>
        /// 断开
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnClose_Click(object sender, EventArgs e)
        {
            if (plc == null)
            {
                MessageBox.Show("PLC没有连接.");
                return;
            }
            if (plc.IsConnected)
            {
                plc.Close();//关闭
                textBox1.Text = "已断开PLC";
                MessageBox.Show("已断开PLC");
                this.btnConne.Enabled = true;
            }
        }

        /// <summary>
        /// 读取字符串
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button9_Click(object sender, EventArgs e)
        {
            if (plc == null)
            {
                MessageBox.Show("请先连接PLC");
                return;
            }
            if (plc.IsConnected)
            {
                var totalcount = plc.Read(DataType.DataBlock, 1, 22, VarType.Byte, 1);
                var lengthcount = plc.Read(DataType.DataBlock, 1, 23, VarType.Byte, 1);
                int length = Convert.ToInt32(lengthcount);
                string textname = plc.Read(DataType.DataBlock, 1, 24, VarType.String, length).ToString();
                textBox1.Text = textname;
                MessageBox.Show(textname, "产品号:");
            }
        }

        /// <summary>
        /// bool读取
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button1_Click(object sender, EventArgs e)
        {
            if (plc == null)
            {
                MessageBox.Show("请先连接PLC");
                return;
            }
            if (plc.IsConnected)
            {
                var varaddr = "DB1.DBX0.0";
                var obj = plc.Read(varaddr);
                textBox1.Text = obj.ToString();
                MessageBox.Show(obj.ToString());
            }
        }

        private void button2_Click(object sender, EventArgs e)
        {
            if (plc == null)
            {
                MessageBox.Show("请先连接PLC");
                return;
            }
            if (plc.IsConnected)
            {
                var varaddr = "DB1.DBX0.1";
                var obj = plc.Read(varaddr);
                textBox1.Text = obj.ToString();
                MessageBox.Show(obj.ToString());
            }
        }

        /// <summary>
        /// short读取水量
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button3_Click(object sender, EventArgs e)
        {
            Button mybtn = (Button)sender;
            string tag = mybtn.Tag.ToString();
            string varaddr = "";
            switch (tag)
            {
                case "pum1water":
                    varaddr = "DB1.DBW2";
                    string str = plc.Read(varaddr).ToString();
                    int cc = Convert.ToInt32(str);
                    byte[] objbyte = BitConverter.GetBytes(cc);//转成字节数组
                    short te = BitConverter.ToInt16(objbyte, 0);//将字节数组转成short
                    textBox1.Text = te.ToString();
                    MessageBox.Show(te.ToString());
                    break;
                case "pum2water":
                    varaddr = "DB1.DBW4";
                    var obja = plc.Read(varaddr);
                    textBox1.Text = obja.ToString();
                    MessageBox.Show(obja.ToString());
                    break;
                default:
                    break;
            }
        }

        /// <summary>
        /// float读取
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button5_Click(object sender, EventArgs e)
        {
            Button mybtn = (Button)sender;
            string tag = mybtn.Tag.ToString();
            string varaddr = "";
            switch (tag)
            {
                case "pat1":
                    varaddr = "DB1.DBD6";
                    break;
                case "pat2":
                    varaddr = "DB1.DBD10";
                    break;
                case "pbt1":
                    varaddr = "DB1.DBD14";
                    break;
                case "pbt2":
                    varaddr = "DB1.DBD18";
                    break;
                default:
                    break;
            }
            var obj = plc.Read(varaddr);//返回的是uint
            byte[] objbyte = BitConverter.GetBytes((uint)obj);
            float objfloat = BitConverter.ToSingle(objbyte, 0);
            textBox1.Text = objfloat.ToString();
            MessageBox.Show(objfloat.ToString());
        }



        /// <summary>
        /// 所有写入按钮代码 
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button10_Click(object sender, EventArgs e)
        {
            if (plc == null)
            {
                MessageBox.Show("plc没有连接");
                return;
            }
            Button mybtn = (Button)sender;
            string tag = mybtn.Tag.ToString();
            string varaddr = "";
            float te3 = 0.0f;
            string tx3 = "";
            ushort ts3 = 0;
            Random rd2 = new Random();
            switch (tag)
            {
                case "pum1state":
                    varaddr = "DB1.DBX0.0";
                    var obj = plc.Read(varaddr);
                    bool flag = (bool)obj;
                    if (flag)
                    {
                        flag = false;
                    }
                    else
                    {
                        flag = true;
                    }
                    plc.Write(varaddr, flag);
                    textBox1.Text = flag.ToString();
                    break;
                case "pum2state":
                    varaddr = "DB1.DBX0.1";
                    var obj2 = plc.Read(varaddr);
                    bool flag2 = (bool)obj2;
                    if (flag2)
                    {
                        flag2 = false;
                    }
                    else
                    {
                        flag2 = true;
                    }
                    plc.Write(varaddr, flag2);
                    textBox1.Text = flag2.ToString();
                    break;
                case "pum1water":
                    varaddr = "DB1.DBW2";
                    ts3 =ushort.Parse((rd2.Next(20, 230)).ToString()); 
                    textBox1.Text = ts3.ToString();
                    plc.Write(varaddr, ts3);
                    break;
                case "pum2water":
                    varaddr = "DB1.DBW4";
                    ts3 = ushort.Parse((rd2.Next(10, 130)).ToString());
                    textBox1.Text = ts3.ToString();
                    plc.Write(varaddr, ts3);
                    break;
                case "pat1":
                    varaddr = "DB1.DBD6";
                    tx3 = (rd2.NextDouble() * 80.0).ToString("0.0");
                    te3 = float.Parse(tx3);
                    textBox1.Text = te3.ToString();
                    plc.Write(varaddr, te3);
                    break;
                case "pat2":
                    varaddr = "DB1.DBD10";
                    tx3 = (rd2.NextDouble() * 70.0).ToString("0.0");
                    te3 = float.Parse(tx3) - 70;
                    textBox1.Text = te3.ToString();
                    plc.Write(varaddr, te3);
                    break;
                case "pbt1":
                    varaddr = "DB1.DBD14";
                    tx3 = (rd2.Next(30, 90)).ToString();
                    te3 = float.Parse(tx3);
                    textBox1.Text = te3.ToString();
                    plc.Write(varaddr, te3);
                    break;
                case "pbt2":
                    varaddr = "DB1.DBD18";
                    tx3 = (rd2.Next(30, 90)).ToString();
                    te3 = float.Parse(tx3) - 90;
                    textBox1.Text = te3.ToString();
                    plc.Write(varaddr, te3);
                    break;
                default:
                    break;
            }
            MessageBox.Show(varaddr + "写入成功"); 
        }
    }
}

3、运行效果

写入前数据

 

4、小结


掌握西门子S7.NET通信库的使用,可以帮助开发者更高效地进行工业自动化控制系统的开发和维护。通过本文的学习,希望读者能够掌握S7.NET通信库的基本使用方法,并在实际的开发工作中灵活运用, 在实际应用中,开发者需要根据PLC的具体型号和配置,以及数据块的结构,来正确地选择数据块和读取数据。在使用S7.NET通信库时,需要注意的是,读操作的性能和效率非常重要,尤其是在工业现场,可能会涉及到大量的数据读写。因此,合理地设计程序结构,优化数据读取方式,对于保证系统的稳定性和实时性至关重要。此外,当进行PLC编程和通信时,安全性和可靠性也是不可忽视的因素。确保通信过程中的数据完整性和正确性,以及对PLC编程的规范性,都是保证控制系统安全可靠运行的关键。

这个通讯库还是蛮厉害的,真的香啊,下节来搞自己的通讯库,开发自己的通讯库,冲击奥运金牌,坐宝马开飞机。

原创不易,打字截图不易,走过路过,不要错过,欢迎点赞,收藏,转载,复制,抄袭,留言,动动你的金手指,早日实现财务自由 

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hqwest

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值