本文是Snap7软件包系列教程的第5篇,上一篇文章我们介绍了Snap7Client与S7服务器创建连接的方法/函数,最常用的是ConnectTo()。当成功创建连接后,接下来就是对服务器数据进行读写,今天我们就来介绍Snap7Client的ReadArea()和WriteArea()方法。
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表示字的数量,此处暂时存疑;
③:字的长度有不同的代号,下文详述;
参数列表如下:
名称 | 数据类型 | 说明 |
---|---|---|
Area | 整数 | 要访问的存储区的代号 |
DBNumber | 整数 | 要访问的数据块编号(Area=0x84) |
Start | 整数 | 要访问数据的起始地址 |
Amount | 整数 | 要读取的字的数量 |
WordLen | 整数 | 要读取的字的长度 |
pUserData | 指针 | 指向存放数据的地址 |
参数Area是要访问的存储区的代号,不同的数值代表不同的存储区,详见下面的表格:
名称 | 值(16进制) | 说明 |
---|---|---|
S7AreaPE | 0x81 | 过程输入映像区 |
S7AreaPA | 0x82 | 过程输出映像区 |
S7AreaMK | 0x83 | 位存储区 |
S7AreaDB | 0x84 | 数据块 |
S7AreaCT | 0x1C | 计数器 |
S7AreaTM | 0x1D | 定时器 |
参数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的值进行了定义,如下图所示:
我们可以在代码中直接对变量进行赋值,也可以使用S7Client的静态成员进行赋值,比如下面的代码:
另外要说明的是,如果访问长度设置为位(S7WLBit),那么起始地址必须以位的形式进行计算。例如,如果起始地址为DB100.DBX20.2,那么参数Start的值=20*8+2=162(编号从0开始);
函数ReadArea()的返回值为整数类型,成功读取数据时返回值为零;如果返回值为非零整数则代表某种错误,需要查看错误列表确定错误类型。函数原型如下图:
2、Snap7Client.WriteArea()
WriteArea()方法可以将数据写入到S7服务器的指定存储区中,支持的存储区的类型与ReadArea()相同,其参数也与ReadArea()相同,是ReadArea()方法的逆操作,其函数原型如下图所示:
ReadArea()和WriteArea()都是以同步的方式执行,换句话说就是如果函数没有返回,则程序会一直等待,可能出现假死现象。因此,这两个方法/函数适用于数据量不大的情况。如果要读取或写入的数据比较多,则建议使用AsReadArea()和AsWriteArea()方法。
另外,ReadArea()和WriteArea()的参数比较多,使用起来不太方便。Snap7Client还提供DBRead/Write、ABRead/Write等单一存储区读写的函数,将在后续介绍。
我开通了微信视频号,以视频的方式分享一些工控小知识,欢迎扫描下方的二维码体验:
发表评论