RCV 接收指令

接收指令(RCV 指令)用于在自由口通信模式下通过指定的通信端口(PORT)接收数据,接收的数据存储到接收缓冲区(TBL),数据长度最多为 255个字符。
RCV 指令接收缓冲区格式如表 1. RCV 指令接收缓存区格式所示。

字节偏移量

描述

0

接收到字符的个数(N)

1

接收的第1个字符

2

接收的第2个字符

N

接收的第N个字符

表1. RCV 指令接收缓存区格式

如果中断子程序连接到接收完成事件,CPU 将在接收到最后一个字符后产生一个中断事件(对于端口 0 为中断事件 23,对于端口 1 为中断事件 24)。
如果不使用中断,也可以通过监视接收信息状态字节 SMB86(端口 0 )或 SMB186(端口 1 )来判断接收是否完成。SMB86 /SMB186 等于0时表示相应的通信端口正在处于接收状态中。
接收信息状态字节 SMB86 /SMB186 的说明见下表2.所示。

端口 0

端口 1

接收信息状态字节

 

 

SMB86

 

 

SMB186


n:1= 接收消息功能被终止:用户发送禁止命令。
r:1= 接收消息功能被终止:输入参数错误或丢失启动或结束条件。
e:1= 接收到结束字符。
t:1= 接收消息功能被终止:定时器时间已用完。
c:1= 接收消息功能被终止:实现最大字符计数。
P: 1 = 接收消息功能被终止:奇偶校验错误。


表2. 接收信息状态字节 SMB86/SMB186

RCV 指令的控制字节

执行 RCV 指令时,必须预先使用接收信息控制字节 SMB87 (端口 0 ) 或 SMB187 (端口 1 )来定义接收消息的起始和结束条件。
接收消息的起始条件可以同时包含多个条件,只有所有条件都满足才开始接收消息;接收消息的结束条件也可以同时包含多个条件,只要有一个条件满足就会结束消息的接收。
接收信息控制字节 SMB87/SMB187 的说明见下表 3. 所示。

端口 0

端口 1

接收信息控制字节

 

 

 

SMB87

 

 

 

SMB187


en:0=禁用接收消息功能。
1=允许接收消息功能。
sc:0=忽略SMB88或SMB188。
1=使用SMB88或SMB188的值检测起始消息。
ec:0=忽略SMB89或SMB189。
1=使用SMB89或SMB189的值检测结束消息。
il: 0=忽略SMW90或SMW190。
1=使用SMW90或SMW190的值检测空闲状态。
c/m:0=定时器是字符间定时器。
1=定时器是消息定时器。
tmr:0=忽略SMW92或SMW192。
1=当SMW92或SMW192中的定时时间超出时终止接收。
bk:0=忽略BREAK状态。
1=使用BREAK状态作为消息检测的开始。

SMB88

SMB188

消息字符的开始

SMB89

SMB189

消息字符的结束

SMW90

SMW190

空闲线时间,以毫秒为单位

SMW92

SMW192

字符间/消息定时器,以毫秒为单位

SMB94

SMB194

允许接收的最大字符数(1 ~ 255)

表3. 接收信息控制字节 SMB87/SMB187

RCV 指令的起始条件

RCV 指令的起始条件可以同时包含多个条件,只有所有条件都满足才开始接收消息,RCV 指令接收消息支持如下多种起始条件:

1、 空闲线检测:il = 1,sc = 0,bk = 0,SMW90/SMW190 = 空闲线超时(毫秒)。


在该起始条件下,执行 RCV 指令时将开始检测空闲线条件,当通信总线上空闲线时间达到 SMW90/SMW190 中指定的毫秒数时,便会开始消息接收。
空闲线时间之前接收到的任何字符都被忽略,并按照SMW90/SMW190 指定的时间重新启动空闲线定时器;空闲线时间到达后,接收消息功能会将接收到的所有后续字符存入接收缓冲区。
如图 1. 使用空闲线检测启动信息接收所示。



图 1. 使用空闲线检测启动信息接收
1:执行 RCV 指令。
2:重新启动空闲时间定时器,空闲线条件之前接收的字符被忽略。
3:空闲线条件已满足,空闲线条件之后接收到的字符16#EE、16#55 将会被存储到接收缓冲区。

2、 起始字符检测: il = 0,sc = 1,bk = 0,忽略SMW90/SMW190,SMB88/SMB188 = 起始字符。

在该起始条件下,执行 RCV 指令时当收到 SMB88/SMB188 中指定的起始字符时,便会开始消息接收。
接收消息功能会将起始字符作为消息的第一个字符存入接收缓冲区,接收消息功能忽略在起始字符之前收到的任何字符,起始字符以及在起始字符之后收到的字符被存储到接收缓冲区。
如图 2. 使用起始字符检测启动信息接收所示。



图2. 使用起始字符检测启动信息接收
1:执行 RCV 指令。
2:起始字符 16#55 之前接收到的字符16#01、16#02、16#03 都被忽略。
3:起始字符 16#55 之后接收到的字符都被存储到接收缓冲区,包括起始字符。

3、空闲线和起始字符检测:il = 1,sc = 1,bk = 0,SMW90/SMW190 > 0,SMB88/SMB188 = 起始字符。

在该组合起始条件下,执行 RCV 指令时,接收消息功能将检测空闲线条件,空闲线条件满足后,接收消息功能将查找指定的起始字符,如果接收到的字符不是起始字符,接收消息功能将重新检测空闲线条件。
所有在满足空闲线条件之前以及起始字符之前接收到的字符都将被忽略,满足起始条件后接收到的起始字符与所有后续字符被一起存入接收缓冲区。
如图 3. 使用空闲线和起始字符检测启动信息接收所示。



图3. 使用空闲线和起始字符检测启动信息接收
1:执行 RCV 指令。
2:重新启动空闲时间定时器,空闲线条件之前接收的字符被忽略。
3:满足空闲线条件后接收的第一个字符非起始字符 16#55 ,收到的字符 16#EE、16#55 将被忽略,需要重新启动空闲时间定时器。
4:满足空闲线和起始字符条件,接收到的字符16#55、16#EE 被存储到接收缓冲区。

4、断开检测:il = 0,sc = 0,bk = 1,忽略 SMW90/SMW190,忽略 SMB88/SMB188。

当通信总线上的数据维持“0”状态的时间大于一个完整字符传输的时间时,通信接收方会指示断开状态。完整字符传输时间定义为传输起始位、数据位、奇偶校验位和停止位的时间总和。
在断开检测条件下,执行 RCV 指令时,断开条件之前接收到的任何字符都会被忽略,断开条件之后接收到的字符会被存储到接收缓冲区中。如图 4. 使用断开检测启动信息接收所示。
断开检测一般很少使用,通常需要与发送方产生 BREAK 状态配合使用。



图 4. 使用断开检测启动信息接收
1:执行 RCV 指令。
2:字符 16#00 的停止位为“1”,传送字符 16#00 时通信总线上数据维持“0”状态时间小于一个完整字符传输的时间,不符合断开条件,此时接收到的字符都会被忽略。
3:BREAK 状态时通信总线上数据维持“0”状态时间为传送 16 位数据所需要的时间,大于一个完整字符传输的时间,符合断开条件,断开条件之后接收到的字符 16#55 被存储到接收缓冲区中。

5、断开检测和起始字符:il = 0,sc = 1,bk = 1,SMB88/SMB188 = 起始字符,忽略 SMW90/SMW190。

在该组合起始条件下,执行 RCV 指令时,接收消息功能将检测断开条件,断开条件满足后,接收消息功能将查找指定的起始字符。
如果接收到的字符不是起始字符,接收消息功能将开始重新检测断开条件;
所有在满足断开条件之前以及起始字符之前接收到的字符都将被忽略,满足起始条件后接收到的起始字符与所有后续字符被一起存入接收缓冲区。
如图 5. 使用断开和起始字符检测启动信息接收所示。



图 5. 使用断开和起始字符检测启动信息接收
1:执行 RCV 指令。
2:断开条件之前接收的字符 16#55 被忽略。
3:满足断开条件后接收的第一个字符非起始字符 16#55 ,收到的字符 16#EE、16#55 将被忽略,需要重新检测断开条件。
4:满足断开和起始字符条件,接收到的字符16#55、16#EE 被存储到接收缓冲区。

6、任意字符:il = 1,sc = 0,bk = 0,SMW90/SMW190 = 0,忽略SMB88/SMB188。

任意字符起始条件是空闲线检测的特例。在该起始条件下,执行 RCV 指令时便会立即开始消息接收并将接收到的所有字符存入接收缓冲区。

注意:
使用任意字符检测为接收消息的起始条件时,可以选择消息定时器为接收消息的结束条件。
使用任意字符检测时空闲线时间 SMW90/SMW190设置为零, RCV 指令执行时,消息定时器将立即启动,如果未满足其它结束条件,则当消息定时器经过 SMW92/SMW192 中指定的毫秒数后终止消息的接收

RCV 指令的结束条件

RCV 指令接收消息支持多种结束消息接收的条件,结束消息接收的条件可以是一种条件或者几种条件的组合。结束字符检测、字符间定时器、消息定时器或最大字符计数等结束条件可以组合使用,当采用组合条件时只要有一个条件满足就将终止消息接收。各种 RCV 指令的结束条件如下:

1、结束字符检测:ec = 1,SMB89/SMB189 = 结束字符。

执行 RCV 指令并找到起始条件之后,接收消息功能将检查接收到的每一个字符,并判断其是否与结束字符匹配。
接收到结束字符时,会将其存入接收缓冲区并终止信息接收,如图 6. 使用结束字符检测终止信息接收所示。



图 6. 使用结束字符检测终止信息接收
1:执行 RCV 指令。
2:起始字符 16#55 之前接收到的字符16#01、16#02、16#03 都被忽略。
3:检测到起始字符 16#55 ,开始消息接收。
4:检测到结束字符 16#CC ,终止消息的接收,结束字符之后接收到的字符 16#01 被忽略。

2、字符间定时器:c/m = 0,tmr = 1,SMW92/SMW192 = 超时(毫秒)。

执行 RCV 指令并找到起始条件之后,接收消息功能接收到每个字符后,重新启动字符间定时器,
如果字符间的时间超出 SMW92/SMW192中指定的毫秒数,则接收消息功能将终止。如图 7. 使用字符间定时器终止消息接收所示



图 7. 使用字符间定时器终止消息接收
1:执行 RCV 指令。
2:空闲线时间到,开始信息接收。
3:满足空闲线条件后接收到字符将被存储到接收缓冲区,接收到每个字符的停止位时重新启动字符间定时器。
4:字符间的时间超出 SMW92/SMW192中指定的毫秒数,接收消息功能将终止,之后接收到的字符被忽略。

3、消息定时器:c/m = 1,tmr = 1,SMW92/SMW192 = 超时(毫秒)。

执行 RCV 指令并且接收消息功能的起始条件得到满足后,消息定时器立即启动,消息定时器经过 SMW92/SMW192 中指定的毫秒数后终止消息的接收。
如图 8. 使用消息定时器终止消息接收所示。



图 8. 使用消息定时器终止消息接收
1:执行 RCV 指令。
2:空闲线时间到,开始消息接收。
3:满足空闲线条件后接收到字符将被存储到接收缓冲区,接收到第一个字符的停止位时启动消息定时器。
4:消息定时器时间超出 SMW92/SMW192中指定的毫秒数,接收消息功能将终止,之后接收到的字符被忽略。

使用任意字符检测为接收消息的起始条件时,可以选择消息定时器为接收消息的结束条件。

使用任意字符检测时空闲线时间 SMW90/SMW190设置为零,RCV 指令执行时,消息定时器将立即启动,
如果未满足其它结束条件,则当消息定时器经过 SMW92/SMW192 中指定的毫秒数后终止消息的接收,如图 9. 使用任意字符开始消息接收和消息定时器终止消息接收所示。



图9. 使用任意字符开始消息接收和消息定时器终止消息接收
1:执行 RCV 指令,同时消息定时器被立即启动。
2:消息定时器时间超出 SMW92/SMW192中指定的毫秒数,接收消息功能将终止,之后接收到的字符被忽略。
注意:
在主从通信中主站发送请求报文,从站需要回复应答报文。主站在指定时间段内对从站未发出任何应答的超时处理,可以采用任意字符检测为接收消息的起始条件、消息定时器为接收消息的结束条件这种方法。

4、最大字符个数:SMB94/SMB194 = 最大字符个数

执行 RCV 指令时当接收字符个数达到或超过最大字符个数(SMB94/SMB194)时接收消息功能将终止。
由于接收指令需要知道接收信息的最大长度,以保证信息缓冲区之后的数据不被覆盖,所以即使最大字符计数不被专门用作接收结束条件,也必须指定最大字符个数。

5、奇偶校验错误

执行 RCV 指令时,当通信端口检测出奇偶校验错误、组帧错误或超限错误时,消息接收功能自动被终止。

6、用户终止:en = 0

设置 SM87.7/SM187.7 = 0 ,同时再调用 RCV 指令,将立即终止消息接收功能。