################################################################################
# FICHE DE MODELE SABER : ED:1 REV:1
# AUTEUR:OCSIMIZE DATE:29/01/04
#
# FICHIER fail_elec_oc.sin : ind.a
# ETAT : valid
################################################################################
#==============================================================================#
template fail_elec_oc p m device = ron, roff, td, duration, tr, tf,\
fault_time_begin,fault, fault_type, dcfail, v_brkdwn_pos, \
v_brkdwn_neg, i_brkdwn, debug
#==============================================================================#
################################################################################
# Copyright 2004 to infinity and beyond..., Ocsimize.
# This template may not be reproduced or modified
# without permission from Ocsimize. Ocsimize does not assume
# liability for the use of this template or the results
# obtained from using it as long as it is not validated by the final user.
# Usage of this template is allowed for customers of Ocsimize's customers
################################################################################
################################################################################
# MODIFICATION
#
# 29/01/04: creation
#
################################################################################
################################################################################
# Name Type Signification
#
# p electrical connection to equivalent output
# m electrical common point
# device electrical connection to device
#
################################################################################
################################################################################
#
# Failure module :
#
# This module will provoke for an electrical device
# to fail "shorted" or "opened" by either:
# * manually set with alter (fail=="yes")
# * or at a specified time
# * or at a specified voltage negative or positive
# * or at a specifieed current
# * or at a specified current or a specified voltage
#
# You must define :
#
# 1) the presence or no of a failure with the -fault- parameter
# 2) If you want a failure immediatly with the -dcfail- parameter
# 3) How will happen the fault with the -fault_type- parameter
# 4) The physical parameters
# 5) If you want more messages
#
# By default ... nothing will happen !
#
# Use :
#
# O-------+
# |
# ------------------ ----------------
# | p device | ----------o |
# | | | |
# | Model | | External |
# | | | device |
# | m | | |
# ------------------ -----o----------
# | |
# O-------+---------------------------+
#
#
# Note: The pin, failure, is a state that is only
# used for monitoring the failure condition
# in post-processing.
#
################################################################################
electrical p,m,device
number ron = 1m # Value of shorted resistance
number roff = 1meg # Value of opened resistance
number td = inf # Duration of timed failure
number duration = inf # Duration of physical failure
number tr = 1m # Failure "risetime"
number tf = 1m # Failure "falltime"
number fault_time_begin = 10000 # Scheduled time to start to fail
enum {timed,voltage,current,any,none} fault = none
# Cause of failure
enum {s_c,o_c} fault_type = s_c # Type of failure
enum {yes,y,no,n} dcfail = no # Whether the device should fail in DC
number v_brkdwn_pos = inf # Voltage (>0) at which failure occurs
number v_brkdwn_neg = -inf # Voltage (<0) at which failure occurs
number i_brkdwn = inf # Current at which failure occurs
number debug = 0 # More messages when debugging
#---+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8
{
state nu brk_pos_bef, brk_pos_aft
state nu brk_neg_bef, brk_neg_aft
state nu brk_i_bef, brk_i_aft
state logic_4 shortcircuit, opencircuit
state logic_4 brkrunning
state logic_4 failure
val v v
var i i
val p power
number dcfail_event = 0
number fault_time_end = inf
number v_brk_pos_event = 0
number v_brk_neg_event = 0
number i_brk_event = 0
number time_brk_event = 0
number volt_pos_event = 0
number volt_neg_event = 0
number current_event = 0
number xfault_time_begin
electrical inner
#---+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8
parameters {
# simple checks not using saber_message for portability
if (ron <= 0) {
message("\n")
message("TMPL_S_POSEQ in template % : \n \n", instance())
error("\t ron must be >= 0. \n \n")
# saber_message("TMPL_S_POSEQ",instance(),"ron")
}
if (roff <= ron) {
message("\n")
message("TMPL_S_GT_PARM in template % : \n \n", instance())
error("\t roff must be > ron. \n \n")
# saber_message("TMPL_S_GT_PARM",instance(),"roff","ron")
}
if (tr <= 0) {
message("\n")
message("TMPL_S_POSEQ in template % : \n \n", instance())
error("\t tr must be >= 0. \n \n")
# saber_message("TMPL_S_POSEQ",instance(),"tr")
}
if (tf <= 0) {
message("\n")
message("TMPL_S_POSEQ in template % : \n \n", instance())
error("\t tf must be >= 0. \n \n")
# saber_message("TMPL_S_POSEQ",instance(),"tf")
}
if (fault_time_begin <= tr) {
message("\n")
message("TMPL_S_GT_PARM in template % : \n \n", instance())
error("\t fault_time_begin must be > tr. \n \n")
# saber_message("TMPL_S_GT_PARM",instance(),"fault_time_begin","tr")
}
if (fault_time_begin <= tf) {
message("\n")
message("TMPL_S_GT_PARM in template % : \n \n", instance())
error("\t fault_time_begin must be > tf. \n \n")
# saber_message("TMPL_S_GT_PARM",instance(),"fault_time_begin","tf")
}
if (td <= 0) {
message("\n")
message("TMPL_S_POSEQ in template % : \n \n", instance())
error("\t td must be >= 0. \n \n")
# saber_message("TMPL_S_POSEQ",instance(),"td")
}
if (td == undef) {
message("\n")
message("TMPL_S_UNDEF in template % : \n \n", instance())
error("\t td is undefined. \n \n")
# saber_message("TMPL_S_UNDEF",instance(),"td")
}
if (duration <= 0) {
message("\n")
message("TMPL_S_POSEQ in template % : \n \n", instance())
error("\t duration must be >= 0. \n \n")
# saber_message("TMPL_S_POSEQ",instance(),"duration")
}
if (v_brkdwn_pos <= 0) {
message("\n")
message("TMPL_S_POS in template % : \n \n", instance())
error("\t v_brkdwn_pos must be >= 0. \n \n")
# saber_message("TMPL_S_POS",instance(),"v_brkdwn_pos")
}
if (v_brkdwn_neg > 0) {
message("\n")
message("TMPL_S_NEGEQ in template % : \n \n", instance())
error("\t v_brkdwn_neg must be <= 0. \n \n")
# error("TMPL_S_NEGEQ % : v_brkdwn_neg must be <= 0",instance())
}
# logic init
dcfail_event = ((dcfail == yes) | (dcfail == y))
v_brk_pos_event = ((v_brkdwn_pos ~= inf) & (v_brkdwn_pos ~= undef))
v_brk_neg_event = ((v_brkdwn_neg ~= -inf) & (v_brkdwn_neg ~= undef))
i_brk_event = ((i_brkdwn ~= inf) & (i_brkdwn ~= undef))
time_brk_event = ((fault_time_begin ~= inf)&(fault_time_begin ~= undef) & \
(td ~= undef))
#---+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8
if ((fault == voltage) & v_brk_pos_event) {
volt_pos_event = 1
volt_neg_event = 0
current_event = 0
}
else if ((fault == voltage) & v_brk_neg_event ) {
volt_pos_event = 0
volt_neg_event = 1
current_event = 0
}
else if ((fault == voltage) & (~v_brk_pos_event | ~v_brk_neg_event)) {
message("\n")
message("TMPL_S_ILL_VALUE in template % : \n \n", instance())
error("\t Voltage cause and value mismatch. \n \n")
# saber_message("TMPL_S_ILL_VALUE",instance())
}
if ((fault == current) & i_brk_event) {
volt_pos_event = 0
volt_neg_event = 0
current_event = 1
}
else if ((fault == current) & ~i_brk_event) {
message("\n")
message("TMPL_S_ILL_VALUE in template % : \n \n", instance())
error("\t Current cause and value mismatch. \n \n")
# saber_message("TMPL_S_ILL_VALUE",instance())
}
if ((fault == any) & \
(i_brk_event | v_brk_neg_event | v_brk_pos_event)) {
volt_pos_event = 1
volt_neg_event = 1
current_event = 1
}
else if ((fault == any) & \
(~i_brk_event & ~v_brk_neg_event & ~v_brk_pos_event)) {
message("\n")
message("TMPL_S_ILL_VALUE in template % : \n \n", instance())
error("\t Any cause and value mismatch. \n \n")
# saber_message("TMPL_S_ILL_VALUE",instance())
}
if ((fault == timed) & time_brk_event) {
xfault_time_begin = fault_time_begin
if (td == inf | xfault_time_begin == inf) {
fault_time_end = inf
}
else {
fault_time_end = fault_time_begin + td
}
}
else if ((fault == timed) & ~time_brk_event) {
message("\n")
message("TMPL_S_ILL_VALUE in template % : \n \n", instance())
error("\t timed cause and value mismatch. \n \n")
# saber_message("TMPL_S_ILL_VALUE",instance())
}
if (fault == none) {
xfault_time_begin = inf
volt_pos_event = 0
volt_neg_event = 0
current_event = 0
}
# for design only
# message("ron = %",ron)
# message("roff = %",roff)
# message("td = %",td)
# message("duration = %",duration)
# message("tr = %",tr)
# message("tf = %",tf)
# message("dcfail = %",dcfail)
# message("v_brkdwn_pos = %",v_brkdwn_pos)
# message("v_brkdwn_neg = %",v_brkdwn_neg)
# message("i_brkdwn = %",i_brkdwn)
# message("debug = %",debug)
# message("fault = %",fault)
# message("fault_type = %",fault_type)
# message("fault_time_begin = %",fault_time_begin)
# message("xfault_time_begin = %",xfault_time_begin)
# message("fault_time_end = %",fault_time_end)
# message("dcfail_event = %",dcfail_event)
# message("v_brk_pos_event = %",v_brk_pos_event)
# message("v_brk_neg_event = %",v_brk_neg_event)
# message("i_brk_event = %",i_brk_event)
# message("time_brk_event = %",time_brk_event)
}
#---+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8
when(dc_init | (time_init & (failure == l4_x | failure == l4_z))) {
if (debug) message ("dc_initializing %", instance())
schedule_event(time,shortcircuit,l4_0)
schedule_event(time,opencircuit,l4_1)
brkrunning = l4_0
}
when(dcfail_event & (dc_start | tr_start)) {
if (debug) message("Template % : dc_or_tr_start_analysis for failure",\
instance())
if (brkrunning == l4_1 & (fault == none)) {
if (debug) message("Reset failure detected")
brkrunning == l4_0
schedule_event(time,shortcircuit,l4_0)
schedule_event(time,opencircuit,l4_1)
schedule_event(time, failure, l4_0)
}
else if (fault ~= none) {
if (debug) message("Alter failure detected")
schedule_event(time, failure, l4_1)
}
}
when(~dcfail_event & (dc_start | tr_start)) {
if (fault == timed) {
if (debug) message("Timed failure detected at time = %",\
xfault_time_begin)
brkrunning = l4_0
schedule_event(time + xfault_time_begin, failure, l4_1)
schedule_event(time + fault_time_end, failure, l4_0)
}
}
#---+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8
when ((threshold(v,v_brkdwn_pos,brk_pos_bef,brk_pos_aft)) \
& v_brk_pos_event & (brkrunning == l4_0)) {
if (brk_pos_aft >= 0) {
schedule_event(time, failure , l4_1)
schedule_event(time + duration, failure , l4_0)
if (debug) message ("Positive Overvoltage threshold crossed", instance())
}
}
when ((threshold(v,v_brkdwn_neg,brk_neg_bef,brk_neg_aft)) & v_brk_neg_event & (brkrunning == l4_0)) {
if (brk_neg_aft < 0) {
schedule_event(time, failure , l4_1)
schedule_event(time + duration, failure , l4_0)
if (debug) message ("Negative Overvoltage threshold crossed", instance())
}
}
when ((threshold(abs(i),i_brkdwn,brk_i_bef,brk_i_aft)) \
& current_event & (brkrunning == l4_0)) {
if (brk_i_aft >= 0) {
schedule_event(time, failure , l4_1)
schedule_event(time + duration, failure , l4_0)
if (debug) message ("Positive Overcurrent threshold crossed", instance())
}
}
when(event_on(failure) & time_domain) {
if (failure == l4_1 & fault_type == s_c) {
schedule_event(time,shortcircuit,l4_1)
if(debug) message("Template % shortcircuit at %",instance(),time)
brkrunning = l4_1
}
else if (failure == l4_0 & fault_type == s_c) {
schedule_event(time,shortcircuit,l4_0)
if(debug) message("Template % ends shortcircuit at %",instance(),time)
brkrunning = l4_0
}
if (failure == l4_1 & fault_type == o_c) {
schedule_event(time,opencircuit,l4_0)
if(debug) message("Template % opencircuit at %",instance(),time)
brkrunning = l4_1
}
else if (failure == l4_0 & fault_type == o_c) {
schedule_event(time,opencircuit,l4_1)
if(debug) message("Template % ends opencircuit at %",instance(),time)
brkrunning = l4_0
}
}
#---+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8
# driver_l4.1 p shortcircuit m =vce_sat=1u, imax=2*i_brkdwn, \
# tr=tr, tf=tf, krev=1
# driver_l4.2 p opencircuit inner =vce_sat=1u, imax=2*i_brkdwn,\
# tr=tr, tf=tf, krev=1
# #r.1 x2 m =rnom,tc,tnom,nons,model,l,w
sw_l4.1 p m shortcircuit =ron=ron, roff=roff, tr=tr, tf=tf
sw_l4.2 p inner opencircuit =ron=ron, roff=roff, tr=tr, tf=tf
values {
v = v(device)-v(m)
power = v*i
}
equations {
i(inner) +=i
i(device) -= i
i: v(inner)-v(device)=0
}
}