C# 西门子PLC s7Plus协议 标签数据读写实现
主要使用的软件是 HslCommunication 关于这个软件的本身,详细可以参考下面的地址:
github地址:https://github.com/dathlin/HslCommunication
官网:http://www.hslcommunication.cn , 胡工科技官网
加群咨询学习信息:http://www.hslcommunication.cn/Cooperation
在Visual Studio 中的NuGet管理器中可以下载安装,也可以直接在NuGet控制台输入下面的指令安装:
Install-Package HslCommunication
如果需要教程:Nuget安装教程:http://www.cnblogs.com/dathlin/p/7705014.html
组件的api地址:http://api.hslcommunication.cn
使用手册:http://www.hsltechnology.cn/Doc/HslCommunication
Demo下载地址:http://www.hsltechnology.cn/Home/Download
在开始之前,我们先来看看HslCommunication能干什么?

好了,现在开始真正的学习西门子s7plus写读写PLC的数据了
1. 使用Demo连接,需要更新到 v12.8.0 版本及以上
我们在真正的读写PLC之前,先使用Demo来连接西门子PLC,除了验证是否真的可以通信之外,还可以看下PLC具体有什么点位。S7Plus协议适合那些优化块的地址,实际和PLC通信的时候,也是基于SSL加密的,Demo程序能通,我们自己写的代码就肯定可以通。

双击这里的 S7-PLUS 协议,然后输入ip地址,一般来说,端口号默认都是102,然后点击成功,连接成功之后,就可以输入地址读写操作了,那么问题来了,地址我们怎么输入??
可以点击浏览界面查看,如下图所示:

我测试的PLC最终结果返回如下:

我们来看下PLC里数据实际长什么样子的?使用博图软件连接PLC查看一下,如果方便的话

我们简单的对比下数据,发现非常好,读取出来是一致的,这时候,我们希望看下这些值是多少?

我们如何读写一个数据呢?这里的物理地址是 RelationId 信息,只需要复制出来,我们以标签 FFFF 为例子,读写下 float 类型的数据看看,读写类型必须一致,才能正确读写操作的。

需要注意的是,从协议层面来说,只能使用 RelationId 地址来读写的,并不能通过字符串的变量名称来读写操作的,但是在 HslCommunication 库里,如果调用了 plc.BrowerDB(); plc.BrowerTags(); 就会自动缓存标签的名称和物理地址,所以我们也可以复制列 StringAddress 的值来当地址使用

其他的操作类似的,Demo可以直接看到怎么调用代码的

使用代码来读写PLC
先实例化一个PLC对象,这个很简单,上面的Demo实例化代码拷贝下来即可。
HslCommunication.Profinet.Siemens.SiemensS7Plus plc = new HslCommunication.Profinet.Siemens.SiemensS7Plus( );
plc.BrowseTagNameOnConnect = false;
plc.CommunicationPipe = new HslCommunication.Core.Pipe.PipeTcpNet("127.0.0.1", 102)
{
ConnectTimeOut = 5000, // 连接超时时间,单位毫秒
ReceiveTimeOut = 10000, // 接收设备数据反馈的超时时间
UseServerActivePush = true,
};
更加简单的版本是
HslCommunication.Profinet.Siemens.SiemensS7Plus plc = new HslCommunication.Profinet.Siemens.SiemensS7Plus( "127.0.0.1" );
然后连接操作,其实不连接也可以读写操作,在第一次读写操作的时候,自动连接操作
OperateResult connect = plc.ConnectServer( );
if (connect.IsSuccess)
{
Console.WriteLine( "Connect success" );
}
else
{
Console.WriteLine( "Connect failed: " + connect.Message );
}
然后我们来读取点位 FFFF 也就是物理地址是 8A0E0001.14 代码如下:
OperateResult<float> read = plc.ReadFloat( "8A0E0001.14" );
if (read.IsSuccess)
{
Console.WriteLine( "Value[FFFF]: " + read.Content );
}
else
{
Console.WriteLine( "read failed: " + read.Message );
}
默认情况下并不支持使用地址 "PP"."FFFFF" 来读写操作,此时没有建立映射的关系,我们需要调用两个方法来变量PLC的点位(实际上不保证所有的点位都能遍历出来及映射出来,Demo界面浏览数据点位后,StringAddress有值的表示可以遍历出来)
plc.BrowseDB( );
plc.BrowseTags( );
OperateResult<float> read = plc.ReadFloat( "\"PP\".\"FFFFF\"" );
if (read.IsSuccess)
{
Console.WriteLine( "Value[\"PP\".\"FFFFF\"]: " + read.Content );
}
else
{
Console.WriteLine( "read failed: " + read.Message );
}
// 写入也是类似的
OperateResult write = plc.Write( "\"PP\".\"FFFFF\"", 1.23f );
if (write.IsSuccess)
{
Console.WriteLine( "write success" );
}
else
{
Console.WriteLine( "write failed: " + write.Message );
}
在连接PLC之后,调用一次 plc.BrowseDB(); plc.BrowseTags(); 即可,如果PLC里面的点位很多,这两个的方法可能需要耗费比较久的时间,长达几秒都是有可能的。
我们还有一种读取的写法,下面简单的介绍下,也是读取上面的点位信息
plc.BrowseDB( );
plc.BrowseTags( );
// 如果没有上面的浏览地址的方法,这里就使用地址 8A0E0001.14
OperateResult<List<HslCommunication.Profinet.Siemens.S7PlusHelper.S7Value>> read = plc.ReadTags( new string[]
{
"\"PP\".\"FFFFF\""
} );
if (read.IsSuccess)
{
Console.WriteLine( "Value[\"PP\".\"FFFFF\"]: " + read.Content[0].Value );
// 也可以手动解析,可以对比下这两种写法
Console.WriteLine( "Value[\"PP\".\"FFFFF\"]: " + plc.ByteTransform.TransSingle( read.Content[0].Buffer, 0 ) );
}
如果我想一次性读取两个点位的数据呢?而不是分别读两次,可以这么写代码
plc.BrowseDB( );
plc.BrowseTags( );
// 如果没有上面的浏览地址的方法,这里就使用地址 8A0E0001.14
OperateResult<List<HslCommunication.Profinet.Siemens.S7PlusHelper.S7Value>> read = plc.ReadTags( new string[]
{
"\"PP\".\"FFFFF\"",
"\"PP\".\"DD\"",
} );
if (read.IsSuccess)
{
Console.WriteLine( "Value[\"PP\".\"FFFFF\"]: " + read.Content[0].Value );
Console.WriteLine( "Value[\"PP\".\"DD\"]: " + read.Content[1].Value );
}
else
{
Console.WriteLine( "read failed: " + read.Message );
}
当然这里更多的数据读取也是支持,就是传入更多的地址数组即可。

浙公网安备 33010602011771号