一、S7协议概述
1、S7协议简介
S7comm(S7 通信)是西门子专有协议,可在西门子 S7-300/400 系列的可编程逻辑控制器 (PLC) 之间运行。它用于 PLC 编程、PLC 之间的数据交换、从 SCADA(监控和数据采集)系统访问 PLC 数据以及诊断目的。
S7comm 数据作为 COTP 数据包的有效载荷出现,第一个字节总是 0x32 作为协议标识符。
要建立与 S7 PLC 的连接,有 3 个步骤:
- 通过 TCP 端口 102 连接到 PLC;
- 在 ISO 层连接(COTP 连接请求);
- 在 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的地址规范的格式类型,常见值如下表:
- 0x10 S7ANY Address data S7-Any pointer-like DB1.DBX10.2;
- 0x13 PBC-R_ID R_ID for PBC;
- 0x15 ALARM_LOCKFREE Alarm lock/free dataset;
- 0x16 ALARM_IND Alarm indication dataset;
- 0x19 ALARM_ACK Alarm acknowledge message dataset;
- 0x1a ALARM_QUERYREQ Alarm query request dataset;
- 0x1c NOTIFY_IND Notify indication dataset;
- 0xa2 DRIVEESANY seen on Drive ES Starter with routing over S7;
- 0xb2 1200SYM Symbolic address mode of S7-1200;
- 0xb0 DBREAD Kind of DB block read, seen only at an S7-400;
- 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 为返回码,返回码如下:
- 0x00 Reserved 未定义,预留;
- 0x01 Hardware error 硬件错误;
- 0x03 Accessing the object not allowed 对象不允许访问;
- 0x05 Invalid address 无效地址,所需的地址超出此PLC的极限;
- 0x06 Data type not supported 数据类型不支持;
- 0x07 Data type inconsistent 日期类型不一致;
- 0x0a Object does not exist 对象不存在;
- 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 即请求目标的文件系统,有三种:
- P(Passive (copied, but not chained) module):被动文件系统
- A (Active embedded module):主动文件系统
- 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