有很多人问我西门子的PLC如何在不使用OPC UA的情况下实现优化DB块后仍然可以用标签与之通讯,其实是可以的,西门子PLC使用私有协议进行通信,端口为102。西门子PLC协议有3个版本,S7Comm协议,早期S7CommPlus协议和最新的S7CommPlus协议。S7-200、S7-300、S7-400系列的PLC采用早期的西门子私有协议S7comm进行通信,S7-1200系列v3.0版本之前的通信协议采用早期S7Comm-Plus协议,S7-1200系列v4.0版本、S7-1500系列采用了最新的S7Comm-Plus协议,最新的S7Comm-Plus协议引入了会话ID来防止重放攻击,S7Comm-Plus协议建立通讯过程大致如下:
通信握手初始化(即CR/CC)-->与PLC建立S7Comm-Plus连接并返回20个随机字节(Challenge)-->根据随机数(Challenge)并结合公钥,生成认证数据(StructSecurityKey&SessionKey)将StructSecurityKey发送到PLC-->PLC端使用私钥对认证数据(StructSecurityKey)进行解密,认证成功后,回复TIA端OK,通信建立成功。
但S7Comm-Plus协议的V2与V3版本有所区别,在建立S7Comm-Plus连接之后,发送到PLC的每个数据包超过1024之后就会被拆分成两个分开发送,在V3版本中被拆分的每个数据包都会携带一个使用SessionKey生成的IntegrityPart(32字节)用于校验当前数据包是否合法,而在V2版本中却是共用一个,并且在V3版本中StructSecurityKey&SessionKey是有生命周期的,如果超过一小时不更新SessionKey PLC就会主动断开当前的连接。
另外S7Comm-Plus协议的V2版本还可以跑在TLS安全层连接上,此时的验证过程则与非TLS安全层连接的V3版本的验证过程完全不一样,也不会再需要定时更新StructSecurityKey与SessionKey了,以下是我基于开源库实现的测试demo(https://github.com/lircy/S7CommPlusV3Driver.git),欢迎大家下载测试