The source code shows how to use the force monitoring functionality of newer Nemesys 4 devices.
#include <chrono>
#include <vector>
#include <labbcan/common/labbcan_test_helpers.h>
#include <usl/core/Thread.h>
#include <usl/core/PollingTimer.h>
#include <usl/math/uslmath.h>
#include <log4cplus/logger.h>
#include <diag/diag.h>
using namespace Usl;
#define BOOST_TEST_MODULE capi_nemesys_forcemon_test
#include <boost/test/unit_test.hpp>
using namespace boost::unit_test;
struct ArgsFixture {
ArgsFixture(): argc(framework::master_test_suite().argc),
argv(framework::master_test_suite().argv){}
int argc;
char **argv;
};
BOOST_GLOBAL_FIXTURE( ArgsFixture );
long Result;
BOOST_FIXTURE_TEST_CASE(testCapiOpen, ArgsFixture)
{
using namespace boost::unit_test;
const char* ConfigPath = "config/testconfig_qmixsdk";
if (argc > 1)
{
ConfigPath = argv[1];
}
CAPI_REQUIRE_ERR_NOERR(Result);
}
BOOST_AUTO_TEST_CASE(testDeviceNameLookup)
{
CAPI_REQUIRE_ERR_NOERR(Result);
}
BOOST_AUTO_TEST_CASE(testForceMonitoringConfig)
{
BOOST_REQUIRE_EQUAL(1, Result);
int Prefix;
int ForceUnit;
BOOST_TEST_MESSAGE("Force unit prefix: " << Prefix);
BOOST_TEST_MESSAGE("Force unit: " << ForceUnit);
double MaxForce;
BOOST_TEST_MESSAGE("Max. device force: " << MaxForce);
}
BOOST_AUTO_TEST_CASE(testBusStart)
{
Result =
LCB_Log(
"C-API Log Test Message");
}
BOOST_AUTO_TEST_CASE(testPumpEnable)
{
BOOST_CHECK_GT(Result, -1);
if (Result)
{
}
CThread::sleep(500);
BOOST_CHECK_GT(Result, 0);
}
void resolveForceOverload(
dev_hdl Pump)
{
BOOST_TEST_MESSAGE("Resolving force overload...");
BOOST_CHECK_EQUAL(Result, 0);
double MaxFlow;
double Flow = 0 - (MaxFlow / 100);
int SafetyStopActive;
double CurrentForce;
do
{
if (Result < 0)
{
break;
}
BOOST_TEST_MESSAGE("Current force: " << CurrentForce);
CThread::sleep(500);
} while (!SafetyStopActive);
if (!SafetyStopActive)
{
BOOST_FAIL("Failed to reduce force");
return;
}
BOOST_REQUIRE_EQUAL(1, Result);
BOOST_CHECK_EQUAL(Result, 0);
do
{
{
BOOST_TEST_MESSAGE("Current force: " << CurrentForce);
CThread::sleep(500);
}
}
while(
ERR_NOERR == Result && CurrentForce > 0.04);
}
{
BOOST_TEST_MESSAGE("Producing force overload...");
BOOST_CHECK_EQUAL(Result, 0);
double MaxFlow;
double Flow = MaxFlow / 100;
int SafetyStopActive;
do
{
double CurrentForce;
if (Result < 0)
{
break;
}
BOOST_TEST_MESSAGE("Current force: " << CurrentForce);
CThread::sleep(500);
} while (!SafetyStopActive);
if (!SafetyStopActive)
{
BOOST_FAIL("Failed to generate force overload");
return;
}
}
BOOST_AUTO_TEST_CASE(testForceMonitoring)
{
double CurrentForce;
double ForceLimit = 0.11;
CAPI_REQUIRE_ERR_NOERR(Result);
BOOST_REQUIRE_GE(0, SafetyStopActive);
if (!SafetyStopActive)
{
testSafetyStop(Nemesys);
}
resolveForceOverload(Nemesys);
testSafetyStop(Nemesys);
do
{
CThread::sleep(1000);
{
Result = SafetyStopActive;
break;
}
{
break;
}
if ((ForceLimit - 0.02) > CurrentForce)
{
{
break;
}
}
BOOST_TEST_MESSAGE("Safety stop active - please lower force manually below "
<< (ForceLimit - 0.02) << " kN");
} while (SafetyStopActive);
}
BOOST_AUTO_TEST_CASE(testForceMonitoringSwitching)
{
BOOST_CHECK_EQUAL(Result, 0);
BOOST_REQUIRE_EQUAL(0, Result);
BOOST_CHECK_EQUAL(Result, 1);
BOOST_REQUIRE_EQUAL(0, Result);
BOOST_REQUIRE_EQUAL(1, Result);
BOOST_CHECK_EQUAL(Result, 0);
BOOST_REQUIRE_EQUAL(1, Result);
}
BOOST_AUTO_TEST_CASE(testCapiClose)
{
}