前言
刚接到手一个项目,是开发一款程序,要和PLC有数据交互,如上图,设备发生故障后,PLC会发电报,我们收到电报后把故障显示出来,同时点击解除故障,也会给PLC发送相对应的电报。查了蛮多资料但是感觉还是无从下手(资料是挺多的,但是感觉太繁琐了,有很多地方都没有必要,比如模拟PLC环境,一连下四五个软件,我感觉没有必要。),最后问了一下我之前公司的好哥们,正好他就是做上位机的,所以跟着学会了怎么连接PLC,怎样读写数据。我这里暂时也没有PLC,所以我使用的也是仿真模拟软件:HslCommunication
安装包下载:
链接:https://pan.baidu.com/s/1dE3KAFUQgXJ2wRB7oWJewA
提取码:acpk
1.引入S7netPlus包
2.连接
//PLC类型 IP地址 机架号 槽号
//这里我们使用的是仿真软件,所以默认是的IP地址是本机地址
Plc plc = new Plc(CpuType.S7300, "127.0.0.1", 0, 0);
try
{
plc.Open();
if (plc.IsConnected == false)
{
textBox1.Text = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss ")+"PLC连接失败!";
}
else
{
textBox1.Text = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss ")+"PLC连接成功!";
}
}
catch (Exception ex)
{
textBox1.Text = ex.Message;
}
效果图如下:
这样就连接上了,真实情况下的PLC也可以连接上。
3.读取数据
我这里写的比较多,是因为我专门写了个Demo来测试连接、读写的。
///代码中用到三种数据获取方式: DBX、DBW、DBD,深入理解的可以查一下网上资料
///简单理解就是 DBX读取位,比如bool类型;DBW读取字;DBD读取数值
///注释中是对应的 TIA Portal 数据块类型
var db1Bool1 = (bool)plc.Read("DB1.DBX0.0");
Console.WriteLine("DB1.DBX0.0: " + db1Bool1);
bool db1Bool2 = (bool)plc.Read("DB1.DBX0.1");
Console.WriteLine("DB1.DBX0.1: " + db1Bool2);
// Int
int intVariable = (ushort)plc.Read("DB1.DBW2.0");
Console.WriteLine("DB1.DBW2.0: " + intVariable);
// Real
var realVariabl = ((uint)plc.Read("DB1.DBD4.0")).ConvertToFloat();
Console.WriteLine("DB1.DBD4.0: " + realVariabl);
// DInt
var dIntVariable = (uint)plc.Read("DB1.DBD8.0");
Console.WriteLine("DB1.DBD8.0: " + dIntVariable);
// DWord
var dWordVariable = (uint)plc.Read("DB1.DBD12.0");
Console.WriteLine("DB1.DBD12.0: " + dWordVariable);
// Word
var wordVariable = (ushort)plc.Read("DB1.DBW16.0");
Console.WriteLine("DB1.DBW16.0: " + wordVariable);
拿DB1.DBD12.0来举例:
var dWordVariable = (uint)plc.Read("DB1.DBD12.0");
textBox1.Text = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss ")+"DB1.DBD12.0读取值为:"+dWordVariable ;
我们可以看到在软件里面这个程序块的值是123456,那么我们接下来用程序试一下。
很完美,读取到了这个模块里的值。
4.写入数据
plc.Write("DB1.DBD12.0", 123457);
一行写入,简单到爆炸,那么我们验证下效果。
写入成功!是不是超级简单。