diff --git a/ecmc_plugin_socketcan/ecmc_plugin_socketcanApp/src/ecmcCANOpenMaster.cpp b/ecmc_plugin_socketcan/ecmc_plugin_socketcanApp/src/ecmcCANOpenMaster.cpp index 7d42457..d20a7f5 100644 --- a/ecmc_plugin_socketcan/ecmc_plugin_socketcanApp/src/ecmcCANOpenMaster.cpp +++ b/ecmc_plugin_socketcan/ecmc_plugin_socketcanApp/src/ecmcCANOpenMaster.cpp @@ -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."); } diff --git a/ecmc_plugin_socketcan/ecmc_plugin_socketcanApp/src/ecmcCANOpenMaster.h b/ecmc_plugin_socketcan/ecmc_plugin_socketcanApp/src/ecmcCANOpenMaster.h index f26860e..a5d37e9 100644 --- a/ecmc_plugin_socketcan/ecmc_plugin_socketcanApp/src/ecmcCANOpenMaster.h +++ b/ecmc_plugin_socketcan/ecmc_plugin_socketcanApp/src/ecmcCANOpenMaster.h @@ -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_ */ diff --git a/ecmc_plugin_socketcan/ecmc_plugin_socketcanApp/src/ecmcSocketCAN.cpp b/ecmc_plugin_socketcan/ecmc_plugin_socketcanApp/src/ecmcSocketCAN.cpp index af6643f..76c1d6a 100644 --- a/ecmc_plugin_socketcan/ecmc_plugin_socketcanApp/src/ecmcSocketCAN.cpp +++ b/ecmc_plugin_socketcan/ecmc_plugin_socketcanApp/src/ecmcSocketCAN.cpp @@ -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_++; diff --git a/ecmc_plugin_socketcan/ecmc_plugin_socketcanApp/src/ecmcSocketCAN.h b/ecmc_plugin_socketcan/ecmc_plugin_socketcanApp/src/ecmcSocketCAN.h index 6a45dbf..05f431f 100644 --- a/ecmc_plugin_socketcan/ecmc_plugin_socketcanApp/src/ecmcSocketCAN.h +++ b/ecmc_plugin_socketcan/ecmc_plugin_socketcanApp/src/ecmcSocketCAN.h @@ -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); diff --git a/ecmc_plugin_socketcan/ecmc_plugin_socketcanApp/src/ecmcSocketCANWrap.cpp b/ecmc_plugin_socketcan/ecmc_plugin_socketcanApp/src/ecmcSocketCANWrap.cpp index c997dcd..eb28dde 100644 --- a/ecmc_plugin_socketcan/ecmc_plugin_socketcanApp/src/ecmcSocketCANWrap.cpp +++ b/ecmc_plugin_socketcan/ecmc_plugin_socketcanApp/src/ecmcSocketCANWrap.cpp @@ -152,13 +152,21 @@ void deleteSocketCAN() { void ecmcCANOpenAddMasterPrintHelp() { printf("\n"); - printf(" Use ecmcCANOpenAddMaster(, )\n"); - printf(" : Name of master device.\n"); - printf(" : CANOpen node id of master.\n"); + printf(" Use ecmcCANOpenAddMaster(, ,....)\n"); + printf(" : Name of master device.\n"); + printf(" : CANOpen node id of master.\n"); + printf(" : Sample time for LSS.\n"); + printf(" : Sample time for SYNC.\n"); + printf(" : 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(, \n"); + printf(" Use \"ecmcCANOpenAddPDO(, \n"); printf(" : Name of master device.\n"); printf(" : CANOpen node id of device/master.\n"); printf(" : CANOpen cob id of PDO.\n"); diff --git a/iocsh/pvs.log b/iocsh/pvs.log index 338332c..bdd7c9f 100644 --- a/iocsh/pvs.log +++ b/iocsh/pvs.log @@ -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