| /******************************************************************************* | |
| * Copyright (c) 2012 AIT, ACIN | |
| * This program and the accompanying materials are made available under the | |
| * terms of the Eclipse Public License 2.0 which is available at | |
| * http://www.eclipse.org/legal/epl-2.0. | |
| * | |
| * SPDX-License-Identifier: EPL-2.0 | |
| * | |
| * Contributors: | |
| * Filip Andren, Alois Zoitl - initial API and implementation and/or initial documentation | |
| *******************************************************************************/ | |
| #include "opcconnectionimpl.h" | |
| #include "opceventhandler.h" | |
| #include "opcconnection.h" | |
| #include "opcprocessvar.h" | |
| #include "OPCClient.h" | |
| #include "OPCHost.h" | |
| #include "OPCServer.h" | |
| #include "OPCGroup.h" | |
| #include "OPCItem.h" | |
| COpcConnectionImpl::COpcConnectionImpl(const char *pa_acHost, const char *pa_acServerName, COpcConnection* pa_pOpcConn) : | |
| m_pOpcConn(pa_pOpcConn), m_pOpcHost(0), m_pOpcServer(0), m_acHost(pa_acHost), m_acServerName(pa_acServerName), m_acGroupName(0), m_nReqUpdateRate(0), m_nRealUpdateRate(0), m_nDeadBand(0) { | |
| } | |
| COpcConnectionImpl::~COpcConnectionImpl(){ | |
| } | |
| void COpcConnectionImpl::connect(){ | |
| try{ | |
| COPCClient::init(); | |
| m_pOpcHost = COPCClient::makeHost(m_acHost); | |
| m_pOpcServer = m_pOpcHost->connectDAServer(m_acServerName); | |
| } catch (OPCException &e){ | |
| m_pOpcConn->response_connect(false); | |
| return; | |
| } | |
| m_pOpcConn->response_connect(true); | |
| } | |
| void COpcConnectionImpl::addItem(COpcProcessVar* pa_pNewItem){ | |
| COPCGroup* itemGroup = getOpcGroup(pa_pNewItem->getItemGroupName(), pa_pNewItem->getItemFunction()); | |
| ATL::CString itemName(pa_pNewItem->getItemName()); | |
| try{ | |
| COPCItem* newItem = itemGroup->addItem(itemName, true); | |
| pa_pNewItem->setOpcItem(newItem); | |
| pa_pNewItem->setIsActive(true); | |
| } catch (OPCException &e){ | |
| pa_pNewItem->setIsActive(false); | |
| } | |
| m_pOpcConn->response_itemAdded(pa_pNewItem); | |
| } | |
| void COpcConnectionImpl::addGroup(const char* pa_acGroupName, unsigned long pa_nReqUpdateRate, float pa_nDeadBand){ | |
| m_lOpcGroupSettingsList.pushBack(new SOpcGroupSettings(pa_acGroupName, pa_nReqUpdateRate, pa_nDeadBand)); | |
| } | |
| int COpcConnectionImpl::sendItemData(COpcProcessVar* pa_pNewItem){ | |
| return 0; | |
| } | |
| void COpcConnectionImpl::OnDataChange(COPCGroup & group, CAtlMap<COPCItem *, OPCItemData *> & changes){ | |
| TItemDataList itemList; | |
| for(POSITION pos = changes.GetStartPosition(); pos != NULL;){ | |
| OPCItemData *itemData = changes.GetValueAt(pos); | |
| COPCItem *item = changes.GetNextKey(pos); | |
| itemList.pushBack(new SOpcItemData((LPCTSTR) (item->getName()), (Variant) itemData->vDataValue)); | |
| } | |
| const char *c_groupName = (const char*) group.getName(); | |
| int position = 0; | |
| const char * subStrRead = strstr(c_groupName, "_read"); | |
| if(subStrRead != NULL) { | |
| position = subStrRead - c_groupName; | |
| } | |
| else{ | |
| //TODO Should not happen error | |
| } | |
| char * groupName = (char*) malloc(position + 1); | |
| strncpy(groupName, c_groupName, position); | |
| groupName[position] = '\0'; | |
| m_pOpcConn->response_dataReceived(groupName, itemList); | |
| free(groupName); | |
| } | |
| COPCGroup* COpcConnectionImpl::getOpcGroup(const char* pa_acGroupName, COpcProcessVar::EOpcProcessVarFunctions pa_eFunction){ | |
| COPCGroup *retGroup = NULL; | |
| TOpcGroupSettingsList::Iterator itEnd = m_lOpcGroupSettingsList.end(); | |
| for(TOpcGroupSettingsList::Iterator it = m_lOpcGroupSettingsList.begin(); it != itEnd; ++it){ | |
| if(strcmp(it->m_acGroupName, pa_acGroupName) == 0){ | |
| if(pa_eFunction == COpcProcessVar::e_FBOutput){ | |
| if(!(it->m_bReadGroupAdded)){ | |
| char *groupName = (char*) malloc(strlen(pa_acGroupName) + 5 + 1); | |
| strcpy(groupName, pa_acGroupName); | |
| strcat(groupName, "_read"); | |
| try{ | |
| it->m_pOpcGroupRead = retGroup = m_pOpcServer->makeGroup(groupName, true, it->m_nReqUpdateRate, it->m_nRevisedUpdateRate, it->m_nDeadBand); | |
| it->m_pOpcGroupRead->enableAsynch(*this); | |
| it->m_bReadGroupAdded = true; | |
| } catch (OPCException &e){ | |
| // TODO | |
| } | |
| free(groupName); | |
| } else { | |
| retGroup = it->m_pOpcGroupRead; | |
| } | |
| } | |
| else if(pa_eFunction == COpcProcessVar::e_FBInput){ | |
| if(!(it->m_bWriteGroupAdded)){ | |
| char *groupName = (char*) malloc(strlen(pa_acGroupName) + 6 + 1); | |
| strcpy(groupName, pa_acGroupName); | |
| strcat(groupName, "_write"); | |
| try{ | |
| it->m_pOpcGroupWrite = retGroup = m_pOpcServer->makeGroup(groupName, true, it->m_nReqUpdateRate, it->m_nRevisedUpdateRate, it->m_nDeadBand); | |
| it->m_bWriteGroupAdded = true; | |
| } catch (OPCException &e){ | |
| // TODO | |
| } | |
| free(groupName); | |
| } else { | |
| retGroup = it->m_pOpcGroupWrite; | |
| } | |
| } | |
| break; | |
| } | |
| } | |
| return retGroup; | |
| } |