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能干什么?

image

 

好了,现在开始真正的学习西门子s7plus写读写PLC的数据了


 

1. 使用Demo连接,需要更新到 v12.8.0 版本及以上

我们在真正的读写PLC之前,先使用Demo来连接西门子PLC,除了验证是否真的可以通信之外,还可以看下PLC具体有什么点位。S7Plus协议适合那些优化块的地址,实际和PLC通信的时候,也是基于SSL加密的,Demo程序能通,我们自己写的代码就肯定可以通。

HslCommChapter8-4-1

 

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

可以点击浏览界面查看,如下图所示:

HslCommChapter8-4-2

 

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

HslCommChapter8-4-3

 

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

 

HslCommChapter8-4-4

 

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

 

HslCommChapter8-4-5

 

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

 

HslCommChapter8-4-6

 

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

HslCommChapter8-4-7

 

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

HslCommChapter8-4-8

 

 

 

使用代码来读写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 );
			}

  

 

当然这里更多的数据读取也是支持,就是传入更多的地址数组即可。

 

posted @ 2026-04-27 16:34  dathlin  阅读(36)  评论(0)    收藏  举报