Add LSS, SYNC and heartbeat sample time for master

This commit is contained in:
Anders Sandstrom
2021-03-09 14:24:20 +01:00
parent 399023e023
commit afb93a2b00
6 changed files with 111 additions and 48 deletions

View File

@@ -22,6 +22,9 @@
ecmcCANOpenMaster::ecmcCANOpenMaster(ecmcSocketCANWriteBuffer* writeBuffer,
uint32_t nodeId,
int exeSampleTimeMs,
int lssSampleTimeMs,
int syncSampleTimeMs,
int heartSampleTimeMs,
const char* name,
int dbgMode):
ecmcCANOpenDevice(writeBuffer,
@@ -29,20 +32,23 @@ ecmcCANOpenMaster::ecmcCANOpenMaster(ecmcSocketCANWriteBuffer* writeBuffer,
exeSampleTimeMs,
name,
dbgMode) {
lssPdo_ = NULL;
syncPdo_ = NULL;
heartPdo_ = NULL;
isMaster_ = true;
lssPdo_ = NULL;
syncPdo_ = NULL;
heartPdo_ = NULL;
isMaster_ = true;
lssSampleTimeMs_ = lssSampleTimeMs;
syncSampleTimeMs_ = syncSampleTimeMs;
heartSampleTimeMs_ = heartSampleTimeMs;
int errorCode = 0;
// lssPdo_ = new ecmcCANOpenPDO( writeBuffer_, 0x7E5,DIR_WRITE,0,0,1000,exeSampleTimeMs_,"lss", cfgDbgMode_);
errorCode = addPDO(0x7E5, // uint32_t cobId,
DIR_WRITE, // ecmc_can_direction rw,
0, // uint32_t ODSize,
0, // int readTimeoutMs,
1000, // int writeCycleMs, if < 0 then write on demand.
"lss"); // const char* name);
errorCode = addPDO(0x7E5, // uint32_t cobId,
DIR_WRITE, // ecmc_can_direction rw,
0, // uint32_t ODSize,
0, // int readTimeoutMs,
lssSampleTimeMs, // int writeCycleMs, if < 0 then write on demand.
"lss"); // const char* name);
if(errorCode) {
throw std::runtime_error( "LSS PDO NULL.");
}
@@ -51,12 +57,12 @@ ecmcCANOpenMaster::ecmcCANOpenMaster(ecmcSocketCANWriteBuffer* writeBuffer,
// Test sync signal
// can0 0x80 [0]
// syncPdo_ = new ecmcCANOpenPDO( writeBuffer_, 0x80,DIR_WRITE,0,0,1000,exeSampleTimeMs_,"sync", cfgDbgMode_);
errorCode = addPDO(0x80, // uint32_t cobId,
DIR_WRITE, // ecmc_can_direction rw,
0, // uint32_t ODSize,
0, // int readTimeoutMs,
1000, // int writeCycleMs, if < 0 then write on demand.
"sync"); // const char* name);
errorCode = addPDO(0x80, // uint32_t cobId,
DIR_WRITE, // ecmc_can_direction rw,
0, // uint32_t ODSize,
0, // int readTimeoutMs,
syncSampleTimeMs, // int writeCycleMs, if < 0 then write on demand.
"sync"); // const char* name);
if(errorCode) {
throw std::runtime_error( "Sync PDO NULL.");
@@ -68,12 +74,12 @@ ecmcCANOpenMaster::ecmcCANOpenMaster(ecmcSocketCANWriteBuffer* writeBuffer,
//can_add_write(1793,1,5,0,0,0,0,0,0,0);
//heartPdo_ = new ecmcCANOpenPDO( writeBuffer_, 0x701,DIR_WRITE,1,0,1000,exeSampleTimeMs_,"heartbeat",cfgDbgMode_);
//heartPdo_->setValue(5);
errorCode = addPDO(0x700+nodeId_, // uint32_t cobId,
DIR_WRITE, // ecmc_can_direction rw,
1, // uint32_t ODSize,
0, // int readTimeoutMs,
1000, // int writeCycleMs, if < 0 then write on demand.
"heart"); // const char* name);
errorCode = addPDO(0x700+nodeId_, // uint32_t cobId,
DIR_WRITE, // ecmc_can_direction rw,
1, // uint32_t ODSize,
0, // int readTimeoutMs,
heartSampleTimeMs, // int writeCycleMs, if < 0 then write on demand.
"heart"); // const char* name);
if(errorCode) {
throw std::runtime_error( "Heart PDO NULL.");
}

View File

@@ -32,6 +32,9 @@ class ecmcCANOpenMaster : public ecmcCANOpenDevice {
ecmcCANOpenMaster(ecmcSocketCANWriteBuffer* writeBuffer,
uint32_t nodeId,
int exeSampleTimeMs,
int lssSampleTimeMs,
int syncSampleTimeMs,
int heartSampleTimeMs,
const char* name,
int dbgMode);
~ecmcCANOpenMaster();
@@ -39,7 +42,10 @@ class ecmcCANOpenMaster : public ecmcCANOpenDevice {
private:
ecmcCANOpenPDO *lssPdo_;
ecmcCANOpenPDO *syncPdo_;
ecmcCANOpenPDO *heartPdo_;
ecmcCANOpenPDO *heartPdo_;
int lssSampleTimeMs_;
int syncSampleTimeMs_;
int heartSampleTimeMs_;
};
#endif /* ECMC_CANOPEN_MASTER_H_ */

View File

@@ -128,7 +128,7 @@ ecmcSocketCAN::ecmcSocketCAN(char* configStr,
testMaster_= new ecmcCANOpenMaster(writeBuffer_,1,exeSampleTimeMs_,"linuxMaster",cfgDbgMode_);
testMaster_= new ecmcCANOpenMaster(writeBuffer_,1,exeSampleTimeMs_,1000,1000,1000,"linuxMaster",cfgDbgMode_);
// Test LSS heartbeat "master" signal. This makes the led on pmu905 to go to "Normal Communication"
@@ -635,7 +635,11 @@ std::string ecmcSocketCAN::to_string(int value) {
//
void ecmcSocketCAN::addMaster(uint32_t nodeId,
const char* name) {
const char* name,
int lssSampleTimeMs,
int syncSampleTimeMs,
int heartSampleTimeMs) {
if(masterDev_) {
throw std::runtime_error("Master already added.");
}
@@ -646,7 +650,26 @@ void ecmcSocketCAN::addMaster(uint32_t nodeId,
throw std::out_of_range("Node id out of range.");
}
masterDev_ = new ecmcCANOpenMaster(writeBuffer_,nodeId,exeSampleTimeMs_,name, cfgDbgMode_);
if(lssSampleTimeMs <= 0) {
throw std::out_of_range("LSS sample time ms out of range.");
}
if(syncSampleTimeMs <= 0) {
throw std::out_of_range("Sync sample time ms out of range.");
}
if(heartSampleTimeMs <= 0) {
throw std::out_of_range("Heart sample time ms out of range.");
}
masterDev_ = new ecmcCANOpenMaster(writeBuffer_,
nodeId,
exeSampleTimeMs_,
lssSampleTimeMs,
syncSampleTimeMs,
heartSampleTimeMs,
name,
cfgDbgMode_);
// add as a normal device also for execute and rxframe
devices_[deviceCounter_] = masterDev_;
deviceCounter_++;

View File

@@ -83,7 +83,10 @@ class ecmcSocketCAN {
void execute(); // ecmc rt loop
void addMaster(uint32_t nodeId,
const char* name);
const char* name,
int lssSampleTimeMs,
int syncSampleTimeMs,
int heartSampleTimeMs);
void addDevice(uint32_t nodeId,
const char* name);

View File

@@ -152,13 +152,21 @@ void deleteSocketCAN() {
void ecmcCANOpenAddMasterPrintHelp() {
printf("\n");
printf(" Use ecmcCANOpenAddMaster(<name>, <node id>)\n");
printf(" <name> : Name of master device.\n");
printf(" <node id> : CANOpen node id of master.\n");
printf(" Use ecmcCANOpenAddMaster(<name>, <node id>,....)\n");
printf(" <name> : Name of master device.\n");
printf(" <node id> : CANOpen node id of master.\n");
printf(" <LSS sample time ms> : Sample time for LSS.\n");
printf(" <Sync sample time ms> : Sample time for SYNC.\n");
printf(" <Heartbeat sample time ms> : Sample time for Heartbeat.\n");
printf("\n");
}
int ecmcCANOpenAddMaster(const char* name, int nodeId) {
int ecmcCANOpenAddMaster(const char* name,
int nodeId,
int lssSampleTimeMs,
int syncSampleTimeMs,
int heartSampleTimeMs) {
if(!name) {
printf("Error: name.\n");
ecmcCANOpenAddMasterPrintHelp();
@@ -176,7 +184,11 @@ int ecmcCANOpenAddMaster(const char* name, int nodeId) {
}
try {
can->addMaster((uint32_t)nodeId,name);
can->addMaster((uint32_t)nodeId,
name,
lssSampleTimeMs,
syncSampleTimeMs,
heartSampleTimeMs);
}
catch(std::exception& e) {
printf("Exception: %s. Add master failed.\n",e.what());
@@ -190,13 +202,26 @@ static const iocshArg initArg0_0 =
{ "Name", iocshArgString };
static const iocshArg initArg1_0 =
{ "Node Id", iocshArgInt };
static const iocshArg initArg2_0 =
{ "LSS sample time ms", iocshArgInt };
static const iocshArg initArg3_0 =
{ "Sync sample time ms", iocshArgInt };
static const iocshArg initArg4_0 =
{ "Heart sample time ms", iocshArgInt };
static const iocshArg *const initArgs_0[] = { &initArg0_0,
&initArg1_0};
&initArg1_0,
&initArg2_0,
&initArg3_0,
&initArg4_0};
static const iocshFuncDef initFuncDef_0 = { "ecmcCANOpenAddMaster", 2, initArgs_0 };
static const iocshFuncDef initFuncDef_0 = { "ecmcCANOpenAddMaster", 5, initArgs_0 };
static void initCallFunc_0(const iocshArgBuf *args) {
ecmcCANOpenAddMaster(args[0].sval, args[1].ival);
ecmcCANOpenAddMaster(args[0].sval,
args[1].ival,
args[2].ival,
args[3].ival,
args[4].ival);
}
/**
@@ -406,7 +431,7 @@ static void initCallFunc_2(const iocshArgBuf *args) {
*/
void ecmcCANOpenAddPDOPrintHelp() {
printf("\n");
printf(" Use \"ecmcCANOpenAddSDO(<name>, <node id>\n");
printf(" Use \"ecmcCANOpenAddPDO(<name>, <node id>\n");
printf(" <name> : Name of master device.\n");
printf(" <node id> : CANOpen node id of device/master.\n");
printf(" <cob id> : CANOpen cob id of PDO.\n");

View File

@@ -1,15 +1,15 @@
IOC_TEST:PLC-0-enable
REQMOD:mcag-trgt-muts--29223:MODULES
REQMOD:mcag-trgt-muts--29223:VERSIONS
REQMOD:mcag-trgt-muts--29223:MOD_VER
REQMOD:mcag-trgt-muts--29223:exit
REQMOD:mcag-trgt-muts--29223:BaseVersion
REQMOD:mcag-trgt-muts--29223:require_VER
REQMOD:mcag-trgt-muts--29223:ecmccfg_VER
REQMOD:mcag-trgt-muts--29223:asyn_VER
REQMOD:mcag-trgt-muts--29223:exprtk_VER
REQMOD:mcag-trgt-muts--29223:motor_VER
REQMOD:mcag-trgt-muts--29223:ecmc_VER
REQMOD:mcag-trgt-muts--29223:ecmc_plugin_socketcan_VER
REQMOD:mcag-trgt-muts--914:MODULES
REQMOD:mcag-trgt-muts--914:VERSIONS
REQMOD:mcag-trgt-muts--914:MOD_VER
REQMOD:mcag-trgt-muts--914:exit
REQMOD:mcag-trgt-muts--914:BaseVersion
REQMOD:mcag-trgt-muts--914:require_VER
REQMOD:mcag-trgt-muts--914:ecmccfg_VER
REQMOD:mcag-trgt-muts--914:asyn_VER
REQMOD:mcag-trgt-muts--914:exprtk_VER
REQMOD:mcag-trgt-muts--914:motor_VER
REQMOD:mcag-trgt-muts--914:ecmc_VER
REQMOD:mcag-trgt-muts--914:ecmc_plugin_socketcan_VER
IOC_TEST:PLC-0-scantime
IOC_TEST:PLC-0-error