diff --git a/motorApp/MotorSrc/motorRecord.cc b/motorApp/MotorSrc/motorRecord.cc index 636faedf..fd824938 100644 --- a/motorApp/MotorSrc/motorRecord.cc +++ b/motorApp/MotorSrc/motorRecord.cc @@ -3200,9 +3200,30 @@ static void alarm_sub(motorRecord * pmr) static void monitor(motorRecord * pmr) { unsigned short monitor_mask; + double delta = 0.0; monitor_mask = recGblResetAlarms(pmr); + /* check for value change */ + delta = pmr->mlst - pmr->rbv; + if (delta<0.0) delta = -delta; + if (delta > pmr->mdel) { + /* post events for value change */ + monitor_mask |= DBE_VALUE; + /* update last value monitored */ + pmr->mlst = pmr->rbv; + } + + /* check for archive change */ + delta = pmr->alst - pmr->rbv; + if (delta<0.0) delta = -delta; + if (delta > pmr->adel) { + /* post events on value field for archive change */ + monitor_mask |= DBE_LOG; + /* update last archive value monitored */ + pmr->alst = pmr->rbv; + } + /* Catch all previous 'calls' to MARK(). */ post_MARKed_fields(pmr, monitor_mask); return; @@ -3224,11 +3245,13 @@ static void post_MARKed_fields(motorRecord * pmr, unsigned short mask) msta.All = pmr->msta; - if ((local_mask = mask | (MARKED(M_RBV) ? DBE_VAL_LOG : 0))) - { - db_post_events(pmr, &pmr->rbv, local_mask); + if (MARKED(M_RBV)) { + db_post_events(pmr, &pmr->rbv, mask); UNMARK(M_RBV); } + + /*Now we have posted change on RBV, reset the monitor mask.*/ + mask = recGblResetAlarms(pmr); if ((local_mask = mask | (MARKED(M_RRBV) ? DBE_VAL_LOG : 0))) { diff --git a/motorApp/MotorSrc/motorRecord.dbd b/motorApp/MotorSrc/motorRecord.dbd index f987e582..676e2a9e 100644 --- a/motorApp/MotorSrc/motorRecord.dbd +++ b/motorApp/MotorSrc/motorRecord.dbd @@ -768,4 +768,24 @@ recordtype(motor) { interest(1) menu(motorRMOD) } + field(ADEL,DBF_DOUBLE) { + prompt("Archive Deadband") + promptgroup(GUI_COMMON) + interest(1) + } + field(MDEL,DBF_DOUBLE) { + prompt("Monitor Deadband") + promptgroup(GUI_COMMON) + interest(1) + } + field(ALST,DBF_DOUBLE) { + prompt("Last Value Archived") + special(SPC_NOMOD) + interest(3) + } + field(MLST,DBF_DOUBLE) { + prompt("Last Val Monitored") + special(SPC_NOMOD) + interest(3) + } }