S7协议抓包分析(附pcap数据包)

news2024/11/24 8:35:36

一、S7协议概述

1、S7协议简介

S7comm(S7 通信)是西门子专有协议,可在西门子 S7-300/400 系列的可编程逻辑控制器 (PLC) 之间运行。它用于 PLC 编程、PLC 之间的数据交换、从 SCADA(监控和数据采集)系统访问 PLC 数据以及诊断目的。

S7comm 数据作为 COTP 数据包的有效载荷出现,第一个字节总是 0x32 作为协议标识符。

要建立与 S7 PLC 的连接,有 3 个步骤:

  1. 通过 TCP 端口 102 连接到 PLC;
  2. 在 ISO 层连接(COTP 连接请求);
  3. 在 S7comm 层连接(s7comm.param.func = 0xf0,Setup 通信);

步骤 1:使用 PLC/CP 的 IP 地址。

步骤 2:用作两个字节长度的目标 TSAP。目标 TSAP 的第一个字节编码通信类型(1=PG,2=OP)。目标 TSAP 的第二个字节编码机架和插槽号:这是 PLC CPU 的位置。插槽编号在位 0-4 中编码,机架编号在位 5-7 中编码。

步骤 3:用于协商 S7comm 的具体细节(如 PDU 大小)。

2、S7协议报文头解析

1. TPKT协议

TPKT协议是一个传输服务协议,它为上层的COPT和下层TCP进行了过渡。我们常用的RDP协议(remote desktop protocol,windows的远程桌面协议)也是基于TPKT的,TPKT的默认TCP端口为102(RDP为3389),其实它本身为payload增加的数据并不多,主要就是以下几个:

  • version,1byte,表明版本信息;
  • reserved,1byte,保留;
  • length,2byte,包括payload和这三部分在内的总长度;

2. COTP

COTP协议的全称是Connection-Oriented Transport Protocol,即面向连接的传输协议,从这个名字就可以看出,它的传输必然是依赖于连接的,所以在传输数据前必然有类似TCP握手建立链接的操作。

这里wireshark为我们标注出了CR和CC,后面的COTP包都是DT,这里的CR和CC其实分别是connect request和connet confirm的,也就是建立连接的过程,之后连接建立成功后,发送DT包,也就是data,是在发送数据。

接下来我们看一下COTP的连接包: 

第一部分:

包含:length、PDU type、DST reference、SRC reference length :标识长度(但是length这个标识位不计入长度)

PDU type:标识类型,常见的值有:

  • 0x01: ED Expedited Data,加急数据;
  • 0x02: EA Expedited Data Acknowledgement,加急数据确认;
  • 0x04: UD,用户数据;
  • 0x05: RJ Reject,拒绝;
  • 0x06: AK Data Acknowledgement,数据确认;
  • 0x07: ER TPDU Error,TPDU错误;
  • 0x08: DR Disconnect Request,断开请求;
  • 0x0C: DC Disconnect Confirm,断开确认;
  • 0x0D: CC Connect Confirm,连接确认;
  • 0x0E: CR Connect Request,连接请求;
  • 0x0F: DT Data,数据传输;

DST reference:目标标识。

SRC reference:源标识。

第二部分(option):

可以看到在wireshark中将这部分(1个byte拆成了前四位和后两位),其中:

  • 前四位标识class,也就是标识类别;
  • 倒数第二位对应Extended formats,是否使用拓展样式;
  • 倒数第一位对应No explicit flow control,是否有明确的指定流控制;

第三部分(parameter):

分为三部分:parameter code、parameter length、data。

parameter code:标识类型,主要有:

  • 0xc0,tpdu的size,tpdu即传送协议数据单元,也就是传输的数据的大小;
  • 0xc1,src-tsap (源设备号);
  • 0xc2,dst-tsap (同上)
    parameter length:长度
    data:对应数据

COPT功能包:

可以看到COTP功能包的PDU type为0X0f,只有三部分:length,type,opt。

以上便是TPKT和COTP协议的解析过程。

3、S7COMM

S7Comm数据作为COTP数据包的有效载荷,第一个字节总是0x32作为协议标识符。

S7Comm协议包含三部分:

  • Header
  • Parameter
  • Data

根据实现的功能不同,S7comm协议的结构会有所不同。

1. Header部分

在Header中最重要的字段就是ROSCTR,它决定了后续参数的结构。ROSCTR的类型常见有以下值:

  • 0x01 - JOB(Request: job with acknowledgement):作业请求。由主设备发送的请求(例如,读/写存储器,读/写块,启动/停止设备,设置通信);
  • 0x02 - ACK(acknowledgement without additional field):确认响应,没有数据的简单确认(未遇到过由S7 300/400设备发送得);
  • 0x03 - ACK_DATA(Response: acknowledgement with additional field):确认数据响应,这个一般都是响应JOB的请求;
  • 0x07 - USERDATA:原始协议的扩展,参数字段包含请求/响应ID(用于编程/调试,读取SZL,安全功能,时间设置,循环读取...);

2. Parameter部分

Parameter的第一个字段为function,根据Header中ROSCTR的类别和Parameter中function的不同,parameter的结构,目的也会有所不同。

下面根据不同的功能码(function的值)讲解parameter的字段的构成:

  • 0XF0(建立通信)

建立通信在每个会话开始时被发送,然后可以交换任何其他消息。它用于协商ACK队列的大小和最大PDU长度,双方声明它们的支持值。ACK队列的长度决定了可以同时启动而不需要确认的并行作业的数量。PDU和队列长度字段都是大端。

当PDU类型为Job(ROSCTR的值为0x01),function为0xf0时,Paramter的结构为:

具体的Parameter结构,如下:

  • 1 (Unsigned integer, 1 byte): Parameter part: Reserved byte in communication setup pdu,保留字节;
  • 2 (Unsigned integer, 2 bytes): Max AmQ (parallel jobs with ack) calling;
  • 3 (Unsigned integer, 2 bytes): Max AmQ (parallel jobs with ack) called;
  • 4 (Unsigned integer, 2 bytes): Parameter part: Negotiate PDU length。协商PDU长度;

从响应包可以看出ack队列为1,PDU最大长度为240(不同的function的值,parameter的结构不一样)。

  • 0x04(读取值)

当PDU类型为Job,function为0x04时,Parameter的结构为:

二、S7协议抓包分析

这三层不用管由计算机自行完成 重点是看S7comm这一层。

功能码附录:

0x00 CPU services CPU服务;
0xf0  Setup communication 建立通信;
0x04 Read Var 读取值;
0x05 Write Var 写入值;
0x1a Request download 请求下载;
0x1b Download block 下载块;
0x1c  Download ended 下载结束;
0x1d  Start upload 开始上传;
0x1e  Upload 上传;
0x1f   End upload 上传结束;
0x28  PI-Service 程序调用服务;
0x29  PLC Stop 关闭PLC;

S7协议一般具有三层 header、parameter、data 根据事先功能不同,协议结构会有所不同。

1、0xF0 建立通信

发送包:

  • Byte[0] 32 为 协议ID   一般指定为0x32;
  • Byte[1] 01 为 PDU类型  一般有0x01 Job 主设备发起请求 0x02 Ack 确认响应 0x03 Ack_data 确认数据响应一般作为确认0x01的请求 0x07 USERDATA     协议的扩展,参数字段包含请求/响应ID; 
  • Byte[2]Byte[3] 00 00冗余数据,通常为0×0000;
  • Byte[4]Byte[5] 3e 02协议数据单元的参考、通过请求事件增加;
  • Byte[6]Byte[7] 00 08参数的总长度 也就是parameter的长度;
  • Byte[8]Byte[9] 00 00数据的长度、也就是data部分数据的长度 如果无即为0; 

  • Byte[0] f0 为PDU的类型 也就是功能码;
  • Byte[1] 00 冗余数据,通常为0×0000;
  • Byte[2] Byte[3]  job呼唤;
  • Byte[4] Byte[5]  job呼叫;
  • Byte[6] Byte[7]  协商的PDU长度;

回包:

红框内的与发送的一样不做描述了:

  • Byte[10] 00 为错误类型;
  • 0x00    No error    没有错误;
  • 0x81    Application relationship    应用关系;
  • 0x82    Object definition    对象定义;
  • 0x83    No resources available    没有可用资源;
  • 0x84    Error on service processing    服务处理中错误;
  • 0x85    Error on supplies    请求错误;
  • 0x87    Access error    访问错误;
  • Byte[11] 00 为错误码,最后会附录一下全部错误码;

  • Byte[0] f0 为PDU的类型 也就是功能码;
  • Byte[1] 00 冗余数据,通常为0×0000;
  • Byte[2] Byte[3]  确认job;
  • Byte[4] Byte[5]  确认job;
  • Byte[6] Byte[7]  协商的PDU长度; 

2、解析userdata 包

Header头地方与其他都较为一致,可自行对比,不在描述了。

重点是Parameter这个地方:

  • Byte[0] Byte[1] Byte[2] 00 01 12 参数头部信息;
  • Byte[3] 04 为之后的数据个数;
  • Byte[4] 11 对应的是Request也就是请求的意思;
  • Byte[5] 44 这个因为wireshark 帮我们解析了8位 前四位 0100 对应的就是Request请求;
  • 说明PDU是从主机请求设备的 后四位0100 对应的是所属类型也就是CPU功能;
  • Byte[6] 01 前面44是规定了大的方向 这个01就是具体要干什么了 图中01就是read szl。在这里解释一下szl 是什么ssl缩写是系统状态 S7协议是德国西门子的 德国状态的是Z开头的所以 缩写为 szl;
  • Byte[7] 字面意思由主机指定顺序;

Data部分:

  • Byte[0] ff 返回码; 
  • Byte[1] 09 指的数据类型,通常有bit、byte等;
  • Byte[2]Byte[3] 00 04 后面数据的个数;

SZL部分:

前四位为操作的对象是什么 0000 为CPU 1100为cp 1000为fm 0100为im。

中间0000 0000 0000 0000是wireshark解析错了按照官方的应该为四位后八位,表明的是局部列表的序号,我们只需要关注最后两位就行(0x00)。

下面是各类的序号图:

回包: 

Header头部不做描述了,与之前都相同的。

  • 00 01 12 与发包一致;
  • 08  长度;
  • 12  对应的Response 回应请求
  • 84  前四位1000 对应的就是 Response  后四位 0100就是要读CPU
  • 01  读系统状态SZL 
  • 00  与发包一致
  • 00  数据的编号
  • 00字译 最后一个数据单元
  • 00错误码  错误码回头我都会附录到后面

Data部分:

  • FF 返回码;
  • 09  指的数据类型,通常有bit、byte等;
  • 00 e8 后面数据个数;
  • SZL-ID 和 Index 跟发包是一样的不做介绍了;
  • 00 02   是一个数据占用多少bytes;
  • 00 70   转换为10进制为112 代表了有112个SZL_data_tree;

后面的PDU就不在分析了都是做读取相关类的相关信息、只不过是指定的局部列表不同、index不同罢了。 

3、0x04 读数据操作

Header头部,与之前都一样的不再描述了。

Parameter,参数部分。 

  • Byte[0]  04功能码;
  • Byte[1]  01 代表了Item的个数 为1 即为一个; 

Item部分:

  • Byte[0] 12结构标识通常都为0x12,代表变量规范。
  • Byte[1] 0a 长度规范、自此往后的长度。
  • Byte[2] 10  IDS的地址规范的格式类型,常见值如下表:
  1. 0x10    S7ANY    Address data S7-Any pointer-like DB1.DBX10.2;
  2. 0x13    PBC-R_ID    R_ID for PBC;
  3. 0x15    ALARM_LOCKFREE    Alarm lock/free dataset;
  4. 0x16    ALARM_IND    Alarm indication dataset;
  5. 0x19    ALARM_ACK    Alarm acknowledge message dataset;
  6. 0x1a    ALARM_QUERYREQ    Alarm query request dataset;
  7. 0x1c      NOTIFY_IND    Notify indication dataset;
  8. 0xa2    DRIVEESANY    seen on Drive ES Starter with routing over S7;
  9. 0xb2    1200SYM    Symbolic address mode of S7-1200;
  10. 0xb0    DBREAD    Kind of DB block read, seen only at an S7-400;
  11. 0x82    NCK    Sinumerik NCK HMI access;
  • Byte[3] 02 为数据传输的大小、常见值如下表:
|   :----- | :----- | :----- |
| 0 | NULL |
| 3 | BIT  | bit access, len is in bits
| 4 | BYTE/WORD/DWORD | byte/word/dword access, len is in bits
| 5 | INTEGER | integer access, len is in bits
| 6 | DINTEGER | integer access, len is in bytes
| 7 | REAL  | real access, len is in bytes
| 9 | OCTET STRING | octet string, len is in bytes

  • Byte[4]Byte[5] 00 01 即数据的长度。
  • Byte[6]byte[7] 00 01  即 DB 编号,如果访问的不是DB区域,此处为0x0000。
  • Byte[8] 84 即数据的区域 常用的如下表:

  • Byte[9] Byte[10]Byte[11] 数据的地址。

图示整体解析一下:

回包: 

Header部分: 

除了红框内的其他都与发包一致。

  • Error class 即错误类型;
  • Error code 即具体错误码 这两个在上面已经介绍了都有哪些错误类型,没有错误即0x00;

Parameter部分:

Byte[0] 04 功能码:

Byte[1] 01 代表一个Item。

 Data部分:

Byte[0] FF 为返回码,返回码如下:

  1. 0x00    Reserved    未定义,预留;
  2. 0x01    Hardware error    硬件错误;
  3. 0x03    Accessing the object not allowed    对象不允许访问;
  4. 0x05    Invalid address    无效地址,所需的地址超出此PLC的极限;
  5. 0x06    Data type not supported    数据类型不支持;
  6. 0x07    Data type inconsistent    日期类型不一致;
  7. 0x0a    Object does not exist    对象不存在;
  8. 0xff        Success  成功;

Byte[1] 04 为数据传输大小,data数据传输大小值如下:
0    NULL
3    BIT    bit access, len is in bits
4    BYTE/WORD/DWORD    byte/word/dword access, len is in bits
5    INTEGER    integer access, len is in bits
6    DINTEGER    integer access, len is in bytes
7    REAL    real access, len is in bytes
9    OCTET STRING    octet string, len is in bytes

Byte[2] Byte[3]为data数据的长度。

Byte[4] 即数据。

有时候会有填充数据 即在byte[4]之后、如果数据长度不满足length的话会填充0x00。例如 byte[2]byte[3] 的长度值为3 就会在byte[4]后填充两个0x00。

4、0x05 写入值

发包:

Header  都与读取值一样的,就不在说了。

Parameter也一样,再说一次吧。

根据读取值对比写入值只比它多了个data部分: 

  • Byte[0]  00 返回码 未定义就为00;
  • Byte[1]  04 数据传输的大小;
  • Byte[2]Byte[3] 数据的长度;
  • Byte[4] 数据;

回包:

Header部分和parameter部分都一样。

data部分: 

Byte[0] FF 即为返回码。

上面介绍有返回码的类型,FF标识向0x000000地址写入成功。

5、0x1a 请求下载

发包:

  • Byte[0]  1a 功能码。
  • Byte[1]  00 即功能状态,包含错误是否发生、是否使用另一个检索块/文件来请求的更多数据网络状态。
  • Byte[2] Byte[3] 01 00没什么意义。
  • Byte[4] 到 Byte[7] 没什么意义,一般都为0x00000000。
  • Byte[8] 09为文件名的长度。
  • Byte[9]到Byte[17] 为文件名。

  • Byte[0] 5f 文件标识符。
  • Byte[1] Byte[2] 30 41 块类型 s7有8中不同的块类型。
  • 0x3041    DB, ASCII为'0A',数据块    DB是用于存储用户数据的数据区域,除了指定给一个功能块的数据,还可以定义可以被任何块使用的共享数据。
  • Byte[3] 到Byte[7] 30 30 30 30 31 即请求的块编号。
  • Byte[8] 50 即请求目标的文件系统,有三种:
  1. P(Passive (copied, but not chained) module):被动文件系统
  2. A (Active embedded module):主动文件系统
  3. B (Active as well as passive module):既主既被文件系统种
  • Byte[18] 0d 参数第二部分的长度、即为接下来数据的长度。
  • Byte[19] 31即加载mem之前的未知字符。
  • Byte[20] 到 Byte[25]  即装载长度。
  • Byte[26] 到 Byte[31]  即 MC7 代码长度。

整个意思就是请求下载(请求的标识是 5f 、请求的块类型是 DB 块的编号是0001 、目标块文件系统是P、所以文件名为_0A00001P,用于将DB1复制到被动文件系统或从被动文件系统复制)。

回包:

参数部分只回复了1a 代表确认请求了 确认请求之后就会进行下载块(功能码为:1b)。 

6、0x1b下载块

发包:

红框内都一样(其他的也都一样) 从length开始加深一下吧。

  • Byte[0] 09 表示之后的数据长度。
  • Byte[1] 5f  文件标识符。
  • Byte[2] 30 41 块类型。
  • Byte[3] 30 30 30 30 31 块编号。
  • Byte[4] 50 请求目标的文件系统。

回包:

与发包相比较只多了个data部分,介绍data部分就行了。

  • Byte[0] Byte[1] 00 de data数据内容的长度;
  • Byte[2] Byte[3] 00 fb 未知字节;
  • Byte[4]到尾 都是数据内容; 

7、0x1c 下载结束

发包:

与0x1a和0x1b都一样 ,少了装载长度和MC7长度 意思就是结束下载了,这里就不做描述了。

回包: 

也很简单,参数部分只回复了个1c 就是下载结束的意思了。

8、0x1d 开始上传

发包:

可以看到,开始上传的结构和请求下载的前部分结构一致。

如上图所示的内容,其实就是告诉 PLC 一个文件名,文件标识是_ (Complete Module),块类型为0B(SDB),块的编号为00000,目标块的文件系统是A (Active embedded module),所以文件名为_0B00000A,基本与请求下载都一样 Fliename就是文件名长度UploadID即为会话ID的意思。

回包: 

  • Byte[0] 1d功能码 Byte[1] 00 功能状态; 
  • Byte[2] Byte[3] 01 00 即即blockcontrol中的所有未知字节;
  • Byte[4] Byte[7] 会话ID;
  • Byte[8] 即自此之后的数据长度;
  • Byte[9]到尾 完整上传快的长度(以字节为单位)、可以拆分为多个PDU; 

9、0x1e 上传

发包:

这个就不做介绍了UploadID与1d回应的ID是对照的。

回包:

如之前的一样、不做介绍了。

Length:数据内容长度。

Unknown byte(s) in blockcontrol:未知字节。

Data:数据。 

10、0x1f 上传结束

发包:

都一样不描述了,其中只是多了个错误代码Errorcode。

回包:

只回复了个1f 是上传结束了。 

11、0x28 程序调用服务

发包:

  • Byte[0] 28功能码;
  • Byte[1] 到byte[7] 00 00 00 00 00 00 fd 未知字节;
  • Byte[8] byte[9] 00 02 Parameter block的 长度;
  • Byte[10] byte[11] 45 50 即参数块;
  • Byte[12] 05 即PI程序调用服务名的数据长度;
  • Byte[13] 到尾 5f 4d 4f 44 55为程序调用服务名 (附录二 );

回包 :

Header头不讲,parameter只回复了0x28就是说明确认请求成功。 

12、0x29 关闭PLC

这个跟之前的都一样、我再整体的图示一下吧,不一个字节一个字节说了。

发包:

回包:

13、userdata协议扩展

时间设置 (包含读时间、写时间)。

读时间的发包:

可以看出,基本与读SZL状态是一样的,我在整体标记一下吧。

回包:

Parameter:

Data:

写时间。

发包: 

与读时间是一样的,只不过data部分是在发包阶段 。

回包:

也都一样,只是返回码不一样。 

  • 0x0a    Object does not exist   对象不存在;

其他的也都大差不差,自己比对一下就OK了。

附录一:错误码具体含义。

0x0000

没有错误

0x0110

块号无效

0x0111

请求长度无效

0x0112

参数无效

0x0113

块类型无效

0x0114

找不到块

0x0115

块已存在

0x0116

块被写保护

0x0117

块/操作系统更新太大

0x0118

块号无效

0x0119

输入的密码不正确

0x011A

PG资源错误

0x011B

PLC资源错误

0x011C

协议错误

0x011D

块太多(与模块相关的限制)

0x011E

不再与数据库建立连接,或者S7DOS句柄无效

0x011F

结果缓冲区太小

0x0120

块结束列表

0x0140

可用内存不足

0x0141

由于缺少资源,无法处理作业

0x8001

当块处于当前状态时,无法执行请求的服务

0x8003

S7协议错误:传输块时发生错误

0x8100

应用程序,一般错误:远程模块未知的服务

0x8104

未在模块上实现此服务或报告了帧错误

0x8204

对象的类型规范不一致

0x8205

复制的块已存在且未链接

0x8301

模块上的内存空间或工作内存不足,或者指定的存储介质不可访问

0x8302

可用资源太少或处理器资源不可用

0x8304

无法进一步并行上传。存在资源瓶颈

0x8305

功能不可用

0x8306

工作内存不足(用于复制,链接,加载AWP)

0x8307

保持性工作记忆不够(用于复制,链接,加载AWP)

0x8401

S7协议错误:无效的服务序列(例如,加载或上载块)

0x8402

由于寻址对象的状态,服务无法执行

0x8404

S7协议:无法执行该功能

0x8405

远程块处于DISABLE状态(CFB)。该功能无法执行

0x8500

S7协议错误:帧错误

0x8503

来自模块的警报:服务过早取消

0x8701

寻址通信伙伴上的对象时出错(例如,区域长度错误)

0x8702

模块不支持所请求的服务

0x8703

拒绝访问对象

0x8704

访问错误:对象已损坏

0xD001

协议错误:非法的作业号

0xD002

参数错误:非法的作业变体

0xD003

参数错误:模块不支持调试功能

0xD004

参数错误:作业状态非法

0xD005

参数错误:作业终止非法

0xD006

参数错误:非法链路断开ID

0xD007

参数错误:缓冲区元素数量非法

0xD008

参数错误:扫描速率非法

0xD009

参数错误:执行次数非法

0xD00A

参数错误:非法触发事件

0xD00B

参数错误:非法触发条件

0xD011

调用环境路径中的参数错误:块不存在

0xD012

参数错误:块中的地址错误

0xD014

参数错误:正在删除/覆盖块

0xD015

参数错误:标签地址非法

0xD016

参数错误:由于用户程序错误,无法测试作业

0xD017

参数错误:非法触发号

0xD025

参数错误:路径无效

0xD026

参数错误:非法访问类型

0xD027

参数错误:不允许此数据块数

0xD031

内部协议错误

0xD032

参数错误:结果缓冲区长度错误

0xD033

协议错误:作业长度错误

0xD03F

编码错误:参数部分出错(例如,保留字节不等于0)

0xD041

数据错误:非法状态列表ID

0xD042

数据错误:标签地址非法

0xD043

数据错误:找不到引用的作业,检查作业数据

0xD044

数据错误:标签值非法,检查作业数据

0xD045

数据错误:HOLD中不允许退出ODIS控制

0xD046

数据错误:运行时测量期间非法测量阶段

0xD047

数据错误:“读取作业列表”中的非法层次结构

0xD048

数据错误:“删除作业”中的非法删除ID

0xD049

“替换作业”中的替换ID无效

0xD04A

执行'程序状态'时出错

0xD05F

编码错误:数据部分出错(例如,保留字节不等于0,...)

0xD061

资源错误:没有作业的内存空间

0xD062

资源错误:作业列表已满

0xD063

资源错误:触发事件占用

0xD064

资源错误:没有足够的内存空间用于一个结果缓冲区元素

0xD065

资源错误:没有足够的内存空间用于多个结果缓冲区元素

0xD066

资源错误:可用于运行时测量的计时器被另一个作业占用

0xD067

资源错误:“修改标记”作业过多(特别是多处理器操作)

0xD081

当前模式下不允许使用的功能

0xD082

模式错误:无法退出HOLD模式

0xD0A1

当前保护级别不允许使用的功能

0xD0A2

目前无法运行,因为正在运行的函数会修改内存

0xD0A3

I / O上活动的“修改标记”作业太多(特别是多处理器操作)

0xD0A4

'强制'已经建立

0xD0A5

找不到引用的作业

0xD0A6

无法禁用/启用作业

0xD0A7

无法删除作业,例如因为当前正在读取作业

0xD0A8

无法替换作业,例如因为当前正在读取或删除作业

0xD0A9

无法读取作业,例如因为当前正在删除作业

0xD0AA

处理操作超出时间限制

0xD0AB

进程操作中的作业参数无效

0xD0AC

进程操作中的作业数据无效

0xD0AD

已设置操作模式

0xD0AE

作业是通过不同的连接设置的,只能通过此连接进行处理

0xD0C1

访问标签时至少检测到一个错误

0xD0C2

切换到STOP / HOLD模式

0xD0C3

访问标记时至少检测到一个错误。模式更改为STOP / HOLD

0xD0C4

运行时测量期间超时

0xD0C5

块堆栈的显示不一致,因为块被删除/重新加载

0xD0C6

作业已被删除,因为它所引用的作业已被删除

0xD0C7

由于退出了STOP模式,因此作业被自动删除

0xD0C8

由于测试作业和正在运行的程序之间不一致,“块状态”中止

0xD0C9

通过复位OB90退出状态区域

0xD0CA

通过在退出前重置OB90并访问错误读取标签退出状态范围

0xD0CB

外设输出的输出禁用再次激活

0xD0CC

调试功能的数据量受时间限制

0xD201

块名称中的语法错误

0xD202

函数参数中的语法错误

0xD205

RAM中已存在链接块:无法进行条件复制

0xD206

EPROM中已存在链接块:无法进行条件复制

0xD208

超出模块的最大复制(未链接)块数

0xD209

(至少)模块上找不到给定块之一

0xD20A

超出了可以与一个作业链接的最大块数

0xD20B

超出了一个作业可以删除的最大块数

0xD20C

OB无法复制,因为关联的优先级不存在

0xD20D

SDB无法解释(例如,未知数)

0xD20E

没有(进一步)阻止可用

0xD20F

超出模块特定的最大块大小

0xD210

块号无效

0xD212

标头属性不正确(与运行时相关)

0xD213

SDB太多。请注意对正在使用的模块的限制

0xD216

无效的用户程序 - 重置模块

0xD217

不允许在模块属性中指定的保护级别

0xD218

属性不正确(主动/被动)

0xD219

块长度不正确(例如,第一部分或整个块的长度不正确)

0xD21A

本地数据长度不正确或写保护错误

0xD21B

模块无法压缩或压缩早期中断

0xD21D

传输的动态项目数据量是非法的

0xD21E

无法为模块(例如FM,CP)分配参数。系统数据无法链接

0xD220

编程语言无效。请注意对正在使用的模块的限制

0xD221

连接或路由的系统数据无效

0xD222

全局数据定义的系统数据包含无效参数

0xD223

通信功能块的实例数据块错误或超出最大背景数据块数

0xD224

SCAN系统数据块包含无效参数

0xD225

DP系统数据块包含无效参数

0xD226

块中发生结构错误

0xD230

块中发生结构错误

0xD231

至少有一个已加载的OB无法复制,因为关联的优先级不存在

0xD232

加载块的至少一个块编号是非法的

0xD234

块在指定的内存介质或作业中存在两次

0xD235

该块包含不正确的校验和

0xD236

该块不包含校验和

0xD237

您将要加载块两次,即CPU上已存在具有相同时间戳的块

0xD238

指定的块中至少有一个不是DB

0xD239

至少有一个指定的DB在装载存储器中不可用作链接变量

0xD23A

至少有一个指定的DB与复制和链接的变体有很大不同

0xD240

违反了协调规则

0xD241

当前保护级别不允许该功能

0xD242

处理F块时的保护冲突

0xD250

更新和模块ID或版本不匹配

0xD251

操作系统组件序列不正确

0xD252

校验和错误

0xD253

没有可用的可执行加载程序; 只能使用存储卡进行更新

0xD254

操作系统中的存储错误

0xD280

在S7-300 CPU中编译块时出错

0xD2A1

块上的另一个块功能或触发器处于活动状态

0xD2A2

块上的触发器处于活动状态。首先完成调试功能

0xD2A3

块未激活(链接),块被占用或块当前被标记为删除

0xD2A4

该块已被另一个块函数处理

0xD2A6

无法同时保存和更改用户程序

0xD2A7

块具有“未链接”属性或未处理

0xD2A8

激活的调试功能阻止将参数分配给CPU

0xD2A9

正在为CPU分配新参数

0xD2AA

当前正在为模块分配新参数

0xD2AB

当前正在更改动态配置限制

0xD2AC

正在运行的激活或取消激活分配(SFC 12)暂时阻止R-KiR过程

0xD2B0

在RUN(CiR)中配置时发生错误

0xD2C0

已超出最大工艺对象数

0xD2C1

模块上已存在相同的技术数据块

0xD2C2

无法下载用户程序或下载硬件配置

0xD401

信息功能不可用

0xD402

信息功能不可用

0xD403

服务已登录/注销(诊断/ PMC)

0xD404

达到的最大节点数。不再需要登录诊断/ PMC

0xD405

不支持服务或函数参数中的语法错误

0xD406

当前不可用的必需信息

0xD407

发生诊断错误

0xD408

更新已中止

0xD409

DP总线错误

0xD601

函数参数中的语法错误

0xD602

输入的密码不正确

0xD603

连接已合法化

0xD604

已启用连接

0xD605

由于密码不存在,因此无法进行合法化

0xD801

至少有一个标记地址无效

0xD802

指定的作业不存在

0xD803

非法的工作状态

0xD804

非法循环时间(非法时基或多个)

0xD805

不能再设置循环读取作业

0xD806

引用的作业处于无法执行请求的功能的状态

0xD807

功能因过载而中止,这意味着执行读取周期所需的时间比设置的扫描周期时间长

0xDC01

日期和/或时间无效

0xE201

CPU已经是主设备

0xE202

由于闪存模块中的用户程序不同,无法进行连接和更新

0xE203

由于固件不同,无法连接和更新

0xE204

由于内存配置不同,无法连接和更新

0xE205

由于同步错误导致连接/更新中止

0xE206

由于协调违规而拒绝连接/更新

0xEF01

S7协议错误:ID2错误; 工作中只允许00H

0xEF02

S7协议错误:ID2错误; 资源集不存在

附录二:程序服务调用名称。

服务名称   | 值(描述)
| :-----  | :-----|
| UNKNOWN | PI-Service目前不详
| _INSE   | PI-Service _INSE(激活PLC模块)
| _DELE   | PI-Service _DELE(从PLC的被动文件系统中删除模块)
| P_PROGRAM | PI-Service P_PROGRAM(PLC启动/停止)
| _MODU   | PI-Service _MODU(PLC Copy Ram to Rom)
| _GARB   | PI-Service _GARB(压缩PLC内存)
| _NLOGIN | PI-Service _NLOGIN(登录)
| _N_LOGOUT | PI-Service _N_LOGOUT(退出)
| _N_CANCEL | PI-Service _N_CANCEL(取消NC报警)
| _N_DASAVE | PI-Service _N_DASAVE(用于将数据从SRAM复制到FLASH的PI-Service)
| _N_DIGIOF P| I-Service _N_DIGIOF(关闭数字化)
| _N_DIGION | PI-Service _N_DIGION(打开数字化)
| _NDZERO   | PI-Service _NDZERO(设置所有D nos。对于函数无效\“唯一D号。\”)
| _N_ENDEXT | PI-Service _N_ENDEXT()
| _N_F_OPER | PI-Service _N_F_OPER(以只读方式打开文件)
| _N_OST_OF | PI-Service _N_OST_OF(Overstore OFF)
| _N_OST_ON | PI-Service _N_OST_ON(Overstore ON)
| _NSCALE   | PI-Service _NSCALE(测量单位设置(公制< - > INCH))
| _N_SETUFR | PI-Service _N_SETUFR(激活用户帧)
| _N_STRTLK | PI-Service _N_STRTLK(设置全局启动禁用)
| _N_STRTUL | PI-Service _N_STRTUL(重置全局启动禁用)
| _N_TMRASS | PI-Service _N_TMRASS(重置活动状态)
| _N_F_DELE | PI-Service _N_F_DELE(删除文件)
| _N_EXTERN | PI-Service _N_EXTERN(选择外部程序执行)
| _N_EXTMOD | PI-Service _N_EXTMOD(选择外部程序执行)
| _N_F_DELR | PI-Service _N_F_DELR(即使没有访问权限也删除文件)
| _N_F_XFER | PI-Service _N_F_XFER(选择要上传的文件)
| _NLOCKE   | PI-Service _NLOCKE(锁定活动文件以进行编辑)
| _N_SELECT | PI-Service _N_SELECT(选择要执行的程序)
| _N_SRTEXT | PI-Service _N_SRTEXT(文件正在/ _N_EXT_DIR中标记)
| _N_F_CLOS | PI-Service _N_F_CLOS(关闭文件)
| _N_F_OPEN | PI-Service _N_F_OPEN(打开文件)
| _N_F_SEEK | PI-Service _N_F_SEEK(定位文件搜索指针)
| _N_ASUP   | PI-Service _N_ASUP (分配中断)
| _N_CHEKDM | PI-Service _N_CHEKDM(对D号码启动唯一性检查)
| _N_CHKDNO | PI-Service _N_CHKDNO(检查工具是否具有唯一的D编号)
| _N_CONFIG | PI-Service _N_CONFIG(重新配置机器数据)
| _N_CRCEDN | PI-Service _N_CRCEDN(通过指定边数来创建切削刃)
| _N_DELECE | PI-Service _N_DELECE(删除最前沿)
| _N_CREACE | PI-Service _N_CREACE(创造最前沿)
| _N_CREATO | PI-Service _N_CREATO(创建工具)
| _N_DELETO | PI-Service _N_DELETO(删除工具)
| _N_CRTOCE | PI-Service _N_CRTOCE(生成具有指定边数的工具)
| _N_DELVAR | PI-Service _N_DELVAR(删除数据块)
| _N_F_COPY | PI-Service _N_F_COPY(复制NCK中的文件)
| _N_F_DMDA | PI-Service _N_F_DMDA(删除MDA内存)
| _N_F_PROT | PI-Service _N_F_PROT(为文件指定保护级别)
| _N_F_RENA | PI-Service _N_F_RENA(重命名文件)
| _N_FINDBL | PI-Service _N_FINDBL(激活搜索)
| _N_IBN_SS | PI-Service _N_IBN_SS(设置设置开关)
| _N_MMCSEM | PI-Service _N_MMCSEM(MMC-Semaphore)
| _N_NCKMOD | PI-Service _N_NCKMOD(正在设置NCK工作的模式)
| _N_NEWPWD | PI-Service _N_NEWPWD(新密码)
| _N_SEL_BL | PI-Service _N_SEL_BL(选择新块)
| _N_SETTST | PI-Service _N_SETTST(激活替换工具组的工具)
| _N_TMAWCO | PI-Service _N_TMAWCO(在一个杂志中设置有效磨损组)
| _N_TMCRTC | PI-Service _N_TMCRTC(创建具有指定边数的工具)
| _N_TMCRTO | PI-Service _N_TMCRTO(在工具管理中创建工具)
| _N_TMFDPL | PI-Service _N_TMFDPL(搜索空白处加载)
| _N_TMFPBP | PI-Service _N_TMFPBP(搜索空位)
| _N_TMGETT | PI-Service _N_TMGETT(使用Duplono确定特定工具ID的T编号)
| _N_TMMVTL | PI-Service _N_TMMVTL(加载或卸载工具)
| _N_TMPCIT | PI-Service _N_TMPCIT(设置计件器的增量值)
| _N_TMPOSM | PI-Service _N_TMPOSM(定位杂志或工具)
| _N_TRESMO | PI-Service _N_TRESMO(重置监控值)
| _N_TSEARC | PI-Service _N_TSEARC(通过搜索屏幕进行复杂搜索)

附:

S7协议Pcap数据包下载地址。

链接:百度网盘 请输入提取码

提取码:8djr 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/65583.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

刷爆力扣之最长连续递增序列

刷爆力扣之最长连续递增序列 HELLO&#xff0c;各位看官大大好&#xff0c;我是阿呆 &#x1f648;&#x1f648;&#x1f648; 今天阿呆继续记录下力扣刷题过程&#xff0c;收录在专栏算法中 &#x1f61c;&#x1f61c;&#x1f61c; 该专栏按照不同类别标签进行刷题&#…

代码随想录算法训练营第五十五天|392. 判断子序列、115. 不同的子序列

LeetCode 392. 判断子序列 链接&#xff1a;392. 判断子序列 双指针&#xff1a; 思路&#xff1a; 本题较容易&#xff0c;如果不用动态规划而是用双指针的办法思路会更加简单。首先两个指针fast&#xff0c;slow分别代表t&#xff0c;s的下标&#xff0c;快指针用于遍历长…

来浅谈一下:GraalVM下载、安装、特点、概括

文章目录前言一、GraaIVM是什么&#xff1f;二、GraaIVM优点三、安装GraaIVM1.GraaIVM Community版本简略2.下载3.解压4.配置变量4.1、JAVA_HOME改成graalvm的位置4.2、编辑path5、查看总结前言 GraaIVM High-performance runtime with new compiler optimizations to accele…

unity计算着色器

序 计算着色器&#xff0c;是什么&#xff1f;好像是并行计算的一个东西。 并行计算&#xff0c;挖矿&#xff1f;显卡&#xff1f; 那看来得先了解显卡&#xff0c;再了解计算着色器了。 认识显卡 显卡&#xff0c;小白&#xff0c;不懂。 显卡的印象&#xff0c;只是停…

批量修改文件名,图文教学,2分钟简单学会

​文件名称是文件的重要组成部分&#xff0c;在我们日常生活中&#xff0c;对文件进行命名&#xff0c;是经常使用到的一种功能。可是有时候需要重命名的文件实在是太多了咋办呢&#xff1f;有没有什么方法可以批量修改文件名&#xff1f; 本文将以图文教学的方式&#xff0c;…

为什么不建议在MySQL中使用 utf8?

MySQL 字符编码集中有两套 UTF-8 编码实现&#xff1a;utf8 和 utf8mb4。 如果使用 utf8 的话&#xff0c;存储 emoji 符号和一些比较复杂的汉字、繁体字就会出错。 为什么会这样呢&#xff1f;这篇文章可以从源头给你解答。 何为字符集&#xff1f; 字符是各种文字和符号的…

LPA-star算法(Lifelong Planning)及相关思考

一、LPA-star算法&#xff08;Lifelong Planning&#xff09;简介 LPA * ( Lifelong Planning 终身规划 A * )是一种基于A * 的增量启发式搜索算法&#xff0c;被用来处理动态环境下从给定起始点到给定目标点的最短路径问题&#xff0c;即起始点和目标点是固定的。 &#xff08…

图数据库知识点1:图数据库与关系型数据库区别

文章目录 前言一、图数据库区别于其他数据库的核心是什么&#xff1f;二、图数据库能解决哪些问题&#xff1f; 1.图的优势2.目前的图的实现方式及优劣3.图的技术趋势及优势小结总结前言 《图数据库知识点》系列有20讲&#xff0c;每一讲中会重点分享一个图数据库知识点&#…

什么是JVM?JVM的机制与JVM自动内存管理机制,如何进行优化

1. 什么是JVM&#xff1f; JVM是Java Virtual Machine&#xff08;Java虚拟机&#xff09;的缩写&#xff0c;JVM是一种用于计算设备的规范&#xff0c;它是一个虚构出来的计算机&#xff0c;是通过在实际的计算机上仿真模拟各种计算机功能来实现的。Java虚拟机包括一套字节码…

彻底搞懂MySql的B+Tree

1.什么是索引 官方定义&#xff1a;一种能为mysql提高查询效率的数据结构&#xff0c;索引是为了加速对表中数据行的检索而创建的一种分散存储的数据结构。好比如&#xff0c;一本书&#xff0c;你想找到自己想看的章节内容&#xff0c;直接查询目录就行。这里的目录就类似索引…

华为路由器升级系统文件

欢迎关注微信公众号【厦门微思网络】。http://www.xmws.cn 组网图形 组网需求 RouterA的管理网口与用户侧主机HostA相连。要求通过BootROM菜单下载系统文件至RouterA完成系统升级。 操作步骤 1.在PC端启动FTP Server服务。 2.用串口线连接并通过Console口登录设备。 3.重启设…

Java内存模型与线程(3)

文章目录4. Java与线程4.1 线程的实现4.2 Java线程调度4.3 状态转换4. Java与线程 并发不一定要依赖多线程&#xff08;如PHP中很常见的多进程并发&#xff09;&#xff0c;但是在Jva里面谈论并发&#xff0c;大多数都与线程脱不开关系。既然我们这本书探讨的话题是Java虚拟机…

一个系列涨粉47w,小红书内容创意卷出新高度

前有双11&#xff0c;后有世界杯&#xff0c;11月注定是热闹的。图源新红_流量分析_趋势查询在此情况下&#xff0c; 小红书内又涌现出哪些黑马博主&#xff1f;有多少品牌打造出了爆品&#xff1f;什么样的种草玩法才能成功出圈&#xff1f;我们将全面分析11月榜单&#xff0c…

java面向对象最全入门笔记

Java面向对象 什么是面向对象编程&#xff1f; 面向&#xff1a;找、拿。 对象&#xff1a;东西。 面向对象编程&#xff1a;找或者拿东西过来编程。 设计对象并使用 设计类&#xff0c;创建对象并使用 类是什么&#xff1f; 类&#xff08;设计图&#xff09;&#xff1…

Vue Cli安装和node-sass、less-loader、sass-loader安装

一、Vue Cli安装 CLI全程是Command-Line Interface&#xff0c;命令行界面&#xff0c;俗称脚手架&#xff0c;可以帮我们快速的创建vue项 Vue Cli的使用必须依赖node环境和webpack 管理员方式打开cmd进行安装&#xff0c;安装命令&#xff1a; npm i -g vue/cli 查看版本…

鸢尾花数据种类预测、分析与处理、scikit-learn数据集使用、seaborn作图及数据集的划分

一、鸢尾花种类预测 Iris数据集是常用的分类实验数据集&#xff0c;由Fisher, 1936收集整理&#xff0c;Iris也称鸢尾花卉数据集&#xff0c;是一类多重变量分析的数据集 鸢尾花数据集包含了 4个属性&#xff08;特征值&#xff09; Sepal.Length&#xff08;花萼长度&#…

Linux学习-69-Linux系统启动管理

16 Linux系统启动管理 Linux 系统的启动是不需要人为参与和控制的&#xff0c;只要选择开机&#xff0c;系统就会按照设定好的方式进行启动。不过&#xff0c;了解系统的启动有助于我们在系统出现问题时能够快速地修复 Linux 系统。在 CentOS 6.x 中&#xff0c;系统的启动过程…

NoSQLBooster for MongoDB 7.1.X

最智能的 MongoDB IDE NoSQLBooster 是 MongoDB v2.6-6.0 的跨平台 GUI 工具&#xff0c;它提供了内置的 MongoDB 脚本调试器MongoDB 脚本调试器、全面的服务器监控工具、链接流畅查询、SQL 查询、查询代码生成器、任务调度、ES2020 支持和高级智能感知体验。 嵌入式 MongoDB 外…

网络面试-0x17如何立即诶OSI模型和TCP/IP协议

OSI(Open System Interconnect) 开放式通信系统互连参考模型。 每一层实现各自的功能和协议&#xff0c;并完成与相邻层的接口通信。即每一层扮演固定的角色&#xff0c;互不打扰。 应用层 ⑦ 作用&#xff1a;通过应用程序间的交互来完成特定的网络应用。 定义了应用程序之间…

【ONE·R || R与C++混合编程简单介绍 】

总言 课堂演讲&#xff1a;R语言与CPP混合编程课后学习汇报。    文章目录总言1、汇报目的&#xff12;、RCPP2.1、简单介绍&#xff1a;2.2、简单使用演示&#xff1a;2.1.1、Rcpp包与RTools2.2.2、上手尝试1.0&#xff1a;一个hello world小程序。2.2.3、上手尝试2.0&#…