在好例子网,分享、交流、成长!
您当前所在位置:首页C# 开发实例桌面应用界面/GUI → C#和西门子CPU进行S7通讯

C#和西门子CPU进行S7通讯

桌面应用界面/GUI

下载此实例
  • 开发语言:C#
  • 实例大小:0.07M
  • 下载次数:34
  • 浏览次数:198
  • 发布时间:2021-03-15
  • 实例类别:桌面应用界面/GUI
  • 发 布 人:怒放的青年
  • 所需积分:2
 相关标签: 西门子 CPU S7 通讯 C#

实例介绍

C#和西门子CPU进行S7通讯

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;
using System.Windows.Forms;
using S7.Net;


namespace S7_Test
{

    public partial class Form1 : Form
    {
        public Plc s7_plc;
        byte[] data = new byte[2];


        public Form1()
        {
            InitializeComponent();
        }

        private void btn_Connect_Click(object sender, EventArgs e)
        {
            s7_plc = new Plc(CpuType.S71500, txt_PLC_IP.Text, 0, 1);

            //开辟一个后台线程
            Task task = Task.Run(() =>
            {
                Communicaton();
            });
        }
        private void Communicaton()
        {
            listBox1.Invoke(new Action(() =>
             listBox1.Items.Add("正在连接到PLC……")
            ));

            s7_plc.Open();
            bool temp1 = true;

            while (true)
            {
                try
                {
                    if (s7_plc.IsConnected & temp1)
                    {
                        temp1 = false;
                        listBox1.Invoke(new Action(() =>
                        listBox1.Items.Add("PLC连接成功!")
                         ));
                    }
                    else
                    {
                        if (!s7_plc.IsConnected)
                        {
                            temp1 = true;
                            listBox1.Invoke(new Action(() =>
                            listBox1.Items.Add("PLC连接中断!")
                             ));
                        }
                    }
                }
                catch (Exception ex)
                {

                    MessageBox.Show(ex.ToString());
                }
                Thread.Sleep(1000);

            }

        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }

        private void btn_Read_Click(object sender, EventArgs e)
        {
            if (s7_plc.IsConnected == false)
            {
                MessageBox.Show("未连接PLC!", "连接提示", MessageBoxButtons.OK);//检查PLC是否连接; 
            }
            else
            {
                try
                {
                    string[] arr = (txt_read_addr.Text.ToUpper()).Split('.');//将txt_read_addr文本框中的数据转为大写字母,并用“.”拆分后存放到arr数组中
                    string valuetype = arr[1].Substring(0, 3);//取数组中的第二个元素的前三位,用以确认读取的PLC数据类型
                                                              //西门子PLC数据类型:DBX(位,bool)DBB(字节,byte)DBW(字,word)DBD(双字,dword)
                                                              //以下是按不同的数据类型,对PLC数据进行读取
                    if (valuetype == "DBX")
                    {
                        bool test1 = (bool)s7_plc.Read(txt_read_addr.Text.ToUpper());
                        ShowMsg(txt_read_addr.Text ":" test1.ToString());
                    }
                    else if (valuetype == "DBB")
                    {
                        //short test2 = ((ushort)s7_plc.Read(txt_read_addr.Text.ToUpper())).ConvertToShort();
                        byte test2 = Convert.ToByte(s7_plc.Read(txt_read_addr.Text.ToUpper()));
                        ShowMsg(txt_read_addr.Text ":" test2.ToString());
                    }

                    else if (valuetype == "DBW")
                    {
                        short test3 = ((ushort)s7_plc.Read(txt_read_addr.Text.ToUpper())).ConvertToShort();
                        ShowMsg(txt_read_addr.Text ":" test3.ToString());
                    }

                    else if (valuetype == "DBD")
                    {
                        //double test5 = ((uint)s7_plc.Read(txt_read_addr.Text.ToUpper())).ConvertToFloat();
                        double test5 = ((uint)s7_plc.Read(txt_read_addr.Text.ToUpper())).ConvertToFloat();
                        ShowMsg(txt_read_addr.Text ":" test5.ToString());
                    }

                    else
                    {
                        MessageBox.Show("请检查地址是否输入错误!", "输入提示", MessageBoxButtons.OK);
                    }

                    //listBox1.Items.Add("读取结果B0:" data[0].ToString());
                    //listBox1.Items.Add("读取结果B1:" data[1].ToString());


                }
                catch (Exception ex)
                {
                    MessageBox.Show("请检查地址是否输入错误!", "输入提示", MessageBoxButtons.OK);
                }
            }
        }

        private void btn_Write_Click(object sender, EventArgs e)
        {
            if (s7_plc.IsConnected == false)
            {
                MessageBox.Show("未连接PLC!", "连接提示", MessageBoxButtons.OK);
            }
            else
            {
                try
                {
                    string[] arr = (txt_write_addr.Text.ToUpper()).Split('.');
                    string valuetype = arr[1].Substring(0, 3);

                    if (valuetype == "DBX")
                    {
                        s7_plc.Write(txt_write_addr.Text.ToUpper(), Convert.ToBoolean(txt_value.Text));
                    }

                    else if (valuetype == "DBB")
                    {
                        var value = byte.Parse(txt_value.Text);
                        s7_plc.Write(txt_write_addr.Text.ToUpper(), value);
                    }

                    else if (valuetype == "DBW")
                    {
                        var value = short.Parse(txt_value.Text);
                        s7_plc.Write(txt_write_addr.Text.ToUpper(), value);
                    }

                    else if (valuetype == "DBD")
                    {
                        //double value = double.Parse(txt_value.Text);
                        Double value = Double.Parse(txt_value.Text);
                        s7_plc.Write(txt_write_addr.Text.ToUpper(), value);
                    }

                    else
                    {
                        MessageBox.Show("请检查地址是否输入错误!", "输入提示", MessageBoxButtons.OK);
                    }

                }
                catch (Exception Ex)
                {
                    MessageBox.Show("请检查输入的“地址”或“值”是否错误!", "输入提示", MessageBoxButtons.OK);
                }
            }
        }
        private void btn_Disconnect_Click(object sender, EventArgs e)
        {
            s7_plc.Close();
        }
        private void ShowMsg(string v)
        {
            //txt_result.AppendText(v "\r\n");//将读取的PLC数据追加到“结果”文本框中
            listBox1.Items.Add("读取结果:" v);
        }

        private void btn_clear_Click(object sender, EventArgs e)
        {
            listBox1.Items.Clear();
        }

        private void groupBox1_Enter(object sender, EventArgs e)
        {

        }
        private void Mouse_down(object sender, EventArgs e)
        {

        }
    }
}

标签: 西门子 CPU S7 通讯 C#

实例下载地址

C#和西门子CPU进行S7通讯

不能下载?内容有错? 点击这里报错 + 投诉 + 提问

好例子网口号:伸出你的我的手 — 分享

网友评论

发表评论

(您的评论需要经过审核才能显示)

查看所有0条评论>>

小贴士

感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。

  • 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
  • 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
  • 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
  • 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
;
报警