Profinet提供了强大的诊断功能,这是其他通讯协议所无法比拟的。PN设备检测到问题后可以向控制器发送报警信息,报警分为三大类:
需要根据报警的触发条件向PLC发送不同类型的报警,诊断报警相对比较常见。
对于PN IO设备,基本的设备模型为如下形式:
在子槽、子模块上都有一个或若干个通道,每个通道既可对应输入输出点,也可以对应某个内部组件(硬件或软件)。对与提供诊断功能的每个通道,都会有相应的观测器(observer)检查在此通道上是否有故障。如果观测器检测到故障,将故障的诊断信息添加到设备的诊断信息数据库中,如果检测到故障消除,再将之前的诊断信息从诊断信息数据库删除。如下图所示:
为了区分在一个通道上的不同类型的故障,还需要使用ErrorType (故障类型) 来指示:IEC 61158-6-10定义的标准故障类型编码如下表所示:
并且诊断事件也有对应的严重程度
严重程度 |
例子:编码器光源的亮度 |
Normal (正常) |
编码器功能有保障,无任何限制 |
Maintenance Required |
编码器光源的亮度变弱,编码器功能有保障,需要采购新的编码器 |
Maintenance Demanded |
编码器光源的亮度变的很弱,编码器功能不再有保障,需要尽快更换编码器 |
Fault (故障) |
编码器光源已损坏,编码器失效,需要立即更换编码器 |
此外,设备的指示灯需要根据诊断信息数据库中诊断信息的严重程度,设置为黄色、橙色或红色。
诊断信息是由以下信息构成的:
模块、子模块、通道号、故障类型、严重程度、方向(输入/输出)以及附加信息组成
因此任何一个诊断报警事件都可以对应到设备的某一个通道上,所以也叫做通道报警。
诊断报警有两种,诊断事件产生/到达(appear)和诊断事件消失/离去(disappear)
如果PN设备检测到故障发生,并将诊断信息添加至诊断数据库,就会伴随诊断事件到达报警发送到PLC;当设备检测该通道的故障状态消除,并将诊断信息从诊断数据库删除,就会伴随诊断事件离去报警发送至PLC。PLC在收到通道报警后,会触发OB 82: Diagnostic Error Interrupt。在OB82中可以使用ALARM结构分析和处理详细的诊断信息。
因此设备诊断的基本流程如下:
在协议栈中,通道诊断信息的添加和删除以及对应报警事件触发是由以下接口实现:
其中MaintenanceReq和MaintenanceDem控制报警严重程度以及‘产生/消失‘
在协议栈中,通道报警的处理被封装在函数
OS_CODE_FAST PNIO_UINT32 UsrChanDiag (PNIO_UINT16 AlarmState, // DIAG_CHANPROP_SPEC_ERR_APP, DIAG_CHANPROP_SPEC_ERR_DISAPP, DIAG_CHANPROP_SPEC_ERR_DISAPP_MORE
PNIO_UINT32 SlotNum, // slot number
PNIO_UINT32 SubNum, // subslot number
PNIO_UINT16 ChanNum, // channel number
PNIO_UINT16 ErrorNum, // error number, see PNIO specification coding of "ChannelErrorType"
PNIO_UINT16 ChanDir, // channel direction (DIAG_CHANPROP_DIR_IN, DIAG_CHANPROP_DIR_OUT,...)
PNIO_UINT16 ChanTyp, // channel type (DIAG_CHANPROP_TYPE_BYTE, DIAG_CHANPROP_TYPE_WORD,...)
PNIO_UINT16 DiagTag) // user defined diag tag, used as reference
添加通道诊断信息会触发协议栈发送RTA_Dat(alarm)报警报文到控制器。控制器会回复RTA_Dat(al-ack)到协议栈并触发相应的回调函数。同时添加诊断信息到设备的诊断数据库中,可以通过TIA查看添加的诊断信息。
移除通道诊断信息也会触发协议栈发送RTA_Dat(alarm)报警报文到控制器。控制器会回复RTA_Dat(al-ack)到协议栈并触发相应的回调函数。同时从设备的诊断数据库中移除对应的诊断信息。
过程报警是通过PNIO_process_alarm_send实现
Addr.Geo.Slot = EXAMPL_1_SLOTNUM; // slot number
Addr.Geo.Subslot = EXAMPL_1_SUBSLOTNUM; // subslot number
Status = PNIO_process_alarm_send(PNIO_SINGLE_DEVICE_HNDL,
PNIO_DEFAULT_API,
&Addr, // location (slot, subslot)
&ProcessAlarmData[0], // alarm data
sizeof (ProcessAlarmData), // alarm data length
EXAMPL_1_USER_STRUCT_IDENT, // 0...0x7fff: user struct. is manufac. specific
EXAMPL_1_DIAG_TAG); // user defined handle
if (Status != PNIO_OK)
PNIO_ConsolePrintf ("Error %x occured\n", PNIO_get_last_error ());
break;
协议栈的处理过程如下图所示