PROFINET系统启动过程-Part1:PLC上电为设备分配通讯参数过程(转)
转自:https://zhuanlan.zhihu.com/p/533194908
本文介绍西门子 S7-1200 PLC 使用 RPOFINET网络连接一个从站设备 Anybus CompactCom40 PROFINET模块(Anybus品牌的PROFINET接口模块)。
使用Wireshark记录并分析PROFINET主从站之间的交互过程,来分析PLC如何检测模块是否存在并为模块设置通讯参数的过程。
1. 工程组态说明
首先我们需要在TIA PORTAL 软件中新建一个工程,并插入PLC设备 CPU 1214C AC/DC/Rly (6ES7214-1BG31-0XB0)。
然后我们新建一个PROFINET网络,并设置PLC的IP 地址为 192.168.0.1/255.255.255.0
通过导入Anybus CompactCom40 PROFINET 模块的GSDML文件,在工程中插入一个Anybus CompactCom40 PROFINET模块。
选择“Set IP address in the project”并设置模块的IP 地址为 192.168.0.5/255.255.255.0,并为模式自动生成设备名称 “abcc40pir”。
将工程中设置的模块设备名称写入到模块中,确保模块内部实际的设备名称与工程组态保持一致
将工程下载到PLC中,后续我们将使用该工程抓取PLC与模块建立连接的过程,并分析整个网络启动的过程。
2. 网络抓包环境设置
我们使用支持端口映射的Anybus 管理型L2交换机AWB5005。
配置AWB5005的端口映射,设置将交换机的Port3和Port5的全部数据流量映射到交换机的Port8。
将S7-1200 和Anybus CompactCom40 PROFINET 模块分别连接到交换机的Port2和Port3。
使用笔记本电脑的网口连接AWB5005交换机的PORT8, 并在电脑上安装运行Wireshark抓包软件。
此时由于配置了端口映射,Wireshark能够接收并抓取记录到S7-1200和Anybus CompactCom40 PROFINET 模块的全部数据流量,并能够进行数据帧分析。
设置完成后,我们重启PROFINET整个网络,确保Wireshark能够正确抓取到所有设备启动后的全部报文。
3. PROFINET报文分析
- PLC使用ARP检测 192.168.0.1 是否被其他设备使用
由于我们在TIA PORTAL组态时,设置了PLC 的IP地址为192.168.0.1,因此PLC在上电启动后会首先检测PROFINET网络上是否有其他设备使用了同样的IP地址,确保其IP地址不会在网络上发生冲突。
在多次ARP广播探测之后,PLC检测到网络上并没有其他设备使用192.168.0.1, 因此PLC将设置自己的IP地址为192.168.0.1
- PLC使用DCP协议查找设备名称为“abcc40pir”的设备
DCP(Discovery and Configuration Protocol) 协议是PROFINET协议用来寻址和设置PROFINET设备IP地址和设备名称的专用协议。
DCP Identify 命令使用专有的FrameID(0xFEFE) PROFINET广播帧在网络上发送Identify 指令,网络上所有的PROFINET都能够接收到该广播帧,如果确认该命令查找的设备是自身则进行响应。
如下图所示,由于在组态时添加了一个Anybus CompactCom40 PROFINET 模块,并设置其设备名称为“abcc40pir”,因此PLC工程中知道网络上应该有个一设备且名称为“abcc40pir”, PLC在上电后使用 DCP Idenfiy 查找网络上名称为“abcc40pir”的设备。
- Anybus CompactCom40 PROFINET 模块应答DCP Identify
因为在组态时我们已经使用TIA PORTAL 将“abcc40pir”设备名称分配给了Anybus CompactCom40 PROFINET 模块,因此Anybus CompactCom40 PROFINET 模块在收到网络上的DCP Identify广播命令后,会进行应答,应答时使用FrameID(0xFEFF) 且目标地址为PLC的MAC地址的单播帧。
在下图可以看到,模块应答DCP Identify时不仅回复了自身的设备名称(abcc40pir),IP地址(0.0.0.0),还包括自身的厂商识别信息VendorID (0x010C)和DeviceID (0x0010)以及模块的设备类型(CompactCom 40 PIR)。
S7-1200 在收到Anybus CompactCom40 PROFINET 模块的DCP Identify应答后,可以根据这些信息对比工程组态中使用的模块和在线模式是否一致,如果不一致将会报错。
- S7-1200 PLC为Anybus CompactCom40 PROFINET 模块分配IP地址
由于在工程组态时Anybus CompactCom40 PROFINET 模块IP地址设置方式选择了“Set IP address in the project” 也就是PLC为模块设置IP地址,因此PLC在启动时无论模块中是否有IP地址存在,都将发送IP地址设置命令,将模块中的IP地址修改为工程组态中的值192.168.0.5
PLC在给模块发送IP地址设置命令之前,会首先使用ARP广播帧进行探测网络上是否有相同的IP地址,避免IP地址冲突。
在确保没有IP地址冲突的情况下, S7-1200 PLC 会使用 DCP Set 命令设置Anybus CompactCom40 PROFINET 模块IP地址为192.168.0.5
DCP Set帧使用的是单播以太网帧, FrameID 为0xFEFD
此处需要注意的一点是S7-1200 为模块设置的I地址是一个临时值,模块仅会在本次运行时使用,并不会将其保存至内部存储中下次断电再次使用。
因此如果模块断电后,不连接S7-1200 PLC,会发现模块的IP地址仍然为0.0.0.0, 原因就在此处
- Anybus CompactCom40 PROFINET 模块检查IP地址
Anybus CompactCom40 PROFINET 模块在接收到DCP Set命令后,会使用ARP Probe进行IP地址重复探测,如果没有冲突则声明使用192.168.0.5
- Anybus CompactCom40 PROFINET 回复PLC DCP Set 命令
模块在设置完自身的IP地址后,会回复之前PLC发送的DCP Set命令, 确认IP地址设置成功
- S7-1200 PLC 确认Anybus CompactCom40 PROFINET IP地址分配成功
PLC会使用ARP 再次查找192.168.0.5 的设备,只有模块正确进行回复PLC才确认IP地址分配成功
以上是选择“Set IP address in the project”选项时PLC 为模块分配IP地址的情况,同时TIA Portal 还提供了另外一个选项“IP address is set directly at the device”
使用“IP address is set directly at the device”, PLC 仅检测Anybus CompactCom40 PROFINET 模块的IP地址是否与PLC在同一IP网段。
Anybus CompactCom40 PROFINET 模块在启动时应确保自身有一个有效的IP地址
在PLC 使用 DCP Identify 查找设备时,从站设备回复PLC自身正在使用的IP地址
PLC 在接收到模块的DCP Identify 应答后,会提取出应答中的IP地址,并在后续的通讯中使用, 而不再执行为模块写入IP地址的操作。