揭秘PLC(五)RTS之扩展通讯
之前有朋友问过这样一个问题,遇到一个新项目/行业,到底是选择MCU还是PLC来实现,我觉得在PLC能够满足要求的前提下,项目初期非常合适使用PLC做评估验证,当产品定型后再通过设计专用的MCU板卡来实现,PLC揭秘(1)中介绍过的ISaGRAF就支持把IEC-61131-3的工程倒出为.c文件,从而简化设备商设计专用控制器的流程。
PLC相比MCU,还有一些无法比拟的优势:灵活性和扩展性。有些应用虽然相同,但是现场的传感器,执行器却并不相同,厂家不可能遍历所有的应用场景去设计MCU固件,而PLC可以通过更换用户代码以及安装不同的IO模块来适应各个场景。其中和IO模块的通讯就非常关键了,这也是PLC技术中非常重要的一环。
早期PLC的CPU模块通过背板扩展,而背板有些是在机框中固定,模块插在不同的槽位中,如下图所示:

而有些类似于拼积木,而这些IO模块都紧邻CPU模块,也可以被视为本地IO

现在PLC的厂商也在不断的衍进新的技术,比如分布式I/O,可以通过工业以太网远程扩展IO,常见的工业以太网有Profinet, EtherCAT, Powerlink等等。

分布式I/O一般由接口模块(IM)和IO模块共同组成,模块之前还是通过背板连接,而IM通过网络与PLC相连

由于IO模块从成本考虑,通常会选择一颗MCU来控制输入/输入及背板协议,不管是本地CPU于IO模块之间,还是IM模块于IO模块之间的背板通讯往往会受到IO模块的限制,一般物理层会选择RS485或者CAN,针对RS485常见的协议有Modbus RTU,Profibus-DP,针对CAN常见的协议有CANOpen,DeviceNET。下面我们以Profibus-dp为例,抛砖引玉,向大家展示其主要原理。
Profibus-DP
Profibus-DP的物理层使用RS485,最大的波特率支持12Mbps,最大传输距离与波特率有关:

DP常见有3个版本
DP版本 | 说明 |
---|---|
DPV0 | 包括DP最基本功能,主从设备间的周期数据传输,从站设备的诊断功能 |
DPV1 | 在V0的基础上扩展了主从设备间非周期数据交互等特性 |
DPV2 | 添加了对冗余的要求,从站间通讯,时钟同步等功能 |
DP支持多主系统,同一个网络内最多有126个设备(包括多主),主站之前通过令牌的方式进行交互,下图是DP的基本功能:

DP网络使用了标准ISO/OSI参考模型的1、2和7层:

DP的字节格式:每字节包含11bit数据:LSB在前,1个起始位,8个数据位,1个偶校验,1个停止位:

DP常见有4种报文格式:SD1, SD2,SD4, SC




符号 | 定义 |
---|---|
SD | 起始符 |
LE | 包括:DA、SA、FC、DSAP、SSAP、DU 在内的所有数据的长度 |
LEr | LE 的重复 |
DA | 目的地址,报文帧的接收方地址 |
SA | 源地址,报文帧的发起方地址 |
FC | 功能码,用于标识本报文帧的类型 |
DU | 数据域,用于放置传输的用户数据 |
FCS | 对帧中各域数据的代数和,由ASIC 自动计算给出。(Frame Check Sequence) |
ED | 结束分界符(End Delimiter),标志着本报文帧的结束。固定为0x16 |
DSAP | 目的服务存取点(Destination Service Access Point) |
SSAP | 源服务存取点(Source Service Access Point) |
SD1 | 起始界定符1(Start Delimiter 1) |
SD2 | 起始界定符2(Start Delimiter 2) |
SD4 | 起始界定符4(Start Delimiter 4) |
DP主从数据交换原理:

DP的通讯关系可以参考下表:
功能/服务 | DP 从站 | 1 类DP 主站 | 2 类DP 主站 | 使用的SAP 号 | 使用第2 层服务 |
---|---|---|---|---|---|
Data_Exchange | M | M | 0 | 默认SAP | SDR |
RD_Inputs | M | 0 | 56 | SDR | |
RD_OutPut | M | 0 | 57 | SDR | |
Slave_Diag | M | M | 0 | 60 | SDR |
Set_Prm | M | M | 0 | 61 | SDR |
Chk_Cfg | M | M | 0 | 62 | SDR |
Get_Cfg | M | 0 | 59 | SDR | |
Global_Control | M | M | 0 | 58 | SDR |
Set_Slave_Addr | 0 | 0 | 55 | SDR | |
M_M_Communication | 0 | 0 | 54 | SDR/SDN | |
DDPV1_serics | 0 | 0 | 0 | 51/50 | SDR |
DP最主要使用的是需回答的数据传输和请求服务(SDR,Send Data With Reply),而这种服务通过数据链路层的SAP(服务存取点)来实现的。
DP要进入数据交互阶段,需要经过两次诊断和一次参数设置过程,下图是从站入网的过程:

从图中得知,入网需要3个比较重要的SAP报文:
诊断报文



参数报文



配置报文


数据交互报文

DP支持波特率自适应,也就是说不管总线上跑什么频率,DP的从设备都会自适应选择到合适的波特率。MCU可以通过软件的方式来实现该功能,首先我们知道帧头SD1 = 0x10, SD2 = 0x68,SD4 = 0xDC,而且不同波特率下帧间隔的最小时间,所以我们可以从最高波特率向下扫描,先假设为最高波特率,一直收数据,直到超过帧间隔时间后,记录下帧数据的包头,判断是否匹配SD帧头,如果是则可以收完整一帧数据,计算FCS是否正确,如果正确则找到了正确的波特率,过程中如果有任何错误,则切换为低一个速率的波特率继续尝试。参考完整的协议,是比较容易通过MCU来实现Profibus-dp从站的,需要注意的是timer的控制。
GSD文件解析
1.配置信息
前面我们重点介绍了DP协议的帧格式,现在我们来看下如何使用DP模块,在Codesys中需要添加DP主站,并设置Bus 参数:

在主站下面添加从站模块,并设置Input/Output和用户参数,当Input/Output模块添加后,PLC配置区会自动计算I/Q区的地址列表

输入输出区在GSD文件的Module Definition List,对应配置报文
; Module Definition List
Module = "2 Bytes Out/ 2 Bytes In -" 0x31
EndModule
Module = "8 Bytes Out/ 8 Bytes In -" 0x37
EndModule
Module = "32 Bytes Out/ 32 Bytes In -" 0xC0,0x1F,0x1F
EndModule
Module = "64 Bytes Out/ 64 Bytes In -" 0xC0,0x3F,0x3F
EndModule
Module = "1 Word Out/ 1 Word In -" 0x70
EndModule
Module = "2 Word Out/ 2 Word In -" 0x71
EndModule
Module = "4 Word Out/ 4 Word In -" 0x73
EndModule
Module = "8 Word Out/ 8 Word In -" 0x77
EndModule
Module = "16 Word Out/ 16 Word In -" 0x7F
EndModule
……
这里以Module = "2 Bytes Out/ 2 Bytes In -" 0x31为例,其表示本模块是Simple格式,有2个字节的输入和2字节的输出

Module = "32 Bytes Out/ 32 Bytes In -" 0xC0,0x1F,0x1F
0xC0表示特殊格式,后面接着1字节的输出字节长度,1字节的输入字节长度
0x1F表示32 Bytes输出
0x1F表示32 Bytes输入

2.用户参数
在Codesys中可以设定从站模块的用户参数:

用户参数在GSD文件的UserPrmData-Definition字段定义:
; UserPrmData-Definition
ExtUserPrmData=1 "I/O Offset in the V-memory"
Unsigned16 0 0-5119
EndExtUserPrmData
; UserPrmData: Length and Preset:
User_Prm_Data_Len=3
User_Prm_Data= 0,0,0
Max_User_Prm_Data_Len=3
Ext_User_Prm_Data_Const(0)=0x00,0x00,0x00
Ext_User_Prm_Data_Ref(1)=1
;
其对应参数报文,其中比较重要的是Ext_User_Prm_Data_Ref(1)=1,这句话括号里的字符表示该参数在扩展参数域的位置,等号后边的值对应ExtUserPrmData=1
PLC设备厂商在编写GSD文件的时候,可以通过一些检查工具来验证其合理性,这里就不详细说明,感兴趣的小伙伴可以搜索相关资料查看。
3.实现方式
从实现方式上讲,Profibus-DP最简单的做法就是使用专用的ASIC芯片:主站可以选择ASP2,从站的话,可以选择西门子的SPC3,Profichip的VPC3,这两个是针对Profibus的芯片,而HMS的B40支持多种协议见下图,其中包括Profibus,而德国赫优讯也提供类似的方案,使用专用芯片是最简单也最容易通过认证的方案,如果有认证的需求,这是不二之选。

通过MCU实现DP也是可行的,但是容易受到波特率的限制,往往低于6Mbps,考虑到DP总线上长期会有周期数据,对MCU的主频也有一定的要求,如果波特率太高会频繁进入中断导致MCU的loading较高。FPGA也是一个较好的实现DP的手段,可以将DP状态机通过FPGA实现,MCU使用SPI或者8080总线与FPGA交互来读写用户参数,诊断,配置数据等操作,FPGA可以实现较高的通讯速率,并减小MCU的loading,但是成本会增加不少。
写在最后
我所分享的这5篇文章,大致是10年前PLC相关知识,就目前而言,PLC正在向更安全,更可靠,更高速的方向发展。国内的厂商早已经有通过SIL3等级认证的相关设备,其中还包括自主知识产权的编译器方案,更加复杂的冗余技术也已经有规模的应用。PLC相比于通讯行业或其他领域而言并不复杂,但需要成功的将计算机,编译器,嵌入式软件/硬件,通讯,安全诸多领域技术融合,并不是一件非常容易的事情,也希望老东家能厚积薄发,早日重回自动化50强。文章的目的不在于揭秘,而在于记录和交友,欢迎大家订阅公众号,本公众号主要发布和嵌入式相关的小文章,谢谢。
