西门子S7通信协议以及JAVA版的实现

西门子S7协议实现

采用java的方式实现西门子S7协议

链接地址:iot-communication
github: https://github.com/xingshuangs/iot-communication
gitee: https://gitee.com/xingshuang/iot-communication

<dependency>
    <groupId>com.github.xingshuangs</groupId>
    <artifactId>iot-communication</artifactId>
    <version>1.5.3</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协议包含在TPKTISO-COTP协议中,允许PDU(协议数据单元)通过TCP承载。
ISO overTCP通信定义在RFC1006中,ISO-COTP定义在RFC2126其是基于ISO 8073协议(RFC905)。该结构如下图。

图片


TPKT结构

TPKT 共占 4 个字节

图片

字节序数字节大小英文名中文含义示例
01Version版本号0x03
11Reserved预留0x00
2-32Length长度0x0016

length,2byte,包括后面负载payload和这三部分在内的总长度


COTP结构

COTP分两种,连接型的COTP和数据型的COTP

COTP连接 共占 18 个字节

图片

字节序数字节大小英文名中文含义示例
01Length长度(但并不包含length这个字段)0x11
11PDU TypePDU类型(CRConnect Request 连接请求)
  • 0xE0,连接请求
  • 0xD0,连接确认
  • 0x80,断开请求
  • 0xC0,断开确认
  • 0x50,拒绝
  • 0xF0,数据
2-32Destination reference目标引用,用来唯一标识目标0x10
4-52Source reference源的引用0x0001
61Class前4位
Extended formates倒数第2位
No explicit flow control最后一位
  • 前四位标识class,也就是标识类别
  • 倒数第二位对应Extended formats,是否使用拓展样式
  • 倒数第一位对应No explicit flow control,是否有明确的指定流控制
0x00
71Parameter code:tpdu-size参数代码**TPDU-Size
0xC0
81Parameter length参数长度
0x01
91TPDU sizeTPDU**大小0x0A
101Parameter code: src-tsap参数代码**SRC-TASP
0xC1
111Parameter length参数长度
0x02
12-132source TSAPSourceTSAP/Rack0x0201
141Parameter code: dst-tsap参数代码**DST-TASP
0xC2
151Parameter length参数长度
0x02
16-172destination TsapDestinationTSAP / Slot0x0201

COTP数据 共占 3 个字节

图片

字节序数字节大小英文名中文含义示例
01Length长度(但并不包含length这个字段)0x11
11PDU TypePDU类型(CRConnect Request 连接请求)0xF0,数据
21Destination reference首位:是否最后一个数据
后7位: TPDU**编号
0x10

S7协议的工作流程

  1. client与server 通过socket和标准的TCP的方式建立连接
  2. client发送COTP,请求连接PLC,报文中包含Source TSAP和Destination TSAP,从而标识出CPU的机架号和槽号
  3. PLC返回COTP,确认连接,报文中包含Source TSAP和Destination TSAP,此时server确定client与哪个CPU进行通讯
  4. client发送S7 Communication给server,报文中包含Setup communication,即通讯请求,包含PDU的长度
  5. server返回S7 Communication给client,报文的ROSCTR为ACK_DATA,有确认的意思,包含PDU的长度
  6. 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 个字节

字节序数字节大小英文名中文含义示例
01Protocol Id协议id0x32(常量)
11ROSCTR/MSG Typepdu(协议数据单元(Protocol Data Unit))的类型0x01-job
0x02-ack
0x03-ack-data
0x07-Userdata
2-32Redundancy Identification保留0x0000
4-52Protocol Data Unit Reference|pdu的参考–由主站生成,每次新传输递增(大端)0x000C
6-72Parameter length参数的长度(大端)0x0002
8-92Data length数据的长度(大端)0x0006

ACK-HEADER(头,响应头,多两个字节)共占 12 个字节

字节序数字节大小英文名中文含义示例
01Protocol Id协议id0x32(常量)
11ROSCTR/MSG Typepdu(协议数据单元(Protocol Data Unit))的类型0x01-job
0x02-ack
0x03-ack-data
0x07-Userdata
2-32Redundancy Identification保留0x0000
4-52Protocol Data Unit Reference|pdu的参考–由主站生成,每次新传输递增(大端)0x000C
6-72Parameter length参数的长度(大端)0x0002
8-92Data length数据的长度(大端)0x0006
101Error Class错误类型(具体内容在其他中)0x00
111Error 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为:

  1. 0x01- Job Request:主站发送的请求(例如读/写存储器,读/写块,启动/停止设备,通信设置)
  2. 0x03- Ack-Data:带有可选数据字段的确认,包含对作业请求的回复

JobAck Data消息的parameter都是以功能代码开头,其余字段的结构取决于此值。

图片

Job Request/Ack-Data function codes功能码

参数码参数功能参数含义
0x00CPU servicesCPU服务
0x04Read Variable读变量
0x05Write Variable写变量
0x1ARequest download开始下载
0x1BDownload block下载阻塞
0x1CDownload ended下载结束
0x1DStart upload开始上传
0x1EUpload上传
0x1FEnd upload结束上传
0x28PLC Control控制PLC
0x29PLC Stop停止PLC
0xF0Setup communication设置通信

2.1 设置通信 0xF0

在可以交换任何其他消息之前,在每个会话开始时会发送该消息对(Job 和Ack Data)。它用于协商Ack队列的大小和最大PDU长度,双方都声明其支持的值。Ack队列的长度决定了可以在没有确认的情况下同时启动的并行作业的数量。PDU和队列长度字段都是大端。

Parameter(设置通信 0xF0) 共占 8 个字节

图片

字节序数字节大小英文名中文含义示例
01Function code功能代码0xF0
11Reserved预留0x00
2-32Max AmQ CallerAck队列的大小(主叫)(大端)0x0001
4-52Max AmQ CalleeAck队列的大小(被叫)(大端)0x0001
6-72PDU lengthPDU长度(大端)0x03C0

2.2 读/写变量 0x04/0x05

通过指定变量的存储区域,地址(偏移量)及其大小或类型来执行数据读取和写入操作
注意:读只要填充parameter即可,写除了parameter外还需要填充data部分的数据

图片

Parameter(读0x04) 共占 不定至少2 个字节

这两个字节不可重复

字节序数字节大小英文名中文含义示例是否重复
01Function code功能代码0x04不可重复
11Item CountRequest Item结构的数量0x01不可重复

后面部分可重复

字节序数字节大小英文名中文含义示例是否重复
21Variable Specification type变量规范,对于读/写消息,它总是具有值0x120x12可重复
31Length of following address specification其余部分的长度规范0x0A可重复
41Syntax ID寻址模式和项结构其余部分的格式,它具有任意类型寻址的常量值0x100x10可重复
51Transport size / Variable Type变量的类型和长度BIT,BYTE,WORD,DWORD,COUNTER0x02可重复
6-72Length / Count读取长度0x0004可重复
8-92DB number即 DB 编号,如果访问的不是DB区域,此处为0x00000x0000可重复
101Area存储区类型DB存储区0x84可重复
11-133Address开始字节,字节地址,位于开始字节地址address3个字节,从第4位开始计数,
位地址,位于开始字节地址address3个字节的最后3
0x000000可重复

存储区域

存储区名存储区简称含义
MerkerM任意标记变量或标志寄存器驻留在这里
Data BlockDBDB区域是存储设备不同功能所需数据的最常见位置,这些数据块编号为地址的一部分
InputI数字和模拟输入模块值,映射到存储器
OutputQ类似的存储器映射输出
CounterCPLC程序使用的不同计数器的[C]值
TimerTPLC程序使用的不同定时器的[T]值
本地数据[L]L本地数据
外设访问[P]P外设访问

Syntax ID 寻址模式和项结构其余部分的格式

地址名称含义
0x10S7ANYAddress data S7-Any pointer-like DB1.DBX10.2
0x13PBC-R_IDR_ID for PBC
0x15ALARM_LOCKFREEAlarm lock/free dataset
0x16ALARM_INDAlarm indication dataset
0x19ALARM_ACKAlarm acknowledge message dataset
0x1aALARM_QUERYREQAlarm query request dataset
0x1cNOTIFY_INDNotify indication dataset
0xa2DRIVEESANYseen on Drive ES Starter with routing over S7
0xb21200SYMSymbolic address mode of S7-1200
0xb0DBREADKind of DB block read, seen only at an S7-400
0x82NCKSinumerik NCK HMI access

Transport size (variable Type) in Item data,请求的数据项类型

含义
0x01BIT
0x02BYTE
0x03CHAR
0x04WORD
0x05INT
0x06DWORD
0x07DINT
0x08REAL
0x09DATE
0x0ATOD
0x0BTIME
0x0CS5TIME
0x0FDATE AND TIME
0x1CCOUNTER
0x1DTIMER
0x1EIEC TIMER
0x1FIEC COUNTER
0x20HS COUNTER

Area 数据的区域

16进制值名称含义
0x03System info of 200 family200系列系统信息
0x05System flags of 200 family200系列系统标志
0x06Analog inputs of 200 family200系列模拟量输入
0x07Analog outputs of 200 family200系统模式量输出
0x80Direct peripheral access直接访问外设
0x81Inputs (I)输入(I)
0x82Outputs (Q)输出(Q)
0x83Flags (M)内部标志(M)
0x84Data blocks (DB)数据块(DB)
0x85Instance data blocks (DI)背景数据块(DI)
0x86Local data (L)局部变量(L)
0x87Unknown yet (V)全局变量(V)
0x1CS7 counters ©S7计数器(C)
0x1DS7 timers (T)S7定时器(T)
0x1EIEC counters (200 family)IEC计数器(200系列)
0x1FIEC timers (200 family)IEC定时器(200系列)

2.3 控制PLC 0x28

Parameter(控制PLC 0x28) 共占 不定 个字节

字节序数字节大小英文名中文含义示例
01Function code功能代码0x28
1-77Reserved未知字节0x000000000000fd
8-92Parameter block Length参数块长度0x0000
不定不定Parameter block参数块内容
101String 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) 共占 不定 个字节

字节序数字节大小英文名中文含义示例
01Function code功能代码0x29
1-55Reserved未知字节0x0000000000
61Length part参数块长度0x09
不定不定PI Service程序调用服务(ASCII码)
P_PROGRAM
0x505F505524F4752414D

停止PLC请求

图片

停止PLC响应

图片

3、数据(Data)

这里的数据有两种,数据项DataItem和返回项ReturnItem,两种都可以重复,数据项(DataItem)占多个字节,返回项(ReturnItem)只有一个字节;
图片

数据格式 Return Item,1个字节

字节序数字节大小英文名中文含义示例
01Error code错误码0x00

数据格式 Data Item,多个字节

注意事项:数据项总字节数若为奇数,则需要补充1个字节,使其保持为偶数字节数

字节序数字节大小英文名中文含义示例
01Error code错误码0x00
11Variable Type数据类型0x04
2-32Count长度0x0000
不定不定data参数块内容

Error Code

字节英文名中文含义
0x00Reserved未定义,预留
0x01Hardware error硬件错误
0x03Accessing the object not allowed对象不允许访问
0x05Invalid address无效地址,所需的地址超出此PLC的极限
0x07Data type inconsistent日期类型不一致
0x0aObject does not exist对象不存在
0xffSuccess成功

Transport size in data **Transport size (**variable Type)变量的类型和长度,返回的数据类型

名称含义
0x00NULL
0x03BITbit access, len is in bits
0x04BYTE/WORD/DWORDbyte/word/dword access, len is in bits
0x05INTEGERinteger access, len is in bits
0x06DINTEGERinteger access, len is in bytes
0x07REALreal access, len is in bytes
0x09OCTET STRINGoctet string, len is in bytes

4、示例

读取数据 0x04

发送

图片

返回

图片

写入数据 0x05

发送

图片

返回

图片


其他

Header Error Class

含义
0x00No error
0x81Application relationship error
0x82Object definition error
0x83No ressources available error
0x84Error on service processing
0x85Error on supplies
0x87Access error

错误码具体含义

含义
0x0000没有错误
0x0110块号无效
0x0111请求长度无效
0x0112参数无效
0x0113块类型无效
0x0114找不到块
0x0115块已存在
0x0116块被写保护
0x0117块/操作系统更新太大
0x0118块号无效
0x0119输入的密码不正确
0x011APG资源错误
0x011BPLC资源错误
0x011C协议错误
0x011D块太多(与模块相关的限制)
0x011E不再与数据库建立连接,或者S7DOS句柄无效
0x011F结果缓冲区太小
0x0120块结束列表
0x0140可用内存不足
0x0141由于缺少资源,无法处理作业
0x8001当块处于当前状态时,无法执行请求的服务
0x8003S7协议错误:传输块时发生错误
0x8100应用程序,一般错误:远程模块未知的服务
0x8104未在模块上实现此服务或报告了帧错误
0x8204对象的类型规范不一致
0x8205复制的块已存在且未链接
0x8301模块上的内存空间或工作内存不足,或者指定的存储介质不可访问
0x8302可用资源太少或处理器资源不可用
0x8304无法进一步并行上传。存在资源瓶颈
0x8305功能不可用
0x8306工作内存不足(用于复制,链接,加载AWP)
0x8307保持性工作记忆不够(用于复制,链接,加载AWP)
0x8401S7协议错误:无效的服务序列(例如,加载或上载块)
0x8402由于寻址对象的状态,服务无法执行
0x8404S7协议:无法执行该功能
0x8405远程块处于DISABLE状态(CFB)。该功能无法执行
0x8500S7协议错误:帧错误
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目前无法运行,因为正在运行的函数会修改内存
0xD0A3I / 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函数参数中的语法错误
0xD205RAM中已存在链接块:无法进行条件复制
0xD206EPROM中已存在链接块:无法进行条件复制
0xD208超出模块的最大复制(未链接)块数
0xD209(至少)模块上找不到给定块之一
0xD20A超出了可以与一个作业链接的最大块数
0xD20B超出了一个作业可以删除的最大块数
0xD20COB无法复制,因为关联的优先级不存在
0xD20DSDB无法解释(例如,未知数)
0xD20E没有(进一步)阻止可用
0xD20F超出模块特定的最大块大小
0xD210块号无效
0xD212标头属性不正确(与运行时相关)
0xD213SDB太多。请注意对正在使用的模块的限制
0xD216无效的用户程序 - 重置模块
0xD217不允许在模块属性中指定的保护级别
0xD218属性不正确(主动/被动)
0xD219块长度不正确(例如,第一部分或整个块的长度不正确)
0xD21A本地数据长度不正确或写保护错误
0xD21B模块无法压缩或压缩早期中断
0xD21D传输的动态项目数据量是非法的
0xD21E无法为模块(例如FM,CP)分配参数。系统数据无法链接
0xD220编程语言无效。请注意对正在使用的模块的限制
0xD221连接或路由的系统数据无效
0xD222全局数据定义的系统数据包含无效参数
0xD223通信功能块的实例数据块错误或超出最大背景数据块数
0xD224SCAN系统数据块包含无效参数
0xD225DP系统数据块包含无效参数
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更新已中止
0xD409DP总线错误
0xD601函数参数中的语法错误
0xD602输入的密码不正确
0xD603连接已合法化
0xD604已启用连接
0xD605由于密码不存在,因此无法进行合法化
0xD801至少有一个标记地址无效
0xD802指定的作业不存在
0xD803非法的工作状态
0xD804非法循环时间(非法时基或多个)
0xD805不能再设置循环读取作业
0xD806引用的作业处于无法执行请求的功能的状态
0xD807功能因过载而中止,这意味着执行读取周期所需的时间比设置的扫描周期时间长
0xDC01日期和/或时间无效
0xE201CPU已经是主设备
0xE202由于闪存模块中的用户程序不同,无法进行连接和更新
0xE203由于固件不同,无法连接和更新
0xE204由于内存配置不同,无法连接和更新
0xE205由于同步错误导致连接/更新中止
0xE206由于协调违规而拒绝连接/更新
0xEF01S7协议错误:ID2错误; 工作中只允许00H
0xEF02S7协议错误:ID2错误; 资源集不存在

### 回答1: 西门子S7协议是一种用于与西门子PLC (可编程控制器)通信的协议。如果你想在Java程序中使用西门子S7协议进行通信,你可以使用西门子S7 Java库。这个库提供了用于连接到PLC并发送和接收数据的API。 要使用西门子S7 Java库,你需要在你的Java项目中添加依赖。添加依赖的方式取决于你使用的构建工具。例如,如果你使用Maven,你可以在你的`pom.xml`文件中添加以下依赖: ``` <dependency> <groupId>com.github.johannes-weigend</groupId> <artifactId>s7</artifactId> <version>1.4.1</version> </dependency> ``` 然后你就可以在你的Java代码中使用西门子S7库了。例如,你可以使用以下代码连接到PLC: ``` S7Client client = new S7Client(); client.ConnectTo("192.168.0.1", 0, 0); ``` 之后,你可以使用`client`对象发送读写请求到PLC。 希望这能帮到你! ### 回答2: 西门子S7协议是工业自动化领域中常用的协议之一,其主要用于实现PLC(可编程逻辑控制器)与上位机之间的通信。在Java语言中,我们可以使用一些开源库或自行编写代码来实现S7协议。 一种常用的实现方式是使用第三方的Java库,例如Snap7。Snap7是一个开源的PLC通讯库,支持多种西门子PLC系列的S7协议通信。我们可以通过引入Snap7库的jar包,并编写少量的Java代码来实现S7协议的通信功能。通过该库,我们可以连接到PLC,读取和写入PLC的内部寄存器等操作。 具体实现步骤如下: 1. 下载并导入Snap7库的jar包到Java项目中。 2. 在Java代码中,使用Snap7库提供的API,建立与PLC的连接。可以通过指定PLC的IP地址和端口号来连接到PLC。 3. 通过Snap7库提供的读取函数,读取PLC的内部寄存器的值。可以指定读取的寄存器地址和长度。 4. 通过Snap7库提供的写入函数,将数据写入PLC的内部寄存器。同样可以指定写入的寄存器地址和数据。 5. 最后,关闭与PLC的连接。 需要注意的是,具体的实现细节会因使用的库和PLC型号而有所不同。在编写代码之前,我们需要了解PLC的型号、固件本和S7协议的具体规范,以及所选用的库的API文档和示例代码。 总的来说,通过引入第三方的Java库(如Snap7)并编写相应的代码,我们可以实现西门子S7协议Java实现实现与PLC的数据通信。这样就可以在Java程序中实时地读取和控制PLC的状态,实现工业自动化控制系统的功能。 ### 回答3: 西门子S7协议是一种用于工业自动化系统的通信协议,用于实现设备之间的数据交换和控制。在Java中,可以使用一些开源库来实现S7协议的支持。 其中,Snap7是一个广泛使用的Java库,它提供了与S7协议通信的功能。使用Snap7,我们可以在Java程序中实现西门子PLC进行通信,读取和写入PLC的数据,以及对PLC进行远程控制等操作。 要使用Snap7库,首先我们需要将Snap7的Java库文件添加到Java项目中。然后,我们需要编写Java代码来初始化一个连接对象,并设置连接参数,例如PLC的IP地址和端口号。 接下来,我们可以使用连接对象来执行各种操作,例如读取和写入PLC的数据。可以通过设定区域和地址来指定需要读取或写入的数据的位置。读取数据时,可以指定需要读取的数据类型和数据长度。 此外,我们还可以使用Snap7库来实现对PLC进行控制操作,例如启动、停止或重置PLC等。可以发送控制命令并接收PLC的响应,以判断操作是否成功。 总结起来,通过使用Snap7这种开源库,我们可以在Java程序中实现西门子S7协议的支持,实现与PLC的通信、数据交换和远程控制等功能。这为工业自动化系统的开发提供了更多的灵活性和便利性。
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值