前言
刚接到手一个项目,是开发一款程序,要和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);// Intint intVariable = (ushort)plc.Read("DB1.DBW2.0");Console.WriteLine("DB1.DBW2.0: " + intVariable);// Realvar realVariabl = ((uint)plc.Read("DB1.DBD4.0")).ConvertToFloat();Console.WriteLine("DB1.DBD4.0: " + realVariabl);// DIntvar dIntVariable = (uint)plc.Read("DB1.DBD8.0");Console.WriteLine("DB1.DBD8.0: " + dIntVariable);// DWordvar dWordVariable = (uint)plc.Read("DB1.DBD12.0");Console.WriteLine("DB1.DBD12.0: " + dWordVariable);// Wordvar 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);
一行写入,简单到爆炸,那么我们验证下效果。
写入成功!是不是超级简单。