03、SECS-I 协议介绍
SECS-I属于传输协议标准,主要定义了电气规格、传输速度、交握码等物理信息。
1、SECS-I 基础介绍
1.1 物理传输单位 bit
SECS-I 定义了使用RS-232
作为传输媒质时点到点的数据通信
。实际的传输由8位Bit连续发送,有一个开始位和一个停止位。
通信是 双向和异步的,但是同一时间只能有一个方向的数据进行传输
。方向由特殊字符和握手建立,然后发送数据本身。
1.2 逻辑传输单位 Block
数据被分块进行传输,每个数据块最大为 254 字节。一个消息是一个方向完整的通信单元,由1到32,767个块组成。每个块标头都包含用于标识该块作为特定消息的一部分的信息。
1.3 Block的组成
一个Block
包括一个Length Byte、N Data Bytes 和 CheckSum
。
- LengthByte:表示随后有多少个字节的数据(即 N bytes),不包括最后 2个字节的校验和;
- CheckSum:计算
N Data Bytes
的校验和; - N Data Bytes:Block中的数据,长度范围是 10 至 254 字节,它由十个字节的头和消息数据组成。
Data Bytes 由 10 byte Header 和 Message Data 组成:
- MessageData:表示Data Bytes中的数据部分,由
编码后的 SECS-II 消息构成
; - 10 byte Header:描述Data Bytes中的数据内容。
10 byte Header 由 4个内容组成,其中:
- Device ID:Header的第一和第二字节,其
第一个比特为 R-bit
,其作用是指出消息传输的方向。 - Message ID:Header的第三和第四字节,其
第一个比特为 Wait-bit
,用于指示消息的发送者是否需要回复。 - Block No.:Header的第五和第六字节,其
第一个比特为 End-bit
,用于指示这个是否是消息的最后一个块。 - System Bytes:Header的最后四个字节,
第七和第八字节表示 source ID,用于表示消息的发送者,第九和第十字节表示 transaction ID,用于唯一标示每个发送的消息
。
我们一起看看 Block 的组成:
我们一起看看 Header 的组成:
1.4 Block的传输
块的传输过程,先传输块的长度,再传输块,最后发送校验码。
标准建议每次可传输的Date Bytes字节最多为254,如果一个消息的大小<245个字节,则以一个块的形式进行传输。如果一个消息的大小> 245个字节,则以分块的形式进行传输。
2、SECS-I Block Transfer Protocol
从上图中,我们可以得知,SECS-I 使用的是块传输协议。
块传输协议
用于建立通信的方向,并为传递消息块提供环境。主消息或回复消息可能需要多个块传输(多块消息)。
2.1 Handshake Sequence(握手顺序)
看到这个,是不是想起来 TCP 建立连接时的三次握手。这里的作用是 TCP 的三次握手差不多,用于确认通信双方已经准备就绪。那接下来我们一起看看 Block Transfer Protocol
的握手顺序是怎么做的。
Block Transfer Protocol
中的握手顺序是主机和设备
之间的字节交换
。
那既然是字节交换
,交换的是哪些字节的呢?
Handshake Codes(握手码):
SECS-I Parameters:
- T1: 在接受 BLOCK DATA时,接收到每个字符的时间间隔(从接收到第一个字符后开始计算)
- T2: 发送 ENQ 和接收到 EOT 之间的时间间隔
- RTY: 这里说说我的理解,这里就是当使用 ENQ 开始发送后,接收到了 NAK 或者其他的错误(比如超时等),就会重新发送 ENQ,重新发送的最大次数是 RTY。
- Master/Slave: 用于解决争议。主机是 slave ,设备是 master。争论是指主机和设备同时尝试进行通信。下面显示了如何解决争论
2.2 Block Data
2.2.1、块数据简介
块数据是单块或多块消息的数据部分。它包含一个Length Byte(长度字节), N Data Bytes(N个数据字节)和a two byte Checksum(一个两个字节校验和)
。
接下来,我们对上面的图进行逐一的讲解:
- Length Byte:是在块数据中发送的
第一个字节
。它是N个DAta Bytes(10 Byte Header + Data Structure)中的字节数。两个字节校验和不包括在这个计数中,值范围为10到254字节。这里要注意的是,Length Byte 占用一个字节
。
- N Data Bytes: 是消息块的数据部分。它包含一个10字节的报头和消息数据。大小范围从10字节到254字节。N个数据字节的最小为10(只包含10字节的字节头),最大为254。
- Message Data: 是消息的数据部分。它包含已编码的SECS-II的全部或部分(如果是多块消息)。这里需要注意的是,发送的是多块消息时, Message Data 只包含了已编码的 SECS-II 的部分。
2.2.2、10 字节的Header
每个消息都包含一个报头。标头用于描述包含在块数据中的数据。它包含 Device ID, Message ID, Block Number, and System Bytes(设备ID、消息ID、块号和系统字节)
。其他重要指标也包括在内。
接下来,我们一起来看看 Header 的 4 个组成部分:
- Device ID: 报头的第1个和第2个字节是设备ID。左字节是上设备ID,右字节是下设备ID。左字节中最左边的位是反向位(R位)。R-位决定了消息的方向。
- Message ID: 报头的第3个字节和第4个字节是消息ID。左字节是上消息ID,右字节是下消息ID。左字节中最左边的位是等待位(W位)。w位用于表示主消息的发送方是否期望得到回复。
- Block Number:
报头的第5个字节和第6个字节表示块号。左字节是 upper block number,右字节是 lower block number。左字节中最左边的位是结束位(E位)。E位表示这是否是消息的最后一个块。
当发送的消息需要多个块时,将使用多块消息。每个块都是数字并且是有序的(这里的数字应该指的是块的序号)。由于消息的接收者不知道一共发送了多少个块,所以使用 e位 指示当前块是不是最后一个块,不会最后一个块的话,后面还会有块发送过来。多块消息中的最大块数为32,767个。
- System Bytes: 报头的最后四个字节是
system bytes(系统字节)
。左边的两个字节是source ID(源ID)
,右边的两个字节是transaction ID
(事务ID)。源ID标识消息的发送方,并用于消息路由。事务ID标识该消息,并且对于所发送的每个消息都是唯一的
。在其关联应答处的主消息具有相同的(匹配的)系统字节。最后一句话如何理解呢?它的意思是,回复的消息的 System Bytes 和 发送的消息的 System Bytes 是相等的。
上面我们对 SECS-I 使用到的 Block Transfer Protocol 有了初略的了解。接下来,一起看看 如何发送 S1F1 指令,以及对应的回复指令 S1F2。
3、Example of S1F1 / S1F2
下面显示了在发送primary message
和接收secondary reply message
时传输的字节。这不是一个多块的消息。主机发送S1F1,设备发送S1F2应答。
4、Typical SECS Protocol Parameters
这一节内容我们将一起看看Typical SECS Protocol Parameters(典型的SECS协议参数)
。
下面是 SECS-I / SECS-II
协议参数的摘要集,以及一些典型的值。
参考资料: