栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > .Net

使用C#引用S7.Net.dll 连接西门子1500PLC 报异常,

.Net 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

使用C#引用S7.Net.dll 连接西门子1500PLC 报异常,

在连接过程中出现,虽然可以成功连接PLC,但是无法读取数据的问题。读PLC报异常。
1、首先说下报的异常
(1)S7.Net.PlcException: 无法将数据写入传输连接: 远程主机强迫关闭了一个现有的连接
(2)索引超出范围,请重新输入!

针对第一个报的异常,很明显是一个硬件问题,但是由于对PLC不熟悉,捣鼓了很久。。终于在一个配置文件中找到了问题。
需要博图进行以下设置:
配置博图TIA

  1. 首先在博图TIA查看PLC的属性

    Rack =0
    Slot=1

2)查看权限
设置完全权限

3)勾选 允许来自远程对象的PUT/GET通讯访问

4)读取DB数据时必须改DB块的属性,去掉优化的块访问的勾选项

在bin文件夹debug,config文件打开配置PLC IP地址,CPU 的信息
修改配置文件
如下:

IP=192.168.0.1   //PLC IP地址
Rack=0          //PLC 机架
Slot=1          //PLC 插槽

对于第二个异常,暂无解答。。。 配置完成以上后,此问题消失不见。。。(有哪位大哥了解此问题,请为小弟解答下。。)

2、如何连接PLC:
首先应将本机电脑的IP地址和PLC在同一个网段里,配置如下:
button1控件为连接PLC
3、连接PLC 程序代码如下:

private void button1_Click(object sender, EventArgs e)
        {
            //创建PLC对象                                                   //机架                      //机槽
            S71500 = new Plc(CpuType.S71500, IP_Address.Text, Convert.ToInt16(Rack.Text),Convert.ToInt16(Slot.Text));

            S71500.OpenAsync().Wait(2000);

            if (S71500.IsConnected)
            {
                button1.Enabled = false;
                button2.Enabled = true;
                Read_Data.Enabled = true;
                Write_Data.Enabled = true;
                textBox1.Text = "已连接到PLC";
            }
            else
                textBox1.Text = "PLC 连接不成功,请检查IP地址、机架、插槽等是否正确";

        }

断开连接代码:

 private void button2_Click(object sender, EventArgs e)
        {
            //调用S7.NET中的方法断开PLC
            S71500.Close();

            //断开成功后使能操作按钮
            if (!S71500.IsConnected)
            {
                button1.Enabled = true;
                button2.Enabled = false;
                Read_Data.Enabled = false;
                Write_Data.Enabled = false;
                textBox1.Text = "PLC断开成功";
            }
           else
                textBox1.Text = "PLC断开不成功";

        }

读PLC程序代码:

        private void Read_Data_Click(object sender, EventArgs e)
        {
            int Data_Type_Value = 0;
            if (Data_Type.Text == "Bool") Data_Type_Value = 1;
            else if (Data_Type.Text == "Int") Data_Type_Value = 2;
            else if (Data_Type.Text == "DInt") Data_Type_Value = 3;
            else if (Data_Type.Text == "Real") Data_Type_Value = 4;
            else if (Data_Type.Text == "String") Data_Type_Value = 5;
            else Data_Type_Value = 0;
                switch (Data_Type_Value)
                {
                    case 1:
                    try
                    { 
                        Current_Value.Text = Convert.ToString(S71500.Read(DataType.DataBlock,
                        Convert.ToInt16(DB_Number.Text), Convert.ToInt16(Start_Address.Text), VarType.Bit, Convert.ToInt16(Length.Text), 0));
                    }
                    catch { MessageBox.Show("索引超出范围,请重新输入!"); }
                    break;
                    case 2:
                    try
                    {
                        Current_Value.Text = Convert.ToString(S71500.Read(DataType.DataBlock,
                        Convert.ToInt16(DB_Number.Text), Convert.ToInt16(Start_Address.Text), VarType.Int, Convert.ToInt16(Length.Text), 0));
                    }
                    catch { MessageBox.Show("索引超出范围,请重新输入!"); }
                    break;
                    case 3:
                        Current_Value.Text = Convert.ToString(S71500.Read(DataType.DataBlock,
                        Convert.ToInt16(DB_Number.Text), Convert.ToInt16(Start_Address.Text), VarType.DInt, Convert.ToInt16(Length.Text), 0));
                        break;
                    case 4:
                        Current_Value.Text = Convert.ToString(S71500.Read(DataType.DataBlock,
                        Convert.ToInt16(DB_Number.Text), Convert.ToInt16(Start_Address.Text), VarType.Real, Convert.ToInt16(Length.Text), 0));
    
                    break;
                    case 5:

                        Current_Value.Text = Convert.ToString(S71500.Read(DataType.DataBlock,
                        Convert.ToInt16(DB_Number.Text), Convert.ToInt16(Start_Address.Text), VarType.String, Convert.ToInt16(Length.Text), 0));
                        break;
                    default: break;
                }
        }
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/904967.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号