西门子S7通信协议以及JAVA版的实现
作者:互联网
西门子S7协议实现
采用java的方式实现西门子S7协议
链接地址:iot-communication
github: https://github.com/xingshuangs/iot-communication
<dependency>
<groupId>com.github.xingshuangs</groupId>
<artifactId>iot-communication</artifactId>
<version>1.1.0</version>
</dependency>
网络模型
层数 | OSI层 | S7协议 |
---|---|---|
第 7 层 | 应用层 | S7 协议 S7 Communication |
第 6 层 | 表示层 | S7 协议( COTP ) |
第 5 层 | 会话层 | S7 协议( TPKT ) |
第 4 层 | 传输层 | Transmission Control Protocol |
第 3 层 | 网络层 | IP |
第 2 层 | 数据链路层 | Ethernet |
第 1 层 | 物理层 | Ethernet |
S7协议数据结构
S7协议TCP/IP实现依赖于面向块的ISO传输服务,S7协议包含在TPKT和ISO-COTP协议中,允许PDU(协议数据单元)通过TCP承载。
ISO overTCP通信定义在RFC1006中,ISO-COTP定义在RFC2126其是基于ISO 8073协议(RFC905)。该结构如下图。
TPKT结构
TPKT 共占 4 个字节
字节序数 | 字节大小 | 英文名 | 中文含义 | 示例 |
---|---|---|---|---|
0 | 1 | Version | 版本号 | 0x03 |
1 | 1 | Reserved | 预留 | 0x00 |
2-3 | 2 | Length | 长度 | 0x0016 |
length,2byte,包括后面负载payload和这三部分在内的总长度
COTP结构
COTP分两种,连接型的COTP和数据型的COTP
COTP连接 共占 18 个字节
字节序数 | 字节大小 | 英文名 | 中文含义 | 示例 |
---|---|---|---|---|
0 | 1 | Length | 长度(但并不包含length这个字段) | 0x11 |
1 | 1 | PDU Type | PDU类型(CRConnect Request 连接请求) |
|
2-3 | 2 | Destination reference | 目标引用,用来唯一标识目标 | 0x10 |
4-5 | 2 | Source reference | 源的引用 | 0x0001 |
6 | 1 | Class前4位 Extended formates倒数第2位 No explicit flow control最后一位 |
|
0x00 |
7 | 1 | Parameter code:tpdu-size | 参数代码**TPDU-Size |
0xC0 |
8 | 1 | Parameter length | 参数长度 |
0x01 |
9 | 1 | TPDU size | TPDU**大小 | 0x0A |
10 | 1 | Parameter code: src-tsap | 参数代码**SRC-TASP |
0xC1 |
11 | 1 | Parameter length | 参数长度 |
0x02 |
12-13 | 2 | source TSAP | SourceTSAP/Rack | 0x0201 |
14 | 1 | Parameter code: dst-tsap | 参数代码**DST-TASP |
0xC2 |
15 | 1 | Parameter length | 参数长度 |
0x02 |
16-17 | 2 | destination Tsap | DestinationTSAP / Slot | 0x0201 |
COTP数据 共占 3 个字节
字节序数 | 字节大小 | 英文名 | 中文含义 | 示例 |
---|---|---|---|---|
0 | 1 | Length | 长度(但并不包含length这个字段) | 0x11 |
1 | 1 | PDU Type | PDU类型(CRConnect Request 连接请求) |
|
2 | 1 | Destination reference | 首位:是否最后一个数据 后7位: TPDU**编号 |
0x10 |
S7协议的工作流程
- client与server通过socket建立连接,过程是标准的TCP连接方式,这一步完成连接的建立
- client发送COTP,请求连接PLC,报文中包含CR Connect Request和Destination TSAP,从而标识出CPU的机架号和槽号
- PLC返回COTP,确认连接,报文中包含CC Connect Confirm,此时server已经明确client与哪个CPU进行通讯
- client发送S7 Communication给server,报文中包含Setup communication,即通讯请求
- server返回S7 Communication给client,报文的ROSCTR为ACK_DATA,有确认的意思,包含了对作业请求的回复
- client与server发送交换数据的报文,仍以S7 Communication完成
备注:2-5的步骤中,2与3完成数据传输前连接的功能,4与5则完成连接之后的通讯请求,如果绕过通讯请求的建立,在有TCP时就进行数据交换,服务器一般会直接断连
S7 PDU结构
S7协议是面向功能/命令的,这意味着传输由S7请求和适当的应答组成(极少数例外)。在连接建立期间协商并行传输的数量和PDU的最大长度。
S7 PDU由三个主要部分组成:
头(Header):包含长度信息,PDU参考和消息类型常量
参数(Parameters):内容和结构根据PDU的消息和功能类型而有很大差异
数据(Data):该数据是一个可选字段来携带数据,例如存储器值,块代码,固件数据等。
1、头(Header)
头长度为10-12个字节,请求头为10个字节,响应头为12个字节,响应消息包含两个额外的错误代码字节。除此之外,标头格式在所有PDU中是一致的。
REQ-HEADER(请求头,发送数据头)共占 10 个字节
字节序数 | 字节大小 | 英文名 | 中文含义 | 示例 |
---|---|---|---|---|
0 | 1 | Protocol Id | 协议id | 0x32(常量) |
1 | 1 | ROSCTR/MSG Type | pdu(协议数据单元(Protocol Data Unit))的类型 | 0x01-job 0x02-ack 0x03-ack-data 0x07-Userdata |
2-3 | 2 | Redundancy Identification | 保留 | 0x0000 |
4-5 | 2 | Protocol Data Unit Reference | |pdu的参考–由主站生成,每次新传输递增(大端) | 0x000C |
6-7 | 2 | Parameter length | 参数的长度(大端) | 0x0002 |
8-9 | 2 | Data length | 数据的长度(大端) | 0x0006 |
ACK-HEADER(头,响应头,多两个字节)共占 12 个字节
字节序数 | 字节大小 | 英文名 | 中文含义 | 示例 |
---|---|---|---|---|
0 | 1 | Protocol Id | 协议id | 0x32(常量) |
1 | 1 | ROSCTR/MSG Type | pdu(协议数据单元(Protocol Data Unit))的类型 | 0x01-job 0x02-ack 0x03-ack-data 0x07-Userdata |
2-3 | 2 | Redundancy Identification | 保留 | 0x0000 |
4-5 | 2 | Protocol Data Unit Reference | |pdu的参考–由主站生成,每次新传输递增(大端) | 0x000C |
6-7 | 2 | Parameter length | 参数的长度(大端) | 0x0002 |
8-9 | 2 | Data length | 数据的长度(大端) | 0x0006 |
10 | 1 | Error Class | 错误类型(具体内容在其他中) | 0x00 |
11 | 1 | Error Code | 错误码(具体内容在其他中) | 0x00 |
Message Type (消息类型 ROSCTR/MSG Type)
Message Type: 消息的一般类型(有时称为ROSCTR类型),消息的其余部分在很大程度上取决于Message Type和功能代码。
值 | 含义 |
---|---|
0x01-job | 开工干活的意思,主设备通过job向从设备发出“干活”的命令,具体是读取数据还是写数据由parameter决定 |
0x02-ack | 确认 确认有没有数据字段 |
0x03-ack-data | 从设备回应主设备的job |
0x07-Userdata | 原始协议的扩展,参数字段包含请求/响应id,(用于编程/调试,SZL读取,安全功能,时间设置,循环读取…) |
2、参数(Parameter)
Parameter参数取决于 Message Type和功能代码,不同功能码的消息结构不同。这里分析仅针对Message Type为:
- 0x01- Job Request:主站发送的请求(例如读/写存储器,读/写块,启动/停止设备,通信设置)
- 0x03- Ack-Data:带有可选数据字段的确认,包含对作业请求的回复
Job和Ack Data消息的parameter都是以功能代码开头,其余字段的结构取决于此值。
Job Request/Ack-Data function codes功能码
参数码 | 参数功能 | 参数含义 |
---|---|---|
0x00 | CPU services | CPU服务 |
0x04 | Read Variable | 读变量 |
0x05 | Write Variable | 写变量 |
0x1A | Request download | 开始下载 |
0x1B | Download block | 下载阻塞 |
0x1C | Download ended | 下载结束 |
0x1D | Start upload | 开始上传 |
0x1E | Upload | 上传 |
0x1F | End upload | 结束上传 |
0x28 | PLC Control | 控制PLC |
0x29 | PLC Stop | 停止PLC |
0xF0 | Setup communication | 设置通信 |
2.1 设置通信 0xF0
在可以交换任何其他消息之前,在每个会话开始时会发送该消息对(Job 和Ack Data)。它用于协商Ack队列的大小和最大PDU长度,双方都声明其支持的值。Ack队列的长度决定了可以在没有确认的情况下同时启动的并行作业的数量。PDU和队列长度字段都是大端。
Parameter(设置通信 0xF0) 共占 8 个字节
字节序数 | 字节大小 | 英文名 | 中文含义 | 示例 |
---|---|---|---|---|
0 | 1 | Function code | 功能代码 | 0xF0 |
1 | 1 | Reserved | 预留 | 0x00 |
2-3 | 2 | Max AmQ Caller | Ack队列的大小(主叫)(大端) | 0x0001 |
4-5 | 2 | Max AmQ Callee | Ack队列的大小(被叫)(大端) | 0x0001 |
6-7 | 2 | PDU length | PDU长度(大端) | 0x03C0 |
2.2 读/写变量 0x04/0x05
通过指定变量的存储区域,地址(偏移量)及其大小或类型来执行数据读取和写入操作。
Parameter(读0x04) 共占 8 个字节
这两个字节不可重复
字节序数 | 字节大小 | 英文名 | 中文含义 | 示例 | 是否重复 |
---|---|---|---|---|---|
0 | 1 | Function code | 功能代码 | 0x04 | 不可重复 |
1 | 1 | Item Count | Request Item结构的数量 | 0x01 | 不可重复 |
后面部分可重复
字节序数 | 字节大小 | 英文名 | 中文含义 | 示例 | 是否重复 |
---|---|---|---|---|---|
2 | 1 | Variable Specification type | 变量规范,对于读/写消息,它总是具有值0x12 | 0x12 | 可重复 |
3 | 1 | Length of following address specification | 其余部分的长度规范 | 0x0A | 可重复 |
4 | 1 | Syntax ID | 寻址模式和项结构其余部分的格式,它具有任意类型寻址的常量值0x10 | 0x10 | 可重复 |
5 | 1 | Transport size / Variable Type | 变量的类型和长度BIT,BYTE,WORD,DWORD,COUNTER | 0x02 | 可重复 |
6-7 | 2 | Length / Count | 读取长度 | 0x0004 | 可重复 |
8-9 | 2 | DB number | 即 DB 编号,如果访问的不是DB区域,此处为0x0000 | 0x0000 | 可重复 |
10 | 1 | Area | 存储区类型DB存储区 | 0x84 | 可重复 |
11-13 | 3 | Address | 开始字节,字节地址,位于开始字节地址address中3个字节,从第4位开始计数, 位地址,位于开始字节地址address中3个字节的最后3位 |
0x000000 | 可重复 |
存储区域
存储区名 | 存储区简称 | 含义 |
---|---|---|
Merker | M | 任意标记变量或标志寄存器驻留在这里 |
Data Block | DB | DB区域是存储设备不同功能所需数据的最常见位置,这些数据块编号为地址的一部分 |
Input | I | 数字和模拟输入模块值,映射到存储器 |
Output | Q | 类似的存储器映射输出 |
Counter | C | PLC程序使用的不同计数器的[C]值 |
Timer | T | PLC程序使用的不同定时器的[T]值 |
本地数据[L] | L | 本地数据 |
外设访问[P] | P | 外设访问 |
Syntax ID 寻址模式和项结构其余部分的格式
地址 | 名称 | 含义 |
---|---|---|
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 |
Transport size (variable Type) in Item data,请求的数据项类型
值 | 含义 |
---|---|
0x01 | BIT |
0x02 | BYTE |
0x03 | CHAR |
0x04 | WORD |
0x05 | INT |
0x06 | DWORD |
0x07 | DINT |
0x08 | REAL |
0x09 | DATE |
0x0A | TOD |
0x0B | TIME |
0x0C | S5TIME |
0x0F | DATE AND TIME |
0x1C | COUNTER |
0x1D | TIMER |
0x1E | IEC TIMER |
0x1F | IEC COUNTER |
0x20 | HS COUNTER |
Area 数据的区域
16进制值 | 名称 | 含义 |
---|---|---|
0x03 | System info of 200 family | 200系列系统信息 |
0x05 | System flags of 200 family | 200系列系统标志 |
0x06 | Analog inputs of 200 family | 200系列模拟量输入 |
0x07 | Analog outputs of 200 family | 200系统模式量输出 |
0x80 | Direct peripheral access | 直接访问外设 |
0x81 | Inputs (I) | 输入(I) |
0x82 | Outputs (Q) | 输出(Q) |
0x83 | Flags (M) | 内部标志(M) |
0x84 | Data blocks (DB) | 数据块(DB) |
0x85 | Instance data blocks (DI) | 背景数据块(DI) |
0x86 | Local data (L) | 局部变量(L) |
0x87 | Unknown yet (V) | 全局变量(V) |
0x1C | S7 counters (C) | S7计数器(C) |
0x1D | S7 timers (T) | S7定时器(T) |
0x1E | IEC counters (200 family) | IEC计数器(200系列) |
0x1F | IEC timers (200 family) | IEC定时器(200系列) |
2.3 控制PLC 0x28
Parameter(控制PLC 0x28) 共占 不定 个字节
字节序数 | 字节大小 | 英文名 | 中文含义 | 示例 |
---|---|---|---|---|
0 | 1 | Function code | 功能代码 | 0x28 |
1-7 | 7 | Reserved | 未知字节 | 0x000000000000fd |
8-9 | 2 | Parameter block Length | 参数块长度 | 0x0000 |
不定 | 不定 | Parameter block | 参数块内容 | |
10 | 1 | String length | 字符串长度 | 0x09 |
不定 | 不定 | PI Service | 程序调用服务(ASCII码) P_PROGRAM |
0x505F50524F4752414D |
PLC控制消息用于在从属设备上执行不同的命令,以修改其执行/内存状态。此类命令用于启动或停止PLC控制程序的执行,激活或删除设备上的程序块,或将其配置保存到永久存储器中。这些消息的结构相当简单,将在不讨论确切细节的情况下对其进行解释。
ob - PLC Control消息由两个主要部分组成,即被调用方法的ASCII名称和参数(也被编码为ASCII字符串)。方法名的结构与块传输部分中引入的文件名类似。参数取决于方法类型,可以将其视为方法类型的参数。 Ack Data消息仅包含PLC Control功能代码。
一些示例函数名称及其相关参数:
- _INSE:激活设备上下载的块,参数是块的名称(例如OB1)。
- _DELE:从设备的文件系统中删除一个块,该参数也是块的名称。
- P_PROGRAM:设置设备的运行状态(启动,停止,mem重置)。它在没有参数的情况下发送以启动设备,但是停止plc程序使用不同的功能代码(参见下一节)。
- _GARB:压缩PLC内存。
- _MODU:将ram复制到rom,该参数包含文件系统标识符(A/E/P)。
热启动
热启动请求
热启动响应
冷启动
冷启动请求
冷启动响应
2.4 停止PLC 0x29
Parameter(停止PLC 0x29) 共占 不定 个字节
字节序数 | 字节大小 | 英文名 | 中文含义 | 示例 |
---|---|---|---|---|
0 | 1 | Function code | 功能代码 | 0x29 |
1-5 | 5 | Reserved | 未知字节 | 0x0000000000 |
6 | 1 | Length part | 参数块长度 | 0x09 |
不定 | 不定 | PI Service | 程序调用服务(ASCII码) P_PROGRAM |
0x505F505524F4752414D |
停止PLC请求
停止PLC响应
3、数据(Data)
这里的数据有两种,数据项DataItem和返回项ReturnItem,两种都可以重复,数据项(DataItem)占多个字节,返回项(ReturnItem)只有一个字节;
数据格式 Return Item,1个字节
字节序数 | 字节大小 | 英文名 | 中文含义 | 示例 |
---|---|---|---|---|
0 | 1 | Error code | 错误码 | 0x00 |
数据格式 Data Item,多个字节
注意事项:数据项总字节数若为奇数,则需要补充1个字节,使其保持为偶数字节数
字节序数 | 字节大小 | 英文名 | 中文含义 | 示例 |
---|---|---|---|---|
0 | 1 | Error code | 错误码 | 0x00 |
1 | 1 | Variable Type | 数据类型 | 0x04 |
2-3 | 2 | Count | 长度 | 0x0000 |
不定 | 不定 | data | 参数块内容 |
Error Code
字节 | 英文名 | 中文含义 |
---|---|---|
0x00 | Reserved | 未定义,预留 |
0x01 | Hardware error | 硬件错误 |
0x03 | Accessing the object not allowed | 对象不允许访问 |
0x05 | Invalid address | 无效地址,所需的地址超出此PLC的极限 |
0x07 | Data type inconsistent | 日期类型不一致 |
0x0a | Object does not exist | 对象不存在 |
0xff | Success | 成功 |
Transport size in data Transport size (variable Type)变量的类型和长度,返回的数据类型
值 | 名称 | 含义 |
---|---|---|
0x00 | NULL | |
0x03 | BIT | bit access, len is in bits |
0x04 | BYTE/WORD/DWORD | byte/word/dword access, len is in bits |
0x05 | INTEGER | integer access, len is in bits |
0x06 | DINTEGER | integer access, len is in bytes |
0x07 | REAL | real access, len is in bytes |
0x09 | OCTET STRING | octet string, len is in bytes |
4、示例
读取数据 0x04
发送
返回
写入数据 0x05
发送
返回
其他
Header Error Class
值 | 含义 |
---|---|
0x00 | No error |
0x81 | Application relationship error |
0x82 | Object definition error |
0x83 | No ressources available error |
0x84 | Error on service processing |
0x85 | Error on supplies |
0x87 | Access error |
错误码具体含义
值 | 含义 |
---|---|
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错误; 资源集不存在 |
标签:JAVA,字节,错误,S7,通信协议,参数,作业,PLC 来源: https://www.cnblogs.com/oscura/p/16275909.html