北岛夜话
原创工业智能控制领域(PLC、单片机/嵌入式、机器人、通信、机器视觉)的技术及经验分享。
文章527 浏览7983561

基于Snap7使用C#编程访问西门子PLC系列教程(5)-Read/WriteArea

本文是Snap7软件包系列教程的第5篇,上一篇文章我们介绍了Snap7Client与S7服务器创建连接的方法/函数,最常用的是ConnectTo()。当成功创建连接后,接下来就是对服务器数据进行读写,今天我们就来介绍Snap7Client的ReadArea()和WriteArea()方法。

cover.png

1、Snap7Client.ReadArea()

Snap7Client的ReadArea()方法可以从S7服务器(S7 Server)读取数据,功能非常强大,支持多种存储区的数据读取,包括:输入缓存区(Input)、输出缓存区(Output)、位存储区(M)、数据块(DB)、定时器区(Timer)和计数器区(Counter);

ReadArea()方法有六个输入参数,包括:

  • Area:整数类型,存储区的代号(下文详解);

  • DBNumber:整数类型,数据块的编号(仅适用于Area=0x84的情况);

  • Start:整数类型,要读取数据的起始地址

  • Amount:整数类型,要读取的的数量

  • WordLen:整数类型,要读取的字的长度

  • pUserData:指针类型,存放读取到的数据的地址;

①:当按位(bit)进行访问时,起始地址计算有所不同,下文详述;

:在之前的实际使用中,这个Amount值通常我认为是字节的数量。不过作者在参考手册中特别说明Amount表示字的数量,此处暂时存疑;

③:字的长度有不同的代号,下文详述;

参数列表如下:

Snap7Client.ReadArea()输入参数列表
名称
数据类型
说明
Area
整数
要访问的存储区的代号
DBNumber
整数
要访问的数据块编号(Area=0x84)
Start
整数
要访问数据的起始地址
Amount
整数
要读取的字的数量
WordLen
整数
要读取的字的长度
pUserData
指针
指向存放数据的地址

参数Area是要访问的存储区的代号,不同的数值代表不同的存储区,详见下面的表格:

参数Area的值
名称
值(16进制)
说明
S7AreaPE
0x81
过程输入映像区
S7AreaPA
0x82
过程输出映像区
S7AreaMK
0x83
位存储区
S7AreaDB
0x84
数据块
S7AreaCT
0x1C
计数器
S7AreaTM
0x1D
定时器

参数WordLen用来定义数据访问的长度,详见下面的表格:

参数WordLen的值
名称
值(16进制)
说明
S7WLBit
0x01
位(字内部的)
S7WLByte
0x02
字节(8位)
S7WLWord
0x04
字(16位)
S7WLDword
0x06
双字(32位)
S7WLReal
0x08
实数(32位)
S7WLCounter
0x1C
计数器(16位)
S7WLTimer
0x1D
定时器(16位)

在类S7Client中,以只读静态成员的方式对上述Area和WordLen的值进行了定义,如下图所示:

Area_Word_length.png

我们可以在代码中直接对变量进行赋值,也可以使用S7Client的静态成员进行赋值,比如下面的代码:

example.PNG

另外要说明的是,如果访问长度设置为位(S7WLBit),那么起始地址必须以位的形式进行计算。例如,如果起始地址为DB100.DBX20.2,那么参数Start的值=20*8+2=162(编号从0开始);

函数ReadArea()的返回值为整数类型,成功读取数据时返回值为零;如果返回值为非零整数则代表某种错误,需要查看错误列表确定错误类型。函数原型如下图:

ReadArea.PNG

2、Snap7Client.WriteArea()

WriteArea()方法可以将数据写入到S7服务器的指定存储区中,支持的存储区的类型与ReadArea()相同,其参数也与ReadArea()相同,是ReadArea()方法的逆操作,其函数原型如下图所示:

WriteArea.PNG

ReadArea()和WriteArea()都是以同步的方式执行,换句话说就是如果函数没有返回,则程序会一直等待,可能出现假死现象。因此,这两个方法/函数适用于数据量不大的情况。如果要读取或写入的数据比较多,则建议使用AsReadArea()和AsWriteArea()方法。

另外,ReadArea()和WriteArea()的参数比较多,使用起来不太方便。Snap7Client还提供DBRead/Write、ABRead/Write等单一存储区读写的函数,将在后续介绍。

我开通了微信视频号,以视频的方式分享一些工控小知识,欢迎扫描下方的二维码体验:


founderchip.png

取消

感谢您的支持,欢迎常来看看!

扫码支持
一点动力,多少随意

打开支付宝扫一扫,即可进行扫码打赏哦

发表评论