#include "stdafx.h" #include "CEquipment.h" #include "ToolUnits.h" namespace SERVO { CEquipment::CEquipment() : m_nID(0), m_strName(""), m_strDescription(""), m_station(0, 255) { m_listener = { nullptr, nullptr }; m_alive = {FALSE, 0, FALSE}; m_bCimState = FALSE; m_bUpstreamInline = FALSE; m_bDownstreamInline = FALSE; m_bLocalAlarm = FALSE; m_bAutoRecipeChange = FALSE; m_bVCREnable[0] = FALSE; m_pCclink = nullptr; InitializeCriticalSection(&m_criticalSection); } CEquipment::~CEquipment() { for (auto item : m_mapStep) { delete item.second; } m_mapStep.clear(); DeleteCriticalSection(&m_criticalSection); } void CEquipment::setListener(EquipmentListener listener) { m_listener.onAlive = listener.onAlive; m_listener.onCimStateChanged = listener.onCimStateChanged; } void CEquipment::setCcLink(CCCLinkIEControl* pCcLink) { m_pCclink = pCcLink; } void CEquipment::getProperties(std::vector>& container) { container.clear(); // ʾÀý£º½«Ò»Ð©ÊôÐÔÌí¼Óµ½ÈÝÆ÷ container.push_back(std::make_pair("DeviceName", "ServoMotor")); container.push_back(std::make_pair("SerialNumber", "123456789")); container.push_back(std::make_pair("Version", "1.0")); } CStep* CEquipment::getStep(unsigned int addr) { auto iter = m_mapStep.find(addr); if (iter == m_mapStep.end()) return nullptr; return iter->second; } int CEquipment::addStep(unsigned int addr, CStep* pStep) { auto iter = m_mapStep.find(addr); if (iter != m_mapStep.end()) return -1; pStep->setEquipment(this); pStep->setCcLink(m_pCclink); m_mapStep[addr] = pStep; return 0; } void CEquipment::init() { for (auto item : m_mapStep) { item.second->init(); } } void CEquipment::term() { for (auto item : m_mapStep) { item.second->term(); } } void CEquipment::setID(int nID) { m_nID = nID; } int CEquipment::getID() { return m_nID; } void CEquipment::setName(const char* pszName) { m_strName = pszName; } std::string& CEquipment::getName() { return m_strName; } void CEquipment::setDescription(const char* pszDescription) { m_strDescription = pszDescription; } std::string& CEquipment::getDescription() { return m_strDescription; } void CEquipment::setStation(int network, int station) { m_station.nNetNo = network; m_station.nStNo = station; } const StationIdentifier& CEquipment::getStation() { return m_station; } void CEquipment::setReadBitBlock(unsigned int start, unsigned int end) { m_blockReadBit.type = (unsigned int)DeviceType::B; m_blockReadBit.start = start; m_blockReadBit.end = end; m_blockReadBit.size = (m_blockReadBit.end - m_blockReadBit.start + 1) / 8; ASSERT(m_blockReadBit.size < BLOCK_BUFFER_MAX); } MemoryBlock& CEquipment::getReadBitBlock() { return m_blockReadBit; } void CEquipment::setWriteBitBlock(unsigned int start, unsigned int end) { m_blockWriteBit.type = (unsigned int)DeviceType::LB; m_blockWriteBit.start = start; m_blockWriteBit.end = end; m_blockWriteBit.size = (m_blockWriteBit.end - m_blockWriteBit.start + 1) / 8; } MemoryBlock& CEquipment::getWriteBitBlock() { return m_blockWriteBit; } void CEquipment::onTimer(UINT nTimerid) { // ÿ¸ôÒ»Ã룬¼ì²éÒ»ÏÂALIVE״̬ static int tick = 0; tick++; if (tick % (4 * 1) == 0) { m_alive.count++; if (m_alive.alive && m_alive.count > ALIVE_TIMEOUT) { m_alive.alive = FALSE; if (m_listener.onAlive != nullptr) { m_listener.onAlive(this, m_alive.alive); } } } } void CEquipment::serialize(CArchive& ar) { } void CEquipment::onReceiveLBData(const char* pszData, size_t size) { /* TRACE("%s onReceiveLBData: %d bytes\n", m_strName.c_str(), size); for (unsigned int i = 0; i < size; i++) { if (pszData[i] != 0) TRACE("%d[%x]\n", i, pszData[i]); } */ // ÒÔϽâÊͺʹ¦ÀíÊý¾Ý BOOL bFlag; int index = 0x340; // alive bFlag = isBitOn(pszData, size, index); if (!equalBool(m_alive.flag, bFlag)) { m_alive.flag = bFlag; m_alive.count = 0; // ״̬ if (!m_alive.alive) { m_alive.alive = TRUE; if (m_listener.onAlive != nullptr) { m_listener.onAlive(this, m_alive.alive); } } } // CIM State bFlag = isBitOn(pszData, size, ++index); if (!equalBool(m_bCimState, bFlag)) { m_bCimState = bFlag; if (m_listener.onCimStateChanged != nullptr) { m_listener.onCimStateChanged(this, m_bCimState); } } // UpstreamInline bFlag = isBitOn(pszData, size, ++index); if (!equalBool(m_bUpstreamInline, bFlag)) { m_bUpstreamInline = bFlag; } // DownstreamInline bFlag = isBitOn(pszData, size, ++index); if (!equalBool(m_bDownstreamInline, bFlag)) { m_bDownstreamInline = bFlag; } // LocalAlarm bFlag = isBitOn(pszData, size, ++index); if (!equalBool(m_bLocalAlarm, bFlag)) { m_bLocalAlarm = bFlag; } // AutoRecipeChange bFlag = isBitOn(pszData, size, ++index); if (!equalBool(m_bAutoRecipeChange, bFlag)) { m_bAutoRecipeChange = bFlag; } // AutoRecipeChange bFlag = isBitOn(pszData, size, ++index); if (!equalBool(m_bVCREnable[0], bFlag)) { m_bVCREnable[0] = bFlag; } // ÒÔϸù¾ÝÐźÅ×öÁ÷³Ì´¦Àí CStep* pStep; // Equipment Mode Change Report(0x360) // Equipment Status Change Report(0x361) // Equipment Alarm Change Report(0x362 ~ 0x366) for (int i = 0; i < 7; i++) { index = 0x360 + i;; bFlag = isBitOn(pszData, size, index); pStep = getStep(index); if (pStep != nullptr) { pStep->onSignal(bFlag); } } } BOOL CEquipment::isBitOn(const char* pszData, size_t size, int index) { int byteIndex, bitIndex; byteIndex = (index) / 8; bitIndex = (index) % 8; return CToolUnits::getBit(pszData[byteIndex], bitIndex); } BOOL CEquipment::equalBool(BOOL b1, BOOL b2) { return (b1 && b2) || (!b1 && !b2); } BOOL CEquipment::isAlive() { return m_alive.alive; } BOOL CEquipment::isCimOn() { return m_bCimState; } BOOL CEquipment::isUpstreamInline() { return m_bUpstreamInline; } BOOL CEquipment::isDownstreamInline() { return m_bDownstreamInline; } BOOL CEquipment::isLocalAlarm() { return m_bLocalAlarm; } BOOL CEquipment::isAutoRecipeChange() { return m_bAutoRecipeChange; } BOOL CEquipment::isVCREnable(unsigned int index) { if (index >= VCR_MAX) return FALSE; return m_bVCREnable[index]; } }