- Java锁的逻辑(结合对象头和ObjectMonitor)
- 还在用饼状图?来瞧瞧这些炫酷的百分比可视化新图形(附代码实现)⛵
- 自动注册实体类到EntityFrameworkCore上下文,并适配ABP及ABPVNext
- 基于Sklearn机器学习代码实战
这里我们先学习 SECS-II 协议,给我的感受是先学完 SECS-II 协议,再去学习 SECS-I 和 HSMS 协议更加容易理解,所以这里我先介绍 SECS-II 协议.
文章的内容基本上来自参考资料和自己看的文档,若有侵权,请联系删除,谢谢.
消息协议用于在 主机和设备( Host and Equipment) 之间发送 SECS-II 消息。每个SECS-II消息都包含一条 主消息( primary message ) 和一个 可选的次回复消息( optional secondary reply message) 。这也被称为一个 事务(transaction) .
SECS-II 标准定义了使用如SECS-I、HSMS等传输协议在设备和主机之间交换的消息的形式和含义.
定义了以消息的形式在设备和主机之间传递信息, 消息按其流分类,称为Stream。有很多不同流的Stream,每个Stream又包括具体的消息,称为Function .
标准还定义了消息的结构, 消息由数据项和数据项列表 ( items and lists of items ) 构成 。该结构允许自描述数据格式,以保证对消息的正确解释.
SECS-II还规定了事务协议,用于管理消息的交换、分块等,对SECS-II实现提出了一些最低要求.
SECS-II消息被称为 行为和函数(Streams and Functions) 。 每条消息都有一个流值(Sx)和一个函数值(Fy) 。比如:Stream 1 Function 1,写作:S1F1,并被称为“S1F1”。流是消息的类别,而函数是该类别中的特定消息.
注意:
Stream和Function按照数字进行编号。所有的Primary Message的Function编号为奇数,其对应的Secondary Message(即 Reply Message)的Function编号为偶数且为其Primary Message的Function编号加1.
如果Primary Message不需要应答,则其对应的偶数编号(Primary Message Function 编号加1)的Function不使用,保留.
我们来看一个例子:
接下来我们一起看看哪些 Streams and Functions 是保留的,那些是我们可以自定义的.
Stream | **Function ** | Availability |
---|---|---|
0 | 0 to 255 | 系统保留的 |
1 to 63 | 0 to 63 | 系统保留的 |
64 to 127 | 0 | 系统保留的 |
1 to 63 | 64 to 255 | 用户可自定义使用的 |
64 to 127 | 1 to 255 | 用户可自定义使用的 |
注意:
All function 0’s have a special meaning. They are sent as a reply to an aborted primary message. 。
上面这句话的意思是:所有Stream中Function编号为0的Message保留,用于中止事务.
上面我们了解了 Streams and Functions 的基础介绍,接下来一起学习下 Stream 的分类.
Stream | Catagory | 含义 |
---|---|---|
1 | Equipment Status | 设备状态 |
2 | Equipment Control and Diagnostics | 设备控制和诊断 |
3 | Material Status | 原料状态 |
4 | Material Control | 原料控制 |
5 | Alarm Handling | 异常处理 |
6 | Data Collection | 数据采集 |
7 | Recipe Management | 工艺程序管理 |
8 | Control Program Transfer | 控制程序传输 |
9 | System Errors | 系统错误 |
10 | Terminal Services | 终端服务 |
11 | Host File Services (Deleted) | 主机文件服务(已删除) |
12 | Wafer Mapping | 晶片图形布置 |
13 | Data Set Transfers | 数据集传输 |
14 | Object Services:对象服务; | 对象服务 |
15 | Recipe Management | 配方管理 |
16 | Processing Management | 工艺进程管理 |
17 | Equipment Control and Diagnostics | 设备控制和诊断 |
18 | Subsystem Control and Data | 子系统控制和数据 |
事务: 是信息交换的基础 。 一个事务由不需要Reply的Primary Message或需要Reply的Primary Message及其Reply Message组成 。这里我理解的事务指的是:一次完整的请求或者一次完整的请求响应.
下列是SECS-II在事务层面所规定的要求:
会话 : 是用于完成特定任务的一系列的一个或多个相关事务 。会话应包括完成任务所需的所有事务,会话结束时,会话双方应释放相关资源.
会话超时 : 表示会话在规定时间内未完成 。 会话超时时间和检测由用户应用程序自定义 .
会话超时将终止会话的进一步操作,并将允许清除任何已提交的资源。在设备上检测到会话超时后,应发送 S9F13 给主机.
SECS-II中定义了7种类型的会话
1、一个无需回复的Primary Message是最简单的会话。此消息必须是一个单块的SECS-II消息.
2、如果响应端有发起端想要的数据,则会使用Primary Message请求这些数据,响应端将这些数据作为Reply Message回复给发起端。这是一个 request / data conversation(请求/数据对话).
3、如果发起端将单块消息中的数据发送给响应端,并期望从响应端回复确认。这是一个 send / acknowledge conversation(发送/确认会话).
4、如果发起端有一个要为特定的交互发送的多块消息,则发起端必须在发送数据之前获得响应端的许可.
会话中的第1个事务请求发送权限,响应端授予或拒绝发送权限。如果授予权限,发起端发送数据,响应端进行相应地回复.
这是一个 inquire / grant / send / acknowledge conversation(询问/授予/发送/确认对话).
5、一个关于在设备和主机之间传输未格式化的数据集的对话,这个会话在 Stream 13 中有详细描述.
6、 一个关于设备之间原料处理的会话。这个会话在 Stream 4中详细描述.
7、发起端可以向响应端请求需要一段时间才能获取的信息(例如,操作员的输入).
会话中的第一个事务请求信息,并且响应端以三种方式之一响应:(1)返回信息,(2)响应端表示不能或不会获得信息,(3)响应端表示将在随后的事务中获得并返回信息.
对于方式(3),响应端将在信息可用时启动后续事务返回信息。方式(3)是一个 request / acknowledge / send / acknowledge conversation(请求/确认/发送/确认对话).
所有根据SECS-II标准的消息使用两种数据结构,即 Item (项目) 和 List(列表)。消息数据结构定义了消息的逻辑划分,与消息传输协议的物理划分不同.
消息的数据结构旨在为在设备和主机之间传递的消息提供一个自描述的内部结构.
一个Item是一个具有长度和格式的信息包。由 Item Header 和 Item Body 组成.
Item的前2个、前3个或前4个字节称为 Item Header ,用以描述Item的长度和格式。Item Header后的字节称为 Item Body,Item Body是Item的实际数据.
下图是 Item Header 的结构图
这个图看着是不是挺复杂的,不用急,我们一步一步的捋清楚后,就会发现并不难.
LSB和MSB的含义:
MSB(Most Significant Bit) :最高有效位,二进制中代表最高值的比特位,这一位对数值的影响最大.
LSB(Least Significant Bit) :最低有效位,二进制中代表最低值的比特位 。
例如,在二进制的1001(十进制的9)中,最左边的“1”即是MSB对数值影响最大,从1到9的变化幅度。而最右边的1是LSB因为仅会让数值产生8到9的变化。
总结:MSB指二进制中表示的最高有效位,LSB指数据的最低有效位,1( MSB )001( LSB ) 。
从上图中我们知道,Header的第1个字节为 Format byte ,其后的字节为Length byte.
注意这里的其后的字节为 Length byte,这里的 字节数不是固定的.
Format byte 被各位了两部分, 前面两位表示:Item Body的长度,后面的表示:数据的格式,即ItemBody中的字节数据类型 .
Format byte的第1位和第2位:
定义Format byte后面有几个字节来表述Item Body的长度。取值只能1、2、3。如果值为2,则表示有2个字节表述Item Body的长度,即第2个和第3个字节。值为0是非法的,会产生错误.
这里就解释了上面为什么说:其后的字节为 Length byte,这里的 字节数不是固定的。因为Format byte的第1位和第2位一共有意义的值有1、2、3,即 Item Header 的 字节可能为 :前2个、前3个或前4个字节.
这里有一个需要特别注意的点,图中的 No. of length bytes 为 0 时,说的是错误的数据格式。但是我看其他的文档,说的是 0 代表 无Item 。这里暂不清楚谁对谁错,也可能是不同的设备厂商有不同的定义。这里大家一定要注意!!! 。
Format byte的第3位至第8位:
定义数据的格式,即ItemBody中的字节数据类型。下图为数据类型定义表:
List 是一 组有序的元素,其中元素可以是Item或List .
List 的Header与数据类型为0的Item的Header形式相同。不过List的Header中的长度表示List中元素的个数,Item的Header中的长度表示数据字节的个数.
这里我页不太明白,清楚的朋友,请不吝赐教.
本地化字符串项是一个用于表示由多字节字符组成的字符串的Item。其Header中的Format Code为22(Octal)。它由string header和string组成.
因为字符有许多不同的编码方案,所以有一个附加的string header来表述字符集.
string header 是一个2字节16位的数字,它在 Item Header 之后,在string之前.
string header 是 Item 的 实际数据的一部分,所以它的长度计算包含在Item Header 的 Length byte 中.
下图为string header的编码集对应.
上面看了这么多理论,接下来一起看看几个 Item 的数据实例,来帮助我们进行理解.
1、包含一个二进制数据 10101010 的 Item.
00100001 Item, binary, 1 length byte
00000001 1 byte length
10101010 data byte
理解了上面这张图代表的含义,上面说的内容基本上就理解了.
2、 包含三个ASCII字符ABC的Item.
01000001 Item ASCII, 1 length byte
00000011 Three bytes long
01000001 ASCII A
01000010 ASCII B
01000011 ASCII C
3、包含三个2字节有符号整型数字的Item.
01101001 Item, 2-byte integers
00000110 6 bytes total (6/2=3 integers)
xxxxxxxx MSByte number x
xxxxxxxx LSByte number x
yyyyyyyy MSByte number y
yyyyyyyy LSByte number y
zzzzzzzz MSByte number z
zzzzzzzz LSByte number z
4、 包含一个4字节浮点数的Item.
10010001 Item, 4-byte floating point
00000100 4 bytes (4/4=1 number)
ffffffff
ffffffff Floating point number
ffffffff
ffffffff
SECS-II 消息包含一个 structure or layout (结构或布局) 。该布局定义了SECS-II消息的所有数据项。布局是消息中遵循 Stream and Function notation (流和函数符号) 的一部分.
上面中 L、A 这种是什么意思呢,还记得我们在 4.1 Item 中介绍的 Format byte 中 第3位到第8位 的作用吗?这里就是的 L、A 就是表示 Item Body 中的数据类型。我们称之为 Data Item 。接下来一起看看有哪些 Data Item吧.
数据项由 format codes(格式代码) 定义。下表中列出了所有可能的数据项及其格式代码。格式代码仅由6位来定义.
需要注意的是,List 类型的数据项可以包含 其他数据项,当然了,也可以包含 List 数据项.
Type 缩写 | Type | 含义 | Format Code |
---|---|---|---|
L | List | 列表 | 000000 |
A | ASCII | ASCII字符 | 010000 |
B | Binary | 二进制数 | 001000 |
Boolean | Boolean | 布尔值 | 001001 |
I1 | 1-byte Singed Integer | 1字节有符号整数 | 011001 |
I2 | 2-byte Singed Integer | 2字节有符号整数 | 011010 |
I4 | 4-byte Singed Integer | 4字节有符号整数 | 011100 |
I8 | 8-byte Singed Integer | 8字节有符号整数 | 011000 |
U1 | 1-byte UnSinged Integer | 1字节无符号整数 | 101001 |
U2 | 2-byte UnSinged Integer | 2字节无符号整数 | 101010 |
U4 | 4-byte UnSinged Integer | 4字节无符号整数 | 101100 |
U8 | 8-byte UnSinged Integer | 8字节无符号整数 | 101000 |
F4 | 4-byte Floating-Point | 4 字节浮点数 | 100100 |
F8 | 8-byte Floating-Point | 8字节浮点数 | 100000 |
JIS-8 | 网上的资料说是:JIS-8是一种 半导体器件的防水等级标准, 表示该器件能够在水深超过1米 的水下保持正常工作。 不知道对不对哈 |
010001 |
SECS-II消息可以使用几个约定进行注释。下面显示了两个更常见的惯例:
按照我的理解,这里的A[6] 是不对的,第一个 A[6]应该是A[4]。第二个 A[6]应该是A[7].
这里我放出来我看的文档的英文原版,大家自行理解.
Before a SECS-II message can be sent, the layout must be encoded. Each data item in the message layout is encoded and becomes part of the Data Structure. This is repeated until all the data items in the layout are encoded. The Data Structure is subsequently sent via the SECS-I protocol. 。
说说我的理解:
在发送SECS-II消息之前,我们要对数据进行编码,这里的数据指的是 5、Message Layout 中的完整数据。消息布局中的每个数据项都被编码,并成为数据结构的一部分。将重复此操作,直到布局中的所有数据项都被编码为止。数据结构随后通过 SECS-I 协议 发送。(这里其实还可以通过 HSMS协议 发送) 。
接下来我们要重点理解了,我们将一起来看看如何将 Data Item 编码:
这里我们先对 Item 有一个整体的认知,方便后面的叙述:
Encoded Data Item 的第一个字节包含数据项的 format code(格式代码) ,并定义了接下来 的将用几个字节 来表示数据项的长度。 format code 用第2位到第7位表示, the number of length bytes 用第0位和第1位表示,那可以知道,数据项的长度的取值范围是:0字节、1字节、2字节、3字节.
接下来的0、1、2或3个字节定义了数据的长度。例如,如果数据的大小为1000字节,那么将需要2个长度的字节来表示1000(03 E8十六进制 或 00000011 11100100二进制) 。
下表显示了可以用长度字节数表示的最大数据字节数.
Number of length bytes | Max data size |
---|---|
0 | Empty item |
1 | 256 bytes |
2 | 64 Kbytes |
3 | 7.99 Mbytes |
接下来的n个字节包含了该数据项的数据.
下面显示了如何对ASCII数据项进行编码。根据它所包含的数据字节数,它可能需要0、1、2或3个长度的字节来表示数据字节的总数.
010000 -> 表示 ASCII .
下面显示了一个示例SECS-II消息布局是如何编码的。请注意,在本例中,只有消息布局被编码,流和函数没有被编码。所有数值均以十六进制为单位,(例如: 52 = 01010010) 。
这里的 01、02 共同组成了 Item Header.
其中 01 中的 Format code 是:000000,表示 List 类型。长度是: 01,表示接下的一个字节表示数据的长度.
02 则表示 有2个元素.
由于SECS-I协议中的数据大小限制,编码的SECS-II消息(数据结构)可能不适合于一个SECS-I事务。因此,编码的SECS-II消息被划分为更小的块,一次发送一个块。这被称为多块消息传递.
每个SECS-I消息块被限制为244个已编码的SECS-II消息字节。消息块的最大数量为32,767,因此SECS-II编码的最大消息大小为 244 x 32,767 字节长.
SECS-II Parameters : 用于在实现消息协议时定义一些边界。下表显示了SECS-II控制系统中的参数:
SECS-II Parameters | 描述 |
---|---|
T3 | Reply Timeout |
T4 | Inter-Block Timeout |
T3 : 从发送端发送 Primary Message 到接收到响应端回复的 Secondary Message之间的时间间隔.
T4 : 多块传输中,接收到相邻块之间的时间间隔.
这是指一次要处理不止一个事务。事务是发送主消息和可选的接收辅助应答。一个事务在等待回复时被“打开”。交错是指有多个“打开”事务的能力。这允许发送多个主消息,而无需首先等待辅助回复。支持此特性并不是SECS-II的要求.
这里我们列出了更常用的SECS-II消息.
1、第一组消息通常在初始化时使用.
SECS-II | Description |
---|---|
S1F1 | Say hello to the equipment |
S1F13 | Establish communications with the equipment |
S2F15 | Set equipment constants |
S2F43 | Turn off spooling |
S2F33 | Create / Delete reports |
S2F35 | Link reports to events |
S2F37 | Enable / Disable events |
S5F3 | Enable / Disable alarms |
2、这些信息可用于配方选择、远程启动、晶圆片选择等 。
SECS-II | Description |
---|---|
S2F41 | Remote equipment control |
3、这些消息可用于数据收集。 |
SECS-II | Description |
---|---|
S6F3 | Older version of Event Reports |
S6F9 | Older version of Event Reports |
S6F11 | Event Reports |
4、S5F1用于处理设备报警 。
5、S9 这一类用于当设备检测到之前的消息错误时,由设备发送.
特别感谢 SECS半导体设备通讯-3 SECS-II通信标准 这边文章,让我对 SECS协议有一个入门的了解.
参考资料:
SECS半导体设备通讯-3 SECS-II通信标准 。
清晰讲解LSB、MSB和大小端模式及网络字节序 。
最后此篇关于02、SECS-II通信协议介绍的文章就讲到这里了,如果你想了解更多关于02、SECS-II通信协议介绍的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
大多数语言都支持双向进程通信。例如,在 Python 中,我可以(草率地)执行以下操作: >>> from subprocess import * >>> p = Popen('nslookup',
致力于使用 C++ 在 arduino 和 PC (Win 7) 之间进行通信。使用 WriteFile 和 ReadFile 创建通信或简单地发送或接收数据没有问题。但是当我想以某种方式“协调”沟通
我们正在开发一个基于微服务的应用程序。它们将使用 Helm Package Manager 部署到 kubernetes,并且它们都存储了自己的存储库和 helm chart。以下是我们微服务的名称。
我正在开发一个大型 MVVM 应用程序。我为此使用了 MVVM 轻量级工具包。该应用程序就像一个带有后退和前进按钮的网络浏览器。主视图是一个用户控件。我在主视图用户控件中放置了后退和前进按钮。主视图又
我在 java 和 freepascal(lazarus) 应用程序之间的通信有问题。我使用套接字。它们正确连接。一切都很顺利,直到我想从一个应用程序向另一个应用程序发送一些东西。在java而不是“a
我已经使用客户端套接字和服务器套接字使用C#编写了群聊。 当我使用VS 2017在自己的PC中运行程序(服务器和客户端)时,客户端和服务器之间的通信工作正常。 当我在笔记本电脑中运行客户端程序,并在自
Kubernetes 中两个不同 Pod 之间的通信是如何发生的? 就我而言,我有两个 Pod:前端和后端,它们都有不同的容器。 我希望我的前端 pod 与后端 pod 通信,但我不想使用后端 pod
我正在尝试在浏览器中嵌入的 flash 实例与在 C# WinForms 应用程序中运行的 flash 实例之间进行通信...我收到一个编译错误,内容为: 1119 Access of possibl
鉴于网络上缺乏信息,请问一个问题:我要在 Android 中创建一个应用程序,使用一个数据库应用程序 rails 。为此,我需要一个手动 session 。所以如果有人准备好了示例/教程显示通信 an
我正在编写一个应用程序,它将通过 MySQL 数据库对用户进行身份验证。我已经用 Java (android) 编写了它,但现在正在移植到 Windows 手机。 PHP 文件使用 $get 然后回显
是否可以通过互联网在两个不同设备上的两个不同应用程序之间建立通信。我想从设备 A 上的应用程序点击一个设备 B 上的应用程序,然后从设备 B 上的应用程序获取数据到设备 A 上的应用程序。如果可能,如
这是脚本: 它被放置在其他网站上。 com 并显示一个 iframe。如果有人点击 iframe 中的某个内容,脚本应该将一个 div 写入 othersite 。 com. 所以我的问题是如何做到
你好我是 php 的新手,我用 c++ 编写了整个代码并想在 php 中使用这段代码。所以我为我的代码制作了 dll 以使用它。但是我不能在 php 中使用这个 dll,可以谁能给我完整的代码来使用
我确定之前已经有人问过(并回答过)此类问题,所以如果是这样,请将我链接到之前的讨论... 在 C++ 中,假设我有一个 ClassA 类型的对象,其中包含一个 ClassB 类型的私有(private
我正在尝试使用 ATmega32 进行串行通信。首先,我使用 RS232,使用 USB-to-RS232 建立使用串行终端的接收和传输(在我的例子中是 tera 术语)。无论我从串行终端 Atmega
我找不到适用于 Ruby 的 SSL 实现。 我的部分项目需要服务器和客户端之间的安全通信链接,我希望为此使用 SSL 以创建安全 session 。 谢谢 最佳答案 如果你使用 Ruby 1.9.x
我正在尝试在客户端/服务器之间进行 SSL 通信。 到目前为止,我已经从 keystore 创建了 java.security.cert.X509Certificate。接下来我应该怎么做才能使这次沟
我在与 Windows 上的 USB 设备 通信时遇到问题。我不能使用 libusb 或 WinUSB,因为我有一个特定的驱动程序(Silabs USB 到 UART,这是一个 USB 到串口的桥接器
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我发现 xcom 实际上是将数据写入数据库并从其他任务中提取数据。我的数据集很大,将其腌制并写入数据库会导致一些不必要的延迟。有没有办法在不使用 xcom 的情况下在同一 Airflow Dag 中的
我是一名优秀的程序员,十分优秀!