使用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;
                }
        }
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值