找传奇、传世资源到传世资源站!

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

8.5玩家评分(1人评分)
下载后可评
介绍 评论 失效链接反馈

C#和西门子CPU进行S7通讯
C#和西门子CPU进行S7通讯 桌面应用界面/GUI-第1张
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)
        {

        }
    }
}

评论

发表评论必须先登陆, 您可以 登陆 或者 注册新账号 !


在线咨询: 问题反馈
客服QQ:174666394

有问题请留言,看到后及时答复