watchdog.cpp
Setup a watchdog timer using User Limits, User Faults and the User Buffer
#include "rsi.h"
using namespace RSI::RapidCode::SynqNet;
#define AXIS_X (0) // a real axis
#define AXIS_Y (2) // another real axis
#define AXIS_WATCHDOG (1) // the phantom/virtual axis to monitor the watchdog
#define WATCHDOG_TIME (0.02) // how long before we are timed out? (seconds)
#define WATCHDOG_ACTION RSIActionABORT
#define WATCHDOG_MONITOR_LIMIT RSIEventTypeLIMIT_USER1
#define WATCHDOG_RESET_LIMIT RSIEventTypeLIMIT_USER2
void ConfigureWatchdogUserLimits(Axis *axis, long watchdogAddress, long timeoutAddress)
{
axis->UserLimitConditionSet(WATCHDOG_MONITOR_LIMIT,
0,
RSIXmpLimitTypeNE,
watchdogAddress,
0xFFFFFFFF ,
0);
axis->UserLimitOutputSet(WATCHDOG_MONITOR_LIMIT,
0,
1,
timeoutAddress,
true);
axis->UserLimitConfigSet(WATCHDOG_MONITOR_LIMIT,
RSIXmpStatusLIMIT,
RSIXmpLogicSINGLE,
WATCHDOG_TIME);
axis->UserLimitConditionSet(WATCHDOG_RESET_LIMIT,
0,
RSIXmpLimitTypeEQ,
axis->rsiControl->AddressFromStringGet("MEIXmpBufferData.UserLimit[7].Limit[1].Count", "c:\\synqnet\\stdmei.map"),
0xFFFFFFFF,
0);
axis->UserLimitOutputSet(WATCHDOG_RESET_LIMIT,
0,
1,
watchdogAddress,
true);
axis->UserLimitConfigSet(WATCHDOG_RESET_LIMIT,
RSIXmpStatusLIMIT,
RSIXmpLogicSINGLE,
0.0);
}
void ConfigureUserFaults(Axis *axis, long timeoutAddress)
{
axis->SqNode->UserFaultAddressSet(timeoutAddress);
axis->SqNode->UserFaultMaskSet(1);
axis->SqNode->UserFaultPatternSet(1);
axis->UserFaultActionSet(WATCHDOG_ACTION);
}
void WatchdogPet(MotionController *controller, long watchdogAddress)
{
controller->MemorySet(watchdogAddress, 0);
}
void WatchdogClear(MotionController *controller, long timeoutAddress)
{
controller->MemorySet(timeoutAddress, 0);
}
void WatchdogDisable(Axis *axis, long timeoutAddress)
{
axis->UserLimitConfigSet(WATCHDOG_MONITOR_LIMIT,
RSIXmpStatusLIMIT,
RSIXmpLogicNEVER,
0.0);
axis->UserLimitConfigSet(WATCHDOG_RESET_LIMIT,
RSIXmpStatusLIMIT,
RSIXmpLogicNEVER,
0.0);
axis->rsiControl->OS->Sleep(10);
}
void watchdogMain()
{
try
{
MotionController *controller ;
Axis *axisX ;
Axis *axisY ;
Axis *axisWatchdog ;
long watchdogAddress;
long timeoutAddress;
controller = MotionController::CreateFromBoard(0);
axisX = controller->AxisGet(AXIS_X);
axisY = controller->AxisGet(AXIS_Y);
axisWatchdog = controller->AxisGet(AXIS_WATCHDOG);
watchdogAddress = controller->AddressFromStringGet("MEIXmpBufferData.UserBuffer.Data[0]", "c:\\synqnet\\stdmei.map");
timeoutAddress = controller->AddressFromStringGet("MEIXmpBufferData.UserBuffer.Data[1]", "c:\\synqnet\\stdmei.map");
axisWatchdog->ClearFaults();
WatchdogClear(controller, timeoutAddress);
ConfigureWatchdogUserLimits(axisWatchdog, watchdogAddress, timeoutAddress);
axisX->ClearFaults();
axisY->ClearFaults();
axisX->AmpEnableSet(true);
axisY->AmpEnableSet(true);
ConfigureUserFaults(axisX, timeoutAddress);
ConfigureUserFaults(axisY, timeoutAddress);
WatchdogPet(controller, watchdogAddress);
printf("Press a key to stop petting the watchdog...\n");
long previousTime = 0;
while(controller->OS->KeyGet(RSIWaitPOLL) < 0)
{
WatchdogPet(controller, watchdogAddress);
}
controller->OS->Sleep( WATCHDOG_TIME * 1000);
controller->OS->Sleep(1000);
WatchdogDisable(axisWatchdog, timeoutAddress);
WatchdogClear(controller, timeoutAddress);
}
catch (RsiError *err)
{
printf("%s\n", err->text);
}
}