| | |
| | | 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); |
| | | } |
| | | |
| | |
| | | m_listener.onCimStateChanged = listener.onCimStateChanged; |
| | | } |
| | | |
| | | void CEquipment::setCcLink(CCCLinkIEControl* pCcLink) |
| | | { |
| | | m_pCclink = pCcLink; |
| | | } |
| | | |
| | | void CEquipment::getProperties(std::vector<std::pair<std::string, std::string>>& 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->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) |
| | |
| | | |
| | | void CEquipment::setReadBitBlock(unsigned int start, unsigned int end) |
| | | { |
| | | m_blockReadBit.type = (unsigned int)DeviceType::LB;; |
| | | 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; |
| | |
| | | |
| | | 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 |
| | | /* |
| | | BOOL bAliveFlag = isBitOn(pszData, size, 0x340); |
| | | if (m_alive.flag != bAliveFlag) { |
| | | m_alive.flag = bAliveFlag; |
| | | bFlag = isBitOn(pszData, size, index); |
| | | if (!equalBool(m_alive.flag, bFlag)) { |
| | | m_alive.flag = bFlag; |
| | | m_alive.count = 0; |
| | | |
| | | // ״̬ |
| | |
| | | } |
| | | } |
| | | } |
| | | */ |
| | | |
| | | // CIM State |
| | | BOOL bCimState = isBitOn(pszData, size, 0x341); |
| | | if ((bCimState && !m_bCimState) || (!bCimState && m_bCimState)) { |
| | | m_bCimState = bCimState; |
| | | 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 |
| | | index = 0x360; |
| | | bFlag = isBitOn(pszData, size, index); |
| | | pStep = getStep(index); |
| | | if (pStep != nullptr) { |
| | | pStep->onSignal(bFlag); |
| | | } |
| | | |
| | | // Equipment Status Change Report |
| | | index = 0x361; |
| | | bFlag = isBitOn(pszData, size, index); |
| | | pStep = getStep(index); |
| | | if (pStep != nullptr) { |
| | | pStep->onSignal(bFlag); |
| | | } |
| | | } |
| | | |
| | |
| | | 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]; |
| | | } |
| | | } |