在连接过程中出现,虽然可以成功连接PLC,但是无法读取数据的问题。读PLC报异常。
1、首先说下报的异常
(1)S7.Net.PlcException: 无法将数据写入传输连接: 远程主机强迫关闭了一个现有的连接
(2)索引超出范围,请重新输入!
针对第一个报的异常,很明显是一个硬件问题,但是由于对PLC不熟悉,捣鼓了很久。。终于在一个配置文件中找到了问题。
需要博图进行以下设置:
配置博图TIA
- 首先在博图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;
}
}