看大家这段时间探讨很火热,我也来分享下几年前做的项目功能块吧!
做过一个STEP7+WinCC系统使用CFC组合SCL工具编程的项目。为充分发挥CFC在块调用连线、程序跳转,以及监控与修改上的功能,于是用SCL编写了一套带通道故障诊断报警(Diagnostic Alarm)、限幅(Limit)、量程标度(Scale)、故障安全值替换/保持(Substitute/Hold)、通道信号仿真(Simulation)等,多功能一体的I/O模块驱动功能块,以方便调试和维护。
尽管PCS7系统有这样一套驱动功能块,但每个块只能针对I/O模块的一个通道驱动,且不能用于非PCS7系统。我这套驱动功能块可对一个I/O模块中的所有通道驱动。这套驱动功能块按I/O信号类型分为IN_D8、OUT_D8、IN_A4、OUT_A2共4个,名称则按使用模块的类型和通道数量规则命名以方便记忆。
一、I/O驱动功能块设计功能简介 实现I/O驱动功能块编程的核心是使用了系统功能块SFC5[GADR_LGC],其功能是获取模块在硬件组态(HW Config)中的起始逻辑地址(Querying the Logical Base Address of a Module)。SFC5系统功能块I/O引脚使用功能如下表:
1.模块起始逻辑地址获取 调用SFC5功能块时,只要键入模块DP主站网络编号(SUBNETID)、DP主站机架编号(RACK),模块插槽编号(SLOT),就可在LADDR获得模块硬件组态起始逻辑地址,而模块I/O类型可在IOID中获得;模块错误信息返回值可在RET_VAL中读取。模拟量I/O通道地址计算公式如下:
ADDR[N]:= 2 * N + L_ADDR; //获取N通道的地址
式中:N——模块通道编号(N=0~x)[Type:INT];
L_ADDR——模块起始逻辑地址[Type:INT];
ADDR[N]——模块N通道地址[Type:INT]。
2.模块通道诊断信息获取 模块通道诊断信息获取原理是基于调用SFC5功能块时,获取RET_VAL错误信息返回值后实现的。SFC5功能块的RET_VAL错误信息返回值代码功能如下表:

编程时先定义变量QPARF和QPERAF,判断RET_VAL返回值代码为8093/8094/8099/809A时,视为组态参数分配错误QPARF;而代码为8095/8096/8097/8098时,则可视为模块访问故障QPERAF。
3.模拟量通道测量值限幅(Limit)设计 本项目I/O模块为ET200S系列,AI模块为两线制4~20mADC类型。AI通道测量值量程转换及表述范围表如下:

由此可知,传感器输入电流4~20mADC时,读取模块通道AI值的正常范围是0~27648。当27648<AI<0时,则AI值开始上/下过冲,出现异常超限;当-32768<AI<-4865时,则AI值已上/下溢出了;通常当AI=-32768时,则基本可视为传感器断线开路或未接线。
AI/AO块限幅值建议设定值范围:低限CH_F_LL≤-5%;高限CH_F_HL≥105%。由于高/低限幅设定值使用百分比%,所以在编程进行比较判断前,需先对通道值CH_V[N]进行百分比%变换。
4.模拟量I/O通道量程标度(Scale) 设计 AI/AO模块的单极性转换量程范围正常是0~27648,因此只要知晓接线通道的工程单位上/下限值,就可以利用线性标度变换计算公式,编程实现AI/AO模块的通道量程变换了。以下是AI模块的线性标度变换公式(AO模块则类同):
V[N]:= LRANGE[N] + CH_V[N] * (HRANGE[N] - LRANGE[N]) / 27648;
式中:N——模块通道编号(N=0~x)[Type:INT];
CH_V[N]——AI模块通道读数值[Type:INT];
LRANGE[N]——AI模块通道工程单位下限值[Type:REAL];
HRANGE[N]——AI模块通道工程单位上限值[Type:REAL];
V[N]——AI模块通道工程单位转换值[Type:REAL]。
此外,再设置POLAR[N]参数选择,用于针对有真空负压传感器测量类型时,报警提醒将工程单位上/下限设定值颠倒。
5.模块通道信号(Simulation)功能设计 设计模块I/O信号仿真功能,是为便于模块通道的在线/离线编程。AI/DI模块通道仿真功能主要用于CFC程序的调试;而AO/DO模块通道仿真则主要用于程序强制外部输出通道的调试。
先为每个I/O通道设置一个“正常输出/仿真强制”切换选择开关SIM_ON[N],再将仿真强制值SIM_V[N]按工程单位进行上/下限值限幅后,送至对应外部通道即可。为防止切换为“仿真强制”模式时对外部输出通道的扰动,可再定义一个跟踪使能TRACE变量,作用是在切换为“正常输出”模式时,让仿真强制值SIM_V[N]等于正常输出值AOV[N]。SCL代码简要如下:
IF SIM_ON[N] THEN //切换选择为仿真模式[SIM_ON[N] :BOOL]
AOV[N]:= SIM_V[N]; //将仿真值送至外部对应通道[SIM_V[N]:REAL]
ELSE
IF TRACE THEN //仿真值跟踪输出值使能选择[TRACE:BOOL]
SIM_V[N]:= AOV[N]; //让仿真值跟踪正常输出值[AOV[N]:REAL]
END_IF;
END_IF;
6.道故障安全值替换/保持(Substitute/Hold)功能设计 该功能主要用于仪表调节阀、快速切断阀、电磁阀等设备,在AO/DO模块输出通道故障时的安全处理方式选择。尽管ET200S系列I/O模块在硬件组态中有Keep last/ Substitute功能选项,但如果在正常生产中更改通道的该选项后,CPU必需停机下载才能生效,因此在一些高可靠性和不间断生产的领域使用受限。
本功能设计则可在CPU不停机时即可实现通道故障安全值“替换/保持”选项的修改,特别是本项目使用了CFC工具,更是方便灵活。SCL代码简要如下:
IF MCH_F[N] THEN //模块通道是否故障[MCH_F[N]:BOOL]
IF HOLD_U[N] THEN //选择通道故障后为“保持”模式[HOLD_U[N]:BOOL]
AOV[N]:= LAST_U[N]; //将通道故障前的正常值输出[LAST_U[N]:REAL]
ELSE
AOV[N]:= SUBS_U[N]; //通道故障后将预置的替换值输出[SUBS_U[N]:REAL]
END_IF;
END_IF;
LAST_U[N]:= AOV[N]; //将本次输出值保存
二、I/O驱动功能块应用体会 1、这套Drive块无论是在项目是调试和维护阶段,都发挥了巨大作用,希望通过以上的简要介绍能对大家有益,此项目也曾将其发表于2011年SIEMENS自动化专家会议论文上。

2、但这套Drive块需配合CFC工具才能展现它高效便捷的优势。此外由于它集多功能于一体,使得CPU的算术运算和存储容量均消耗较大,所以不建议在中低端的CPU项目上使用。