14 #include "variablehandleuanode.h" 17 #include <boost/assign/std/vector.hpp> 39 list<UaDeviceMethod<UaControlDeviceGeneric> *> CanBusInterface::m_listInitMethod;
40 list<struct CanBusInterface::InitSet> CanBusInterface::m_listInitSet;
41 vector< AddressSpace::UaCalcItem *> CanBusInterface::m_vCCI;
42 unique_ptr<CanBusAccess> CanBusInterface::g_pCanaccess;
48 UaStatus CanBusInterface::initialize()
50 UaStatus ret = OpcUa_Good;
54 SEM_FAILCRITICALERRORS & SEM_NOGPFAULTERRORBOX & SEM_NOOPENFILEERRORBOX & SEM_NOALIGNMENTFAULTEXCEPT
58 g_pCanaccess = unique_ptr<CanBusAccess>(
new CanBusAccess());
63 for(list<CanBusObject *>::iterator it = m_CanBusList.begin(); it != m_CanBusList.end(); it++)
70 string bn = (*it)->getCanBusName();
80 for (list<CanBusObject *>::iterator it = m_CanBusList.begin(); it != m_CanBusList.end(); it++)
83 (*it)->sendInitNodeNmt();
84 (*it)->startSyncInterval();
85 (*it)->startNodeGuardingInterval();
90 ret = variableInitSet();
94 for (list<CanBusObject *>::iterator it = m_CanBusList.begin(); it != m_CanBusList.end(); it++)
99 ret = executeInitMethod();
104 CanBusInterface::CanBusInterface()
118 CanBusInterface::~CanBusInterface()
129 for(list<CanBusObject *>::iterator it = m_CanBusList.begin(); it != m_CanBusList.end(); it++)
136 m_CanBusList.clear();
137 cout <<
"Delete Interface" << endl;
142 void CanBusInterface::closeInterface()
144 for (list<CanBusObject *>::iterator it = m_CanBusList.begin(); it != m_CanBusList.end(); it++)
149 cout <<
"Close Interface" << endl;
156 UaStatus ret = OpcUa_Good;
158 if (parent == NULL) {
160 interf = factory[code]->createHardwareEntry(parent,
conf,pAS,code);
161 m_CanBusList.push_back(static_cast<CanBusObject *>(interf));
166 if (factory.find(code) != factory.end() ) {
167 interf = factory[code]->createHardwareEntry(parent,
conf,pAS,code);
188 UaStatus CanBusInterface::CreateXmlParser(UaString &sXmlFileName)
190 UaStatus ret = OpcUa_True;
192 m_sXmlFileName = sXmlFileName;
196 cout <<
"Config file " << m_sXmlFileName.toUtf8() << endl;
199 m_nodetypes = vDoc->NODETYPE();
200 m_canbuses = vDoc->CANBUS();
201 m_items = vDoc->ITEM();
202 m_regexprisson = vDoc->REGEXPR();
203 m_settings = vDoc->SETTINGS();
204 m_execute = vDoc->atStartup();
205 m_setvalue = vDoc->SET();
209 cout <<
"Parser error " <<
e << endl;
211 cout <<
e.what() <<
" " <<
e << endl;
226 OpcUa_UInt32 uMaxTraceEntries = 10000;
227 OpcUa_UInt32 uMaxBackupFiles = 4;
229 cout <<
"Create Address Space" << endl;
231 m_pNodeManager = nManager;
232 m_pTypeNodeManager = pXmlNodeManager;
233 m_pDefaultNodeManager = pDefaultNodeManager;
237 ret = createNodeTypes();
238 UA_ASSERT(ret.isGood());
244 OpcUa_UInt16 nIdx = m_pNodeManager->getNameSpaceIndex();
245 UaVariant defaultValue;
246 defaultValue.setUInt32(0);
250 UaNodeId(
"TraceLevel", nIdx),
254 Ua_AccessLevel_CurrentRead | Ua_AccessLevel_CurrentWrite,
257 ret = m_pNodeManager->addNodeAndReference(OpcUaId_ObjectsFolder, m_Trace, OpcUaId_HasComponent);
258 UA_ASSERT(ret.isGood());
260 ret = createCanbuses();
261 UA_ASSERT(ret.isGood());
275 ret = CompileItems(NULL, m_items, m_regexprisson, nManager);
276 UA_ASSERT(ret.isGood());
281 ret = createListInitmethod(m_execute,NULL, nManager);
282 UA_ASSERT(ret.isGood());
286 ret = createListInitSet(m_setvalue, NULL, nManager);
287 UA_ASSERT(ret.isGood());
291 if (m_settings.present()) {
322 UaDateTime sdt = UaDateTime::now();
325 UA_ASSERT(ret.isGood());
332 UaStatus CanBusInterface::createNodeTypes()
338 for(CanOpenOpcServerConfig::NODETYPE_sequence::iterator itnt(m_nodetypes.begin()); itnt != m_nodetypes.end(); itnt++ ) {
346 UaNodeId uTypeNode = UaNodeId(nodTyp->
name().c_str(), m_pNodeManager->getNameSpaceIndex());
348 nodTyp->
name().c_str(),
354 addStatus = m_pNodeManager->addNodeAndReference(OpcUaId_BaseObjectType,pCanNodeType, OpcUaId_HasComponent);
355 UA_ASSERT(addStatus.isGood());
356 UaObjectType* uv = m_pNodeManager->getInstanceDeclarationObjectType(
BA_CANNODETYPE);
357 addStatus = m_pNodeManager->addUaReference(pCanNodeType->nodeId(), uv->nodeId(), OpcUaId_HasSubtype);
358 UA_ASSERT(addStatus.isGood());
366 UaStatus CanBusInterface::createCanbuses()
369 UaVariant defaultValue;
373 OpcUa_UInt16 indx = m_pNodeManager->getNameSpaceIndex();
388 list<CanBusObject *>::iterator o = find_if(m_CanBusList.begin(), m_CanBusList.end(), pred);
390 if (o == m_CanBusList.end()){
391 UaObjectType *pInstanceDeclarationObject = m_pNodeManager->getInstanceDeclarationObjectType(
BA_CANBUS);
392 pcanbus =
new UaControlDeviceGeneric(canb->
name().c_str(), UaNodeId(canb->
name().c_str(), indx), pNodeManager, pInstanceDeclarationObject, canb, NULL);
393 addStatus = m_pNodeManager->addNodeAndReference(OpcUaId_ObjectsFolder, pcanbus, OpcUaId_Organizes);
394 UA_ASSERT(addStatus.isGood());
398 cerr <<
"Can Port " << canb->
port() <<
" is duplicated" << endl;
402 addStatus = createNodes(canb->
NODE(),pcanbus);
403 UA_ASSERT(addStatus.isGood());
405 addStatus = CompileItems(pcanbus,canb->
ITEM(),canb->
REGEXPR(), m_pNodeManager);
406 UA_ASSERT(addStatus.isGood());
407 if (addStatus.isBad()) {
408 LOG(
Log::ERR) <<
"Calc Item" <<
" failed to create Calc Item, for canbus= " << pcanbus->browseName().toString().toUtf8() <<
" " << addStatus.pDiagnosticInfo()->m_localizedText.toString().toUtf8();
409 cerr <<
"Error Cacl Item " << pcanbus->browseName().toString().toUtf8() <<
" " << addStatus.pDiagnosticInfo()->m_localizedText.toString().toUtf8() << endl;
414 addStatus = createListInitmethod(canb->
atStartup(), pcanbus,pNodeManager);
415 UA_ASSERT(addStatus.isGood());
416 addStatus = createListInitSet(m_setvalue, NULL, pNodeManager);
417 UA_ASSERT(addStatus.isGood());
418 if (addStatus.isBad())
432 UaString nodeName, typeName;
433 UaNodeId nodeId,nodeTypeId;
434 OpcUa_UInt16 indx = m_pNodeManager->getNameSpaceIndex();
442 nodeName = it->
name().c_str();
444 UaNode *node = pNodeManager->
findNode(nodeId);
447 if (!it->type().present()) {
455 typeName = it->type().get().c_str();
456 nodeTypeId = UaNodeId(typeName,indx);
459 cerr <<
"Node Type" << it->type().get().c_str() <<
" has not been defined" << endl;
462 pcannode =
new UaCanNodeObject(nodeb,(UaObject *)pNode, nodeId,pNodeManager,cb);
464 ret = m_pNodeManager->addNodeAndReference( pcanbus,pcannode, OpcUaId_Organizes);
465 UA_ASSERT(ret.isGood());
466 ret = createListInitmethod(nodeb->
atStartup(), pcannode, pNodeManager);
467 UA_ASSERT(ret.isGood());
468 ret = createListInitSet(m_setvalue, NULL, pNodeManager);
469 UA_ASSERT(ret.isGood());
474 cerr <<
"Node " << nodeName.toUtf8() <<
" is duplicated" << endl;
481 VariableHandle* CanBusInterface::getVariableHandler(Session* session, VariableHandle::ServiceType serviceType, OpcUa_NodeId *
nodeid, OpcUa_Int32 attributeId)
484 OpcUa_ReferenceParameter(session);
485 OpcUa_ReferenceParameter(serviceType);
489 VariableHandle* pVariableHandle = NULL;
491 if ( attributeId == OpcUa_Attributes_Value )
495 UaNode *pUaNode = getNodeManager()->findNode(*
nodeid);
496 UaNodeId
id = pUaNode->typeDefinitionId();
497 if (
id.identifierType() == OpcUa_IdentifierType_Numeric) {
498 idt =
id.identifierNumeric();
505 pVariableHandle =
new VariableHandleUaNode;
506 t_uanodeid = getCanNodeNodeId(pUaNode);
507 UaNode *pParNode = getNodeManager()->findNode(t_uanodeid);
508 pVariableHandle->m_pIOManager = ((
UaCanNodeObject *)pParNode)->getSDOIOManager();
509 pVariableHandle->m_AttributeID = attributeId;
510 ((VariableHandleUaNode *)pVariableHandle)->setUaNode(pUaNode);
529 return pVariableHandle;
532 UaNodeId CanBusInterface::getCanNodeNodeId(UaNode *pNode)
536 uNode = getNodeManager()->getUpNode(pNode);
537 if (uNode->typeDefinitionId().identifierNumeric() ==
BA_CANNODETYPE)
538 uNodeId = uNode->nodeId();
540 uNode = getNodeManager()->getUpNode(uNode);
542 if (uNode->typeDefinitionId().identifierNumeric() ==
BA_CANNODETYPE) {
543 uNodeId = uNode->nodeId();
545 else uNodeId.clear();
555 IOManager* CanBusInterface::getIOManager(UaNode* pUaNode, OpcUa_Int32 attributeId)
559 if (attributeId == OpcUa_Attributes_Value) {
560 UaNodeId
id = pUaNode->typeDefinitionId();
561 if (
id.identifierType() == OpcUa_IdentifierType_Numeric) {
562 OpcUa_UInt32 idt =
id.identifierNumeric();
581 t_uanodeid = getCanNodeNodeId(pUaNode);
582 UaNode *pParNode = m_pNodeManager->findNode(t_uanodeid);
596 const char *comm = (*exiter).command().get().c_str();
597 UaNodeId uaMethodId = nManager->
getNewNodeId(parent, comm);
601 m_listInitMethod.push_front(dm);
604 cout <<
"The command " << comm <<
" does not define!" << endl;
616 const UaString comm = exiter->variable().get().c_str();
617 const UaString vval = exiter->value().get().c_str();
618 UaNodeId uaVarId = nManager->
getNewNodeId(parent, comm);
620 OpcUa::BaseDataVariableType *dm = (OpcUa::BaseDataVariableType *)nManager->
findNode(uaVarId);
625 m_listInitSet.push_front(inset);
629 cout <<
"The variable " << comm <<
" does not define!" << endl;
636 UaStatus CanBusInterface::executeInitMethod()
638 UaStatus ret = OpcUa_Good;
642 UaStatus retexec = (*it)->execute();
646 m_listInitMethod.clear();
650 UaStatus CanBusInterface::variableInitSet()
652 UaStatus ret = OpcUa_Good;
654 for (list<struct InitSet> ::iterator it = m_listInitSet.begin(); it != m_listInitSet.end(); it++)
656 OpcUa::BaseDataVariableType *bvar = it->setVar;
657 OpcUa_Byte acc = bvar->accessLevel();
658 UaString uas = it->value;
660 if (acc & Ua_AccessLevel_CurrentWrite)
662 UaNodeId uaid = bvar->dataType();
663 OpcUa_Int32 tid = uaid.identifierNumeric();
666 OpcUa_BuiltInType binty = (OpcUa_BuiltInType)tid;
669 uav.changeType(binty,
false);
670 udv.setValue(uav,
false);
671 bvar->setValue(0, udv,
true);
675 m_listInitSet.clear();
680 UaStatus ret = OpcUa_Good;
681 UaString sName, sFullName, tName;
683 UaVariant defaultValue;
684 UaDataValue dataValue;
690 OpcUa_BuiltInType typeName;
695 sName = UaString(sit->name().c_str());
696 OpcUa_Int32 minVar = 0xEFFFFFF;
698 ret = createRegVariable((*sit),regex, pVariables, pParent, minVar, nManager);
701 if (minVar != INT_MAX) {
702 for (OpcUa_Int32 j = 0; j < minVar; j++)
706 sFullName = UaString(
"%1_%2").arg(sName).arg(j);
708 for (mapDataVariable::iterator it = pVariables.begin(); it != pVariables.end(); it++)
710 string nn = (*it).first;
711 nn.erase(std::remove(nn.begin(), nn.end(),
'$'), nn.end());
712 ucVariables[nn] = (*it).second[j];
716 dv.changeType(typeName,
false);
717 pUaCalcItem =
new UaCalcItem(sFullName, uaId, pParent, nManager, dv, (*sit), ucVariables, (pParent) ? pParent->getSharedMutex() : NULL);
719 pUaCalcItem->setDataType(UaNodeId(typeName));
720 dataValue.setDataValue(dv, OpcUa_False, OpcUa_BadWaitingForInitialData, UaDateTime::now(), UaDateTime::now());
721 pUaCalcItem->
setValue(0, dataValue, OpcUa_False);
734 if (pParent == NULL) {
735 ret = nManager->addNodeAndReference(OpcUaId_ObjectsFolder, pUaCalcItem, OpcUaId_HasComponent);
738 ret = nManager->addNodeAndReference(pParent, pUaCalcItem, OpcUaId_HasComponent);
740 UA_ASSERT(ret.isGood());
742 addCalcCompilerItem(pUaCalcItem);
751 dv.changeType(typeName,
false);
752 pUaCalcItem =
new UaCalcItem(sName, uaId, pParent, nManager, dv, (*sit), ucVariables, (pParent) ? pParent->getSharedMutex() : NULL);
754 pUaCalcItem->setDataType(UaNodeId(typeName));
755 dataValue.setDataValue(dv, OpcUa_False, OpcUa_BadWaitingForInitialData, UaDateTime::now(), UaDateTime::now());
756 pUaCalcItem->
setValue(0, dataValue, OpcUa_False);
768 if (pParent == NULL) {
769 ret = nManager->addNodeAndReference(OpcUaId_ObjectsFolder, pUaCalcItem, OpcUaId_HasComponent);
772 ret = nManager->addNodeAndReference(pParent, pUaCalcItem, OpcUaId_HasComponent);
774 UA_ASSERT(ret.isGood());
775 addCalcCompilerItem(pUaCalcItem);
787 OpcUa_Int32 nVar = 0;
790 for (REGEXPR_sequence::const_iterator it = regex.begin(); it != regex.end(); it++) {
793 if (itemvar.
value().find((*it).name()) != string::npos) {
794 string t = (*it).value();
798 cout <<
"Variable " <<
t <<
" is not defined!" << endl;
801 if (minVar > nVar) minVar = nVar;
803 pvariables.insert(pair<string, UaControlVariableSet>((*it).name(), ucVariables));
807 if (itemvar.
when().present()) {
809 for (REGEXPR_sequence::const_iterator it = regex.begin(); it != regex.end(); it++) {
811 string t = itemvar.
when().get();
812 if (
t.find((*it).name()) != string::npos) {
813 string t = (*it).value();
818 cout <<
"Variable " <<
t <<
" is not defined!" << endl;
821 if (minVar > nVar) minVar = nVar;
823 pvariables.insert(pair<string, UaControlVariableSet>((*it).name(), ucVariables));
827 if (itemvar.
status().present()) {
829 for (REGEXPR_sequence::const_iterator it = regex.begin(); it != regex.end(); it++) {
831 if (itemvar.
status().get().find((*it).name()) != string::npos) {
832 string t = (*it).value();
836 cout <<
"Variable " <<
t <<
" is not defined!" << endl;
839 if (minVar > nVar) minVar = nVar;
841 pvariables.insert(pair<string, UaControlVariableSet>((*it).name(), ucVariables));
850 void CanBusInterface::initCalculation()
852 for (
unsigned int i = 0; i < m_vCCI.size(); i++)
857 for (
unsigned int i = 0; i < m_vCCI.size(); i++)
867 m_vCCI.push_back(ucci);