Merge branch 'clh'
# Conflicts:
# SourceCode/Bond/Servo/AlarmDlg.cpp
# SourceCode/Bond/Servo/AlarmDlg.h
# SourceCode/Bond/Servo/AlarmManager.cpp
# SourceCode/Bond/Servo/AlarmManager.h
# SourceCode/Bond/Servo/CEqAlarmStep.cpp
# SourceCode/Bond/Servo/CEqAlarmStep.h
# SourceCode/Bond/Servo/CMaster.cpp
# SourceCode/Bond/Servo/CStep.cpp
# SourceCode/Bond/Servo/CStep.h
# SourceCode/Bond/Servo/Common.h
# SourceCode/Bond/Servo/Model.cpp
# SourceCode/Bond/Servo/Servo.cpp
# SourceCode/Bond/Servo/Servo.rc
# SourceCode/Bond/Servo/Servo.vcxproj.filters
# SourceCode/Bond/Servo/ServoDlg.cpp
# SourceCode/Bond/Servo/ServoDlg.h
# SourceCode/Bond/Servo/resource.h
| | |
| | | *.iom |
| | | SourceCode/Bond/BoounionPLC/BoounionPLC.vcxproj.user |
| | | SourceCode/Bond/x64/Debug/ServoConfiguration.ini |
| | | *.iobj |
| | |
| | | #include "Servo.h" |
| | | #include "afxdialogex.h" |
| | | #include "AlarmDlg.h" |
| | | #include "AlarmManager.h" |
| | | #include "Common.h" |
| | | #include <iomanip> |
| | | |
| | |
| | | bool result = alarmManager.addAlarm(alarmData, alarmEventId); |
| | | if (result) { |
| | | LOGI("<CAlarmDlg> Alarm added successfully!"); |
| | | } |
| | | } |
| | | else { |
| | | LOGI("<CAlarmDlg> Failed to add alarm."); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | |
| | | pAny->release(); |
| | | }, [&]() -> void { |
| | |
| | | pListCtrl->SetColumnWidth(7, LVSCW_AUTOSIZE_USEHEADER); |
| | | |
| | | // è®¡ç®æ»é¡µæ° |
| | | int totalRecords = AlarmManager::getInstance().getTotalAlarmCount("", "", m_strDeviceName, m_strUnitName, m_strKeyword, m_szTimeStart, m_szTimeEnd); |
| | | m_nTotalPages = (totalRecords + PAGE_SIZE - 1) / PAGE_SIZE; |
| | | m_nCurPage = 1; |
| | | |
| | |
| | | |
| | | return TRUE; // return TRUE unless you set the focus to a control |
| | | // å¼å¸¸: OCX 屿§é¡µåºè¿å FALSE |
| | | } |
| | | |
| | | BOOL CAlarmDlg::DestroyWindow() |
| | | { |
| | | return CDialogEx::DestroyWindow(); |
| | | } |
| | | |
| | | HBRUSH CAlarmDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) |
| | |
| | | // ç¹å»ä¸ä¸é¡µ |
| | | m_nCurPage++; |
| | | UpdatePageData(); // è°ç¨åé¡µæ´æ°å½æ° |
| | | } |
| | | } |
| | |
| | | protected: |
| | | virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV æ¯æ |
| | | virtual BOOL OnInitDialog(); |
| | | virtual BOOL DestroyWindow(); |
| | | afx_msg HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor); |
| | | afx_msg void OnDestroy(); |
| | | afx_msg void OnClose(); |
| | |
| | | */ |
| | | std::vector<AlarmInfo> getAlarmsInfoByIDs(const std::vector<int>& alarmIDs) const; |
| | | |
| | | /** |
| | | * è¯»åæ¥è¦æä»¶ |
| | | * @param filename æä»¶å |
| | | * @return æåè¿åtrueï¼å¤±è´¥è¿åfalse |
| | | */ |
| | | bool readAlarmFile(const std::string& filename); |
| | | |
| | | /** |
| | | * ä¿åæ¥è¦æä»¶ |
| | | * @param filename æä»¶å |
| | | * @return æåè¿åtrueï¼å¤±è´¥è¿åfalse |
| | | */ |
| | | bool saveAlarmFile(const std::string& filename); |
| | | |
| | | /** |
| | | * éè¿æ¥è¦IDæ¥è¯¢æ¥è¦ä¿¡æ¯ |
| | | * @param nAlarmID æ¥è¦ID |
| | | * @return æ¥è¦ä¿¡æ¯çæé |
| | | */ |
| | | const AlarmInfo* getAlarmInfoByID(int nAlarmID) const; |
| | | |
| | | /** |
| | | * éè¿å¤ä¸ªæ¥è¦IDæ¥è¯¢å¯¹åºçæ¥è¦ä¿¡æ¯ |
| | | * @param alarmIDs å¤ä¸ªæ¥è¦ID |
| | | * @return è¿åå¤ä¸ªæ¥è¦ä¿¡æ¯ |
| | | */ |
| | | std::vector<AlarmInfo> getAlarmsInfoByIDs(const std::vector<int>& alarmIDs) const; |
| | | |
| | | private: |
| | | AlarmManager(); |
| | | ~AlarmManager(); |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | #include "stdafx.h" |
| | | #include "ApredTreeCtrl2.h" |
| | | |
| | | |
| | | #define ROFFSET 7 |
| | | #define WIDE 10 |
| | | #define WIDE2 5 |
| | | #define EXPANDED_WIDE 8 |
| | | |
| | | #define BADGE_HIDE 0 |
| | | #define BADGE_DOT 1 |
| | | #define BADGE_NUMBER 2 |
| | | #define BADGE_DOT_WIDTH 12 |
| | | #define BADGE_NUMBER_WIDTH 20 |
| | | |
| | | |
| | | IMPLEMENT_DYNAMIC(CApredTreeCtrl2, CTreeCtrl) |
| | | |
| | | CApredTreeCtrl2::CApredTreeCtrl2() |
| | | { |
| | | m_hBrushItem[0] = NULL; |
| | | m_hBrushItem[1] = NULL; |
| | | m_hBrushItem[2] = NULL; |
| | | m_crItemBk[0] = GetSysColor(COLOR_WINDOW); |
| | | m_crItemBk[1] = GetSysColor(COLOR_HIGHLIGHT); |
| | | m_crItemBk[2] = RGB(204, 206, 219); |
| | | m_crItemBtn[0] = RGB(30, 30, 30); |
| | | m_crItemBtn[1] = RGB(255, 255, 255); |
| | | m_crItemBtn[2] = RGB(255, 255, 255); |
| | | } |
| | | |
| | | CApredTreeCtrl2::~CApredTreeCtrl2() |
| | | { |
| | | if (m_hBrushItem[0] != NULL) { |
| | | ::DeleteObject(m_hBrushItem[0]); |
| | | } |
| | | if (m_hBrushItem[1] != NULL) { |
| | | ::DeleteObject(m_hBrushItem[1]); |
| | | } |
| | | if (m_hBrushItem[2] != NULL) { |
| | | ::DeleteObject(m_hBrushItem[2]); |
| | | } |
| | | } |
| | | |
| | | BEGIN_MESSAGE_MAP(CApredTreeCtrl2, CTreeCtrl) |
| | | ON_NOTIFY_REFLECT(NM_CUSTOMDRAW, &CApredTreeCtrl2::OnNMCustomdraw) |
| | | END_MESSAGE_MAP() |
| | | |
| | | |
| | | void CApredTreeCtrl2::OnNMCustomdraw(NMHDR* pNMHDR, LRESULT* pResult) |
| | | { |
| | | LPNMCUSTOMDRAW pNMCD = reinterpret_cast<LPNMCUSTOMDRAW>(pNMHDR); |
| | | LPNMTVCUSTOMDRAW lpnmcd = (LPNMTVCUSTOMDRAW)pNMCD; |
| | | HTREEITEM hItem; |
| | | UINT unt; |
| | | *pResult = 0; |
| | | |
| | | |
| | | switch (lpnmcd->nmcd.dwDrawStage) |
| | | { |
| | | case CDDS_PREPAINT: |
| | | *pResult = CDRF_NOTIFYITEMDRAW; |
| | | m_items.clear(); |
| | | break; |
| | | |
| | | case CDDS_ITEMPREPAINT: |
| | | m_items[(HTREEITEM)lpnmcd->nmcd.dwItemSpec] = lpnmcd->iLevel; |
| | | hItem = (HTREEITEM)lpnmcd->nmcd.dwItemSpec; |
| | | if (hItem != NULL) { |
| | | if ( (GetItemState(hItem, TVIS_SELECTED) & TVIS_SELECTED)== TVIS_SELECTED) { |
| | | if (GetFocus() != this) { |
| | | lpnmcd->clrTextBk = RGB(204, 206, 219); |
| | | } |
| | | } |
| | | } |
| | | *pResult = CDRF_NEWFONT | CDRF_NOTIFYPOSTPAINT; // 订é
ç»å¶ç»æéç¥ |
| | | |
| | | break; |
| | | |
| | | |
| | | case CDDS_ITEMPOSTPAINT: // 项ç»å¶ç»æéç¥ |
| | | unt = GetIndent(); |
| | | hItem = (HTREEITEM)lpnmcd->nmcd.dwItemSpec; |
| | | auto iter = m_items.find(hItem); |
| | | if (iter != m_items.end()) { |
| | | CRect button_rect = pNMCD->rc; |
| | | button_rect.right = button_rect.left + unt + 5; |
| | | int off = unt * iter->second; |
| | | button_rect.OffsetRect(off, 0); |
| | | DrawItemButton(hItem, pNMCD->hdc, &button_rect); |
| | | |
| | | // æ¯å¦æå°åç¹ |
| | | CRect rcItem = pNMCD->rc; |
| | | Gdiplus::Graphics graphics(pNMCD->hdc); |
| | | graphics.SetSmoothingMode(Gdiplus::SmoothingModeAntiAlias); |
| | | if (m_badges.find(hItem) != m_badges.end()) { |
| | | BADGE& badge = m_badges[hItem]; |
| | | if (badge.type == BADGE_DOT) { |
| | | Gdiplus::SolidBrush brush(Gdiplus::Color(GetRValue(badge.badgeBackground), GetGValue(badge.badgeBackground), GetBValue(badge.badgeBackground))); |
| | | int x = rcItem.right - 18 - BADGE_DOT_WIDTH; |
| | | int y = rcItem.top + (rcItem.Height() - BADGE_DOT_WIDTH) / 2; |
| | | graphics.FillEllipse(&brush, x, y, BADGE_DOT_WIDTH, BADGE_DOT_WIDTH); |
| | | } |
| | | else if (badge.type == BADGE_NUMBER) { |
| | | Gdiplus::SolidBrush brush(Gdiplus::Color(GetRValue(badge.badgeBackground), GetGValue(badge.badgeBackground), GetBValue(badge.badgeBackground))); |
| | | int x = rcItem.right - 18 - BADGE_NUMBER_WIDTH; |
| | | int y = rcItem.top + (rcItem.Height() - BADGE_NUMBER_WIDTH) / 2; |
| | | graphics.FillEllipse(&brush, x, y, BADGE_NUMBER_WIDTH, BADGE_NUMBER_WIDTH); |
| | | RECT rcBadge; |
| | | rcBadge.left = x; |
| | | rcBadge.right = rcBadge.left + BADGE_NUMBER_WIDTH; |
| | | rcBadge.top = y; |
| | | rcBadge.bottom = rcBadge.top + BADGE_NUMBER_WIDTH; |
| | | ::SetTextColor(pNMCD->hdc, badge.badgeForeground); |
| | | char szBuffer[32]; |
| | | sprintf_s(szBuffer, 32, "%d%s", min(badge.number, 9), badge.number > 9 ? "+" : ""); |
| | | DrawText(pNMCD->hdc, szBuffer, (int)strlen(szBuffer), &rcBadge, DT_CENTER | DT_VCENTER | DT_SINGLELINE); |
| | | } |
| | | } |
| | | |
| | | *pResult = CDRF_SKIPDEFAULT; |
| | | } |
| | | |
| | | break; |
| | | } |
| | | } |
| | | |
| | | void CApredTreeCtrl2::DrawItemButton(HTREEITEM hItem, HDC hDC, CRect* pRect) |
| | | { |
| | | if (!ItemHasChildren(hItem)) { |
| | | return; |
| | | } |
| | | |
| | | |
| | | // æé®è¦å·ä¸ä¸ |
| | | ::FillRect(hDC, pRect, GetItemBkBrush(hItem)); |
| | | if ((GetItemState(hItem, TVIS_EXPANDED) & TVIS_EXPANDED) == TVIS_EXPANDED) { |
| | | int nBottomOffset = (pRect->Height() - EXPANDED_WIDE) / 2; |
| | | POINT pt[3]; |
| | | pt[0].x = pRect->right - ROFFSET - EXPANDED_WIDE; |
| | | pt[0].y = pRect->bottom - nBottomOffset; |
| | | pt[1].x = pRect->right - ROFFSET; |
| | | pt[1].y = pRect->bottom - nBottomOffset; |
| | | pt[2].x = pRect->right - ROFFSET; |
| | | pt[2].y = pRect->bottom - nBottomOffset - EXPANDED_WIDE; |
| | | |
| | | HBRUSH hBrush = GetItemBtnBrush(hItem); |
| | | HPEN hPen = GetItemBtnPen(hItem); |
| | | HBRUSH hOldBrush = (HBRUSH)::SelectObject(hDC, hBrush); |
| | | HPEN hOldPen = (HPEN)::SelectObject(hDC, hPen); |
| | | ::Polygon(hDC, pt, 3); |
| | | ::SelectObject(hDC, hOldBrush); |
| | | ::SelectObject(hDC, hOldPen); |
| | | ::DeleteObject(hBrush); |
| | | ::DeleteObject(hPen); |
| | | } |
| | | else { |
| | | int nBottomOffset = (pRect->Height() - WIDE) / 2; |
| | | POINT pt[3]; |
| | | pt[0].x = pRect->right - ROFFSET - WIDE2; |
| | | pt[0].y = pRect->bottom - nBottomOffset - WIDE; |
| | | pt[1].x = pRect->right - ROFFSET - WIDE2; |
| | | pt[1].y = pRect->bottom - nBottomOffset; |
| | | pt[2].x = pRect->right - ROFFSET; |
| | | pt[2].y = pRect->bottom - nBottomOffset - WIDE2; |
| | | |
| | | HBRUSH hBrush = GetItemBtnBrush(hItem); |
| | | HPEN hPen = GetItemBtnPen(hItem); |
| | | HBRUSH hOldBrush = (HBRUSH)::SelectObject(hDC, hBrush); |
| | | HPEN hOldPen = (HPEN)::SelectObject(hDC, hPen); |
| | | ::Polygon(hDC, pt, 3); |
| | | ::SelectObject(hDC, hOldBrush); |
| | | ::SelectObject(hDC, hOldPen); |
| | | ::DeleteObject(hBrush); |
| | | ::DeleteObject(hPen); |
| | | } |
| | | } |
| | | |
| | | COLORREF CApredTreeCtrl2::SetBkColor(COLORREF crColor) |
| | | { |
| | | if (m_hBrushItem[0] != NULL) { |
| | | ::DeleteObject(m_hBrushItem[0]); |
| | | } |
| | | m_hBrushItem[0] = CreateSolidBrush(crColor); |
| | | |
| | | return CTreeCtrl::SetBkColor(crColor); |
| | | } |
| | | |
| | | int CApredTreeCtrl2::OnCreate(LPCREATESTRUCT lpCreateStruct) |
| | | { |
| | | if (CTreeCtrl::OnCreate(lpCreateStruct) == -1) |
| | | return -1; |
| | | |
| | | m_crItemBk[0] = GetBkColor(); |
| | | m_crItemBk[1] = GetSysColor(COLOR_HIGHLIGHT); |
| | | m_hBrushItem[0] = CreateSolidBrush(m_crItemBk[0]); |
| | | m_hBrushItem[1] = CreateSolidBrush(m_crItemBk[1]); |
| | | m_hBrushItem[2] = CreateSolidBrush(m_crItemBk[2]); |
| | | |
| | | return 0; |
| | | } |
| | | |
| | | HBRUSH CApredTreeCtrl2::GetItemBkBrush(HTREEITEM hItem) |
| | | { |
| | | BOOL bSelected = (GetItemState(hItem, TVIS_SELECTED) & TVIS_SELECTED) == TVIS_SELECTED; |
| | | BOOL bHilited = (GetItemState(hItem, TVIS_DROPHILITED) & TVIS_DROPHILITED) == TVIS_DROPHILITED;; |
| | | HTREEITEM hClickedItem = GetDropHilightItem(); |
| | | |
| | | |
| | | if (bHilited) { |
| | | return m_hBrushItem[1]; |
| | | } |
| | | |
| | | if (!bSelected) { |
| | | return m_hBrushItem[0]; |
| | | } |
| | | |
| | | if (GetFocus() == this) { |
| | | if (hClickedItem == NULL) { |
| | | return m_hBrushItem[1]; |
| | | } |
| | | else { |
| | | return m_hBrushItem[0]; |
| | | } |
| | | } |
| | | |
| | | |
| | | return m_hBrushItem[2]; |
| | | } |
| | | |
| | | HBRUSH CApredTreeCtrl2::GetItemBtnBrush(HTREEITEM hItem) |
| | | { |
| | | BOOL bExpanded = (GetItemState(hItem, TVIS_EXPANDED) & TVIS_EXPANDED) == TVIS_EXPANDED; |
| | | BOOL bSelected = (GetItemState(hItem, TVIS_SELECTED) & TVIS_SELECTED) == TVIS_SELECTED; |
| | | BOOL bHilited = (GetItemState(hItem, TVIS_DROPHILITED) & TVIS_DROPHILITED) == TVIS_DROPHILITED;; |
| | | HTREEITEM hClickedItem = GetDropHilightItem(); |
| | | |
| | | |
| | | // å±å¼æ¶å®å¿ä¸è§ |
| | | if (bExpanded) { |
| | | if (bHilited) { |
| | | return CreateSolidBrush(m_crItemBtn[1]); |
| | | } |
| | | |
| | | if (!bSelected) { |
| | | return CreateSolidBrush(m_crItemBtn[0]); |
| | | } |
| | | |
| | | if (GetFocus() == this && hClickedItem == NULL) { |
| | | return CreateSolidBrush(m_crItemBtn[1]); |
| | | } |
| | | |
| | | return CreateSolidBrush(m_crItemBtn[0]); |
| | | } |
| | | else { |
| | | // æ¶èµ·æ¶ç©ºå¿ä¸è§ |
| | | if (bHilited) { |
| | | return CreateSolidBrush(m_crItemBk[1]); |
| | | } |
| | | |
| | | if (!bSelected) { |
| | | return CreateSolidBrush(m_crItemBk[0]); |
| | | } |
| | | |
| | | if (GetFocus() == this && hClickedItem == NULL) { |
| | | return CreateSolidBrush(m_crItemBk[1]); |
| | | } |
| | | |
| | | return CreateSolidBrush(m_crItemBk[2]); |
| | | } |
| | | } |
| | | |
| | | HPEN CApredTreeCtrl2::GetItemBtnPen(HTREEITEM hItem) |
| | | { |
| | | BOOL bExpanded = (GetItemState(hItem, TVIS_EXPANDED) & TVIS_EXPANDED) == TVIS_EXPANDED; |
| | | BOOL bSelected = (GetItemState(hItem, TVIS_SELECTED) & TVIS_SELECTED) == TVIS_SELECTED; |
| | | BOOL bHilited = (GetItemState(hItem, TVIS_DROPHILITED) & TVIS_DROPHILITED) == TVIS_DROPHILITED;; |
| | | HTREEITEM hClickedItem = GetDropHilightItem(); |
| | | |
| | | |
| | | // å±å¼æ¶å®å¿ä¸è§ |
| | | if (bExpanded) { |
| | | if (bHilited) { |
| | | return CreatePen(PS_SOLID, 1, m_crItemBtn[1]); |
| | | } |
| | | |
| | | if (!bSelected) { |
| | | return CreatePen(PS_SOLID, 1, m_crItemBtn[0]); |
| | | } |
| | | |
| | | if (GetFocus() == this && hClickedItem == NULL) { |
| | | return CreatePen(PS_SOLID, 1, m_crItemBtn[1]); |
| | | } |
| | | |
| | | return CreatePen(PS_SOLID, 1, m_crItemBtn[0]); |
| | | } |
| | | else { |
| | | // æ¶èµ·æ¶ç©ºå¿ä¸è§ |
| | | if (bHilited) { |
| | | return CreatePen(PS_SOLID, 1, m_crItemBtn[1]); |
| | | } |
| | | |
| | | if (!bSelected) { |
| | | return CreatePen(PS_SOLID, 1, m_crItemBtn[0]); |
| | | } |
| | | |
| | | if (GetFocus() == this && hClickedItem == NULL) { |
| | | return CreatePen(PS_SOLID, 1, m_crItemBtn[1]); |
| | | } |
| | | |
| | | return CreatePen(PS_SOLID, 1, m_crItemBtn[0]); |
| | | } |
| | | } |
| | | |
| | | void CApredTreeCtrl2::PreSubclassWindow() |
| | | { |
| | | m_crItemBk[0] = GetBkColor(); |
| | | m_crItemBk[1] = GetSysColor(COLOR_HIGHLIGHT); |
| | | m_hBrushItem[0] = CreateSolidBrush(m_crItemBk[0]); |
| | | m_hBrushItem[1] = CreateSolidBrush(m_crItemBk[1]); |
| | | m_hBrushItem[2] = CreateSolidBrush(m_crItemBk[2]); |
| | | |
| | | CTreeCtrl::PreSubclassWindow(); |
| | | } |
| | | |
| | | void CApredTreeCtrl2::SetItemBadge(HTREEITEM hItem, COLORREF badgeBackground, COLORREF badgeForeground) |
| | | { |
| | | if (m_badges.find(hItem) == m_badges.end()) { |
| | | BADGE badge; |
| | | badge.badgeBackground = badgeBackground; |
| | | badge.badgeForeground = badgeForeground; |
| | | badge.type = BADGE_HIDE; |
| | | m_badges[hItem] = badge; |
| | | } |
| | | else { |
| | | BADGE& badge = m_badges[hItem]; |
| | | badge.badgeBackground = badgeBackground; |
| | | badge.badgeForeground = badgeForeground; |
| | | badge.type = BADGE_HIDE; |
| | | } |
| | | } |
| | | |
| | | void CApredTreeCtrl2::ShowItemBadgeNumber(HTREEITEM hItem, int number) |
| | | { |
| | | if (m_badges.find(hItem) == m_badges.end()) { |
| | | return; |
| | | } |
| | | |
| | | BADGE& badge = m_badges[hItem]; |
| | | badge.type = BADGE_NUMBER; |
| | | badge.number = number; |
| | | InvalidateRect(NULL, TRUE); |
| | | } |
| | | |
| | | void CApredTreeCtrl2::ShowItemBadgeDotMode(HTREEITEM hItem) |
| | | { |
| | | if (m_badges.find(hItem) == m_badges.end()) { |
| | | return; |
| | | } |
| | | |
| | | BADGE& badge = m_badges[hItem]; |
| | | if (badge.type != BADGE_DOT) { |
| | | badge.type = BADGE_DOT; |
| | | InvalidateRect(NULL, TRUE); |
| | | } |
| | | } |
| | | |
| | | void CApredTreeCtrl2::HideItemBadge(HTREEITEM hItem) |
| | | { |
| | | if (m_badges.find(hItem) == m_badges.end()) { |
| | | return; |
| | | } |
| | | |
| | | BADGE& badge = m_badges[hItem]; |
| | | if (badge.type != BADGE_HIDE) { |
| | | badge.type = BADGE_HIDE; |
| | | InvalidateRect(NULL, TRUE); |
| | | } |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | #pragma once |
| | | #include <afxcmn.h> |
| | | #include <map> |
| | | |
| | | class CApredTreeCtrl2 : |
| | | public CTreeCtrl |
| | | { |
| | | public: |
| | | typedef struct tagBADGE |
| | | { |
| | | HTREEITEM hTreeItem; |
| | | COLORREF badgeBackground; |
| | | COLORREF badgeForeground; |
| | | int type; /* 0: æ ,䏿¾ç¤º*/ |
| | | int number; |
| | | } BADGE; |
| | | |
| | | |
| | | DECLARE_DYNAMIC(CApredTreeCtrl2) |
| | | |
| | | public: |
| | | CApredTreeCtrl2(); |
| | | virtual ~CApredTreeCtrl2(); |
| | | |
| | | |
| | | public: |
| | | virtual COLORREF SetBkColor(COLORREF crColor); |
| | | void SetItemBadge(HTREEITEM hItem, COLORREF badgeBackground, COLORREF badgeForeground); |
| | | void ShowItemBadgeNumber(HTREEITEM hItem, int number); |
| | | void ShowItemBadgeDotMode(HTREEITEM hItem); |
| | | void HideItemBadge(HTREEITEM hItem); |
| | | |
| | | private: |
| | | HBRUSH GetItemBkBrush(HTREEITEM hItem); |
| | | HBRUSH GetItemBtnBrush(HTREEITEM hItem); |
| | | HPEN GetItemBtnPen(HTREEITEM hItem); |
| | | void DrawItemButton(HTREEITEM hItem, HDC hDC, CRect* pRect); |
| | | |
| | | |
| | | private: |
| | | std::map<HTREEITEM, BADGE> m_badges; |
| | | std::map<HTREEITEM, int> m_items; |
| | | HBRUSH m_hBrushItem[3]; |
| | | COLORREF m_crItemBk[3]; |
| | | COLORREF m_crItemBtn[3]; |
| | | |
| | | public: |
| | | DECLARE_MESSAGE_MAP() |
| | | afx_msg void OnNMCustomdraw(NMHDR* pNMHDR, LRESULT* pResult); |
| | | afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct); |
| | | virtual void PreSubclassWindow(); |
| | | }; |
| | | |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | #include "stdafx.h" |
| | | #include "CAttribute.h" |
| | | |
| | | namespace SERVO { |
| | | CAttribute::CAttribute() |
| | | { |
| | | |
| | | } |
| | | |
| | | CAttribute::CAttribute(const char* pszName, const char* pszValue, const char* pszDescription) |
| | | { |
| | | m_strName = pszName; |
| | | m_strValue = pszValue; |
| | | m_strDescription = pszDescription; |
| | | } |
| | | |
| | | CAttribute::~CAttribute() |
| | | { |
| | | |
| | | } |
| | | |
| | | std::string& CAttribute::getName() |
| | | { |
| | | return m_strName; |
| | | } |
| | | |
| | | std::string& CAttribute::getValue() |
| | | { |
| | | return m_strValue; |
| | | } |
| | | |
| | | std::string& CAttribute::getDescription() |
| | | { |
| | | return m_strDescription; |
| | | } |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | #pragma once |
| | | |
| | | |
| | | namespace SERVO { |
| | | class CAttribute |
| | | { |
| | | public: |
| | | CAttribute(); |
| | | CAttribute(const char* pszName, const char* pszValue, const char* pszDescription); |
| | | ~CAttribute(); |
| | | |
| | | public: |
| | | std::string& getName(); |
| | | std::string& getValue(); |
| | | std::string& getDescription(); |
| | | |
| | | private: |
| | | std::string m_strName; |
| | | std::string m_strValue; |
| | | std::string m_strDescription; |
| | | }; |
| | | } |
| | | |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | #include "stdafx.h" |
| | | #include "CAttributeVector.h" |
| | | |
| | | |
| | | namespace SERVO { |
| | | CAttributeVector::CAttributeVector() |
| | | { |
| | | |
| | | } |
| | | |
| | | CAttributeVector::~CAttributeVector() |
| | | { |
| | | for (auto item : m_attributes) { |
| | | delete item; |
| | | } |
| | | m_attributes.clear(); |
| | | } |
| | | |
| | | void CAttributeVector::addAttribute(CAttribute* pAttribute) |
| | | { |
| | | m_attributes.push_back(pAttribute); |
| | | } |
| | | |
| | | unsigned int CAttributeVector::size() |
| | | { |
| | | return m_attributes.size(); |
| | | } |
| | | |
| | | void CAttributeVector::clear() |
| | | { |
| | | for (auto item : m_attributes) { |
| | | delete item; |
| | | } |
| | | m_attributes.clear(); |
| | | } |
| | | |
| | | bool CAttributeVector::empty() |
| | | { |
| | | return m_attributes.empty(); |
| | | } |
| | | |
| | | CAttribute* CAttributeVector::getAttribute(unsigned int index) |
| | | { |
| | | ASSERT(index < m_attributes.size()); |
| | | return m_attributes[index]; |
| | | } |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | #pragma once |
| | | #include <vector> |
| | | #include "CAttribute.h" |
| | | |
| | | |
| | | namespace SERVO { |
| | | class CAttributeVector |
| | | { |
| | | public: |
| | | CAttributeVector(); |
| | | ~CAttributeVector(); |
| | | |
| | | public: |
| | | void addAttribute(CAttribute* pAttribute); |
| | | void clear(); |
| | | unsigned int size(); |
| | | bool empty(); |
| | | CAttribute* getAttribute(unsigned int index); |
| | | |
| | | private: |
| | | std::vector<CAttribute*> m_attributes; |
| | | }; |
| | | } |
| | | |
| | |
| | | #define LOG_DEBUG(msg) |
| | | #endif |
| | | |
| | | // åå§åéææååé |
| | | // åå§åéææååé |
| | | std::unordered_map<int, std::string> CPerformanceMelsec::m_mapError = { |
| | | // æ¿åSDKé误ç |
| | | // æ¿åSDKé误ç |
| | | {0, "No error, communication successful."}, |
| | | {1, "Driver not started. The driver is not running."}, |
| | | {2, "Timeout error (board response error). Request not completed within timeout."}, |
| | |
| | | {-28634, "Hardware self-diagnosis error."}, |
| | | {-28636, "Hardware self-diagnosis error."}, |
| | | |
| | | // èªå®ä¹é误ç |
| | | // èªå®ä¹é误ç |
| | | {ERROR_CODE_UNKNOWN, "Error: Unknown error code."}, |
| | | {ERROR_CODE_NOT_CONNECTED, "Error: Not connected to the device."}, |
| | | {ERROR_CODE_INVALID_PARAM, "Error: Invalid parameter."}, |
| | |
| | | m_bConnected.store(false); |
| | | } |
| | | |
| | | // ææå½æ° |
| | | // ææå½æ° |
| | | CPerformanceMelsec::~CPerformanceMelsec() { |
| | | Disconnect(); |
| | | } |
| | | |
| | | // è·åæè¿çéè¯¯ä¿¡æ¯ |
| | | // è·åæè¿çéè¯¯ä¿¡æ¯ |
| | | std::string CPerformanceMelsec::GetLastError() const { |
| | | return m_strLastError; |
| | | } |
| | | |
| | | // ä¿åéè¯¯ä¿¡æ¯ |
| | | // ä¿åéè¯¯ä¿¡æ¯ |
| | | bool CPerformanceMelsec::SaveErrorInfoToFile(const std::string& filename) { |
| | | // æå¼æä»¶ |
| | | // æå¼æä»¶ |
| | | std::ofstream file(filename); |
| | | if (!file.is_open()) { |
| | | std::cerr << "Failed to open file for saving: " << filename << std::endl; |
| | | return false; |
| | | } |
| | | |
| | | // éåéææååé m_mapError å¹¶å°æ¯ä¸ªé误信æ¯åå
¥æä»¶ |
| | | // éåéææååé m_mapError å¹¶å°æ¯ä¸ªé误信æ¯åå
¥æä»¶ |
| | | for (const auto& entry : m_mapError) { |
| | | const int nCode = entry.first; |
| | | const std::string& strMessage = entry.second; |
| | |
| | | return true; |
| | | } |
| | | |
| | | // å è½½éè¯¯ä¿¡æ¯ |
| | | // å è½½éè¯¯ä¿¡æ¯ |
| | | bool CPerformanceMelsec::LoadErrorInfoFromFile(const std::string& filename) { |
| | | std::ifstream inFile(filename); |
| | | if (!inFile.is_open()) { |
| | |
| | | std::string strToken; |
| | | std::string strMessage; |
| | | |
| | | // 使ç¨åé符 "|" è§£ææ¯ä¸è¡ |
| | | // 使ç¨åé符 "|" è§£ææ¯ä¸è¡ |
| | | if (std::getline(iss, strToken, '|')) { |
| | | nCode = std::stoi(strToken); |
| | | } |
| | |
| | | return true; |
| | | } |
| | | |
| | | // è¿æ¥å°PLC |
| | | // è¿æ¥å°PLC |
| | | int CPerformanceMelsec::Connect(const short nChannel, const short nMode) { |
| | | std::lock_guard<std::mutex> lock(m_mtx); |
| | | |
| | |
| | | return ERROR_CODE_INVALID_PARAM; |
| | | } |
| | | |
| | | // è¿æ¥PLCï¼æ¾å¼ç±»å转æ¢ä»¥å¹é
mdOpen çç¾å |
| | | // è¿æ¥PLCï¼æ¾å¼ç±»å转æ¢ä»¥å¹é
mdOpen çç¾å |
| | | const short nRet = mdOpen(nChannel, nMode, &m_nPath); |
| | | if (nRet == 0) { |
| | | m_bConnected.store(true); |
| | |
| | | return nRet; |
| | | } |
| | | |
| | | // æå¼è¿æ¥ |
| | | // æå¼è¿æ¥ |
| | | int CPerformanceMelsec::Disconnect() { |
| | | std::lock_guard<std::mutex> lock(m_mtx); |
| | | |
| | |
| | | return nRet; |
| | | } |
| | | |
| | | // å¯ç¼ç¨æ§å¶å¨è½¯å
ä»¶ä¿¡æ¯è¡¨çåå§å |
| | | // å¯ç¼ç¨æ§å¶å¨è½¯å
ä»¶ä¿¡æ¯è¡¨çåå§å |
| | | int CPerformanceMelsec::InitializeController() { |
| | | std::lock_guard<std::mutex> lock(m_mtx); |
| | | |
| | |
| | | return nRet; |
| | | } |
| | | |
| | | // è·åçæ¬ä¿¡æ¯ |
| | | // è·åçæ¬ä¿¡æ¯ |
| | | int CPerformanceMelsec::GetBoardVersion(BoardVersion& version) { |
| | | if (!m_bConnected.load()) { |
| | | UpdateLastError(ERROR_CODE_NOT_CONNECTED); |
| | | return ERROR_CODE_NOT_CONNECTED; |
| | | } |
| | | |
| | | // è·åçæ¬ä¿¡æ¯ |
| | | // è·åçæ¬ä¿¡æ¯ |
| | | short buf[32] = { 0 }; |
| | | const short nRet = mdBdVerRead(m_nPath, buf); |
| | | if (nRet != 0) { |
| | |
| | | return nRet; |
| | | } |
| | | |
| | | // å¡«å
çæ¬ä¿¡æ¯å°ç»æä½ |
| | | // å¡«å
çæ¬ä¿¡æ¯å°ç»æä½ |
| | | version.fixedValue[0] = static_cast<char>(buf[0] & 0xFF); |
| | | version.fixedValue[1] = static_cast<char>((buf[0] >> 8) & 0xFF); |
| | | |
| | |
| | | return nRet; |
| | | } |
| | | |
| | | // 读åç®æ ç«ç¹CPUç±»å |
| | | // 读åç®æ ç«ç¹CPUç±»å |
| | | int CPerformanceMelsec::ReadCPUCode(const StationIdentifier& station, short& nCPUCode) { |
| | | // éªè¯ç«ç¹åæ°åæ°æ®æææ§ |
| | | // éªè¯ç«ç¹åæ°åæ°æ®æææ§ |
| | | int nRet = ValidateStation(station); |
| | | if (nRet != 0) { |
| | | UpdateLastError(nRet); |
| | | return nRet; |
| | | } |
| | | |
| | | // ç¡®ä¿çº¿ç¨å®å
¨çæå°éå®èå´ |
| | | // ç¡®ä¿çº¿ç¨å®å
¨çæå°éå®èå´ |
| | | { |
| | | nCPUCode = 0; |
| | | std::lock_guard<std::mutex> lock(m_mtx); |
| | |
| | | return nRet; |
| | | } |
| | | |
| | | // æ¿æ¨¡å¼è®¾ç½® |
| | | // æ¿æ¨¡å¼è®¾ç½® |
| | | int CPerformanceMelsec::SetBoardMode(const short nMode) { |
| | | // æ£æ¥æ¯å¦å·²ç»è¿æ¥ |
| | | // æ£æ¥æ¯å¦å·²ç»è¿æ¥ |
| | | if (!m_bConnected.load()) { |
| | | UpdateLastError(ERROR_CODE_NOT_CONNECTED); |
| | | return ERROR_CODE_NOT_CONNECTED; |
| | | } |
| | | |
| | | // ç¡®ä¿çº¿ç¨å®å
¨çæå°éå®èå´ |
| | | // ç¡®ä¿çº¿ç¨å®å
¨çæå°éå®èå´ |
| | | short nRet = 0; |
| | | { |
| | | std::lock_guard<std::mutex> lock(m_mtx); |
| | |
| | | return nRet; |
| | | } |
| | | |
| | | // è·åæ¿æ¨¡å¼ |
| | | // è·åæ¿æ¨¡å¼ |
| | | int CPerformanceMelsec::GetBoardMode(short& nMode) { |
| | | // æ£æ¥æ¯å¦å·²ç»è¿æ¥ |
| | | // æ£æ¥æ¯å¦å·²ç»è¿æ¥ |
| | | if (!m_bConnected.load()) { |
| | | UpdateLastError(ERROR_CODE_NOT_CONNECTED); |
| | | return ERROR_CODE_NOT_CONNECTED; |
| | |
| | | return 0; |
| | | } |
| | | |
| | | // æ¿å¤ä½ |
| | | // æ¿å¤ä½ |
| | | int CPerformanceMelsec::BoardReset() { |
| | | std::lock_guard<std::mutex> lock(m_mtx); |
| | | if (!m_bConnected.load()) { |
| | |
| | | return nRet; |
| | | } |
| | | |
| | | // æ¿LED读å |
| | | // æ¿LED读å |
| | | int CPerformanceMelsec::ReadBoardLed(std::vector<short>& vecLedBuffer) { |
| | | std::lock_guard<std::mutex> lock(m_mtx); |
| | | if (!m_bConnected.load()) { |
| | |
| | | return ERROR_CODE_NOT_CONNECTED; |
| | | } |
| | | |
| | | // æ¸
空 LED ç¼å²åº |
| | | // æ¸
空 LED ç¼å²åº |
| | | vecLedBuffer.clear(); |
| | | vecLedBuffer.resize(16, 0); |
| | | |
| | | // è°ç¨ SDK 彿°è¯»å LED æ°æ® |
| | | // è°ç¨ SDK 彿°è¯»å LED æ°æ® |
| | | const short nRet = mdBdLedRead(m_nPath, vecLedBuffer.data()); |
| | | if (nRet != 0) { |
| | | UpdateLastError(ERROR_CODE_NOT_CONNECTED); |
| | |
| | | return nRet; |
| | | } |
| | | |
| | | // è·åæ¿ç¶æ |
| | | // è·åæ¿ç¶æ |
| | | int CPerformanceMelsec::GetBoardStatus(BoardStatus& status) { |
| | | std::lock_guard<std::mutex> lock(m_mtx); |
| | | if (!m_bConnected) { |
| | |
| | | LOG_ERROR(m_strLastError); |
| | | } |
| | | |
| | | // å° buf æ å°å°ç»æä½ |
| | | // å° buf æ å°å°ç»æä½ |
| | | status = BoardStatus::fromBuffer(buf); |
| | | return 0; |
| | | } |
| | | |
| | | // éç¨è¯»æ°æ® |
| | | // éç¨è¯»æ°æ® |
| | | int CPerformanceMelsec::ReadData(const StationIdentifier& station, const short nDevType, const short nDevNo, short nSize, std::vector<short>& vecData) { |
| | | // éªè¯ç«ç¹åæ°åæ°æ®æææ§ |
| | | // éªè¯ç«ç¹åæ°åæ°æ®æææ§ |
| | | int nRet = ValidateStationAndSize(station, nSize); |
| | | if (nRet != 0) { |
| | | UpdateLastError(nRet); |
| | | return nRet; |
| | | } |
| | | |
| | | // åå§å读åç¼å²åº |
| | | // åå§å读åç¼å²åº |
| | | vecData.clear(); |
| | | vecData.resize(nSize, 0); |
| | | |
| | | // ç¡®ä¿çº¿ç¨å®å
¨çæå°éå®èå´ |
| | | // ç¡®ä¿çº¿ç¨å®å
¨çæå°éå®èå´ |
| | | { |
| | | std::lock_guard<std::mutex> lock(m_mtx); |
| | | short* pData = vecData.data(); |
| | |
| | | } |
| | | |
| | | if (nRet != 0) { |
| | | vecData.clear(); // å¦æè¯»åå¤±è´¥ï¼æ¸
空ç¼å²åº |
| | | vecData.clear(); // å¦æè¯»åå¤±è´¥ï¼æ¸
空ç¼å²åº |
| | | } |
| | | |
| | | return nRet; |
| | | } |
| | | |
| | | // 读å使°æ® |
| | | // 读å使°æ® |
| | | int CPerformanceMelsec::ReadBitData(const StationIdentifier& station, const DeviceType enDevType, const short nDevNo, const short nBitCount, BitContainer& vecData) { |
| | | // éªè¯ç«ç¹åæ°åæ°æ®æææ§ |
| | | // éªè¯ç«ç¹åæ°åæ°æ®æææ§ |
| | | int nRet = ValidateStationAndSize(station, nBitCount); |
| | | if (nRet != 0) { |
| | | UpdateLastError(nRet); |
| | |
| | | } |
| | | |
| | | const short nDevType = CalculateDeviceType(station, enDevType); |
| | | const auto nSize = static_cast<short>((static_cast<int>(nBitCount) + 15) / 16); // 计ç®éè¦è¯»åçåæ°éï¼åä¸åæ´ï¼ |
| | | const auto nSize = static_cast<short>((static_cast<int>(nBitCount) + 15) / 16); // 计ç®éè¦è¯»åçåæ°éï¼åä¸åæ´ï¼ |
| | | |
| | | std::vector<short> vecTempBuffer(nSize, 0); |
| | | nRet = ReadData(station, nDevType, nDevNo, nSize, vecTempBuffer); |
| | |
| | | if (nRet == 0) { |
| | | vecData.clear(); |
| | | |
| | | // å°åæ°æ®è§£æä¸ºä½æ°æ® |
| | | // å°åæ°æ®è§£æä¸ºä½æ°æ® |
| | | for (short nIdx = 0; nIdx < nSize; ++nIdx) { |
| | | const short nCurrentValue = vecTempBuffer[nIdx]; |
| | | // éåå½å short ä¸çæ¯ä¸ä½ |
| | | // éåå½å short ä¸çæ¯ä¸ä½ |
| | | for (int bitIdx = 0; bitIdx < 16; ++bitIdx) { |
| | | bool bBit = (nCurrentValue & (1 << bitIdx)) != 0; |
| | | vecData.push_back(bBit); |
| | | if (vecData.size() >= nBitCount) { |
| | | return nRet; // 妿已ç»è¯»å宿éç使°ï¼æåéåº |
| | | return nRet; // 妿已ç»è¯»å宿éç使°ï¼æåéåº |
| | | } |
| | | } |
| | | } |
| | |
| | | return nRet; |
| | | } |
| | | |
| | | // 读ååæ°æ® |
| | | // 读ååæ°æ® |
| | | int CPerformanceMelsec::ReadWordData(const StationIdentifier& station, const DeviceType enDevType, const short nDevNo, const short nWordCount, WordContainer& vecData) { |
| | | // éªè¯ç«ç¹åæ°åæ°æ®æææ§ |
| | | // éªè¯ç«ç¹åæ°åæ°æ®æææ§ |
| | | int nRet = ValidateStationAndSize(station, nWordCount); |
| | | if (nRet != 0) { |
| | | UpdateLastError(nRet); |
| | |
| | | return nRet; |
| | | } |
| | | |
| | | // 读åååæ°æ® |
| | | // 读åååæ°æ® |
| | | int CPerformanceMelsec::ReadDWordData(const StationIdentifier& station, const DeviceType enDevType, const short nDevNo, const short nDWordCount, DWordContainer& vecData) { |
| | | // éªè¯ç«ç¹åæ°åæ°æ®æææ§ |
| | | // éªè¯ç«ç¹åæ°åæ°æ®æææ§ |
| | | int nRet = ValidateStationAndSize(station, nDWordCount); |
| | | if (nRet != 0) { |
| | | UpdateLastError(nRet); |
| | | return nRet; |
| | | } |
| | | |
| | | const auto nSize = static_cast<short>(nDWordCount * 2); // æ¯ä¸ªååå 两个åï¼æ¯ä¸ªååå 4 åèï¼ |
| | | const auto nSize = static_cast<short>(nDWordCount * 2); // æ¯ä¸ªååå 两个åï¼æ¯ä¸ªååå 4 åèï¼ |
| | | const short nDevType = CalculateDeviceType(station, enDevType); |
| | | std::vector<short> vecTempBuffer(nSize, 0); |
| | | nRet = ReadData(station, nDevType, nDevNo, nSize, vecTempBuffer); |
| | | |
| | | if (nRet == 0) { |
| | | std::lock_guard<std::mutex> lock(m_mtx); // 线ç¨å®å
¨ä¿æ¤ |
| | | std::lock_guard<std::mutex> lock(m_mtx); // 线ç¨å®å
¨ä¿æ¤ |
| | | ConvertShortToUint32(vecTempBuffer, vecData); |
| | | } |
| | | |
| | | return nRet; |
| | | } |
| | | |
| | | // éç¨åæ°æ® |
| | | // éç¨åæ°æ® |
| | | int CPerformanceMelsec::WriteData(const StationIdentifier& station, const short nDevType, const short nDevNo, short nSize, short* pData) { |
| | | // éªè¯ç«ç¹åæ° |
| | | // éªè¯ç«ç¹åæ° |
| | | int nRet = ValidateStation(station); |
| | | if (nRet != 0) { |
| | | UpdateLastError(nRet); |
| | | return nRet; |
| | | } |
| | | |
| | | // æ°æ®æææ§ |
| | | // æ°æ®æææ§ |
| | | if (nSize < 0 || pData == nullptr) { |
| | | UpdateLastError(ERROR_CODE_INVALID_PARAM); |
| | | return ERROR_CODE_INVALID_PARAM; |
| | | } |
| | | |
| | | // ç¡®ä¿çº¿ç¨å®å
¨çæå°éå®èå´ |
| | | // ç¡®ä¿çº¿ç¨å®å
¨çæå°éå®èå´ |
| | | { |
| | | std::lock_guard<std::mutex> lock(m_mtx); |
| | | nSize *= sizeof(short); |
| | |
| | | return nRet; |
| | | } |
| | | |
| | | // å使°æ® |
| | | // å使°æ® |
| | | int CPerformanceMelsec::WriteBitData(const StationIdentifier& station, const DeviceType enDevType, const short nDevNo, const BitContainer& vecData) { |
| | | // éªè¯ç«ç¹åæ°åæ°æ®æææ§ |
| | | // éªè¯ç«ç¹åæ°åæ°æ®æææ§ |
| | | int nRet = ValidateStationAndData(station, vecData); |
| | | if (nRet != 0) { |
| | | UpdateLastError(nRet); |
| | |
| | | } |
| | | |
| | | const short nDevType = CalculateDeviceType(station, enDevType); |
| | | const auto nSize = static_cast<short>((static_cast<int>(vecData.size()) + 15) / 16); // 计ç®éè¦åå
¥çåæ°éï¼åä¸åæ´ï¼ |
| | | const auto nSize = static_cast<short>((static_cast<int>(vecData.size()) + 15) / 16); // 计ç®éè¦åå
¥çåæ°éï¼åä¸åæ´ï¼ |
| | | |
| | | // åå¤ä¸´æ¶ç¼å²åºæ¥åå¨è½¬æ¢åç 16 使°æ® |
| | | // åå¤ä¸´æ¶ç¼å²åºæ¥åå¨è½¬æ¢åç 16 使°æ® |
| | | std::vector<short> vecTempBuffer(nSize, 0); |
| | | { |
| | | std::lock_guard<std::mutex> lock(m_mtx); // 线ç¨å®å
¨ä¿æ¤ |
| | | // å°ä½æ°æ®æåæå
å°ä¸´æ¶ç¼å²åº |
| | | std::lock_guard<std::mutex> lock(m_mtx); // 线ç¨å®å
¨ä¿æ¤ |
| | | // å°ä½æ°æ®æåæå
å°ä¸´æ¶ç¼å²åº |
| | | for (int i = 0; i < vecData.size(); ++i) { |
| | | if (vecData[i]) { |
| | | // ä½¿ç¨ & 0xFFFF ä¿è¯ä¸ä¼è¶
è¿ 16 ä½ï¼é²æ¢æº¢åº |
| | | // ä½¿ç¨ & 0xFFFF ä¿è¯ä¸ä¼è¶
è¿ 16 ä½ï¼é²æ¢æº¢åº |
| | | vecTempBuffer[i / 16] |= static_cast<short>((1 << (i % 16)) & 0xFFFF); |
| | | } |
| | | } |
| | |
| | | return WriteData(station, nDevType, nDevNo, nSize, vecTempBuffer.data()); |
| | | } |
| | | |
| | | // ååæ°æ® |
| | | // ååæ°æ® |
| | | int CPerformanceMelsec::WriteWordData(const StationIdentifier& station, const DeviceType enDevType, const short nDevNo, const WordContainer& vecData) { |
| | | // éªè¯ç«ç¹åæ°åæ°æ®æææ§ |
| | | // éªè¯ç«ç¹åæ°åæ°æ®æææ§ |
| | | const int nRet = ValidateStationAndData(station, vecData); |
| | | if (nRet != 0) { |
| | | UpdateLastError(nRet); |
| | | return nRet; |
| | | } |
| | | |
| | | // 计ç®éè¦åå
¥çåèæ°ï¼æ¯ä¸ªåå 2 åèï¼ |
| | | // 计ç®éè¦åå
¥çåèæ°ï¼æ¯ä¸ªåå 2 åèï¼ |
| | | const short nDevType = CalculateDeviceType(station, enDevType); |
| | | const auto nSize = static_cast<short>(vecData.size()); |
| | | const auto pData = const_cast<short*>(reinterpret_cast<const short*>(vecData.data())); |
| | |
| | | return WriteData(station, nDevType, nDevNo, nSize, pData); |
| | | } |
| | | |
| | | // åååæ°æ® |
| | | // åååæ°æ® |
| | | int CPerformanceMelsec::WriteDWordData(const StationIdentifier& station, const DeviceType enDevType, const short nDevNo, const DWordContainer& vecData) { |
| | | // éªè¯ç«ç¹åæ°åæ°æ®æææ§ |
| | | // éªè¯ç«ç¹åæ°åæ°æ®æææ§ |
| | | const int nRet = ValidateStationAndData(station, vecData); |
| | | if (nRet != 0) { |
| | | UpdateLastError(nRet); |
| | | return nRet; |
| | | } |
| | | |
| | | // 计ç®éè¦åå
¥çåèæ°ï¼æ¯ä¸ªååå 4 åèï¼ |
| | | // 计ç®éè¦åå
¥çåèæ°ï¼æ¯ä¸ªååå 4 åèï¼ |
| | | const short nDevType = CalculateDeviceType(station, enDevType); |
| | | const auto nSize = static_cast<short>(vecData.size() * sizeof(short)); |
| | | std::vector<short> vecBuffer(nSize, 0); |
| | | { |
| | | std::lock_guard<std::mutex> lock(m_mtx); // 线ç¨å®å
¨ä¿æ¤ |
| | | std::lock_guard<std::mutex> lock(m_mtx); // 线ç¨å®å
¨ä¿æ¤ |
| | | ConvertUint32ToShort(vecData, vecBuffer); |
| | | } |
| | | |
| | | return WriteData(station, nDevType, nDevNo, nSize, vecBuffer.data()); |
| | | } |
| | | |
| | | // æ©å±è¯»æ°æ® |
| | | // æ©å±è¯»æ°æ® |
| | | long CPerformanceMelsec::ReadDataEx(const StationIdentifier& station, long nDevType, long nDevNo, long nSize, std::vector<char>& vecData) { |
| | | // éªè¯ç«ç¹åæ°å读å大尿¯å¦ææ |
| | | // éªè¯ç«ç¹åæ°å读å大尿¯å¦ææ |
| | | long nRet = ValidateStation(station); |
| | | if (nRet != 0) { |
| | | UpdateLastError(nRet); |
| | |
| | | std::vector<short> vecBuffer(nSize / 2, 0); |
| | | |
| | | { |
| | | std::lock_guard<std::mutex> lock(m_mtx); // 线ç¨å®å
¨ä¿æ¤ |
| | | std::lock_guard<std::mutex> lock(m_mtx); // 线ç¨å®å
¨ä¿æ¤ |
| | | nRet = mdReceiveEx(m_nPath, station.nNetNo, station.nStNo, nDevType, nDevNo, &nSize, vecBuffer.data()); |
| | | } |
| | | |
| | |
| | | LOG_ERROR(m_strLastError); |
| | | } |
| | | else { |
| | | std::lock_guard<std::mutex> lock(m_mtx); // 线ç¨å®å
¨ä¿æ¤ |
| | | std::lock_guard<std::mutex> lock(m_mtx); // 线ç¨å®å
¨ä¿æ¤ |
| | | vecData.resize(nSize); |
| | | ConvertShortToChar(vecBuffer, vecData); |
| | | } |
| | |
| | | return 0; |
| | | } |
| | | |
| | | // æ©å±åæ°æ® |
| | | // æ©å±åæ°æ® |
| | | long CPerformanceMelsec::WriteDataEx(const StationIdentifier& station, long nDevType, long nDevNo, const std::vector<char>& vecData) { |
| | | // éªè¯ç«ç¹åæ°åæ°æ®æææ§ |
| | | // éªè¯ç«ç¹åæ°åæ°æ®æææ§ |
| | | long nRet = ValidateStationAndData(station, vecData); |
| | | if (nRet != 0) { |
| | | UpdateLastError(nRet); |
| | | return nRet; |
| | | } |
| | | |
| | | // å° vecData 转æ¢ä¸º short ç±»åçç¼å²åº |
| | | // å° vecData 转æ¢ä¸º short ç±»åçç¼å²åº |
| | | long nSize = static_cast<long>(vecData.size()); |
| | | nSize = nSize % 2 != 0 ? nSize + 1 : nSize; |
| | | std::vector<short> vecBuffer(nSize / 2, 0); |
| | | |
| | | { |
| | | std::lock_guard<std::mutex> lock(m_mtx); // 线ç¨å®å
¨ä¿æ¤ |
| | | std::lock_guard<std::mutex> lock(m_mtx); // 线ç¨å®å
¨ä¿æ¤ |
| | | ConvertCharToShort(vecData, vecBuffer); |
| | | nRet = mdSendEx(m_nPath, station.nNetNo, station.nStNo, nDevType, nDevNo, &nSize, vecBuffer.data()); |
| | | } |
| | | |
| | | // é误å¤ç忥å¿è®°å½ |
| | | // é误å¤ç忥å¿è®°å½ |
| | | if (nRet != 0) { |
| | | UpdateLastError(nRet); |
| | | LOG_ERROR(m_strLastError); |
| | |
| | | return nRet; |
| | | } |
| | | |
| | | // æ©å±è½¯å
ä»¶éæºè¯»å |
| | | // æ©å±è½¯å
ä»¶éæºè¯»å |
| | | long CPerformanceMelsec::ReadRandomDataEx(const StationIdentifier& station, const std::vector<SoftElement>& vecSoftElements, std::vector<char>& vecData) { |
| | | if (vecSoftElements.empty()) { |
| | | UpdateLastError(ERROR_INVALID_PARAMETER); |
| | |
| | | return ERROR_INVALID_PARAMETER; |
| | | } |
| | | |
| | | // åå¤ dev æ°æ® |
| | | std::vector<short> devBuffer(vecSoftElements.size() * 3 + 1, 0); // æ¯ä¸ªè½¯å
ä»¶éè¦ 3 个 shortï¼å¤å ä¸ä¸ªè®¡æ°å¨ |
| | | devBuffer[0] = static_cast<short>(vecSoftElements.size()); // 第ä¸ä¸ªå
ç´ æ¯è½¯å
ä»¶æ°é |
| | | // åå¤ dev æ°æ® |
| | | std::vector<short> devBuffer(vecSoftElements.size() * 3 + 1, 0); // æ¯ä¸ªè½¯å
ä»¶éè¦ 3 个 shortï¼å¤å ä¸ä¸ªè®¡æ°å¨ |
| | | devBuffer[0] = static_cast<short>(vecSoftElements.size()); // 第ä¸ä¸ªå
ç´ æ¯è½¯å
ä»¶æ°é |
| | | for (size_t i = 0; i < vecSoftElements.size(); ++i) { |
| | | const SoftElement& element = vecSoftElements[i]; |
| | | devBuffer[i * 3 + 1] = element.nType; // 软å
ä»¶ç±»å |
| | | devBuffer[i * 3 + 2] = static_cast<short>(element.nStartNo); // èµ·å§è½¯å
ä»¶ç¼å· |
| | | devBuffer[i * 3 + 3] = element.nElementCount; // ç¹æ° |
| | | devBuffer[i * 3 + 1] = element.nType; // 软å
ä»¶ç±»å |
| | | devBuffer[i * 3 + 2] = static_cast<short>(element.nStartNo); // èµ·å§è½¯å
ä»¶ç¼å· |
| | | devBuffer[i * 3 + 3] = element.nElementCount; // ç¹æ° |
| | | } |
| | | |
| | | // 计ç®è¯»åæ°æ®æéç¼å²åºå¤§å° |
| | | // 计ç®è¯»åæ°æ®æéç¼å²åºå¤§å° |
| | | long nBufferSize = 0; |
| | | for (const auto& element : vecSoftElements) { |
| | | nBufferSize += element.nElementCount * 2; // æ¯ä¸ªç¹å ç¨ 2 个åè |
| | | nBufferSize += element.nElementCount * 2; // æ¯ä¸ªç¹å ç¨ 2 个åè |
| | | } |
| | | |
| | | // éä¿æ¤åè°ç¨ mdRandREx |
| | | // éä¿æ¤åè°ç¨ mdRandREx |
| | | long nRet = 0; |
| | | std::vector<short> vecBuffer(nBufferSize / 2, 0); |
| | | { |
| | | std::lock_guard<std::mutex> lock(m_mtx); // ç¡®ä¿çº¿ç¨å®å
¨ |
| | | std::lock_guard<std::mutex> lock(m_mtx); // ç¡®ä¿çº¿ç¨å®å
¨ |
| | | nRet = mdRandREx(m_nPath, station.nNetNo, station.nStNo, devBuffer.data(), vecBuffer.data(), nBufferSize); |
| | | } |
| | | |
| | | // é误å¤ç忥å¿è®°å½ |
| | | // é误å¤ç忥å¿è®°å½ |
| | | if (nRet != 0) { |
| | | UpdateLastError(nRet); |
| | | LOG_ERROR(m_strLastError); |
| | | return nRet; |
| | | } |
| | | |
| | | // å°è¯»åå°ç short æ°æ®è½¬æ¢ä¸º char æ°æ® |
| | | // å°è¯»åå°ç short æ°æ®è½¬æ¢ä¸º char æ°æ® |
| | | vecData.resize(nBufferSize); |
| | | for (size_t i = 0; i < vecBuffer.size(); ++i) { |
| | | vecData[i * 2] = static_cast<char>(vecBuffer[i] & 0xFF); // ä½åè |
| | | vecData[i * 2 + 1] = static_cast<char>((vecBuffer[i] >> 8) & 0xFF); // é«åè |
| | | vecData[i * 2] = static_cast<char>(vecBuffer[i] & 0xFF); // ä½åè |
| | | vecData[i * 2 + 1] = static_cast<char>((vecBuffer[i] >> 8) & 0xFF); // é«åè |
| | | } |
| | | |
| | | return nRet; |
| | | } |
| | | |
| | | // æ©å±è½¯å
ä»¶éæºåå
¥ï¼æ¯æå¤ä¸ªè½¯å
ä»¶ï¼ |
| | | // æ©å±è½¯å
ä»¶éæºåå
¥ï¼æ¯æå¤ä¸ªè½¯å
ä»¶ï¼ |
| | | long CPerformanceMelsec::WriteRandomDataEx(const StationIdentifier& station, const std::vector<SoftElement>& vecSoftElements, const std::vector<char>& vecData) { |
| | | if (vecSoftElements.empty() || vecData.empty()) { |
| | | UpdateLastError(ERROR_INVALID_PARAMETER); |
| | |
| | | return ERROR_INVALID_PARAMETER; |
| | | } |
| | | |
| | | // åå¤ dev æ°æ® |
| | | std::vector<long> devBuffer(vecSoftElements.size() * 3 + 1, 0); // æ¯ä¸ªè½¯å
ä»¶éè¦ 3 个 longï¼å¤å ä¸ä¸ªè®¡æ°å¨ |
| | | devBuffer[0] = static_cast<long>(vecSoftElements.size()); // 第ä¸ä¸ªå
ç´ æ¯è½¯å
ä»¶æ°é |
| | | // åå¤ dev æ°æ® |
| | | std::vector<long> devBuffer(vecSoftElements.size() * 3 + 1, 0); // æ¯ä¸ªè½¯å
ä»¶éè¦ 3 个 longï¼å¤å ä¸ä¸ªè®¡æ°å¨ |
| | | devBuffer[0] = static_cast<long>(vecSoftElements.size()); // 第ä¸ä¸ªå
ç´ æ¯è½¯å
ä»¶æ°é |
| | | for (size_t i = 0; i < vecSoftElements.size(); ++i) { |
| | | const SoftElement& element = vecSoftElements[i]; |
| | | devBuffer[i * 3 + 1] = static_cast<long>(element.nType); // 软å
ä»¶ç±»å |
| | | devBuffer[i * 3 + 2] = element.nStartNo; // èµ·å§è½¯å
ä»¶ç¼å·ï¼å·²ç»æ¯ long ç±»åï¼æ é转æ¢ï¼ |
| | | devBuffer[i * 3 + 3] = static_cast<long>(element.nElementCount); // ç¹æ° |
| | | devBuffer[i * 3 + 1] = static_cast<long>(element.nType); // 软å
ä»¶ç±»å |
| | | devBuffer[i * 3 + 2] = element.nStartNo; // èµ·å§è½¯å
ä»¶ç¼å·ï¼å·²ç»æ¯ long ç±»åï¼æ é转æ¢ï¼ |
| | | devBuffer[i * 3 + 3] = static_cast<long>(element.nElementCount); // ç¹æ° |
| | | } |
| | | |
| | | // éä¿æ¤åè°ç¨ mdRandWEx |
| | | // éä¿æ¤åè°ç¨ mdRandWEx |
| | | long nRet = 0; |
| | | std::vector<short> vecBuffer(vecData.size() / 2, 0); |
| | | { |
| | | std::lock_guard<std::mutex> lock(m_mtx); // ç¡®ä¿çº¿ç¨å®å
¨ |
| | | std::lock_guard<std::mutex> lock(m_mtx); // ç¡®ä¿çº¿ç¨å®å
¨ |
| | | ConvertCharToShort(vecData, vecBuffer); |
| | | nRet = mdRandWEx(m_nPath, station.nNetNo, station.nStNo, devBuffer.data(), vecBuffer.data(), static_cast<long>(vecBuffer.size())); |
| | | } |
| | | |
| | | // é误å¤ç忥å¿è®°å½ |
| | | // é误å¤ç忥å¿è®°å½ |
| | | if (nRet != 0) { |
| | | UpdateLastError(nRet); |
| | | LOG_ERROR(m_strLastError); |
| | |
| | | return nRet; |
| | | } |
| | | |
| | | // è¿ç¨è®¾å¤ç«/è¿ç¨ç«çç¼å²åå¨å¨è¯»å |
| | | // è¿ç¨è®¾å¤ç«/è¿ç¨ç«çç¼å²åå¨å¨è¯»å |
| | | long CPerformanceMelsec::ReadRemoteBuffer(const StationIdentifier& station, long nOffset, long nSize, std::vector<char>& vecData) { |
| | | // éªè¯ç«ç¹åæ°åæ°æ®æææ§ |
| | | // éªè¯ç«ç¹åæ°åæ°æ®æææ§ |
| | | int nRet = ValidateStation(station); |
| | | if (nRet != 0) { |
| | | UpdateLastError(nRet); |
| | |
| | | long nActualSize = (nSize + 1) / 2; |
| | | std::vector<short> vecBuffer(nActualSize, 0); |
| | | { |
| | | std::lock_guard<std::mutex> lock(m_mtx); // 线ç¨å®å
¨ä¿æ¤ |
| | | std::lock_guard<std::mutex> lock(m_mtx); // 线ç¨å®å
¨ä¿æ¤ |
| | | nRet = mdRemBufReadEx(m_nPath, station.nNetNo, station.nStNo, nOffset, &nActualSize, vecBuffer.data()); |
| | | } |
| | | |
| | | if (nRet != 0) { |
| | | UpdateLastError(nRet); // æ´æ°é误ç |
| | | UpdateLastError(nRet); // æ´æ°é误ç |
| | | LOG_ERROR(m_strLastError); |
| | | } |
| | | else { |
| | | std::lock_guard<std::mutex> lock(m_mtx); // 线ç¨å®å
¨ä¿æ¤ |
| | | std::lock_guard<std::mutex> lock(m_mtx); // 线ç¨å®å
¨ä¿æ¤ |
| | | ConvertShortToChar(vecBuffer, vecData); |
| | | } |
| | | |
| | | return nRet; |
| | | } |
| | | |
| | | // è¿ç¨è®¾å¤ç«/è¿ç¨ç«çç¼å²åå¨å¨åå
¥ |
| | | // è¿ç¨è®¾å¤ç«/è¿ç¨ç«çç¼å²åå¨å¨åå
¥ |
| | | long CPerformanceMelsec::WriteRemoteBuffer(const StationIdentifier& station, long nOffset, const std::vector<char>& vecData) { |
| | | // éªè¯ç«ç¹åæ°åæ°æ®æææ§ |
| | | // éªè¯ç«ç¹åæ°åæ°æ®æææ§ |
| | | long nRet = ValidateStationAndData(station, vecData); |
| | | if (nRet != 0) { |
| | | UpdateLastError(nRet); |
| | | return nRet; |
| | | } |
| | | |
| | | // å° vecData 转æ¢ä¸º short ç±»åçç¼å²åº |
| | | // å° vecData 转æ¢ä¸º short ç±»åçç¼å²åº |
| | | long nSize = static_cast<long>(vecData.size()); |
| | | std::vector<short> vecBuffer((nSize + 1) / 2, 0); |
| | | |
| | | { |
| | | std::lock_guard<std::mutex> lock(m_mtx); // 线ç¨å®å
¨ä¿æ¤ |
| | | std::lock_guard<std::mutex> lock(m_mtx); // 线ç¨å®å
¨ä¿æ¤ |
| | | ConvertCharToShort(vecData, vecBuffer); |
| | | nRet = mdRemBufWriteEx(m_nPath, station.nNetNo, station.nStNo, nOffset, &nSize, vecBuffer.data()); |
| | | } |
| | |
| | | return nRet; |
| | | } |
| | | |
| | | // è¿ç¨ç«çç¼å²åå¨å¨è¯»å 对象ç«IPå°åæå® |
| | | // è¿ç¨ç«çç¼å²åå¨å¨è¯»å 对象ç«IPå°åæå® |
| | | long CPerformanceMelsec::ReadRemoteBufferByIp(const std::string& strIP, long nOffset, long nSize, std::vector<char>& vecData) { |
| | | uint32_t nAddress = 0; |
| | | if (nSize < 0 || !ConvertIpStringToUint32(strIP, nAddress)) { |
| | |
| | | return ERROR_CODE_INVALID_PARAM; |
| | | } |
| | | |
| | | // å°ç¼å²åºå¤§å°è°æ´ä¸º nSize |
| | | // å°ç¼å²åºå¤§å°è°æ´ä¸º nSize |
| | | vecData.resize(nSize, 0); |
| | | std::vector<short> vecBuffer((nSize + 1) / 2, 0); // 转æ¢ä¸º short ç±»å |
| | | std::vector<short> vecBuffer((nSize + 1) / 2, 0); // 转æ¢ä¸º short ç±»å |
| | | |
| | | // è°ç¨åºå± SDK |
| | | // è°ç¨åºå± SDK |
| | | long nRet = 0; |
| | | { |
| | | std::lock_guard<std::mutex> lock(m_mtx); // 线ç¨å®å
¨ä¿æ¤ |
| | | std::lock_guard<std::mutex> lock(m_mtx); // 线ç¨å®å
¨ä¿æ¤ |
| | | nRet = mdRemBufReadIPEx(m_nPath, static_cast<long>(nAddress), nOffset, &nSize, vecBuffer.data()); |
| | | } |
| | | |
| | |
| | | LOG_ERROR(m_strLastError); |
| | | } |
| | | else { |
| | | std::lock_guard<std::mutex> lock(m_mtx); // 线ç¨å®å
¨ä¿æ¤ |
| | | std::lock_guard<std::mutex> lock(m_mtx); // 线ç¨å®å
¨ä¿æ¤ |
| | | ConvertShortToChar(vecBuffer, vecData); |
| | | } |
| | | |
| | | return nRet; |
| | | } |
| | | |
| | | // è¿ç¨ç«çç¼å²åå¨å¨åå
¥ 对象ç«IPå°åæå® |
| | | // è¿ç¨ç«çç¼å²åå¨å¨åå
¥ 对象ç«IPå°åæå® |
| | | long CPerformanceMelsec::WriteRemoteBufferByIp(const std::string& strIP, long nOffset, const std::vector<char>& vecData) { |
| | | uint32_t nAddress = 0; |
| | | if (vecData.empty() || !ConvertIpStringToUint32(strIP, nAddress)) { |
| | |
| | | return ERROR_CODE_INVALID_PARAM; |
| | | } |
| | | |
| | | // è½¬æ¢ vecData 为 short ç±»åçç¼å²åº |
| | | // è½¬æ¢ vecData 为 short ç±»åçç¼å²åº |
| | | long nSize = static_cast<long>(vecData.size()); |
| | | std::vector<short> vecBuffer((nSize + 1) / 2, 0); |
| | | |
| | | long nRet = 0; |
| | | { |
| | | std::lock_guard<std::mutex> lock(m_mtx); // 线ç¨å®å
¨ |
| | | std::lock_guard<std::mutex> lock(m_mtx); // 线ç¨å®å
¨ |
| | | ConvertCharToShort(vecData, vecBuffer); |
| | | nRet = mdRemBufWriteIPEx(m_nPath, static_cast<long>(nAddress), nOffset, &nSize, vecBuffer.data()); |
| | | } |
| | |
| | | return nRet; |
| | | } |
| | | |
| | | // 设置(ON)对象ç«çæå®ä½è½¯å
ä»¶ |
| | | // 设置(ON)对象ç«çæå®ä½è½¯å
ä»¶ |
| | | int CPerformanceMelsec::SetBitDevice(const StationIdentifier& station, const DeviceType enDevType, const short nDevNo) { |
| | | // éªè¯ç«ç¹åæ° |
| | | // éªè¯ç«ç¹åæ° |
| | | int nRet = ValidateStation(station); |
| | | if (nRet != 0) { |
| | | UpdateLastError(nRet); |
| | | return nRet; |
| | | } |
| | | |
| | | // ç¡®ä¿çº¿ç¨å®å
¨çæå°éå®èå´ |
| | | // ç¡®ä¿çº¿ç¨å®å
¨çæå°éå®èå´ |
| | | { |
| | | std::lock_guard<std::mutex> lock(m_mtx); // 线ç¨å®å
¨ |
| | | std::lock_guard<std::mutex> lock(m_mtx); // 线ç¨å®å
¨ |
| | | const short nDevType = CalculateDeviceType(station, enDevType); |
| | | nRet = mdDevSet(m_nPath, CombineStation(station), nDevType, nDevNo); |
| | | } |
| | |
| | | return nRet; |
| | | } |
| | | |
| | | // å¤ä½(OFF)对象ç«çæå®ä½è½¯å
ä»¶ |
| | | // å¤ä½(OFF)对象ç«çæå®ä½è½¯å
ä»¶ |
| | | int CPerformanceMelsec::ResetBitDevice(const StationIdentifier& station, const DeviceType enDevType, const short enDevNo) { |
| | | // éªè¯ç«ç¹åæ° |
| | | // éªè¯ç«ç¹åæ° |
| | | int nRet = ValidateStation(station); |
| | | if (nRet != 0) { |
| | | UpdateLastError(nRet); |
| | | return nRet; |
| | | } |
| | | |
| | | // ç¡®ä¿çº¿ç¨å®å
¨çæå°éå®èå´ |
| | | // ç¡®ä¿çº¿ç¨å®å
¨çæå°éå®èå´ |
| | | { |
| | | std::lock_guard<std::mutex> lock(m_mtx); |
| | | const short nDevType = CalculateDeviceType(station, enDevType); |
| | |
| | | return nRet; |
| | | } |
| | | |
| | | // æ©å±ä½è½¯å
件设置 |
| | | // æ©å±ä½è½¯å
件设置 |
| | | long CPerformanceMelsec::SetBitDeviceEx(const StationIdentifier& station, long nDevType, long nDevNo) { |
| | | std::lock_guard<std::mutex> lock(m_mtx); |
| | | |
| | | // æ£æ¥åæ°æææ§ |
| | | // æ£æ¥åæ°æææ§ |
| | | long nRet = ValidateStation(station); |
| | | if (nRet != 0) { |
| | | UpdateLastError(nRet); |
| | |
| | | return nRet; |
| | | } |
| | | |
| | | // æ©å±ä½è½¯å
ä»¶å¤ä½ |
| | | // æ©å±ä½è½¯å
ä»¶å¤ä½ |
| | | long CPerformanceMelsec::ResetBitDeviceEx(const StationIdentifier& station, long nDevType, long nDevNo) { |
| | | std::lock_guard<std::mutex> lock(m_mtx); |
| | | |
| | | // æ£æ¥åæ°æææ§ |
| | | // æ£æ¥åæ°æææ§ |
| | | long nRet = ValidateStation(station); |
| | | if (nRet != 0) { |
| | | UpdateLastError(nRet); |
| | |
| | | return nRet; |
| | | } |
| | | |
| | | // æ§è¡å¯¹è±¡ç«çCPU |
| | | // æ§è¡å¯¹è±¡ç«çCPU |
| | | int CPerformanceMelsec::ControlCPU(const StationIdentifier& station, ControlCode enControlCode) { |
| | | // éªè¯ç«ç¹åæ°åæ°æ®æææ§ |
| | | // éªè¯ç«ç¹åæ°åæ°æ®æææ§ |
| | | int nRet = ValidateStation(station); |
| | | if (nRet != 0) { |
| | | UpdateLastError(nRet); |
| | | return nRet; |
| | | } |
| | | |
| | | // éªè¯æ§å¶ç æ¯å¦åæ³ |
| | | // éªè¯æ§å¶ç æ¯å¦åæ³ |
| | | const auto nControlCode = static_cast<short>(enControlCode); |
| | | if (nControlCode < 0 || nControlCode > 2) { |
| | | UpdateLastError(ERROR_CODE_INVALID_PARAM); // åæ°é误 |
| | | UpdateLastError(ERROR_CODE_INVALID_PARAM); // åæ°é误 |
| | | return ERROR_CODE_INVALID_PARAM; |
| | | } |
| | | |
| | | // ç¡®ä¿çº¿ç¨å®å
¨çæå°éå®èå´ |
| | | // ç¡®ä¿çº¿ç¨å®å
¨çæå°éå®èå´ |
| | | { |
| | | std::lock_guard<std::mutex> lock(m_mtx); |
| | | nRet = mdControl(m_nPath, CombineStation(station), nControlCode); |
| | |
| | | return nRet; |
| | | } |
| | | |
| | | // äºä»¶çå¾
|
| | | // äºä»¶çå¾
|
| | | int CPerformanceMelsec::WaitForBoardEvent(std::vector<short> vecEventNumbers, const int nTimeoutMs, EventDetails& details) { |
| | | std::lock_guard<std::mutex> lock(m_mtx); |
| | | |
| | |
| | | return ERROR_CODE_INVALID_PARAM; |
| | | } |
| | | |
| | | // 第 0 个å
ç´ å卿°éï¼æå¤§æ¯æ 64 个äºä»¶ |
| | | // 第 0 个å
ç´ å卿°éï¼æå¤§æ¯æ 64 个äºä»¶ |
| | | std::array<short, 65> eventno = { 0 }; |
| | | eventno[0] = static_cast<short>(vecEventNumbers.size()); |
| | | std::copy(vecEventNumbers.begin(), vecEventNumbers.end(), eventno.begin() + 1); |
| | | |
| | | // åå§åè¾åºåæ° |
| | | // åå§åè¾åºåæ° |
| | | details.nEventNo = 0; |
| | | details.details.fill(0); |
| | | |
| | |
| | | return nRet; |
| | | } |
| | | |
| | | //============================================è¾
å©å½æ°======================================================= |
| | | // æ´æ°æè¿çéè¯¯ä¿¡æ¯ |
| | | //============================================è¾
å©å½æ°======================================================= |
| | | // æ´æ°æè¿çéè¯¯ä¿¡æ¯ |
| | | void CPerformanceMelsec::UpdateLastError(const int nCode) { |
| | | if (nCode == 0) { |
| | | return; |
| | | } |
| | | |
| | | // æ£æ¥éè¯¯ç æ¯å¦åå¨äºæ å°è¡¨ä¸ |
| | | // æ£æ¥éè¯¯ç æ¯å¦åå¨äºæ å°è¡¨ä¸ |
| | | const auto it = m_mapError.find(nCode); |
| | | if (it != m_mapError.end()) { |
| | | // 妿æ¾å°ï¼ç´æ¥è¿å对åºè¯è¨çéè¯¯ä¿¡æ¯ |
| | | // 妿æ¾å°ï¼ç´æ¥è¿å对åºè¯è¨çéè¯¯ä¿¡æ¯ |
| | | m_strLastError = it->second; |
| | | } |
| | | else { |
| | | // å¦ææªæ¾å°ï¼å¤çç¹æ®èå´ |
| | | // å¦ææªæ¾å°ï¼å¤çç¹æ®èå´ |
| | | m_strLastError = "Unknown error."; |
| | | if (nCode == -28611 || nCode == -28612) { |
| | | // ç³»ç»åºé |
| | | // ç³»ç»åºé |
| | | m_strLastError = "System error."; |
| | | } |
| | | |
| | | if (nCode >= -20480 && nCode <= -16384) { |
| | | // CC-Link ç³»ç»æ£æµåºçé误 |
| | | // CC-Link ç³»ç»æ£æµåºçé误 |
| | | m_strLastError = "Error detected in the CC-Link system."; |
| | | } |
| | | |
| | | if (nCode >= -12288 && nCode <= -8193) { |
| | | // CC-Link IE TSN ç³»ç»æ£æµåºçé误 |
| | | // CC-Link IE TSN ç³»ç»æ£æµåºçé误 |
| | | m_strLastError = "Error detected in the CC-Link IE TSN system."; |
| | | } |
| | | |
| | | if (nCode >= -8192 && nCode <= -4097) { |
| | | // CC-Link IE æ§å¶ç½ç»ç³»ç»æ£æµåºçé误 |
| | | // CC-Link IE æ§å¶ç½ç»ç³»ç»æ£æµåºçé误 |
| | | m_strLastError = "Error detected in the CC-Link IE control network system."; |
| | | } |
| | | |
| | | if (nCode >= -4096 && nCode <= -257) { |
| | | // MELSECNET/10 æ MELSECNET/ç½ç»ç³»ç»é误èå´ |
| | | // MELSECNET/10 æ MELSECNET/ç½ç»ç³»ç»é误èå´ |
| | | m_strLastError = "Errors detected in MELSECNET/10 or MELSECNET/network system."; |
| | | } |
| | | |
| | | if (nCode >= 4096 && nCode <= 16383) { |
| | | // MELSEC æ°æ®é¾æ¥åºèå´ |
| | | // MELSEC æ°æ®é¾æ¥åºèå´ |
| | | m_strLastError = "Internal error detected by MELSEC Data Link Library."; |
| | | } |
| | | |
| | | if (nCode == 18944 || nCode == 18945) { |
| | | // 龿¥å
³èåºé |
| | | // 龿¥å
³èåºé |
| | | m_strLastError = "Link association error: Network does not exist, unsupported CPU, or incorrect network No./station number."; |
| | | } |
| | | |
| | | if (nCode >= 16384 && nCode <= 20479) { |
| | | // PLC CPU æ£æµèå´ |
| | | // PLC CPU æ£æµèå´ |
| | | m_strLastError = "Errors detected by the programmable controller CPU in the target station."; |
| | | } |
| | | |
| | | if (nCode >= 28416 && nCode <= 28671) { |
| | | // åä½åè½æ¨¡åèå´ |
| | | // åä½åè½æ¨¡åèå´ |
| | | m_strLastError = "Error detected in the redundancy module of the target station."; |
| | | } |
| | | } |
| | | } |
| | | |
| | | // æ£æ¥è¿æ¥ç¶æåç«ç¹åæ°æææ§ |
| | | // æ£æ¥è¿æ¥ç¶æåç«ç¹åæ°æææ§ |
| | | int CPerformanceMelsec::ValidateStation(const StationIdentifier& station) const { |
| | | // æ£æ¥æ¯å¦å·²è¿æ¥ |
| | | // æ£æ¥æ¯å¦å·²è¿æ¥ |
| | | if (!m_bConnected.load()) { |
| | | return ERROR_CODE_NOT_CONNECTED; |
| | | } |
| | | |
| | | // æ£æ¥ç½ç»å·åç«ç¹å·èå´ |
| | | // æ£æ¥ç½ç»å·åç«ç¹å·èå´ |
| | | if (station.nNetNo < 0 || station.nNetNo > 239 || station.nStNo < 0 || station.nStNo > 255) { |
| | | return ERROR_CODE_INVALID_PARAM; |
| | | } |
| | | |
| | | return 0; // åæ°ææ |
| | | return 0; // åæ°ææ |
| | | } |
| | | |
| | | // éªè¯ç«ç¹åæ°åæ°æ®æææ§ |
| | | // éªè¯ç«ç¹åæ°åæ°æ®æææ§ |
| | | int CPerformanceMelsec::ValidateStationAndSize(const StationIdentifier& station, const short nCount) const { |
| | | // éªè¯ç«ç¹åæ° |
| | | // éªè¯ç«ç¹åæ° |
| | | const int nRet = ValidateStation(station); |
| | | if (nRet != 0) { |
| | | return nRet; // 妿ç«ç¹éªè¯å¤±è´¥ï¼è¿å对åºé误ç |
| | | return nRet; // 妿ç«ç¹éªè¯å¤±è´¥ï¼è¿å对åºé误ç |
| | | } |
| | | |
| | | if (nCount <= 0) { |
| | | return ERROR_CODE_INVALID_PARAM; |
| | | } |
| | | |
| | | return 0; // éªè¯éè¿ |
| | | return 0; // éªè¯éè¿ |
| | | } |
| | | |
| | | // IPå符串转uint32_t |
| | | // IPå符串转uint32_t |
| | | bool CPerformanceMelsec::ConvertIpStringToUint32(const std::string& strIP, uint32_t& nIP) { |
| | | nIP = 0; |
| | | std::stringstream ss(strIP); |
| | |
| | | return true; |
| | | } |
| | | |
| | | //============================================éæè¾
å©å½æ°==================================================== |
| | | // å»¶æ¶ï¼å¹¶ä¸è½¬åçªå£æ¶æ¯ |
| | | //============================================éæè¾
å©å½æ°==================================================== |
| | | // å»¶æ¶ï¼å¹¶ä¸è½¬åçªå£æ¶æ¯ |
| | | void CPerformanceMelsec::Delay(const unsigned int nDelayMs) { |
| | | MSG message; |
| | | // å¦æå»¶è¿æ¶é´ä¸º 0ï¼ä»
å¤ç䏿¬¡æ¶æ¯éå |
| | | // å¦æå»¶è¿æ¶é´ä¸º 0ï¼ä»
å¤ç䏿¬¡æ¶æ¯éå |
| | | if (nDelayMs == 0) { |
| | | // éé»å¡çæ£æ¥æ¶æ¯éå |
| | | // éé»å¡çæ£æ¥æ¶æ¯éå |
| | | if (PeekMessage(&message, nullptr, 0, 0, PM_REMOVE)) { |
| | | TranslateMessage(&message); // å°æ¶æ¯è½¬å为ææççªå£æ¶æ¯ |
| | | DispatchMessage(&message); // æ´¾åæ¶æ¯ç»ç¸åºççªå£è¿ç¨ |
| | | TranslateMessage(&message); // å°æ¶æ¯è½¬å为ææççªå£æ¶æ¯ |
| | | DispatchMessage(&message); // æ´¾åæ¶æ¯ç»ç¸åºççªå£è¿ç¨ |
| | | } |
| | | return; |
| | | } |
| | | |
| | | DWORD finish; |
| | | const DWORD start = GetTickCount(); // è·åå½åçæ¶é´æ³ï¼ä»ç³»ç»å¯å¨ä»¥æ¥çæ¯«ç§æ°ï¼ |
| | | const DWORD start = GetTickCount(); // è·åå½åçæ¶é´æ³ï¼ä»ç³»ç»å¯å¨ä»¥æ¥çæ¯«ç§æ°ï¼ |
| | | do { |
| | | if (PeekMessage(&message, nullptr, 0, 0, PM_REMOVE)) { |
| | | TranslateMessage(&message); // è½¬æ¢æ¶æ¯ |
| | | DispatchMessage(&message); // å¤çæ¶æ¯ |
| | | TranslateMessage(&message); // è½¬æ¢æ¶æ¯ |
| | | DispatchMessage(&message); // å¤çæ¶æ¯ |
| | | } |
| | | Sleep(1); // æå 1 毫ç§ï¼é²æ¢è¿åº¦å ç¨ CPU |
| | | finish = GetTickCount(); // è·åå½åçæ¶é´æ³ |
| | | } while ((finish - start) < nDelayMs); // 循ç¯ç´å°ç»è¿çæ¶é´å¤§äºæå®çå»¶è¿æ¶é´ |
| | | Sleep(1); // æå 1 毫ç§ï¼é²æ¢è¿åº¦å ç¨ CPU |
| | | finish = GetTickCount(); // è·åå½åçæ¶é´æ³ |
| | | } while ((finish - start) < nDelayMs); // 循ç¯ç´å°ç»è¿çæ¶é´å¤§äºæå®çå»¶è¿æ¶é´ |
| | | } |
| | | |
| | | BoardType CPerformanceMelsec::FindBoardTypeByChannel(const int nChannel) { |
| | |
| | | return BoardType::UNKNOWN; |
| | | } |
| | | |
| | | // åå¹¶ç½ç»å·åç«ç¹å· |
| | | // åå¹¶ç½ç»å·åç«ç¹å· |
| | | short CPerformanceMelsec::CombineStation(const StationIdentifier& station) { |
| | | return static_cast<short>(station.nStNo | ((station.nNetNo << 8) & 0xFF00)); |
| | | } |
| | | |
| | | // 计ç®è½¯å
ä»¶ç±»å |
| | | // 计ç®è½¯å
ä»¶ç±»å |
| | | short CPerformanceMelsec::CalculateDeviceType(const StationIdentifier& station, DeviceType enDevType) { |
| | | int nDevType = static_cast<int>(enDevType); |
| | | |
| | | // æ ¹æ®è½¯å
ä»¶ç±»åçç¹å®è§åè¿è¡è®¡ç® |
| | | // æ ¹æ®è½¯å
ä»¶ç±»åçç¹å®è§åè¿è¡è®¡ç® |
| | | if (enDevType == DeviceType::LX || enDevType == DeviceType::LY || |
| | | enDevType == DeviceType::LB || enDevType == DeviceType::LW || |
| | | enDevType == DeviceType::LSB || enDevType == DeviceType::LSW) { |
| | | // ç½ç»å·å åç§» |
| | | // ç½ç»å·å åç§» |
| | | nDevType += station.nNetNo; |
| | | } |
| | | else if (enDevType == DeviceType::ER) { |
| | | // æä»¶å¯åå¨çåå·å åç§» |
| | | // æä»¶å¯åå¨çåå·å åç§» |
| | | nDevType += 0; |
| | | } |
| | | else if (enDevType == DeviceType::SPG) { |
| | | // èµ·å§ I/O No. ÷ 16 çå¼ |
| | | // èµ·å§ I/O No. ÷ 16 çå¼ |
| | | nDevType += 0 / 16; |
| | | } |
| | | |
| | | return static_cast<short>(nDevType); |
| | | } |
| | | |
| | | // std::vector<char>转æ¢ä¸ºstd::vector<short> |
| | | // std::vector<char>转æ¢ä¸ºstd::vector<short> |
| | | void CPerformanceMelsec::ConvertCharToShort(const std::vector<char>& vecChar, std::vector<short>& vecShort) { |
| | | vecShort.resize((vecChar.size() + 1) / 2, 0); // è°æ´ short 容å¨å¤§å° |
| | | vecShort.resize((vecChar.size() + 1) / 2, 0); // è°æ´ short 容å¨å¤§å° |
| | | for (size_t i = 0; i < vecChar.size(); i++) { |
| | | if (i % 2 == 0) { |
| | | vecShort[i / 2] = static_cast<unsigned char>(vecChar[i]); // ä½åè |
| | | vecShort[i / 2] = static_cast<unsigned char>(vecChar[i]); // ä½åè |
| | | } |
| | | else { |
| | | vecShort[i / 2] |= static_cast<unsigned char>(vecChar[i]) << 8; // é«åè |
| | | vecShort[i / 2] |= static_cast<unsigned char>(vecChar[i]) << 8; // é«åè |
| | | } |
| | | } |
| | | } |
| | | |
| | | // std::vector<short>转æ¢ä¸ºstd::vector<char> |
| | | // std::vector<short>转æ¢ä¸ºstd::vector<char> |
| | | void CPerformanceMelsec::ConvertShortToChar(const std::vector<short>& vecShort, std::vector<char>& vecChar) { |
| | | vecChar.resize(vecShort.size() * 2); // è°æ´ char 容å¨å¤§å° |
| | | vecChar.resize(vecShort.size() * 2); // è°æ´ char 容å¨å¤§å° |
| | | for (size_t i = 0; i < vecShort.size(); i++) { |
| | | vecChar[i * 2] = static_cast<char>(vecShort[i] & 0xFF); // ä½åè |
| | | vecChar[i * 2 + 1] = static_cast<char>((vecShort[i] >> 8) & 0xFF); // é«åè |
| | | vecChar[i * 2] = static_cast<char>(vecShort[i] & 0xFF); // ä½åè |
| | | vecChar[i * 2 + 1] = static_cast<char>((vecShort[i] >> 8) & 0xFF); // é«åè |
| | | } |
| | | } |
| | | |
| | | // std::vector<uint8_t>转æ¢ä¸ºstd::vector<short> |
| | | // std::vector<uint8_t>转æ¢ä¸ºstd::vector<short> |
| | | void CPerformanceMelsec::ConvertUint8ToShort(const std::vector<uint8_t>& vecUint8, std::vector<short>& vecShort) { |
| | | vecShort.resize((vecUint8.size() + 1) / 2, 0); // è°æ´ short 容å¨å¤§å° |
| | | vecShort.resize((vecUint8.size() + 1) / 2, 0); // è°æ´ short 容å¨å¤§å° |
| | | for (size_t i = 0; i < vecUint8.size(); i++) { |
| | | if (i % 2 == 0) { |
| | | vecShort[i / 2] = static_cast<short>(vecUint8[i]); // ä½åè |
| | | vecShort[i / 2] = static_cast<short>(vecUint8[i]); // ä½åè |
| | | } |
| | | else { |
| | | vecShort[i / 2] |= static_cast<short>(vecUint8[i] << 8); // é«åè |
| | | vecShort[i / 2] |= static_cast<short>(vecUint8[i] << 8); // é«åè |
| | | } |
| | | } |
| | | } |
| | | |
| | | // std::vector<short>转æ¢ä¸ºstd::vector<uint8_t> |
| | | // std::vector<short>转æ¢ä¸ºstd::vector<uint8_t> |
| | | void CPerformanceMelsec::ConvertShortToUint8(const std::vector<short>& vecShort, std::vector<uint8_t>& vecUint8) { |
| | | vecUint8.resize(vecShort.size() * 2); // è°æ´ uint8_t 容å¨å¤§å° |
| | | vecUint8.resize(vecShort.size() * 2); // è°æ´ uint8_t 容å¨å¤§å° |
| | | for (size_t i = 0; i < vecShort.size(); i++) { |
| | | vecUint8[i * 2] = static_cast<uint8_t>(vecShort[i] & 0xFF); // ä½åè |
| | | vecUint8[i * 2 + 1] = static_cast<uint8_t>((vecShort[i] >> 8) & 0xFF); // é«åè |
| | | vecUint8[i * 2] = static_cast<uint8_t>(vecShort[i] & 0xFF); // ä½åè |
| | | vecUint8[i * 2 + 1] = static_cast<uint8_t>((vecShort[i] >> 8) & 0xFF); // é«åè |
| | | } |
| | | } |
| | | |
| | | // std::vector<uint32_t>转æ¢ä¸ºstd::vector<short> |
| | | // std::vector<uint32_t>转æ¢ä¸ºstd::vector<short> |
| | | void CPerformanceMelsec::ConvertUint32ToShort(const std::vector<uint32_t>& vecUint32, std::vector<short>& vecShort) { |
| | | vecShort.resize(vecUint32.size() * 2); // æ¯ä¸ª uint32_t 转æ¢ä¸ºä¸¤ä¸ª short |
| | | vecShort.resize(vecUint32.size() * 2); // æ¯ä¸ª uint32_t 转æ¢ä¸ºä¸¤ä¸ª short |
| | | for (size_t i = 0; i < vecUint32.size(); i++) { |
| | | vecShort[i * 2] = static_cast<short>(vecUint32[i] & 0xFFFF); // ä½16ä½ |
| | | vecShort[i * 2 + 1] = static_cast<short>((vecUint32[i] >> 16) & 0xFFFF); // é«16ä½ |
| | | vecShort[i * 2] = static_cast<short>(vecUint32[i] & 0xFFFF); // ä½16ä½ |
| | | vecShort[i * 2 + 1] = static_cast<short>((vecUint32[i] >> 16) & 0xFFFF); // é«16ä½ |
| | | } |
| | | } |
| | | |
| | | // std::vector<short>转æ¢ä¸ºstd::vector<uint32_t> |
| | | // std::vector<short>转æ¢ä¸ºstd::vector<uint32_t> |
| | | void CPerformanceMelsec::ConvertShortToUint32(const std::vector<short>& vecShort, std::vector<uint32_t>& vecUint32) { |
| | | vecUint32.resize((vecShort.size() + 1) / 2, 0); // æ¯ä¸¤ä¸ª short å并为ä¸ä¸ª uint32_t |
| | | vecUint32.resize((vecShort.size() + 1) / 2, 0); // æ¯ä¸¤ä¸ª short å并为ä¸ä¸ª uint32_t |
| | | for (size_t i = 0; i < vecUint32.size(); i++) { |
| | | vecUint32[i] = (static_cast<uint32_t>(static_cast<uint16_t>(vecShort[i * 2 + 1])) << 16) | // é«16ä½ |
| | | static_cast<uint32_t>(static_cast<uint16_t>(vecShort[i * 2])); // ä½16ä½ |
| | | vecUint32[i] = (static_cast<uint32_t>(static_cast<uint16_t>(vecShort[i * 2 + 1])) << 16) | // é«16ä½ |
| | | static_cast<uint32_t>(static_cast<uint16_t>(vecShort[i * 2])); // ä½16ä½ |
| | | } |
| | | } |
| | | |
| | | //============================================模æ¿è¾
å©å½æ°==================================================== |
| | | // éªè¯ç«ç¹åæ°åæ°æ®æææ§ |
| | | //============================================模æ¿è¾
å©å½æ°==================================================== |
| | | // éªè¯ç«ç¹åæ°åæ°æ®æææ§ |
| | | template <typename T> |
| | | int CPerformanceMelsec::ValidateStationAndData(const StationIdentifier& station, const std::vector<T>& vecData) { |
| | | // éªè¯ç«ç¹åæ° |
| | | // éªè¯ç«ç¹åæ° |
| | | const int nRet = ValidateStation(station); |
| | | if (nRet != 0) { |
| | | return nRet; // 妿ç«ç¹éªè¯å¤±è´¥ï¼è¿å对åºé误ç |
| | | return nRet; // 妿ç«ç¹éªè¯å¤±è´¥ï¼è¿å对åºé误ç |
| | | } |
| | | |
| | | // éªè¯æ°æ®æ¯å¦ä¸ºç©º |
| | | // éªè¯æ°æ®æ¯å¦ä¸ºç©º |
| | | if (vecData.empty()) { |
| | | return ERROR_CODE_INVALID_PARAM; |
| | | } |
| | | |
| | | return 0; // éªè¯éè¿ |
| | | return 0; // éªè¯éè¿ |
| | | } |
| | | |
| | | // ç±ä½è½¬é«å®¹å¨ç模æ¿ï¼æ´åï¼ |
| | | // ç±ä½è½¬é«å®¹å¨ç模æ¿ï¼æ´åï¼ |
| | | template <typename T, typename U> |
| | | void CPerformanceMelsec::ConvertLowToHigh(const std::vector<T>& vecLow, std::vector<U>& vecHigh) { |
| | | static_assert(std::is_integral<T>::value && std::is_integral<U>::value, "T and U must be integral types"); |
| | | |
| | | // èªå¨è®¡ç® nGroupSize |
| | | // èªå¨è®¡ç® nGroupSize |
| | | constexpr size_t nGroupSize = sizeof(U) / sizeof(T); |
| | | |
| | | // 妿 T å U ç大å°ç¸çï¼ç´æ¥è½¬æ¢ |
| | | // 妿 T å U ç大å°ç¸çï¼ç´æ¥è½¬æ¢ |
| | | if (sizeof(T) == sizeof(U)) { |
| | | vecHigh.assign(vecLow.begin(), vecLow.end()); |
| | | return; |
| | | } |
| | | |
| | | // 妿 U ç大尿¯ T çåæ°ï¼æ£å¸¸ç»å |
| | | // 妿 U ç大尿¯ T çåæ°ï¼æ£å¸¸ç»å |
| | | static_assert(sizeof(U) > sizeof(T), "Size of U must be greater than or equal to size of T"); |
| | | |
| | | // 计ç®å®æ´ç»çæ°é |
| | | size_t nHighSize = (vecLow.size() + nGroupSize - 1) / nGroupSize; // åä¸åæ´ |
| | | // 计ç®å®æ´ç»çæ°é |
| | | size_t nHighSize = (vecLow.size() + nGroupSize - 1) / nGroupSize; // åä¸åæ´ |
| | | vecHigh.resize(nHighSize, 0); |
| | | |
| | | // åå¹¶ä½ä½æ°æ®å°é«ä½æ°æ® |
| | | // åå¹¶ä½ä½æ°æ®å°é«ä½æ°æ® |
| | | for (size_t i = 0; i < vecLow.size(); i++) { |
| | | vecHigh[i / nGroupSize] |= (static_cast<U>(vecLow[i]) << ((i % nGroupSize) * CHAR_BIT * sizeof(T))); |
| | | } |
| | |
| | | return vecHigh; |
| | | } |
| | | |
| | | // ç±é«è½¬ä½å®¹å¨ç模æ¿ï¼æ´åï¼ |
| | | // ç±é«è½¬ä½å®¹å¨ç模æ¿ï¼æ´åï¼ |
| | | template <typename T, typename U> |
| | | void CPerformanceMelsec::ConvertHighToLow(const std::vector<T>& vecHigh, std::vector<U>& vecLow) { |
| | | static_assert(std::is_integral<T>::value && std::is_integral<U>::value, "T and U must be integral types"); |
| | | |
| | | // èªå¨è®¡ç® nGroupSize |
| | | // èªå¨è®¡ç® nGroupSize |
| | | constexpr size_t nGroupSize = sizeof(T) / sizeof(U); |
| | | |
| | | // 妿 T å U ç大å°ç¸çï¼ç´æ¥è½¬æ¢ |
| | | // 妿 T å U ç大å°ç¸çï¼ç´æ¥è½¬æ¢ |
| | | if (sizeof(T) == sizeof(U)) { |
| | | vecLow.assign(vecHigh.begin(), vecHigh.end()); |
| | | return; |
| | | } |
| | | |
| | | // 妿 T ç大尿¯ U çåæ°ï¼æ£å¸¸åè§£ |
| | | // 妿 T ç大尿¯ U çåæ°ï¼æ£å¸¸åè§£ |
| | | static_assert(sizeof(T) > sizeof(U), "Size of T must be greater than or equal to size of U"); |
| | | |
| | | size_t nLowSize = vecHigh.size() * nGroupSize; // ä½å®¹å¨çå¤§å° |
| | | size_t nLowSize = vecHigh.size() * nGroupSize; // ä½å®¹å¨çå¤§å° |
| | | vecLow.resize(nLowSize, 0); |
| | | |
| | | // åè§£é«ä½æ°æ®å°ä½ä½æ°æ® |
| | | // åè§£é«ä½æ°æ®å°ä½ä½æ°æ® |
| | | for (size_t i = 0; i < vecHigh.size(); i++) { |
| | | for (size_t j = 0; j < nGroupSize; j++) { |
| | | vecLow[i * nGroupSize + j] = static_cast<U>((vecHigh[i] >> (j * CHAR_BIT * sizeof(U))) & ((1ULL << (CHAR_BIT * sizeof(U))) - 1)); |
| | |
| | | #include <sstream> |
| | | #include <unordered_map> |
| | | |
| | | // è¿æ¥åæ° |
| | | #define PLC_MAX_RETRY 3 // æå¤§éè¯æ¬¡æ°ï¼å¨ä¸PLCéä¿¡æ¶ï¼å¦æåçéä¿¡é误ï¼å°æå¤éè¯3次 |
| | | #define PLC_TIMEOUT 500 // è¶
æ¶æ¶é´ï¼æ¯«ç§ï¼ï¼æ¯æ¬¡éä¿¡æä½çè¶
æ¶çå¾
æ¶é´ä¸º500æ¯«ç§ |
| | | // è¿æ¥åæ° |
| | | #define PLC_MAX_RETRY 3 // æå¤§éè¯æ¬¡æ°ï¼å¨ä¸PLCéä¿¡æ¶ï¼å¦æåçéä¿¡é误ï¼å°æå¤éè¯3次 |
| | | #define PLC_TIMEOUT 500 // è¶
æ¶æ¶é´ï¼æ¯«ç§ï¼ï¼æ¯æ¬¡éä¿¡æä½çè¶
æ¶çå¾
æ¶é´ä¸º500æ¯«ç§ |
| | | |
| | | /* |
| | | * ç½ç»ééï¼æå®éä¿¡æä½¿ç¨çç½ç»ééå·ï¼é常å¨å¤éééä¿¡ä¸è®¾ç½® |
| | | * 51 å° 54 æ¯ MELSECNET/H ç 1-4 éé |
| | | * 81 å° 84 æ¯ CC-Link ç 1-4 éé |
| | | * 151 å° 154 æ¯ CC-Link IE æ§å¶å¨ç½ç»ç 1-4 éé |
| | | * 181 å° 184 æ¯ CC-Link IE ç°åºç½ç»ç 1-4 éé |
| | | * 281 å° 284 æ¯ CC-Link IE TSN ç½ç»ç 1-4 éé |
| | | * ç½ç»ééï¼æå®éä¿¡æä½¿ç¨çç½ç»ééå·ï¼é常å¨å¤éééä¿¡ä¸è®¾ç½® |
| | | * 51 å° 54 æ¯ MELSECNET/H ç 1-4 éé |
| | | * 81 å° 84 æ¯ CC-Link ç 1-4 éé |
| | | * 151 å° 154 æ¯ CC-Link IE æ§å¶å¨ç½ç»ç 1-4 éé |
| | | * 181 å° 184 æ¯ CC-Link IE ç°åºç½ç»ç 1-4 éé |
| | | * 281 å° 284 æ¯ CC-Link IE TSN ç½ç»ç 1-4 éé |
| | | **/ |
| | | #define MELSECNET_CHANNEL(x) (50 + (x)) // x èå´ï¼1~4 |
| | | #define CC_LINK_CHANNEL(x) (80 + (x)) // x èå´ï¼1~4 |
| | | #define CC_LINK_IE_CONTROL_CHANNEL(x) (150 + (x)) // x èå´ï¼1~4 |
| | | #define CC_LINK_IE_FIELD_CHANNEL(x) (180 + (x)) // x èå´ï¼1~4 |
| | | #define CC_LINK_IE_TSN_CHANNEL(x) (280 + (x)) // x èå´ï¼1~4 |
| | | #define MELSECNET_CHANNEL(x) (50 + (x)) // x èå´ï¼1~4 |
| | | #define CC_LINK_CHANNEL(x) (80 + (x)) // x èå´ï¼1~4 |
| | | #define CC_LINK_IE_CONTROL_CHANNEL(x) (150 + (x)) // x èå´ï¼1~4 |
| | | #define CC_LINK_IE_FIELD_CHANNEL(x) (180 + (x)) // x èå´ï¼1~4 |
| | | #define CC_LINK_IE_TSN_CHANNEL(x) (280 + (x)) // x èå´ï¼1~4 |
| | | |
| | | // èªå®ä¹é误ç |
| | | #define ERROR_CODE_UNKNOWN 0x00010000 // æªç¥ |
| | | #define ERROR_CODE_NOT_CONNECTED 0x00020000 // æªè¿æ¥ |
| | | #define ERROR_CODE_INVALID_PARAM 0x00030000 // åæ°æ æ |
| | | #define ERROR_CODE_INVALID_DATA 0x00040000 // æ°æ®æ æ |
| | | #define ERROR_CODE_STATION_OUT_OF_RANGE 0x00050000 // ç«å·è¶
åºèå´ |
| | | #define ERROR_CODE_GROUP_OUT_OF_RANGE 0x00060000 // ç»å·è¶
åºèå´ |
| | | #define ERROR_CODE_NETWORK_OUT_OF_RANGE 0x00070000 // ç½ç»å·è¶
åºèå´ |
| | | // èªå®ä¹é误ç |
| | | #define ERROR_CODE_UNKNOWN 0x00010000 // δ֪ |
| | | #define ERROR_CODE_NOT_CONNECTED 0x00020000 // æªè¿æ¥ |
| | | #define ERROR_CODE_INVALID_PARAM 0x00030000 // åæ°æ æ |
| | | #define ERROR_CODE_INVALID_DATA 0x00040000 // æ°æ®æ æ |
| | | #define ERROR_CODE_STATION_OUT_OF_RANGE 0x00050000 // ç«å·è¶
åºèå´ |
| | | #define ERROR_CODE_GROUP_OUT_OF_RANGE 0x00060000 // ç»å·è¶
åºèå´ |
| | | #define ERROR_CODE_NETWORK_OUT_OF_RANGE 0x00070000 // ç½ç»å·è¶
åºèå´ |
| | | |
| | | // æ¿åç±»å |
| | | // æ¿åç±»å |
| | | enum class BoardType { |
| | | UNKNOWN = -1, // æªç¥ç±»å |
| | | UNKNOWN = -1, // æªç¥ç±»å |
| | | MELSECNET_H = MELSECNET_CHANNEL(1), // MELSECNET/H |
| | | CC_LINK_VER_2 = CC_LINK_CHANNEL(1), // CC-Link Ver. 2 |
| | | CC_LINK_IE_CONTROL = CC_LINK_IE_CONTROL_CHANNEL(1), // CC-Link IE æ§å¶ç½ç» |
| | | CC_LINK_IE_FIELD = CC_LINK_IE_FIELD_CHANNEL(1), // CC-Link IE ç°åºç½ç» |
| | | CC_LINK_IE_CONTROL = CC_LINK_IE_CONTROL_CHANNEL(1), // CC-Link IE æ§å¶ç½ç» |
| | | CC_LINK_IE_FIELD = CC_LINK_IE_FIELD_CHANNEL(1), // CC-Link IE ç°åºç½ç» |
| | | CC_LINK_IE_TSN = CC_LINK_IE_TSN_CHANNEL(1) // CC-Link IE TSN |
| | | }; |
| | | |
| | | // 软å
ä»¶ç±»åæä¸¾ |
| | | // 软å
ä»¶ç±»åæä¸¾ |
| | | enum class DeviceType { |
| | | /* |
| | | * ERãLXãLYãLBãLWãLSBãLSWåSPG软å
件齿¯èå´å |
| | | * ERï¼DevER0ï½256 |
| | | * LXï¼DevLX1ï½255ï¼DevLX(x) (DevX*1000+(x)) |
| | | * LYï¼DevLY1ï½255ï¼DevLY(x) (DevY*1000+(x)) |
| | | * LBï¼DevLB1ï½255ï¼DevLB(x) (DevB*1000+(x)) |
| | | * LWï¼DevLW1ï½255ï¼DevLW(x) (DevW*1000+(x)) |
| | | * LSBï¼DevLSB1ï½255ï¼DevLSB(x) (DevQSB*1000+(x)) |
| | | * LSWï¼DevLSW1ï½255ï¼DevLSW(x) (DevQSW*1000+(x)) |
| | | * SPGï¼DevSPG0ï½255ï¼DevSPG(x) (29*1000+(x)) |
| | | * æ©å±æä»¶å¯åå¨ä»£ç æå®(10è¿å¶æ°)çå3使°å软å
ä»¶åæå®çæ°å¼ä¸ï¼åºæå®åNo.(0ï½256) |
| | | * 龿¥ç´æ¥è½¯å
ä»¶ä»£ç æå®(10è¿å¶æ°)çå3使°å软å
ä»¶åæå®çæ°å¼ä¸ï¼åºæå®ç½ç»No.(1ï½255) |
| | | * æºè½åè½æ¨¡å软å
ä»¶ä»£ç æå®(10è¿å¶æ°)çå3使°å软å
ä»¶åæå®çæ°å¼ä¸ï¼åºæå®(èµ·å§I/ONo.÷16)çå¼ |
| | | * æ©å±æä»¶å¯åå¨å龿¥ç´æ¥è½¯å
ä»¶å¨éæºè¯»å(mdRandRãmdRandREx)彿°ä¸ï¼å³ä½¿æå®å®é
ä¸åå¨ç软å
件乿å¯è½æ£å¸¸ç»æ |
| | | * MAILåMAILMCå¨SENDåè½åRECVåè½ä¸ï¼ä¸è½¯å
件访é®ä¸æ ·ï¼æå®ååè½å¯¹åºç软å
ä»¶ç±»åï¼è¿è¡æ°æ®çåé(mdSendãmdSendEx)ææ°æ®ç读å(mdReceiveãmdReceiveEx) |
| | | * ERãLXãLYãLBãLWãLSBãLSWåSPG软å
件齿¯èå´å |
| | | * ERï¼DevER0ï½256 |
| | | * LXï¼DevLX1ï½255ï¼DevLX(x) (DevX*1000+(x)) |
| | | * LYï¼DevLY1ï½255ï¼DevLY(x) (DevY*1000+(x)) |
| | | * LBï¼DevLB1ï½255ï¼DevLB(x) (DevB*1000+(x)) |
| | | * LWï¼DevLW1ï½255ï¼DevLW(x) (DevW*1000+(x)) |
| | | * LSBï¼DevLSB1ï½255ï¼DevLSB(x) (DevQSB*1000+(x)) |
| | | * LSWï¼DevLSW1ï½255ï¼DevLSW(x) (DevQSW*1000+(x)) |
| | | * SPGï¼DevSPG0ï½255ï¼DevSPG(x) (29*1000+(x)) |
| | | * æ©å±æä»¶å¯åå¨ä»£ç æå®(10è¿å¶æ°)çå3使°å软å
ä»¶åæå®çæ°å¼ä¸ï¼åºæå®åNo.(0ï½256) |
| | | * 龿¥ç´æ¥è½¯å
ä»¶ä»£ç æå®(10è¿å¶æ°)çå3使°å软å
ä»¶åæå®çæ°å¼ä¸ï¼åºæå®ç½ç»No.(1ï½255) |
| | | * æºè½åè½æ¨¡å软å
ä»¶ä»£ç æå®(10è¿å¶æ°)çå3使°å软å
ä»¶åæå®çæ°å¼ä¸ï¼åºæå®(èµ·å§I/ONo.÷16)çå¼ |
| | | * æ©å±æä»¶å¯åå¨å龿¥ç´æ¥è½¯å
ä»¶å¨éæºè¯»å(mdRandRãmdRandREx)彿°ä¸ï¼å³ä½¿æå®å®é
ä¸åå¨ç软å
件乿å¯è½æ£å¸¸ç»æ |
| | | * MAILåMAILMCå¨SENDåè½åRECVåè½ä¸ï¼ä¸è½¯å
件访é®ä¸æ ·ï¼æå®ååè½å¯¹åºç软å
ä»¶ç±»åï¼è¿è¡æ°æ®çåé(mdSendãmdSendEx)ææ°æ®ç读å(mdReceiveãmdReceiveEx) |
| | | **/ |
| | | |
| | | X = 0x0001, // è¾å
¥ (ä½) |
| | | Y = 0x0002, // è¾åº (ä½) |
| | | L = 0x0003, // éåç»§çµå¨ (ä½) |
| | | M = 0x0004, // å
é¨ç»§çµå¨ (ä½) |
| | | SM = 0x0005, // ç¹æ®ç»§çµå¨ (ä½) |
| | | F = 0x0006, // æ¥è¦å¨ (ä½) |
| | | TT = 0x0007, // 宿¶å¨ (触ç¹) (ä½) |
| | | TC = 0x0008, // 计æ°å¨ (线å) (ä½) |
| | | CT = 0x0009, // 计æ°å¨ (触ç¹) (ä½) |
| | | CC = 0x000A, // 计æ°å¨ (线å) (å) |
| | | TN = 0x000B, // 宿¶å¨ (å½åå¼) (å) |
| | | CN = 0x000C, // 计æ°å¨ (å½åå¼) (å) |
| | | D = 0x000D, // æ°æ®å¯åå¨ (å) |
| | | SD = 0x000E, // ç¹æ®å¯åå¨ (å) |
| | | TM = 0x000F, // 宿¶å¨ (设置å¼ä¸») (å) |
| | | TS = 0x0010, // 宿¶å¨ (设置å¼ä¸»1) (å) |
| | | TS2 = 0x3E82, // 宿¶å¨ (设置å¼ä¸»2) (å) |
| | | TS3 = 0x3E83, // 宿¶å¨ (设置å¼ä¸»3) (å) |
| | | CM = 0x0011, // 计æ°å¨ (设置å¼ä¸») (å) |
| | | CS = 0x0012, // 计æ°å¨ (设置å¼ä¸»1) (å) |
| | | CS2 = 0x4652, // 计æ°å¨ (设置å¼ä¸»2) (å) |
| | | CS3 = 0x4653, // 计æ°å¨ (设置å¼ä¸»3) (å) |
| | | A = 0x0013, // ç´¯å å¨ (å) |
| | | Z = 0x0014, // ååå¯åå¨ (å) |
| | | V = 0x0015, // ååå¯åå¨ (å) |
| | | R = 0x0016, // æä»¶å¯åå¨ (å忢æ¹å¼) (å) |
| | | ER = 0x55F0, // æ©å±æä»¶å¯åå¨ (å忢æ¹å¼) (0x55F0ï½0x56F0) (å) (å¨éæºè¯»å(mdRandRãmdRandREx)彿°ä¸ï¼å³ä½¿æå®å®é
ä¸åå¨ç软å
件乿å¯è½æ£å¸¸ç»æã(è¯»åæ°æ®ä¸æ£ç¡®ã)) |
| | | ZR = 0x00DC, // æä»¶å¯åå¨ (è¿å·è®¿é®æ¹å¼) (å) |
| | | B = 0x0017, // 龿¥ç»§çµå¨ (ä½) |
| | | W = 0x0018, // 龿¥å¯åå¨ (å) |
| | | QSB = 0x0019, // 龿¥ç¹æ®ç»§çµå¨ (ä½) |
| | | STT = 0x001A, // ç´¯è®¡å®æ¶å¨ (触ç¹) (ä½) |
| | | STC = 0x001B, // ç´¯è®¡å®æ¶å¨ (线å) (ä½) |
| | | QSW = 0x001C, // 龿¥ç¹æ®å¯åå¨ (å) |
| | | QV = 0x001E, // ååç»§çµå¨ (ä½) |
| | | MRB = 0x0021, // éæºè®¿é®ç¼å² (å) |
| | | STN = 0x0023, // ç´¯è®¡å®æ¶å¨ (å½åå¼) (å) |
| | | LZ = 0x0026, // è¶
é¿ååå¯åå¨ (åå) |
| | | RD = 0x0027, // å·æ°æ°æ®å¯åå¨ (å) |
| | | LTT = 0x0029, // è¶
é¿å®æ¶å¨ (触ç¹) (ä½) |
| | | LTC = 0x002A, // è¶
é¿å®æ¶å¨ (线å) (ä½) |
| | | LTN = 0x002B, // è¶
é¿å®æ¶å¨ (å½åå¼) (åå) |
| | | LCT = 0x002C, // è¶
é¿è®¡æ°å¨ (触ç¹) (ä½) |
| | | LCC = 0x002D, // è¶
é¿è®¡æ°å¨ (线å) (ä½) |
| | | LCN = 0x002E, // è¶
é¿è®¡æ°å¨ (å½åå¼) (åå) |
| | | LSTT = 0x002F, // è¶
é¿ç´¯è®¡å®æ¶å¨ (触ç¹) (ä½) |
| | | LSTC = 0x0030, // è¶
é¿ç´¯è®¡å®æ¶å¨ (线å) (ä½) |
| | | LSTN = 0x0031, // è¶
é¿ç´¯è®¡å®æ¶å¨ (å½åå¼) (åå) |
| | | SPB = 0x0032, // ç¼å²åå¨å¨ (å) |
| | | MAIL = 0x0065, // ç¹æ®è½¯å
ä»¶ç±»åï¼é®ä»¶ç±»å (10è¿å¶ 101) |
| | | MAILMC = 0x0066, // ç¹æ®è½¯å
ä»¶ç±»åï¼æ 确认é®ä»¶ (10è¿å¶ 102) |
| | | LX = 0x03E8, // 龿¥ç´æ¥è½¯å
ä»¶ (龿¥è¾å
¥) (0x03E9ï½0x04E7) (ä½) |
| | | LY = 0x07D0, // 龿¥ç´æ¥è½¯å
ä»¶ (龿¥è¾åº) (0x07D1ï½0x08CF) (ä½) |
| | | LB = 0x59D8, // 龿¥ç´æ¥è½¯å
ä»¶ (龿¥ç»§çµå¨) (0x59D9ï½0x5AD7) (ä½) |
| | | LW = 0x5DC0, // 龿¥ç´æ¥è½¯å
ä»¶ (龿¥å¯åå¨) (0x5DC1ï½0x5EBF) (å) |
| | | LSB = 0x61A8, // 龿¥ç´æ¥è½¯å
ä»¶ (龿¥ç¹æ®ç»§çµå¨) (0x61A9ï½0x62A7) (ä½) |
| | | LSW = 0x6D60, // 龿¥ç´æ¥è½¯å
ä»¶ (龿¥ç¹æ®å¯åå¨) (0x6D61ï½0x6E5F) (å) |
| | | SPG = 0x7147, // æºè½åè½æ¨¡å软å
ä»¶ (0x7148ï½0x7247) (å) |
| | | X = 0x0001, // è¾å
¥ (ä½) |
| | | Y = 0x0002, // è¾åº (ä½) |
| | | L = 0x0003, // éåç»§çµå¨ (ä½) |
| | | M = 0x0004, // å
é¨ç»§çµå¨ (ä½) |
| | | SM = 0x0005, // ç¹æ®ç»§çµå¨ (ä½) |
| | | F = 0x0006, // æ¥è¦å¨ (ä½) |
| | | TT = 0x0007, // 宿¶å¨ (触ç¹) (ä½) |
| | | TC = 0x0008, // 计æ°å¨ (线å) (ä½) |
| | | CT = 0x0009, // 计æ°å¨ (触ç¹) (ä½) |
| | | CC = 0x000A, // 计æ°å¨ (线å) (å) |
| | | TN = 0x000B, // 宿¶å¨ (å½åå¼) (å) |
| | | CN = 0x000C, // 计æ°å¨ (å½åå¼) (å) |
| | | D = 0x000D, // æ°æ®å¯åå¨ (å) |
| | | SD = 0x000E, // ç¹æ®å¯åå¨ (å) |
| | | TM = 0x000F, // 宿¶å¨ (设置å¼ä¸») (å) |
| | | TS = 0x0010, // 宿¶å¨ (设置å¼ä¸»1) (å) |
| | | TS2 = 0x3E82, // 宿¶å¨ (设置å¼ä¸»2) (å) |
| | | TS3 = 0x3E83, // 宿¶å¨ (设置å¼ä¸»3) (å) |
| | | CM = 0x0011, // 计æ°å¨ (设置å¼ä¸») (å) |
| | | CS = 0x0012, // 计æ°å¨ (设置å¼ä¸»1) (å) |
| | | CS2 = 0x4652, // 计æ°å¨ (设置å¼ä¸»2) (å) |
| | | CS3 = 0x4653, // 计æ°å¨ (设置å¼ä¸»3) (å) |
| | | A = 0x0013, // ç´¯å å¨ (å) |
| | | Z = 0x0014, // ååå¯åå¨ (å) |
| | | V = 0x0015, // ååå¯åå¨ (å) |
| | | R = 0x0016, // æä»¶å¯åå¨ (å忢æ¹å¼) (å) |
| | | ER = 0x55F0, // æ©å±æä»¶å¯åå¨ (å忢æ¹å¼) (0x55F0ï½0x56F0) (å) (å¨éæºè¯»å(mdRandRãmdRandREx)彿°ä¸ï¼å³ä½¿æå®å®é
ä¸åå¨ç软å
件乿å¯è½æ£å¸¸ç»æã(è¯»åæ°æ®ä¸æ£ç¡®ã)) |
| | | ZR = 0x00DC, // æä»¶å¯åå¨ (è¿å·è®¿é®æ¹å¼) (å) |
| | | B = 0x0017, // 龿¥ç»§çµå¨ (ä½) |
| | | W = 0x0018, // 龿¥å¯åå¨ (å) |
| | | QSB = 0x0019, // 龿¥ç¹æ®ç»§çµå¨ (ä½) |
| | | STT = 0x001A, // ç´¯è®¡å®æ¶å¨ (触ç¹) (ä½) |
| | | STC = 0x001B, // ç´¯è®¡å®æ¶å¨ (线å) (ä½) |
| | | QSW = 0x001C, // 龿¥ç¹æ®å¯åå¨ (å) |
| | | QV = 0x001E, // ååç»§çµå¨ (ä½) |
| | | MRB = 0x0021, // éæºè®¿é®ç¼å² (å) |
| | | STN = 0x0023, // ç´¯è®¡å®æ¶å¨ (å½åå¼) (å) |
| | | LZ = 0x0026, // è¶
é¿ååå¯åå¨ (åå) |
| | | RD = 0x0027, // å·æ°æ°æ®å¯åå¨ (å) |
| | | LTT = 0x0029, // è¶
é¿å®æ¶å¨ (触ç¹) (ä½) |
| | | LTC = 0x002A, // è¶
é¿å®æ¶å¨ (线å) (ä½) |
| | | LTN = 0x002B, // è¶
é¿å®æ¶å¨ (å½åå¼) (åå) |
| | | LCT = 0x002C, // è¶
é¿è®¡æ°å¨ (触ç¹) (ä½) |
| | | LCC = 0x002D, // è¶
é¿è®¡æ°å¨ (线å) (ä½) |
| | | LCN = 0x002E, // è¶
é¿è®¡æ°å¨ (å½åå¼) (åå) |
| | | LSTT = 0x002F, // è¶
é¿ç´¯è®¡å®æ¶å¨ (触ç¹) (ä½) |
| | | LSTC = 0x0030, // è¶
é¿ç´¯è®¡å®æ¶å¨ (线å) (ä½) |
| | | LSTN = 0x0031, // è¶
é¿ç´¯è®¡å®æ¶å¨ (å½åå¼) (åå) |
| | | SPB = 0x0032, // ç¼å²åå¨å¨ (å) |
| | | MAIL = 0x0065, // ç¹æ®è½¯å
ä»¶ç±»åï¼é®ä»¶ç±»å (10è¿å¶ 101) |
| | | MAILMC = 0x0066, // ç¹æ®è½¯å
ä»¶ç±»åï¼æ 确认é®ä»¶ (10è¿å¶ 102) |
| | | LX = 0x03E8, // 龿¥ç´æ¥è½¯å
ä»¶ (龿¥è¾å
¥) (0x03E9ï½0x04E7) (ä½) |
| | | LY = 0x07D0, // 龿¥ç´æ¥è½¯å
ä»¶ (龿¥è¾åº) (0x07D1ï½0x08CF) (ä½) |
| | | LB = 0x59D8, // 龿¥ç´æ¥è½¯å
ä»¶ (龿¥ç»§çµå¨) (0x59D9ï½0x5AD7) (ä½) |
| | | LW = 0x5DC0, // 龿¥ç´æ¥è½¯å
ä»¶ (龿¥å¯åå¨) (0x5DC1ï½0x5EBF) (å) |
| | | LSB = 0x61A8, // 龿¥ç´æ¥è½¯å
ä»¶ (龿¥ç¹æ®ç»§çµå¨) (0x61A9ï½0x62A7) (ä½) |
| | | LSW = 0x6D60, // 龿¥ç´æ¥è½¯å
ä»¶ (龿¥ç¹æ®å¯åå¨) (0x6D61ï½0x6E5F) (å) |
| | | SPG = 0x7147, // æºè½åè½æ¨¡å软å
ä»¶ (0x7148ï½0x7247) (å) |
| | | }; |
| | | |
| | | // æ°æ®ç±»å |
| | | // æ°æ®ç±»å |
| | | enum class DataType { |
| | | BIT = 1, // ä½ (1ä½) |
| | | WORD = 2, // å (16ä½) |
| | | DWORD = 4 // åå (32ä½) |
| | | BIT = 1, // λ (1λ) |
| | | WORD = 2, // å (16ä½) |
| | | DWORD = 4 // åå (32ä½) |
| | | }; |
| | | |
| | | // æ§å¶ä»£ç |
| | | // æ§å¶ä»£ç |
| | | enum class ControlCode { |
| | | RUN = 0, // è¿ç¨ RUN |
| | | STOP = 1, // è¿ç¨ STOP |
| | | PAUSE = 2 // è¿ç¨ PAUSE |
| | | RUN = 0, // è¿ç¨ RUN |
| | | STOP = 1, // è¿ç¨ STOP |
| | | PAUSE = 2 // è¿ç¨ PAUSE |
| | | }; |
| | | |
| | | // çæ¬ä¿¡æ¯ |
| | | // çæ¬ä¿¡æ¯ |
| | | struct BoardVersion { |
| | | char fixedValue[2]; // åºå®å¼ |
| | | char checksum[2]; // æ ¡éªå |
| | | char swVersion[2]; // è½¯ä»¶çæ¬ |
| | | char date[6]; // æ¥æ (æ ¼å¼ YYMMDD) |
| | | uint32_t reserved; // ä¿çåºå (4 åè) |
| | | char swModel[16]; // 软件åå· |
| | | char hwModel[16]; // 硬件åå· |
| | | char twoPortMemory[2]; // 两端å£åå¨å¨å ç¨å®¹é |
| | | char twoPortAttribute[2]; // 两端å£å±æ§ |
| | | char availableBias[2]; // å¯ä½¿ç¨åç½® |
| | | char moduleType[10]; // æºåç±»å |
| | | char fixedValue[2]; // åºå®å¼ |
| | | char checksum[2]; // æ ¡éªå |
| | | char swVersion[2]; // è½¯ä»¶çæ¬ |
| | | char date[6]; // æ¥æ (æ ¼å¼ YYMMDD) |
| | | uint32_t reserved; // ä¿çåºå (4 åè) |
| | | char swModel[16]; // 软件åå· |
| | | char hwModel[16]; // 硬件åå· |
| | | char twoPortMemory[2]; // 两端å£åå¨å¨å ç¨å®¹é |
| | | char twoPortAttribute[2]; // 两端å£å±æ§ |
| | | char availableBias[2]; // å¯ä½¿ç¨åç½® |
| | | char moduleType[10]; // æºåç±»å |
| | | |
| | | // è¾åºç»æä½å
容为å符串 (便äºè°è¯) |
| | | // è¾åºç»æä½å
容为å符串 (便äºè°è¯) |
| | | std::string toString() const { |
| | | std::ostringstream oss; |
| | | oss << "Fixed Value: " << fixedValue[0] << fixedValue[1] << "\n" |
| | |
| | | } |
| | | }; |
| | | |
| | | // ç«ç¹æ è¯ç¬¦ï¼é»è®¤ä½¿ç¨æ¬ç« |
| | | // ç«ç¹æ è¯ç¬¦ï¼é»è®¤ä½¿ç¨æ¬ç« |
| | | struct StationIdentifier { |
| | | /* |
| | | * [Network No.] |
| | | * 0 表示æ¬ç« |
| | | * 1~239 表示æ®éç½ç»å· |
| | | * 0 表示æ¬ç« |
| | | * 1~239 表示æ®éç½ç»å· |
| | | **/ |
| | | |
| | | /* |
| | | * [Station No.] |
| | | * MELSECNET/Hï¼1~64 表示å
¶ä»ç«ç¹ï¼255 表示æ¬ç« |
| | | * CC-Link ç³»åç½ç»çèå´ç±»ä¼¼ï¼åºå«å¨äºç«å·çåå¼èå´ |
| | | * MELSECNET/Hï¼1~64 表示å
¶ä»ç«ç¹ï¼255 表示æ¬ç« |
| | | * CC-Link ç³»åç½ç»çèå´ç±»ä¼¼ï¼åºå«å¨äºç«å·çåå¼èå´ |
| | | * MELSECNET/H : 1~64(Other stations),255(Own station) |
| | | * CC-Link : 0~63(Other stations),255(Own station) |
| | | * CC-Link IE Controller : 1~120(Other stations),255(Own station) |
| | |
| | | **/ |
| | | |
| | | /* |
| | | * é« 8 ä½ï¼ç½ç»å·ï¼ï¼ æå®è®¾å¤æå±çç½ç» |
| | | * ä½ 8 ä½ï¼ç«ç¹å·ï¼ï¼ æå®è®¾å¤å¨ç½ç»ä¸çç¼å· |
| | | * ç¨ä¸ä¸ªåæ°ä¼ é设å¤çç½ç»å·åç«ç¹å·æ¶: nSt = station.nStNo | ((station.nNetNo << 8) & 0xFF00); |
| | | * é« 8 ä½ï¼ç½ç»å·ï¼ï¼ æå®è®¾å¤æå±çç½ç» |
| | | * ä½ 8 ä½ï¼ç«ç¹å·ï¼ï¼ æå®è®¾å¤å¨ç½ç»ä¸çç¼å· |
| | | * ç¨ä¸ä¸ªåæ°ä¼ é设å¤çç½ç»å·åç«ç¹å·æ¶: nSt = station.nStNo | ((station.nNetNo << 8) & 0xFF00); |
| | | **/ |
| | | |
| | | short nNetNo = 0; // ç½ç»ç¼å·ï¼PLCæè¿æ¥çç½ç»ç¼å·ï¼0表示é»è®¤ç½ç» |
| | | short nStNo = 255; // ç«ç¹ç¼å·ï¼æå®ä¸PLCè¿æ¥çç«ç¹ç¼å·ï¼255éå¸¸è¡¨ç¤ºå¹¿ææææç«ç¹ |
| | | short nNetNo = 0; // ç½ç»ç¼å·ï¼PLCæè¿æ¥çç½ç»ç¼å·ï¼0表示é»è®¤ç½ç» |
| | | short nStNo = 255; // ç«ç¹ç¼å·ï¼æå®ä¸PLCè¿æ¥çç«ç¹ç¼å·ï¼255éå¸¸è¡¨ç¤ºå¹¿ææææç«ç¹ |
| | | |
| | | // èªå®ä¹æé 彿°ï¼è¦çé»è®¤å¼ |
| | | // èªå®ä¹æé 彿°ï¼è¦çé»è®¤å¼ |
| | | explicit StationIdentifier(const short net, const short st) : nNetNo(net), nStNo(st) {} |
| | | |
| | | StationIdentifier() |
| | |
| | | nStNo = 255; |
| | | } |
| | | |
| | | // å°âç½ç»å·âåâç«ç¹å·âç»åæä¸ä¸ªæç»ç¼ç |
| | | // å°âç½ç»å·âåâç«ç¹å·âç»åæä¸ä¸ªæç»ç¼ç |
| | | short StationIdentifier::toNetworkStationCode() const { |
| | | return static_cast<short>(nStNo | ((nNetNo << 8) & 0xFF00)); |
| | | } |
| | | |
| | | // éè½½ < è¿ç®ç¬¦ï¼ç¨äºæåºææ¯è¾ï¼é常ç¨äº map æ set ä¸ä½ä¸º keyï¼ |
| | | // éè½½ < è¿ç®ç¬¦ï¼ç¨äºæåºææ¯è¾ï¼é常ç¨äº map æ set ä¸ä½ä¸º keyï¼ |
| | | bool operator<(const StationIdentifier& other) const { |
| | | return std::tie(nNetNo, nStNo) < |
| | | std::tie(other.nNetNo, other.nStNo); |
| | | } |
| | | |
| | | // éè½½ == è¿ç®ç¬¦ï¼ç¨äºç¸çæ¯è¾ï¼ |
| | | // éè½½ == è¿ç®ç¬¦ï¼ç¨äºç¸çæ¯è¾ï¼ |
| | | bool operator==(const StationIdentifier& other) const { |
| | | return std::tie(nNetNo, nStNo) == |
| | | std::tie(other.nNetNo, other.nStNo); |
| | | } |
| | | |
| | | // éè½½ = è¿ç®ç¬¦ï¼ç¨äºèµå¼ï¼ |
| | | // éè½½ = è¿ç®ç¬¦ï¼ç¨äºèµå¼ï¼ |
| | | StationIdentifier& operator=(const StationIdentifier& other) { |
| | | if (this != &other) { |
| | | nNetNo = other.nNetNo; |
| | |
| | | } |
| | | }; |
| | | |
| | | // æ¿ç¶æ |
| | | // æ¿ç¶æ |
| | | struct BoardStatus { |
| | | short nStationValue = 0; // ç«å·ç设å¤å¼ (buf[0]) |
| | | short nGroupValue = 0; // ç» No. ç设å¤å¼ (buf[1]) |
| | | short nNetworkValue = 0; // ç½ç» No. ç设å¤å¼ (buf[2]) |
| | | short nReserved1 = 0; // ä¿çåæ®µ (buf[3]) |
| | | short nReserved2 = 0; // ä¿çåæ®µ (buf[4]) |
| | | short nReserved3 = 0; // ä¿çåæ®µ (buf[5]) |
| | | short nStationValue = 0; // ç«å·ç设å¤å¼ (buf[0]) |
| | | short nGroupValue = 0; // ç» No. ç设å¤å¼ (buf[1]) |
| | | short nNetworkValue = 0; // ç½ç» No. ç设å¤å¼ (buf[2]) |
| | | short nReserved1 = 0; // ä¿çåæ®µ (buf[3]) |
| | | short nReserved2 = 0; // ä¿çåæ®µ (buf[4]) |
| | | short nReserved3 = 0; // ä¿çåæ®µ (buf[5]) |
| | | |
| | | // å°æ°ç»æ å°å°ç»æä½ |
| | | // å°æ°ç»æ å°å°ç»æä½ |
| | | static BoardStatus fromBuffer(const short buf[6]) { |
| | | return { |
| | | buf[0], |
| | |
| | | }; |
| | | } |
| | | |
| | | // å°ç»æä½å
容æ å°å°æ°ç» |
| | | // å°ç»æä½å
容æ å°å°æ°ç» |
| | | void toBuffer(short buf[6]) const { |
| | | buf[0] = nStationValue; |
| | | buf[1] = nGroupValue; |
| | |
| | | buf[5] = nReserved3; |
| | | } |
| | | |
| | | // è°è¯è¾åº |
| | | // è°è¯è¾åº |
| | | std::string toString() const { |
| | | std::ostringstream oss; |
| | | oss << "Station Value: " << nStationValue << "\n" |
| | |
| | | } |
| | | }; |
| | | |
| | | // äºä»¶è¯¦æ
|
| | | // äºä»¶è¯¦æ
|
| | | struct EventDetails { |
| | | short nEventNo; // åççäºä»¶å· |
| | | std::array<short, 4> details; // åå¨äºä»¶è¯¦æ
ä¿¡æ¯ |
| | | short nEventNo; // åççäºä»¶å· |
| | | std::array<short, 4> details; // åå¨äºä»¶è¯¦æ
ä¿¡æ¯ |
| | | |
| | | // è§£æäºä»¶è¯¦æ
ï¼è¿åæ ¼å¼åå符串 |
| | | // è§£æäºä»¶è¯¦æ
ï¼è¿åæ ¼å¼åå符串 |
| | | std::string toString() const { |
| | | std::ostringstream oss; |
| | | oss << "Details[0]: " << details[0] << ", " |
| | |
| | | } |
| | | }; |
| | | |
| | | // SoftElement ç»æä½å®ä¹ |
| | | // SoftElement ç»æä½å®ä¹ |
| | | struct SoftElement { |
| | | short nType; // 软å
ä»¶ç±»å |
| | | short nElementCount; // ç¹æ° |
| | | long nStartNo; // èµ·å§è½¯å
ä»¶ç¼å· |
| | | short nType; // 软å
ä»¶ç±»å |
| | | short nElementCount; // ç¹æ° |
| | | long nStartNo; // èµ·å§è½¯å
ä»¶ç¼å· |
| | | }; |
| | | |
| | | // éè¯¯ä¿¡æ¯ |
| | | // éè¯¯ä¿¡æ¯ |
| | | struct ErrorInfo { |
| | | int nErrorCode = 0; // é误ç |
| | | std::string strErrorMessageCn; // 䏿æè¿° |
| | | std::string strErrorMessageEn; // è±ææè¿° |
| | | int nErrorCode = 0; // é误ç |
| | | std::string strErrorMessageCn; // 䏿æè¿° |
| | | std::string strErrorMessageEn; // è±ææè¿° |
| | | |
| | | // å°ç»æä½åºåå为å符串 |
| | | // å°ç»æä½åºåå为å符串 |
| | | std::string toString() const { |
| | | std::ostringstream oss; |
| | | oss << nErrorCode << "|" << strErrorMessageCn << "|" << strErrorMessageEn; |
| | | return oss.str(); |
| | | } |
| | | |
| | | // ä»å符串ååºååä¸ºç»æä½ |
| | | // ä»å符串ååºååä¸ºç»æä½ |
| | | static ErrorInfo fromString(const std::string& line) { |
| | | ErrorInfo info; |
| | | std::istringstream iss(line); |
| | | std::string token; |
| | | |
| | | // 使ç¨åé符 "|" è§£æå符串 |
| | | // 使ç¨åé符 "|" è§£æå符串 |
| | | std::getline(iss, token, '|'); |
| | | info.nErrorCode = std::stoi(token); |
| | | |
| | |
| | | } |
| | | }; |
| | | |
| | | using BitContainer = std::vector<bool>; // æ¯ä¸ªå
ç´ åå¨ 1 ä½ |
| | | using WordContainer = std::vector<uint16_t>; // æ¯ä¸ªå
ç´ åå¨ 16 ä½ |
| | | using DWordContainer = std::vector<uint32_t>; // æ¯ä¸ªå
ç´ åå¨ 32 ä½ |
| | | using BitContainer = std::vector<bool>; // æ¯ä¸ªå
ç´ åå¨ 1 ä½ |
| | | using WordContainer = std::vector<uint16_t>; // æ¯ä¸ªå
ç´ åå¨ 16 ä½ |
| | | using DWordContainer = std::vector<uint32_t>; // æ¯ä¸ªå
ç´ åå¨ 32 ä½ |
| | | |
| | | // CPerformanceMelsec 类声æ |
| | | // CPerformanceMelsec 类声æ |
| | | class CPerformanceMelsec { |
| | | public: |
| | | // è·åæè¿çéè¯¯ä¿¡æ¯ |
| | | // è·åæè¿çéè¯¯ä¿¡æ¯ |
| | | std::string GetLastError() const; |
| | | |
| | | // é误信æ¯å è½½ä¸ä¿åæ¥å£ |
| | | static bool LoadErrorInfoFromFile(const std::string& filename); // 仿件å è½½éè¯¯ä¿¡æ¯ |
| | | static bool SaveErrorInfoToFile(const std::string& filename); // ä¿åé误信æ¯å°æä»¶ |
| | | // é误信æ¯å è½½ä¸ä¿åæ¥å£ |
| | | static bool LoadErrorInfoFromFile(const std::string& filename); // 仿件å è½½éè¯¯ä¿¡æ¯ |
| | | static bool SaveErrorInfoToFile(const std::string& filename); // ä¿åé误信æ¯å°æä»¶ |
| | | |
| | | // è¿æ¥/æå¼ |
| | | // è¿æ¥/æå¼ |
| | | int Connect(short nChannel, short nMode = -1); |
| | | int Disconnect(); |
| | | |
| | | // åå§åå¯ç¼ç¨æ§å¶å¨è½¯å
ä»¶ä¿¡æ¯è¡¨ |
| | | // åå§åå¯ç¼ç¨æ§å¶å¨è½¯å
ä»¶ä¿¡æ¯è¡¨ |
| | | int InitializeController(); |
| | | |
| | | // è·åçæ¬ä¿¡æ¯ |
| | | // è·åçæ¬ä¿¡æ¯ |
| | | int GetBoardVersion(BoardVersion& version); |
| | | |
| | | // æ¿å¤ä½ |
| | | // æ¿å¤ä½ |
| | | int BoardReset(); |
| | | |
| | | // æ¿LED读å |
| | | // æ¿LED读å |
| | | int ReadBoardLed(std::vector<short>& vecLedBuffer); |
| | | |
| | | // 读åç®æ ç«ç¹CPUç±»å |
| | | // 读åç®æ ç«ç¹CPUç±»å |
| | | int ReadCPUCode(const StationIdentifier& station, short& nCPUCode); |
| | | |
| | | // æ¿æ¨¡å¼è·å/设置 |
| | | // æ¿æ¨¡å¼è·å/设置 |
| | | int SetBoardMode(short nMode); |
| | | int GetBoardMode(short& nMode); |
| | | |
| | | // è·åæ¿ç¶æ |
| | | // è·åæ¿ç¶æ |
| | | int GetBoardStatus(BoardStatus& status); |
| | | |
| | | // è¯»åæ°æ® |
| | | // è¯»åæ°æ® |
| | | int ReadData(const StationIdentifier& station, short nDevType, short nDevNo, short nSize, std::vector<short>& vecData); |
| | | int ReadBitData(const StationIdentifier& station, DeviceType enDevType, short nDevNo, short nBitCount, BitContainer& vecData); |
| | | int ReadWordData(const StationIdentifier& station, DeviceType enDevType, short nDevNo, short nWordCount, WordContainer& vecData); |
| | |
| | | int WriteWordData(const StationIdentifier& station, DeviceType enDevType, short nDevNo, const WordContainer& vecData); |
| | | int WriteDWordData(const StationIdentifier& station, DeviceType enDevType, short nDevNo, const DWordContainer& vecData); |
| | | |
| | | // æ©å±è¯»åæ°æ® |
| | | // æ©å±è¯»åæ°æ® |
| | | long ReadDataEx(const StationIdentifier& station, long nDevType, long nDevNo, long nSize, std::vector<char>& vecData); |
| | | long WriteDataEx(const StationIdentifier& station, long nDevType, long nDevNo, const std::vector<char>& vecData); |
| | | |
| | | // æ©å±è½¯å
ä»¶éæºè¯»åï¼æ¯æå¤ä¸ªè½¯å
ä»¶ï¼ |
| | | // æ©å±è½¯å
ä»¶éæºè¯»åï¼æ¯æå¤ä¸ªè½¯å
ä»¶ï¼ |
| | | long ReadRandomDataEx(const StationIdentifier& station, const std::vector<SoftElement>& vecSoftElements, std::vector<char>& vecData); |
| | | long WriteRandomDataEx(const StationIdentifier& station, const std::vector<SoftElement>& vecSoftElements, const std::vector<char>& vecData); |
| | | |
| | | // è¿ç¨è®¾å¤ç«/è¿ç¨ç«çç¼å²åå¨å¨è¯»å |
| | | // è¿ç¨è®¾å¤ç«/è¿ç¨ç«çç¼å²åå¨å¨è¯»å |
| | | long ReadRemoteBuffer(const StationIdentifier& station, long nOffset, long nSize, std::vector<char>& vecData); |
| | | long WriteRemoteBuffer(const StationIdentifier& station, long nOffset, const std::vector<char>& vecData); |
| | | long ReadRemoteBufferByIp(const std::string& strIP, long nOffset, long nSize, std::vector<char>& vecData); |
| | | long WriteRemoteBufferByIp(const std::string& strIP, long nOffset, const std::vector<char>& vecData); |
| | | |
| | | // 设置/å¤ä½å¯¹è±¡ç«çæå®ä½è½¯å
ä»¶ |
| | | // 设置/å¤ä½å¯¹è±¡ç«çæå®ä½è½¯å
ä»¶ |
| | | int SetBitDevice(const StationIdentifier& station, DeviceType enDevType, short nDevNo); |
| | | int ResetBitDevice(const StationIdentifier& station, DeviceType enDevType, short enDevNo); |
| | | |
| | | // æ©å±è®¾ç½®/å¤ä½å¯¹è±¡ç«çæå®ä½è½¯å
ä»¶ |
| | | // æ©å±è®¾ç½®/å¤ä½å¯¹è±¡ç«çæå®ä½è½¯å
ä»¶ |
| | | long SetBitDeviceEx(const StationIdentifier& station, long nDevType, long nDevNo); |
| | | long ResetBitDeviceEx(const StationIdentifier& station, long nDevType, long nDevNo); |
| | | |
| | | // æ§è¡å¯¹è±¡ç«çCPU |
| | | // æ§è¡å¯¹è±¡ç«çCPU |
| | | int ControlCPU(const StationIdentifier& station, ControlCode enControlCode); |
| | | |
| | | // äºä»¶çå¾
ï¼vecEventNumbers[0, 64]ï¼nTimeoutMs[-1, 2147483647] |
| | | // åæ¶åçäºå¤ä¸ªäºä»¶çæ
åµä¸ï¼é¦å
æ£æµåºå
¶ä¸ä¸ä¸ªäºä»¶ã 忬¡æ§è¡äºæ¬å½æ°çæ
åµä¸æ£æµåºå
¶å®äºä»¶ã |
| | | // äºä»¶çå¾
ï¼vecEventNumbers[0, 64]ï¼nTimeoutMs[-1, 2147483647] |
| | | // åæ¶åçäºå¤ä¸ªäºä»¶çæ
åµä¸ï¼é¦å
æ£æµåºå
¶ä¸ä¸ä¸ªäºä»¶ã 忬¡æ§è¡äºæ¬å½æ°çæ
åµä¸æ£æµåºå
¶å®äºä»¶ã |
| | | int WaitForBoardEvent(std::vector<short> vecEventNumbers, int nTimeoutMs, EventDetails& details); |
| | | |
| | | private: |
| | | // éå®ä¸è§£éï¼å¤çº¿ç¨åæ¥ä¿æ¤ï¼ |
| | | // éå®ä¸è§£éï¼å¤çº¿ç¨åæ¥ä¿æ¤ï¼ |
| | | void Lock() { m_mtx.lock(); } |
| | | void Unlock() { m_mtx.unlock(); } |
| | | |
| | | protected: |
| | | // æé 彿°/ææå½æ° |
| | | // æé 彿°/ææå½æ° |
| | | explicit CPerformanceMelsec(BoardType enBoardType); |
| | | virtual ~CPerformanceMelsec(); |
| | | |
| | | // è¾
å©å½æ° |
| | | void UpdateLastError(int nCode); // æ´æ°æè¿çéè¯¯ä¿¡æ¯ |
| | | int ValidateStation(const StationIdentifier& station) const; // æ£æ¥è¿æ¥ç¶æåç«ç¹åæ°æææ§ |
| | | // è¾
å©å½æ° |
| | | void UpdateLastError(int nCode); // æ´æ°æè¿çéè¯¯ä¿¡æ¯ |
| | | int ValidateStation(const StationIdentifier& station) const; // æ£æ¥è¿æ¥ç¶æåç«ç¹åæ°æææ§ |
| | | int ValidateStationAndSize(const StationIdentifier& station, short nCount) const; |
| | | |
| | | // éæè¾
å©å½æ° |
| | | static void Delay(unsigned int nDelayMs); // å»¶æ¶ï¼å¹¶ä¸è½¬åçªå£æ¶æ¯ |
| | | static BoardType FindBoardTypeByChannel(int nChannel); // æ¥æ¾æ¿åç±»å |
| | | static short CombineStation(const StationIdentifier& station); // åå¹¶ç½ç»å·åç«ç¹å· |
| | | static short CalculateDeviceType(const StationIdentifier& station, DeviceType enDevType); // 计ç®è½¯å
ä»¶ç±»å |
| | | // éæè¾
å©å½æ° |
| | | static void Delay(unsigned int nDelayMs); // å»¶æ¶ï¼å¹¶ä¸è½¬åçªå£æ¶æ¯ |
| | | static BoardType FindBoardTypeByChannel(int nChannel); // æ¥æ¾æ¿åç±»å |
| | | static short CombineStation(const StationIdentifier& station); // åå¹¶ç½ç»å·åç«ç¹å· |
| | | static short CalculateDeviceType(const StationIdentifier& station, DeviceType enDevType); // 计ç®è½¯å
ä»¶ç±»å |
| | | |
| | | // IPè½¬æ¢ |
| | | // IPè½¬æ¢ |
| | | static bool ConvertIpStringToUint32(const std::string& strIP, uint32_t& nIP); |
| | | |
| | | // 容å¨è½¬æ¢ |
| | | // 容å¨è½¬æ¢ |
| | | static void ConvertCharToShort(const std::vector<char>& vecChar, std::vector<short>& vecShort); |
| | | static void ConvertShortToChar(const std::vector<short>& vecShort, std::vector<char>& vecChar); |
| | | static void ConvertUint8ToShort(const std::vector<uint8_t>& vecUint8, std::vector<short>& vecShort); |
| | |
| | | static void ConvertUint32ToShort(const std::vector<uint32_t>& vecUint32, std::vector<short>& vecShort); |
| | | static void ConvertShortToUint32(const std::vector<short>& vecShort, std::vector<uint32_t>& vecUint32); |
| | | |
| | | // 模æ¿è¾
å©å½æ° |
| | | // 模æ¿è¾
å©å½æ° |
| | | template <typename T> |
| | | int ValidateStationAndData(const StationIdentifier& station, const std::vector<T>& vecData); |
| | | |
| | |
| | | template <typename T, typename U> |
| | | void ConvertHighToLow(const std::vector<T>& vecHigh, std::vector<U>& vecLow); |
| | | |
| | | // æååé |
| | | std::mutex m_mtx; // äºæ¥éä¿æ¤ |
| | | BoardType m_enBoardType; // æ¿åç±»å |
| | | long m_nPath; // éä¿¡è·¯å¾ |
| | | std::atomic<bool> m_bConnected; // æ¯å¦å·²è¿æ¥ |
| | | std::string m_strLastError; // æè¿ä¸æ¬¡éè¯¯ä¿¡æ¯ |
| | | // æååé |
| | | std::mutex m_mtx; // äºæ¥éä¿æ¤ |
| | | BoardType m_enBoardType; // æ¿åç±»å |
| | | long m_nPath; // éä¿¡è·¯å¾ |
| | | std::atomic<bool> m_bConnected; // æ¯å¦å·²è¿æ¥ |
| | | std::string m_strLastError; // æè¿ä¸æ¬¡éè¯¯ä¿¡æ¯ |
| | | |
| | | // éææååé |
| | | static std::unordered_map<int, std::string> m_mapError; // éè¯¯ç æ å°è¡¨ |
| | | // éææååé |
| | | static std::unordered_map<int, std::string> m_mapError; // éè¯¯ç æ å°è¡¨ |
| | | }; |
| | | |
| | | #endif // PERFORMANCE_MELSEC_H |
| | |
| | | |
| | | |
| | | namespace SERVO { |
| | | CEqAlarmStep::CEqAlarmStep() : CStep() |
| | | CEqAlarmStep::CEqAlarmStep() : CReadStep() |
| | | { |
| | | m_nAlarmDev = 0; |
| | | m_nAlarmState = 0; |
| | |
| | | { |
| | | |
| | | } |
| | | |
| | | void CEqAlarmStep::getAttributeVector(CAttributeVector& attrubutes) |
| | | { |
| | | CReadStep::getAttributeVector(attrubutes); |
| | | |
| | | attrubutes.addAttribute(new CAttribute("Alarm State", |
| | | std::to_string(m_nAlarmState).c_str(), "")); |
| | | attrubutes.addAttribute(new CAttribute("Unit ID", |
| | | std::to_string(m_nUnitId).c_str(), "")); |
| | | attrubutes.addAttribute(new CAttribute("Alarm Level", |
| | | std::to_string(m_nAlarmLevel).c_str(), "")); |
| | | attrubutes.addAttribute(new CAttribute("Alarm Code", |
| | | std::to_string(m_nAlarmCode).c_str(), "")); |
| | | attrubutes.addAttribute(new CAttribute("Alarm ID", |
| | | std::to_string(m_nAlarmId).c_str(), "")); |
| | | attrubutes.addAttribute(new CAttribute("Text", |
| | | m_strText.c_str(), "")); |
| | | attrubutes.addAttribute(new CAttribute("Description", |
| | | m_strDescription.c_str(), "")); |
| | | } |
| | | |
| | | int CEqAlarmStep::onReadData() |
| | | { |
| | | CStep::onReadData(); |
| | | CReadStep::onReadData(); |
| | | |
| | | char szBuffer[64]; |
| | | int nRet = m_pCclink->ReadData2(m_station, DeviceType::W, |
| | |
| | | |
| | | int CEqAlarmStep::onComplete() |
| | | { |
| | | CStep::onComplete(); |
| | | CReadStep::onComplete(); |
| | | LOGI("<CEqAlarmStep> onComplete."); |
| | | |
| | | return 0; |
| | |
| | | |
| | | int CEqAlarmStep::onTimeout() |
| | | { |
| | | CStep::onTimeout(); |
| | | CReadStep::onTimeout(); |
| | | LOGI("<CEqAlarmStep> onTimeout."); |
| | | |
| | | return 0; |
| | |
| | | m_strText = strText; |
| | | } |
| | | |
| | | // è·åå设置 Description |
| | | std::string CEqAlarmStep::getDescription() const { |
| | | return m_strDescription; |
| | | int CEqAlarmStep::getAlarmState() |
| | | { |
| | | return m_nAlarmState; |
| | | } |
| | | |
| | | void CEqAlarmStep::setDescription(const std::string& strDescription) { |
| | | m_strDescription = strDescription; |
| | | int CEqAlarmStep::getUnitId() |
| | | { |
| | | return m_nUnitId; |
| | | } |
| | | |
| | | int CEqAlarmStep::getAlarmLevel() |
| | | { |
| | | return m_nAlarmLevel; |
| | | } |
| | | |
| | | int CEqAlarmStep::getAlarmCode() |
| | | { |
| | | return m_nAlarmCode; |
| | | } |
| | | |
| | | int CEqAlarmStep::getAlarmId() |
| | | { |
| | | return m_nAlarmId; |
| | | } |
| | | } |
| | |
| | | #pragma once |
| | | #include "CStep.h" |
| | | #include "CReadStep.h" |
| | | |
| | | |
| | | namespace SERVO { |
| | | class CEqAlarmStep : public CStep |
| | | class CEqAlarmStep : public CReadStep |
| | | { |
| | | public: |
| | | CEqAlarmStep(); |
| | | ~CEqAlarmStep(); |
| | | |
| | | public: |
| | | virtual void getAttributeVector(CAttributeVector& attrubutes); |
| | | virtual int onReadData(); |
| | | virtual int onComplete(); |
| | | virtual int onTimeout(); |
| | | |
| | | // Getter å Setter 声æ |
| | | int getAlarmDev() const; |
| | | void setAlarmDev(int nAlarmDev); |
| | | |
| | | int getAlarmState() const; |
| | | void setAlarmState(int nAlarmState); |
| | | |
| | | int getUnitId() const; |
| | | void setUnitId(int nUnitId); |
| | | |
| | | int getAlarmLevel() const; |
| | | void setAlarmLevel(int nAlarmLevel); |
| | | |
| | | int getAlarmCode() const; |
| | | void setAlarmCode(int nAlarmCode); |
| | | |
| | | int getAlarmId() const; |
| | | void setAlarmId(int nAlarmId); |
| | | |
| | | std::string getText() const; |
| | | void setText(const std::string& strText); |
| | | |
| | | std::string getDescription() const; |
| | | void setDescription(const std::string& strDescription); |
| | | |
| | | void setAlarmDev(int nDev); |
| | | int getAlarmState(); |
| | | int getUnitId(); |
| | | int getAlarmLevel(); |
| | | int getAlarmCode(); |
| | | int getAlarmId(); |
| | | |
| | | private: |
| | | int m_nAlarmDev; |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | #include "stdafx.h" |
| | | #include "CEqCimModeChangeStep.h" |
| | | |
| | | |
| | | namespace SERVO { |
| | | CEqCimModeChangeStep::CEqCimModeChangeStep() : CWriteStep() |
| | | { |
| | | m_nCimModeDev = 0; |
| | | } |
| | | |
| | | CEqCimModeChangeStep::~CEqCimModeChangeStep() |
| | | { |
| | | |
| | | } |
| | | |
| | | void CEqCimModeChangeStep::setCimModeDev(int nDev) |
| | | { |
| | | m_nCimModeDev = nDev; |
| | | } |
| | | |
| | | int CEqCimModeChangeStep::cimOn() |
| | | { |
| | | short mode = 1; |
| | | return writeData(m_nCimModeDev, (const char*)&mode, sizeof(short)); |
| | | } |
| | | |
| | | int CEqCimModeChangeStep::cimOff() |
| | | { |
| | | short mode = 2; |
| | | return writeData(m_nCimModeDev, (const char*)&mode, sizeof(short)); |
| | | } |
| | | |
| | | int CEqCimModeChangeStep::setCimMode(short mode) |
| | | { |
| | | return writeData(m_nCimModeDev, (const char*)&mode, sizeof(short)); |
| | | } |
| | | |
| | | void CEqCimModeChangeStep::getAttributeVector(CAttributeVector& attrubutes) |
| | | { |
| | | CWriteStep::getAttributeVector(attrubutes); |
| | | |
| | | attrubutes.addAttribute(new CAttribute("Cim Mode Dev", |
| | | std::to_string(m_nCimModeDev).c_str(), "")); |
| | | } |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | #pragma once |
| | | #include "CWriteStep.h" |
| | | |
| | | |
| | | namespace SERVO { |
| | | class CEqCimModeChangeStep : public CWriteStep |
| | | { |
| | | public: |
| | | CEqCimModeChangeStep(); |
| | | ~CEqCimModeChangeStep(); |
| | | |
| | | public: |
| | | void setCimModeDev(int nDev); |
| | | int cimOn(); |
| | | int cimOff(); |
| | | int setCimMode(short mode); |
| | | void getAttributeVector(CAttributeVector& attrubutes); |
| | | |
| | | private: |
| | | int m_nCimModeDev; |
| | | }; |
| | | } |
| | | |
| | |
| | | |
| | | |
| | | namespace SERVO { |
| | | CEqModeStep::CEqModeStep() : CStep() |
| | | CEqModeStep::CEqModeStep() : CReadStep() |
| | | { |
| | | m_nModeDev = 0; |
| | | m_nMode = 0; |
| | |
| | | |
| | | } |
| | | |
| | | void CEqModeStep::getAttributeVector(CAttributeVector& attrubutes) |
| | | { |
| | | CReadStep::getAttributeVector(attrubutes); |
| | | |
| | | std::string strTemp; |
| | | attrubutes.addAttribute(new CAttribute("Mode", |
| | | std::to_string(m_nMode).c_str(), getModeDescription(strTemp).c_str())); |
| | | attrubutes.addAttribute(new CAttribute("Mode Dev", |
| | | std::to_string(m_nModeDev).c_str(), "")); |
| | | } |
| | | |
| | | int CEqModeStep::onReadData() |
| | | { |
| | | CStep::onReadData(); |
| | | CReadStep::onReadData(); |
| | | |
| | | DWordContainer dc; |
| | | if (0 != m_pCclink->ReadDWordData(m_station, DeviceType::W, m_nModeDev, 1, dc)) { |
| | |
| | | |
| | | int CEqModeStep::onComplete() |
| | | { |
| | | CStep::onComplete(); |
| | | CReadStep::onComplete(); |
| | | LOGI("<CEqModeStep> onComplete."); |
| | | |
| | | return 0; |
| | |
| | | |
| | | int CEqModeStep::onTimeout() |
| | | { |
| | | CStep::onTimeout(); |
| | | CReadStep::onTimeout(); |
| | | LOGI("<CEqModeStep> onTimeout."); |
| | | |
| | | return 0; |
| | |
| | | m_nModeDev = nDev; |
| | | } |
| | | |
| | | int CEqModeStep::getMode() |
| | | { |
| | | return m_nMode; |
| | | } |
| | | |
| | | /* |
| | | 0: No Equipment Mode exist |
| | | 1: Normal Mode |
| | |
| | | #pragma once |
| | | #include "CStep.h" |
| | | #include "CReadStep.h" |
| | | |
| | | |
| | | namespace SERVO { |
| | | class CEqModeStep : public CStep |
| | | class CEqModeStep : public CReadStep |
| | | { |
| | | public: |
| | | CEqModeStep(); |
| | | ~CEqModeStep(); |
| | | |
| | | public: |
| | | virtual void getAttributeVector(CAttributeVector& attrubutes); |
| | | virtual int onReadData(); |
| | | virtual int onComplete(); |
| | | virtual int onTimeout(); |
| | | void setModeDev(int nDev); |
| | | int getMode(); |
| | | std::string& getModeDescription(std::string& strDescription); |
| | | |
| | | private: |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | #include "stdafx.h" |
| | | #include "Common.h" |
| | | #include "CEqProcessStep.h" |
| | | #include "Log.h" |
| | | #include "ToolUnits.h" |
| | | |
| | | |
| | | namespace SERVO { |
| | | CEqProcessStep::CEqProcessStep() : CReadStep() |
| | | { |
| | | m_nProcessDev = 0; |
| | | m_nTotalParameter = 0; |
| | | } |
| | | |
| | | CEqProcessStep::~CEqProcessStep() |
| | | { |
| | | |
| | | } |
| | | |
| | | void CEqProcessStep::getAttributeVector(CAttributeVector& attrubutes) |
| | | { |
| | | CReadStep::getAttributeVector(attrubutes); |
| | | |
| | | attrubutes.addAttribute(new CAttribute("Glass ID", |
| | | m_strGlassId.c_str(), "")); |
| | | attrubutes.addAttribute(new CAttribute("Start Time", |
| | | m_strStartTime.c_str(), "")); |
| | | attrubutes.addAttribute(new CAttribute("End Time", |
| | | m_strEndTime.c_str(), "")); |
| | | attrubutes.addAttribute(new CAttribute("Total Parameter", |
| | | std::to_string(m_nTotalParameter).c_str(), "")); |
| | | attrubutes.addAttribute(new CAttribute("Total Group", |
| | | std::to_string(m_nTotalGroup).c_str(), "")); |
| | | attrubutes.addAttribute(new CAttribute("Current Group", |
| | | std::to_string(m_nCurrentGroup).c_str(), "")); |
| | | |
| | | char szName[256]; |
| | | int index = 0; |
| | | for (auto item : m_params) { |
| | | sprintf_s(szName, 256, "Parameter %d", ++index); |
| | | attrubutes.addAttribute(new CAttribute(szName, |
| | | item.c_str(), "")); |
| | | } |
| | | } |
| | | |
| | | #define PROGRESS_BUF_SIZE (1024 + 64) |
| | | int CEqProcessStep::onReadData() |
| | | { |
| | | CReadStep::onReadData(); |
| | | |
| | | // W1864 ~ W1A74, 529个word, 1058 bytes |
| | | char szBuffer[PROGRESS_BUF_SIZE]; |
| | | int nRet = m_pCclink->ReadData2(m_station, DeviceType::W, |
| | | m_nProcessDev, PROGRESS_BUF_SIZE, szBuffer); |
| | | if (0 != nRet) { |
| | | return -1; |
| | | } |
| | | |
| | | // è§£éæ°æ® |
| | | // Glass ID(1864~186D) |
| | | int index = 0; |
| | | convertString(&szBuffer[index], (0x186d - 0x1864 + 1) * 2, m_strStartTime); |
| | | index += (0x186d - 0x1864 + 1) * 2; |
| | | |
| | | // Process Start Time(186e~1875) |
| | | convertString(&szBuffer[index], (0x1875 - 0x186e + 1) * 2, m_strStartTime); |
| | | index += (0x1875 - 0x186e + 1) * 2; |
| | | |
| | | // Process End Time(1876~187d) |
| | | convertString(&szBuffer[index], (0x187d - 0x1876 + 1) * 2, m_strEndTime); |
| | | index += (0x187d - 0x1876 + 1) * 2; |
| | | |
| | | // parameter count |
| | | m_nTotalParameter = (unsigned int)CToolUnits::toInt16(&szBuffer[index]); |
| | | index += 2; |
| | | |
| | | // total group |
| | | m_nTotalGroup = (unsigned int)CToolUnits::toInt16(&szBuffer[index]); |
| | | index += 2; |
| | | |
| | | // current group |
| | | m_nCurrentGroup = (unsigned int)CToolUnits::toInt16(&szBuffer[index]); |
| | | index += 2; |
| | | |
| | | // param list(0x1881~0x1a74), å
±1000 bytes, 20个å符为ä¸ä¸ªåæ°, 50ç» |
| | | // æåä¸groupå¯è½ä¸æ»¡è¶³50, 以m_nTotalParameterä¸ºä¾æ® |
| | | int size = (m_nCurrentGroup == m_nTotalGroup) ? m_nTotalParameter % 50 : 50; |
| | | for (int i = 0; i < size; i++) { |
| | | std::string strParam; |
| | | convertString(&szBuffer[index], 20, strParam); |
| | | if (!strParam.empty()) { |
| | | m_params.push_back(strParam); |
| | | } |
| | | index += 20; |
| | | } |
| | | |
| | | if (m_nCurrentGroup == m_nTotalGroup && m_listener.onEvent != nullptr) { |
| | | m_listener.onEvent(this, STEP_EVENT_PROCESS_DATA, nullptr); |
| | | } |
| | | |
| | | |
| | | LOGI("<CEqProcessStep> Process Data<GlassId:%s>\n", |
| | | m_strGlassId.c_str()); |
| | | |
| | | return 0; |
| | | } |
| | | |
| | | int CEqProcessStep::onComplete() |
| | | { |
| | | CReadStep::onComplete(); |
| | | LOGI("<CEqProcessStep> onComplete."); |
| | | |
| | | return 0; |
| | | } |
| | | |
| | | int CEqProcessStep::onTimeout() |
| | | { |
| | | CReadStep::onTimeout(); |
| | | LOGI("<CEqProcessStep> onTimeout."); |
| | | |
| | | return 0; |
| | | } |
| | | |
| | | void CEqProcessStep::setProcessDev(int nDev) |
| | | { |
| | | m_nProcessDev = nDev; |
| | | } |
| | | |
| | | std::string& CEqProcessStep::getGlassId() |
| | | { |
| | | return m_strGlassId; |
| | | } |
| | | |
| | | std::string& CEqProcessStep::getStartTime() |
| | | { |
| | | return m_strStartTime; |
| | | } |
| | | |
| | | std::string& CEqProcessStep::getEndTime() |
| | | { |
| | | return m_strEndTime; |
| | | } |
| | | |
| | | unsigned int CEqProcessStep::getTotalParameter() |
| | | { |
| | | return m_nTotalParameter; |
| | | } |
| | | |
| | | const std::list<std::string> CEqProcessStep::getParameters() |
| | | { |
| | | return m_params; |
| | | } |
| | | |
| | | void CEqProcessStep::getParameters(std::list<std::string>& list) |
| | | { |
| | | Lock(); |
| | | std::copy(m_params.begin(), m_params.end(), std::back_inserter(list)); |
| | | Unlock(); |
| | | } |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | #pragma once |
| | | #include "CReadStep.h" |
| | | #include <list> |
| | | |
| | | |
| | | namespace SERVO { |
| | | class CEqProcessStep : public CReadStep |
| | | { |
| | | public: |
| | | CEqProcessStep(); |
| | | ~CEqProcessStep(); |
| | | |
| | | public: |
| | | void getAttributeVector(CAttributeVector& attrubutes); |
| | | virtual int onReadData(); |
| | | virtual int onComplete(); |
| | | virtual int onTimeout(); |
| | | void setProcessDev(int nDev); |
| | | std::string& getGlassId(); |
| | | std::string& getStartTime(); |
| | | std::string& getEndTime(); |
| | | unsigned int getTotalParameter(); |
| | | const std::list<std::string> getParameters(); |
| | | void getParameters(std::list<std::string>& list); |
| | | |
| | | private: |
| | | int m_nProcessDev; |
| | | std::string m_strGlassId; |
| | | std::string m_strStartTime; |
| | | std::string m_strEndTime; |
| | | unsigned int m_nTotalParameter; |
| | | unsigned int m_nTotalGroup; |
| | | unsigned int m_nCurrentGroup; |
| | | std::list<std::string> m_params; |
| | | }; |
| | | } |
| | | |
| | |
| | | |
| | | |
| | | namespace SERVO { |
| | | CEqStatusStep::CEqStatusStep() : CStep() |
| | | CEqStatusStep::CEqStatusStep() : CReadStep() |
| | | { |
| | | m_nStatusDev = 0; |
| | | for (int i = 0; i < STATUS_MAX; i++) { |
| | |
| | | |
| | | } |
| | | |
| | | void CEqStatusStep::getAttributeVector(CAttributeVector& attrubutes) |
| | | { |
| | | CReadStep::getAttributeVector(attrubutes); |
| | | |
| | | char szName[256]; |
| | | for (int i = 0; i < STATUS_MAX; i++) { |
| | | sprintf_s(szName, 256, "Status %d", i + 1); |
| | | attrubutes.addAttribute(new CAttribute(szName, |
| | | std::to_string(m_nStatus[i]).c_str(), "")); |
| | | sprintf_s(szName, 256, "Reason Code %d", i + 1); |
| | | attrubutes.addAttribute(new CAttribute(szName, |
| | | std::to_string(m_nReasonCode[i]).c_str(), "")); |
| | | } |
| | | |
| | | attrubutes.addAttribute(new CAttribute("Status Dev", |
| | | std::to_string(m_nStatusDev).c_str(), "")); |
| | | } |
| | | |
| | | int CEqStatusStep::getStatus(unsigned int uint) |
| | | { |
| | | if (uint < STATUS_MAX) { |
| | | return m_nStatus[uint]; |
| | | } |
| | | |
| | | return -1; |
| | | } |
| | | int CEqStatusStep::onReadData() |
| | | { |
| | | CStep::onReadData(); |
| | | CReadStep::onReadData(); |
| | | |
| | | char szBuffer[64]; |
| | | int nRet = m_pCclink->ReadData2(m_station, DeviceType::W, |
| | |
| | | |
| | | int CEqStatusStep::onComplete() |
| | | { |
| | | CStep::onComplete(); |
| | | CReadStep::onComplete(); |
| | | LOGI("<CEqStatusStep> onComplete."); |
| | | |
| | | return 0; |
| | |
| | | |
| | | int CEqStatusStep::onTimeout() |
| | | { |
| | | CStep::onTimeout(); |
| | | CReadStep::onTimeout(); |
| | | LOGI("<CEqStatusStep> onTimeout."); |
| | | |
| | | return 0; |
| | |
| | | #pragma once |
| | | #include "CStep.h" |
| | | #include "CReadStep.h" |
| | | |
| | | |
| | | namespace SERVO { |
| | | #define UNIT_MAX 6 |
| | | #define STATUS_MAX (UNIT_MAX + 1) |
| | | |
| | | class CEqStatusStep : public CStep |
| | | class CEqStatusStep : public CReadStep |
| | | { |
| | | public: |
| | | CEqStatusStep(); |
| | | ~CEqStatusStep(); |
| | | |
| | | public: |
| | | virtual void getAttributeVector(CAttributeVector& attrubutes); |
| | | virtual int onReadData(); |
| | | virtual int onComplete(); |
| | | virtual int onTimeout(); |
| | | void setStatusDev(int nDev); |
| | | int getStatus(unsigned int uint); |
| | | std::string& getStatusDescription(unsigned int unid, std::string& strDescription); |
| | | |
| | | private: |
| | |
| | | m_bAutoRecipeChange = FALSE; |
| | | m_bVCREnable[0] = FALSE; |
| | | m_pCclink = nullptr; |
| | | m_nBaseAlarmId = 0; |
| | | InitializeCriticalSection(&m_criticalSection); |
| | | } |
| | | |
| | |
| | | m_pCclink = pCcLink; |
| | | } |
| | | |
| | | void CEquipment::setBaseAlarmId(int nBaseId) |
| | | { |
| | | m_nBaseAlarmId = nBaseId; |
| | | } |
| | | |
| | | int CEquipment::getBaseAlarmId() |
| | | { |
| | | return m_nBaseAlarmId; |
| | | } |
| | | |
| | | 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")); |
| | | } |
| | | |
| | | std::map<unsigned int, CStep*>& CEquipment::getSteps() |
| | | { |
| | | return m_mapStep; |
| | | } |
| | | |
| | | CStep* CEquipment::getStep(unsigned int addr) |
| | |
| | | bFlag = isBitOn(pszData, size, index); |
| | | pStep = getStep(index); |
| | | if (pStep != nullptr) { |
| | | pStep->onSignal(bFlag); |
| | | ((CReadStep*)pStep)->onReadSignal(bFlag); |
| | | } |
| | | } |
| | | |
| | | index = 0x350; |
| | | bFlag = isBitOn(pszData, size, index); |
| | | pStep = getStep(index); |
| | | if (pStep != nullptr) { |
| | | ((CWriteStep*)pStep)->onRecvSignal(bFlag); |
| | | } |
| | | } |
| | | |
| | | BOOL CEquipment::isBitOn(const char* pszData, size_t size, int index) |
| | |
| | | #include "CEqModeStep.h" |
| | | #include "CEqStatusStep.h" |
| | | #include "CEqAlarmStep.h" |
| | | #include "CEqProcessStep.h" |
| | | #include "CEqCimModeChangeStep.h" |
| | | #include <map> |
| | | |
| | | |
| | |
| | | virtual const char* getClassName() = 0; |
| | | virtual void setListener(EquipmentListener listener); |
| | | void setCcLink(CCCLinkIEControl* pCcLink); |
| | | void setBaseAlarmId(int nBaseId); |
| | | int getBaseAlarmId(); |
| | | void setID(int nID); |
| | | int getID(); |
| | | void setName(const char* pszName); |
| | |
| | | void getProperties(std::vector<std::pair<std::string, std::string>>& container); |
| | | int addStep(unsigned int addr, CStep* pStep); |
| | | CStep* getStep(unsigned int addr); |
| | | std::map<unsigned int, CStep*>& getSteps(); |
| | | virtual void init(); |
| | | virtual void term(); |
| | | virtual void onTimer(UINT nTimerid); |
| | |
| | | private: |
| | | CCCLinkIEControl* m_pCclink; |
| | | std::map<unsigned int, CStep*> m_mapStep; |
| | | int m_nBaseAlarmId; |
| | | }; |
| | | } |
| | | |
| | |
| | | // åå§åæ·»å ååè®¾å¤ |
| | | addEFEM(listener); |
| | | |
| | | /* |
| | | |
| | | { |
| | | CBonder* pBonder = new CBonder(); |
| | | pBonder->setName("Bonder 1"); |
| | |
| | | addEquipment(pBonder); |
| | | LOGE("已添å âBonder 1â."); |
| | | } |
| | | */ |
| | | |
| | | |
| | | // 宿¶å¨ |
| | | g_pMaster = this; |
| | |
| | | return 0; |
| | | } |
| | | |
| | | std::list<CEquipment*>& CMaster::getEquipmentList() |
| | | { |
| | | return m_listEquipment; |
| | | } |
| | | |
| | | CEquipment* CMaster::getEquipment(int id) |
| | | { |
| | | for (auto item : m_listEquipment) { |
| | |
| | | { |
| | | CEFEM* pEquipment = new CEFEM(); |
| | | pEquipment->setID(EQ_ID_EFEM); |
| | | pEquipment->setBaseAlarmId(BASE_ALARM_EFEM); |
| | | pEquipment->setName("EFEM(ROBOT)"); |
| | | pEquipment->setDescription("EFEM(ROBOT)."); |
| | | pEquipment->setReadBitBlock(0x4000, 0x45ff); |
| | |
| | | // æ·»å step |
| | | { |
| | | CEqModeStep* pStep = new CEqModeStep(); |
| | | pStep->setName("EQMode"); |
| | | pStep->setName(STEP_MODE); |
| | | pStep->setListener(listener); |
| | | pStep->setWriteSignalDev(0x30); |
| | | pStep->setModeDev(0x4a8c); |
| | |
| | | } |
| | | { |
| | | CEqStatusStep* pStep = new CEqStatusStep(); |
| | | pStep->setName("EQStatus"); |
| | | pStep->setName(STEP_STATUS); |
| | | pStep->setListener(listener); |
| | | pStep->setWriteSignalDev(0x31); |
| | | pStep->setStatusDev(0x4a68); |
| | |
| | | } |
| | | { |
| | | CEqAlarmStep* pStep = new CEqAlarmStep(); |
| | | pStep->setName("EQAlarm1"); |
| | | pStep->setName(STEP_ALARM_BLOCK1); |
| | | pStep->setListener(listener); |
| | | pStep->setWriteSignalDev(0x32); |
| | | pStep->setAlarmDev(0x4c1d); |
| | |
| | | } |
| | | { |
| | | CEqAlarmStep* pStep = new CEqAlarmStep(); |
| | | pStep->setName("EQAlarm2"); |
| | | pStep->setName(STEP_ALARM_BLOCK2); |
| | | pStep->setListener(listener); |
| | | pStep->setWriteSignalDev(0x33); |
| | | pStep->setAlarmDev(0x4c4a); |
| | |
| | | } |
| | | { |
| | | CEqAlarmStep* pStep = new CEqAlarmStep(); |
| | | pStep->setName("EQAlarm3"); |
| | | pStep->setName(STEP_ALARM_BLOCK3); |
| | | pStep->setListener(listener); |
| | | pStep->setWriteSignalDev(0x34); |
| | | pStep->setAlarmDev(0x4c77); |
| | |
| | | } |
| | | { |
| | | CEqAlarmStep* pStep = new CEqAlarmStep(); |
| | | pStep->setName("EQAlarm4"); |
| | | pStep->setName(STEP_ALARM_BLOCK4); |
| | | pStep->setListener(listener); |
| | | pStep->setWriteSignalDev(0x35); |
| | | pStep->setAlarmDev(0x4ca4); |
| | |
| | | } |
| | | { |
| | | CEqAlarmStep* pStep = new CEqAlarmStep(); |
| | | pStep->setName("EQAlarm5"); |
| | | pStep->setName(STEP_ALARM_BLOCK5); |
| | | pStep->setListener(listener); |
| | | pStep->setWriteSignalDev(0x36); |
| | | pStep->setAlarmDev(0x4cd1); |
| | |
| | | delete pStep; |
| | | } |
| | | } |
| | | { |
| | | CEqProcessStep* pStep = new CEqProcessStep(); |
| | | pStep->setName(STEP_PROCESS); |
| | | pStep->setListener(listener); |
| | | pStep->setWriteSignalDev(0x37); |
| | | pStep->setProcessDev(0x1864); |
| | | if (pEquipment->addStep(0x367, pStep) != 0) { |
| | | delete pStep; |
| | | } |
| | | } |
| | | { |
| | | CEqCimModeChangeStep* pStep = new CEqCimModeChangeStep(); |
| | | pStep->setName(STEP_CIM_MODE_CHANGE); |
| | | pStep->setListener(listener); |
| | | pStep->setWriteSignalDev(0x50); |
| | | pStep->setCimModeDev(0x15); |
| | | if (pEquipment->addStep(0x350, pStep) != 0) { |
| | | delete pStep; |
| | | } |
| | | } |
| | | |
| | | |
| | | pEquipment->init(); |
| | |
| | | int init(); |
| | | int term(); |
| | | void onTimer(UINT nTimerid); |
| | | std::list<CEquipment*>& getEquipmentList(); |
| | | CEquipment* getEquipment(int id); |
| | | |
| | | private: |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | // CPanelAttributes.cpp: å®ç°æä»¶ |
| | | // |
| | | |
| | | #include "stdafx.h" |
| | | #include "Servo.h" |
| | | #include "CPanelAttributes.h" |
| | | #include "afxdialogex.h" |
| | | #include "common.h" |
| | | #include "VerticalLine.h" |
| | | |
| | | |
| | | // CPanelAttributes å¯¹è¯æ¡ |
| | | |
| | | IMPLEMENT_DYNAMIC(CPanelAttributes, CDialogEx) |
| | | |
| | | CPanelAttributes::CPanelAttributes(CWnd* pParent /*=nullptr*/) |
| | | : CDialogEx(IDD_PANEL_ATTRIBUTES, pParent) |
| | | { |
| | | m_crBkgnd = PANEL_ATTRIBUTES_BACKGROUND_COLOR; |
| | | m_hbrBkgnd = nullptr; |
| | | m_nPanelWidth = 188; |
| | | } |
| | | |
| | | CPanelAttributes::~CPanelAttributes() |
| | | { |
| | | } |
| | | |
| | | void CPanelAttributes::DoDataExchange(CDataExchange* pDX) |
| | | { |
| | | CDialogEx::DoDataExchange(pDX); |
| | | DDX_Control(pDX, IDC_MFCPROPERTYGRID1, m_gridCtrl); |
| | | } |
| | | |
| | | |
| | | BEGIN_MESSAGE_MAP(CPanelAttributes, CDialogEx) |
| | | ON_WM_CTLCOLOR() |
| | | ON_WM_DESTROY() |
| | | ON_WM_SIZE() |
| | | ON_NOTIFY(BYVERTICALLINE_MOVEX, IDC_LINE1, &CPanelAttributes::OnVLineMoveX) |
| | | ON_BN_CLICKED(IDC_BUTTON_CLOSE, &CPanelAttributes::OnBnClickedButtonClose) |
| | | END_MESSAGE_MAP() |
| | | |
| | | |
| | | // CPanelAttributes æ¶æ¯å¤çç¨åº |
| | | |
| | | |
| | | int CPanelAttributes::getPanelWidth() |
| | | { |
| | | return m_nPanelWidth; |
| | | } |
| | | |
| | | void CPanelAttributes::loadDataFromStep(SERVO::CStep* pStep) |
| | | { |
| | | // å
æ¸
ç©ºææ |
| | | m_gridCtrl.RemoveAll(); |
| | | |
| | | |
| | | // å è½½æ°æ® |
| | | SetDlgItemText(IDC_LABEL_TITLE, pStep->getName().c_str()); |
| | | SERVO::CAttributeVector attrubutes; |
| | | pStep->getAttributeVector(attrubutes); |
| | | unsigned int nSize = attrubutes.size(); |
| | | for (unsigned int i = 0; i < nSize; i++) { |
| | | SERVO::CAttribute* pAttribute = attrubutes.getAttribute(i); |
| | | CMFCPropertyGridProperty* pProperty = new CMFCPropertyGridProperty( |
| | | pAttribute->getName().c_str(), |
| | | pAttribute->getValue().c_str(), |
| | | pAttribute->getDescription().c_str()); |
| | | pProperty->AllowEdit(TRUE); |
| | | m_gridCtrl.AddProperty(pProperty); |
| | | } |
| | | } |
| | | |
| | | BOOL CPanelAttributes::OnInitDialog() |
| | | { |
| | | CDialogEx::OnInitDialog(); |
| | | |
| | | |
| | | // å
³éæé® |
| | | CString strIcon1; |
| | | strIcon1.Format(_T("%s\\Res\\panel_close_24_b.ico"), theApp.m_strAppDir); |
| | | HICON hIcon1 = (HICON)::LoadImage(AfxGetInstanceHandle(), |
| | | strIcon1, IMAGE_ICON, 24, 24, |
| | | LR_LOADFROMFILE | LR_DEFAULTCOLOR | LR_CREATEDIBSECTION | LR_DEFAULTSIZE); |
| | | m_btnClose.SubclassDlgItem(IDC_BUTTON_CLOSE, this); |
| | | m_btnClose.SetIcon(hIcon1, hIcon1, 24); |
| | | m_btnClose.SetFaceColor(m_crBkgnd); |
| | | m_btnClose.SetFrameColor(m_crBkgnd); |
| | | m_btnClose.SetFrameColor(BS_HOVER, RGB(218, 218, 218)); |
| | | m_btnClose.SetFrameColor(BS_PRESS, RGB(168, 168, 168)); |
| | | |
| | | CVerticalLine* pLine1 = CVerticalLine::Hook(GetDlgItem(IDC_LINE1)->GetSafeHwnd()); |
| | | pLine1->SetBkgndColor(RGB(225, 225, 225)); |
| | | pLine1->SetLineColor(RGB(198, 198, 198)); |
| | | pLine1->EnableResize(); |
| | | |
| | | |
| | | // 读å颿¿å®½ |
| | | CString strIniFile; |
| | | strIniFile.Format(_T("%s\\%s.ini"), (LPTSTR)(LPCTSTR)theApp.m_strAppDir, (LPTSTR)(LPCTSTR)theApp.m_strAppFile); |
| | | m_nPanelWidth = GetPrivateProfileInt(_T("App"), _T("AttributesPanelWidth"), |
| | | int((double)GetSystemMetrics(SM_CXSCREEN) * 0.25), (LPTSTR)(LPCTSTR)strIniFile); |
| | | |
| | | |
| | | |
| | | |
| | | return TRUE; // return TRUE unless you set the focus to a control |
| | | // å¼å¸¸: OCX 屿§é¡µåºè¿å FALSE |
| | | } |
| | | |
| | | |
| | | HBRUSH CPanelAttributes::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) |
| | | { |
| | | HBRUSH hbr = CDialogEx::OnCtlColor(pDC, pWnd, nCtlColor); |
| | | |
| | | if (nCtlColor == CTLCOLOR_STATIC) { |
| | | pDC->SetBkColor(m_crBkgnd); |
| | | pDC->SetTextColor(RGB(0, 0, 0)); |
| | | } |
| | | |
| | | if (m_hbrBkgnd == nullptr) { |
| | | m_hbrBkgnd = CreateSolidBrush(m_crBkgnd); |
| | | } |
| | | |
| | | return m_hbrBkgnd; |
| | | } |
| | | |
| | | void CPanelAttributes::OnDestroy() |
| | | { |
| | | CDialogEx::OnDestroy(); |
| | | |
| | | if (m_hbrBkgnd != nullptr) { |
| | | ::DeleteObject(m_hbrBkgnd); |
| | | } |
| | | } |
| | | |
| | | void CPanelAttributes::OnSize(UINT nType, int cx, int cy) |
| | | { |
| | | CDialogEx::OnSize(nType, cx, cy); |
| | | if (GetDlgItem(IDC_LINE1) == nullptr) return; |
| | | |
| | | CWnd* pItem; |
| | | CRect rcClient, rcItem; |
| | | |
| | | GetClientRect(&rcClient); |
| | | pItem = GetDlgItem(IDC_LINE1); |
| | | pItem->MoveWindow(rcClient.right - 3, 0, 3, rcClient.Height()); |
| | | |
| | | int x2 = rcClient.right - 6; |
| | | int y = 3; |
| | | pItem = GetDlgItem(IDC_BUTTON_CLOSE); |
| | | pItem->GetWindowRect(&rcItem); |
| | | pItem->MoveWindow(x2 - rcItem.Width(), y, rcItem.Width(), rcItem.Height()); |
| | | x2 -= rcItem.Width(); |
| | | x2 -= 3; |
| | | |
| | | pItem = GetDlgItem(IDC_LABEL_TITLE); |
| | | pItem->GetWindowRect(&rcItem); |
| | | pItem->MoveWindow(5, y, x2 - 5, rcItem.Height()); |
| | | y += rcItem.Height(); |
| | | y += 8; |
| | | |
| | | |
| | | GetDlgItem(IDC_MFCPROPERTYGRID1)->MoveWindow(5, y, rcClient.Width() - 13, rcClient.Height() - 3 - y); |
| | | } |
| | | |
| | | #define ATTRIBUTES_PANEL_MIN_WIDTH 88 |
| | | #define ATTRIBUTES_PANEL_MAX_WIDTH 588 |
| | | void CPanelAttributes::OnVLineMoveX(NMHDR* nmhdr, LRESULT* result) |
| | | { |
| | | BYVERTICALLINE_NMHDR* pNmhdrex = (BYVERTICALLINE_NMHDR*)nmhdr; |
| | | int x = pNmhdrex->dwData; |
| | | m_nPanelWidth += x; |
| | | m_nPanelWidth = max(m_nPanelWidth, ATTRIBUTES_PANEL_MIN_WIDTH); |
| | | m_nPanelWidth = min(m_nPanelWidth, ATTRIBUTES_PANEL_MAX_WIDTH); |
| | | GetParent()->SendMessage(ID_MSG_PANEL_RESIZE, m_nPanelWidth, 0); |
| | | |
| | | CString strIniFile, strValue; |
| | | strIniFile.Format(_T("%s\\%s.ini"), (LPTSTR)(LPCTSTR)theApp.m_strAppDir, (LPTSTR)(LPCTSTR)theApp.m_strAppFile); |
| | | strValue.Format(_T("%d"), m_nPanelWidth); |
| | | WritePrivateProfileString(_T("App"), _T("AttributesPanelWidth"), |
| | | (LPTSTR)(LPCTSTR)strValue, (LPTSTR)(LPCTSTR)strIniFile); |
| | | OnSize(0, 0, 0); |
| | | |
| | | *result = 0; |
| | | } |
| | | |
| | | void CPanelAttributes::OnBnClickedButtonClose() |
| | | { |
| | | ShowWindow(SW_HIDE); |
| | | GetParent()->SendMessage(ID_MSG_PANEL_RESIZE, m_nPanelWidth, 0); |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | #pragma once |
| | | #include "BlButton.h" |
| | | |
| | | |
| | | |
| | | // CPanelAttributes å¯¹è¯æ¡ |
| | | |
| | | class CPanelAttributes : public CDialogEx |
| | | { |
| | | DECLARE_DYNAMIC(CPanelAttributes) |
| | | |
| | | public: |
| | | CPanelAttributes(CWnd* pParent = nullptr); // æ åæé 彿° |
| | | virtual ~CPanelAttributes(); |
| | | int getPanelWidth(); |
| | | void loadDataFromStep(SERVO::CStep* pStep); |
| | | |
| | | private: |
| | | COLORREF m_crBkgnd; |
| | | HBRUSH m_hbrBkgnd; |
| | | int m_nPanelWidth; |
| | | CMFCPropertyGridCtrl m_gridCtrl; |
| | | CBlButton m_btnClose; |
| | | |
| | | // å¯¹è¯æ¡æ°æ® |
| | | #ifdef AFX_DESIGN_TIME |
| | | enum { IDD = IDD_PANEL_ATTRIBUTES }; |
| | | #endif |
| | | |
| | | protected: |
| | | virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV æ¯æ |
| | | |
| | | DECLARE_MESSAGE_MAP() |
| | | public: |
| | | virtual BOOL OnInitDialog(); |
| | | afx_msg HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor); |
| | | afx_msg void OnDestroy(); |
| | | afx_msg void OnSize(UINT nType, int cx, int cy); |
| | | afx_msg void OnVLineMoveX(NMHDR* nmhdr, LRESULT* result); |
| | | afx_msg void OnBnClickedButtonClose(); |
| | | }; |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | // CPanelEquipment.cpp: å®ç°æä»¶ |
| | | // |
| | | |
| | | #include "stdafx.h" |
| | | #include "Servo.h" |
| | | #include "CPanelEquipment.h" |
| | | #include "afxdialogex.h" |
| | | #include "Common.h" |
| | | #include "VerticalLine.h" |
| | | |
| | | |
| | | // CPanelEquipment å¯¹è¯æ¡ |
| | | |
| | | IMPLEMENT_DYNAMIC(CPanelEquipment, CDialogEx) |
| | | |
| | | CPanelEquipment::CPanelEquipment(CWnd* pParent /*=nullptr*/) |
| | | : CDialogEx(IDD_PANEL_EQUIPMENT, pParent) |
| | | { |
| | | m_crBkgnd = PANEL_EQUIPMENT_BACKGROUND_COLOR; |
| | | m_hbrBkgnd = nullptr; |
| | | m_nPanelWidth = 188; |
| | | m_pEquipment = nullptr; |
| | | } |
| | | |
| | | CPanelEquipment::~CPanelEquipment() |
| | | { |
| | | } |
| | | |
| | | void CPanelEquipment::DoDataExchange(CDataExchange* pDX) |
| | | { |
| | | CDialogEx::DoDataExchange(pDX); |
| | | } |
| | | |
| | | |
| | | BEGIN_MESSAGE_MAP(CPanelEquipment, CDialogEx) |
| | | ON_WM_CTLCOLOR() |
| | | ON_WM_DESTROY() |
| | | ON_WM_SIZE() |
| | | ON_NOTIFY(BYVERTICALLINE_MOVEX, IDC_LINE1, &CPanelEquipment::OnVLineMoveX) |
| | | ON_BN_CLICKED(IDC_BUTTON_CLOSE, &CPanelEquipment::OnBnClickedButtonClose) |
| | | END_MESSAGE_MAP() |
| | | |
| | | |
| | | // CPanelEquipment æ¶æ¯å¤çç¨åº |
| | | |
| | | |
| | | int CPanelEquipment::getPanelWidth() |
| | | { |
| | | return m_nPanelWidth; |
| | | } |
| | | |
| | | void CPanelEquipment::SetEquipment(SERVO::CEquipment* pEquipment) |
| | | { |
| | | m_pEquipment = pEquipment; |
| | | ASSERT(m_pEquipment); |
| | | |
| | | if (::IsWindow(m_hWnd)) { |
| | | SetDlgItemText(IDC_LABEL_TITLE, m_pEquipment->getName().c_str()); |
| | | } |
| | | } |
| | | |
| | | BOOL CPanelEquipment::OnInitDialog() |
| | | { |
| | | CDialogEx::OnInitDialog(); |
| | | |
| | | // å
³éæé® |
| | | CString strIcon1; |
| | | strIcon1.Format(_T("%s\\Res\\panel_close_24_b.ico"), theApp.m_strAppDir); |
| | | HICON hIcon1 = (HICON)::LoadImage(AfxGetInstanceHandle(), |
| | | strIcon1, IMAGE_ICON, 24, 24, |
| | | LR_LOADFROMFILE | LR_DEFAULTCOLOR | LR_CREATEDIBSECTION | LR_DEFAULTSIZE); |
| | | m_btnClose.SubclassDlgItem(IDC_BUTTON_CLOSE, this); |
| | | m_btnClose.SetIcon(hIcon1, hIcon1, 24); |
| | | m_btnClose.SetFaceColor(m_crBkgnd); |
| | | m_btnClose.SetFrameColor(m_crBkgnd); |
| | | m_btnClose.SetFrameColor(BS_HOVER, RGB(218, 218, 218)); |
| | | m_btnClose.SetFrameColor(BS_PRESS, RGB(168, 168, 168)); |
| | | |
| | | CVerticalLine* pLine1 = CVerticalLine::Hook(GetDlgItem(IDC_LINE1)->GetSafeHwnd()); |
| | | pLine1->SetBkgndColor(RGB(225, 225, 225)); |
| | | pLine1->SetLineColor(RGB(198, 198, 198)); |
| | | pLine1->EnableResize(); |
| | | |
| | | |
| | | // 读å颿¿å®½ |
| | | CString strIniFile; |
| | | strIniFile.Format(_T("%s\\%s.ini"), (LPTSTR)(LPCTSTR)theApp.m_strAppDir, (LPTSTR)(LPCTSTR)theApp.m_strAppFile); |
| | | m_nPanelWidth = GetPrivateProfileInt(_T("App"), _T("EquipmentPanelWidth"), |
| | | int((double)GetSystemMetrics(SM_CXSCREEN) * 0.25), (LPTSTR)(LPCTSTR)strIniFile); |
| | | |
| | | return TRUE; // return TRUE unless you set the focus to a control |
| | | // å¼å¸¸: OCX 屿§é¡µåºè¿å FALSE |
| | | } |
| | | |
| | | |
| | | HBRUSH CPanelEquipment::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) |
| | | { |
| | | HBRUSH hbr = CDialogEx::OnCtlColor(pDC, pWnd, nCtlColor); |
| | | |
| | | if (nCtlColor == CTLCOLOR_STATIC) { |
| | | pDC->SetBkColor(m_crBkgnd); |
| | | pDC->SetTextColor(RGB(0, 0, 0)); |
| | | } |
| | | |
| | | if (m_hbrBkgnd == nullptr) { |
| | | m_hbrBkgnd = CreateSolidBrush(m_crBkgnd); |
| | | } |
| | | |
| | | return m_hbrBkgnd; |
| | | } |
| | | |
| | | |
| | | void CPanelEquipment::OnDestroy() |
| | | { |
| | | CDialogEx::OnDestroy(); |
| | | |
| | | if (m_hbrBkgnd != nullptr) { |
| | | ::DeleteObject(m_hbrBkgnd); |
| | | } |
| | | } |
| | | |
| | | |
| | | void CPanelEquipment::OnSize(UINT nType, int cx, int cy) |
| | | { |
| | | CDialogEx::OnSize(nType, cx, cy); |
| | | if (GetDlgItem(IDC_LINE1) == nullptr) return; |
| | | |
| | | CWnd* pItem; |
| | | CRect rcClient, rcItem; |
| | | |
| | | GetClientRect(&rcClient); |
| | | pItem = GetDlgItem(IDC_LINE1); |
| | | pItem->MoveWindow(rcClient.right - 3, 0, 3, rcClient.Height()); |
| | | |
| | | int x2 = rcClient.right - 6; |
| | | int y = 3; |
| | | pItem = GetDlgItem(IDC_BUTTON_CLOSE); |
| | | pItem->GetWindowRect(&rcItem); |
| | | pItem->MoveWindow(x2 - rcItem.Width(), y, rcItem.Width(), rcItem.Height()); |
| | | x2 -= rcItem.Width(); |
| | | x2 -= 3; |
| | | |
| | | pItem = GetDlgItem(IDC_LABEL_TITLE); |
| | | pItem->GetWindowRect(&rcItem); |
| | | pItem->MoveWindow(5, y, x2 - 5, rcItem.Height()); |
| | | y += rcItem.Height(); |
| | | y += 8; |
| | | } |
| | | |
| | | #define EQUIPMENT_PANEL_MIN_WIDTH 88 |
| | | #define EQUIPMENT_PANEL_MAX_WIDTH 588 |
| | | void CPanelEquipment::OnVLineMoveX(NMHDR* nmhdr, LRESULT* result) |
| | | { |
| | | BYVERTICALLINE_NMHDR* pNmhdrex = (BYVERTICALLINE_NMHDR*)nmhdr; |
| | | int x = pNmhdrex->dwData; |
| | | m_nPanelWidth += x; |
| | | m_nPanelWidth = max(m_nPanelWidth, EQUIPMENT_PANEL_MIN_WIDTH); |
| | | m_nPanelWidth = min(m_nPanelWidth, EQUIPMENT_PANEL_MAX_WIDTH); |
| | | GetParent()->SendMessage(ID_MSG_PANEL_RESIZE, m_nPanelWidth, 0); |
| | | |
| | | CString strIniFile, strValue; |
| | | strIniFile.Format(_T("%s\\%s.ini"), (LPTSTR)(LPCTSTR)theApp.m_strAppDir, (LPTSTR)(LPCTSTR)theApp.m_strAppFile); |
| | | strValue.Format(_T("%d"), m_nPanelWidth); |
| | | WritePrivateProfileString(_T("App"), _T("EquipmentPanelWidth"), |
| | | (LPTSTR)(LPCTSTR)strValue, (LPTSTR)(LPCTSTR)strIniFile); |
| | | OnSize(0, 0, 0); |
| | | |
| | | *result = 0; |
| | | } |
| | | |
| | | void CPanelEquipment::OnBnClickedButtonClose() |
| | | { |
| | | ShowWindow(SW_HIDE); |
| | | GetParent()->SendMessage(ID_MSG_PANEL_RESIZE, m_nPanelWidth, 0); |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | #pragma once |
| | | #include "BlButton.h" |
| | | #include "CEquipment.h" |
| | | |
| | | |
| | | // CPanelEquipment å¯¹è¯æ¡ |
| | | |
| | | class CPanelEquipment : public CDialogEx |
| | | { |
| | | DECLARE_DYNAMIC(CPanelEquipment) |
| | | |
| | | public: |
| | | CPanelEquipment(CWnd* pParent = nullptr); // æ åæé 彿° |
| | | virtual ~CPanelEquipment(); |
| | | int getPanelWidth(); |
| | | void SetEquipment(SERVO::CEquipment* pEquipment); |
| | | |
| | | private: |
| | | COLORREF m_crBkgnd; |
| | | HBRUSH m_hbrBkgnd; |
| | | int m_nPanelWidth; |
| | | CBlButton m_btnClose; |
| | | SERVO::CEquipment* m_pEquipment; |
| | | |
| | | |
| | | // å¯¹è¯æ¡æ°æ® |
| | | #ifdef AFX_DESIGN_TIME |
| | | enum { IDD = IDD_PANEL_EQUIPMENT }; |
| | | #endif |
| | | |
| | | protected: |
| | | virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV æ¯æ |
| | | |
| | | DECLARE_MESSAGE_MAP() |
| | | public: |
| | | virtual BOOL OnInitDialog(); |
| | | afx_msg HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor); |
| | | afx_msg void OnDestroy(); |
| | | afx_msg void OnSize(UINT nType, int cx, int cy); |
| | | afx_msg void OnVLineMoveX(NMHDR* nmhdr, LRESULT* result); |
| | | afx_msg void OnBnClickedButtonClose(); |
| | | }; |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | // CPanelMaster.cpp: å®ç°æä»¶ |
| | | // |
| | | |
| | | #include "stdafx.h" |
| | | #include "Servo.h" |
| | | #include "CPanelMaster.h" |
| | | #include "afxdialogex.h" |
| | | #include "Common.h" |
| | | #include "VerticalLine.h" |
| | | |
| | | |
| | | // CPanelMaster å¯¹è¯æ¡ |
| | | |
| | | IMPLEMENT_DYNAMIC(CPanelMaster, CDialogEx) |
| | | |
| | | CPanelMaster::CPanelMaster(CWnd* pParent /*=nullptr*/) |
| | | : CDialogEx(IDD_PANEL_MASTER, pParent) |
| | | { |
| | | m_crBkgnd = PANEL_MASTER_BACKGROUND_COLOR; |
| | | m_hbrBkgnd = nullptr; |
| | | m_nPanelWidth = 388; |
| | | } |
| | | |
| | | CPanelMaster::~CPanelMaster() |
| | | { |
| | | } |
| | | |
| | | void CPanelMaster::DoDataExchange(CDataExchange* pDX) |
| | | { |
| | | CDialogEx::DoDataExchange(pDX); |
| | | DDX_Control(pDX, IDC_TREE1, m_treeCtrl); |
| | | } |
| | | |
| | | |
| | | BEGIN_MESSAGE_MAP(CPanelMaster, CDialogEx) |
| | | ON_WM_CTLCOLOR() |
| | | ON_WM_DESTROY() |
| | | ON_WM_SIZE() |
| | | ON_NOTIFY(BYVERTICALLINE_MOVEX, IDC_LINE1, &CPanelMaster::OnVLineMoveX) |
| | | ON_WM_TIMER() |
| | | ON_NOTIFY(TVN_SELCHANGED, IDC_TREE1, &CPanelMaster::OnTvnSelchangedTree1) |
| | | END_MESSAGE_MAP() |
| | | |
| | | |
| | | // CPanelMaster æ¶æ¯å¤çç¨åº |
| | | |
| | | |
| | | int CPanelMaster::getPanelWidth() |
| | | { |
| | | return m_nPanelWidth; |
| | | } |
| | | |
| | | BOOL CPanelMaster::OnInitDialog() |
| | | { |
| | | CDialogEx::OnInitDialog(); |
| | | |
| | | |
| | | CVerticalLine* pLine1 = CVerticalLine::Hook(GetDlgItem(IDC_LINE1)->GetSafeHwnd()); |
| | | pLine1->SetBkgndColor(RGB(225, 225, 225)); |
| | | pLine1->SetLineColor(RGB(198, 198, 198)); |
| | | pLine1->EnableResize(); |
| | | |
| | | |
| | | // 读å颿¿å®½ |
| | | CString strIniFile; |
| | | strIniFile.Format(_T("%s\\%s.ini"), (LPTSTR)(LPCTSTR)theApp.m_strAppDir, (LPTSTR)(LPCTSTR)theApp.m_strAppFile); |
| | | m_nPanelWidth = GetPrivateProfileInt(_T("App"), _T("MasterPanelWidth"), |
| | | int((double)GetSystemMetrics(SM_CXSCREEN) * 0.25), (LPTSTR)(LPCTSTR)strIniFile); |
| | | |
| | | |
| | | // treectrl |
| | | m_treeCtrl.SetBkColor(PANEL_MASTER_BACKGROUND_COLOR); |
| | | m_treeCtrl.SetItemHeight(28); |
| | | SetTimer(1, 2000, nullptr); |
| | | |
| | | return TRUE; // return TRUE unless you set the focus to a control |
| | | // å¼å¸¸: OCX 屿§é¡µåºè¿å FALSE |
| | | } |
| | | |
| | | HBRUSH CPanelMaster::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) |
| | | { |
| | | HBRUSH hbr = CDialogEx::OnCtlColor(pDC, pWnd, nCtlColor); |
| | | |
| | | if (nCtlColor == CTLCOLOR_STATIC) { |
| | | pDC->SetBkColor(m_crBkgnd); |
| | | pDC->SetTextColor(RGB(0, 0, 0)); |
| | | } |
| | | |
| | | if (m_hbrBkgnd == nullptr) { |
| | | m_hbrBkgnd = CreateSolidBrush(m_crBkgnd); |
| | | } |
| | | |
| | | return m_hbrBkgnd; |
| | | } |
| | | |
| | | void CPanelMaster::OnDestroy() |
| | | { |
| | | CDialogEx::OnDestroy(); |
| | | |
| | | if (m_hbrBkgnd != nullptr) { |
| | | ::DeleteObject(m_hbrBkgnd); |
| | | } |
| | | } |
| | | |
| | | void CPanelMaster::OnSize(UINT nType, int cx, int cy) |
| | | { |
| | | CDialogEx::OnSize(nType, cx, cy); |
| | | if (GetDlgItem(IDC_LINE1) == nullptr) return; |
| | | |
| | | CWnd* pItem; |
| | | CRect rcClient; |
| | | |
| | | GetClientRect(&rcClient); |
| | | pItem = GetDlgItem(IDC_LINE1); |
| | | pItem->MoveWindow(rcClient.right - 3, 0, 3, rcClient.Height()); |
| | | |
| | | m_treeCtrl.MoveWindow(5, 5, rcClient.Width() - 13, rcClient.Height() - 10); |
| | | } |
| | | |
| | | |
| | | #define MASTER_PANEL_MIN_WIDTH 88 |
| | | #define MASTER_PANEL_MAX_WIDTH 588 |
| | | void CPanelMaster::OnVLineMoveX(NMHDR* nmhdr, LRESULT* result) |
| | | { |
| | | BYVERTICALLINE_NMHDR* pNmhdrex = (BYVERTICALLINE_NMHDR*)nmhdr; |
| | | int x = pNmhdrex->dwData; |
| | | m_nPanelWidth += x; |
| | | m_nPanelWidth = max(m_nPanelWidth, MASTER_PANEL_MIN_WIDTH); |
| | | m_nPanelWidth = min(m_nPanelWidth, MASTER_PANEL_MAX_WIDTH); |
| | | GetParent()->SendMessage(ID_MSG_PANEL_RESIZE, m_nPanelWidth, 0); |
| | | |
| | | CString strIniFile, strValue; |
| | | strIniFile.Format(_T("%s\\%s.ini"), (LPTSTR)(LPCTSTR)theApp.m_strAppDir, (LPTSTR)(LPCTSTR)theApp.m_strAppFile); |
| | | strValue.Format(_T("%d"), m_nPanelWidth); |
| | | WritePrivateProfileString(_T("App"), _T("MasterPanelWidth"), |
| | | (LPTSTR)(LPCTSTR)strValue, (LPTSTR)(LPCTSTR)strIniFile); |
| | | OnSize(0, 0, 0); |
| | | |
| | | * result = 0; |
| | | } |
| | | |
| | | void CPanelMaster::OnTimer(UINT_PTR nIDEvent) |
| | | { |
| | | if (1 == nIDEvent) { |
| | | KillTimer(1); |
| | | loadEquipmentList(); |
| | | } |
| | | |
| | | CDialogEx::OnTimer(nIDEvent); |
| | | } |
| | | |
| | | void CPanelMaster::loadEquipmentList() |
| | | { |
| | | HTREEITEM hItemMaster = m_treeCtrl.InsertItem("Master"); |
| | | |
| | | std::list<SERVO::CEquipment*>& eqs = theApp.m_model.m_master.getEquipmentList(); |
| | | for (auto item : eqs) { |
| | | HTREEITEM hItemEq = m_treeCtrl.InsertItem(item->getName().c_str(), hItemMaster); |
| | | m_treeCtrl.SetItemData(hItemEq, (DWORD_PTR)item); |
| | | loadSteps(item, hItemEq); |
| | | m_treeCtrl.Expand(hItemEq, TVE_EXPAND); |
| | | } |
| | | |
| | | |
| | | m_treeCtrl.Expand(hItemMaster, TVE_EXPAND); |
| | | } |
| | | |
| | | void CPanelMaster::loadSteps(SERVO::CEquipment* pEquipment, HTREEITEM hItemEq) |
| | | { |
| | | std::map<unsigned int, SERVO::CStep*>& steps = pEquipment->getSteps(); |
| | | |
| | | for (auto item : steps) { |
| | | HTREEITEM hStep = m_treeCtrl.InsertItem(item.second->getName().c_str(), hItemEq); |
| | | m_treeCtrl.SetItemData(hStep, (DWORD_PTR)item.second); |
| | | } |
| | | } |
| | | |
| | | void CPanelMaster::OnTvnSelchangedTree1(NMHDR* pNMHDR, LRESULT* pResult) |
| | | { |
| | | LPNMTREEVIEW pNMTreeView = reinterpret_cast<LPNMTREEVIEW>(pNMHDR); |
| | | HTREEITEM hItem = pNMTreeView->itemNew.hItem; |
| | | int nLevel = GetTreeItemLevel(hItem); |
| | | if (nLevel == 2) { |
| | | SERVO::CEquipment* pEquipment = (SERVO::CEquipment*)m_treeCtrl.GetItemData(hItem); |
| | | theApp.m_model.notifyPtr(RX_CODE_SELECT_EQUIPMENT, pEquipment); |
| | | } |
| | | else if (nLevel == 3) { |
| | | SERVO::CStep* pStep = (SERVO::CStep*)m_treeCtrl.GetItemData(hItem); |
| | | theApp.m_model.notifyPtr(RX_CODE_SELECT_STEP, pStep); |
| | | } |
| | | |
| | | |
| | | |
| | | *pResult = 0; |
| | | } |
| | | |
| | | int CPanelMaster::GetTreeItemLevel(HTREEITEM hItem) |
| | | { |
| | | int nLevel = 0; |
| | | HTREEITEM hTemp = hItem; |
| | | while (hTemp != nullptr) { |
| | | hTemp = m_treeCtrl.GetParentItem(hTemp); |
| | | nLevel++; |
| | | } |
| | | |
| | | return nLevel; |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | #pragma once |
| | | #include "ApredTreeCtrl2.h" |
| | | |
| | | |
| | | // CPanelMaster å¯¹è¯æ¡ |
| | | |
| | | class CPanelMaster : public CDialogEx |
| | | { |
| | | DECLARE_DYNAMIC(CPanelMaster) |
| | | |
| | | public: |
| | | CPanelMaster(CWnd* pParent = nullptr); // æ åæé 彿° |
| | | virtual ~CPanelMaster(); |
| | | int getPanelWidth(); |
| | | void loadEquipmentList(); |
| | | void loadSteps(SERVO::CEquipment* pEquipment, HTREEITEM hItemEq); |
| | | |
| | | |
| | | private: |
| | | int GetTreeItemLevel(HTREEITEM hItem); |
| | | |
| | | |
| | | private: |
| | | COLORREF m_crBkgnd; |
| | | HBRUSH m_hbrBkgnd; |
| | | CApredTreeCtrl2 m_treeCtrl; |
| | | int m_nPanelWidth; |
| | | |
| | | |
| | | // å¯¹è¯æ¡æ°æ® |
| | | #ifdef AFX_DESIGN_TIME |
| | | enum { IDD = IDD_PANEL_MASTER }; |
| | | #endif |
| | | |
| | | protected: |
| | | virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV æ¯æ |
| | | |
| | | DECLARE_MESSAGE_MAP() |
| | | public: |
| | | virtual BOOL OnInitDialog(); |
| | | afx_msg HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor); |
| | | afx_msg void OnDestroy(); |
| | | afx_msg void OnSize(UINT nType, int cx, int cy); |
| | | afx_msg void OnVLineMoveX(NMHDR* nmhdr, LRESULT* result); |
| | | afx_msg void OnTimer(UINT_PTR nIDEvent); |
| | | afx_msg void OnTvnSelchangedTree1(NMHDR* pNMHDR, LRESULT* pResult); |
| | | }; |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | #include "stdafx.h" |
| | | #include "CReadStep.h" |
| | | #include "Common.h" |
| | | |
| | | |
| | | namespace SERVO { |
| | | #define TIMEOUT 15 |
| | | |
| | | unsigned __stdcall ReadStepWorkThreadFunction(LPVOID lpParam) |
| | | { |
| | | CReadStep* pStep = (CReadStep*)lpParam; |
| | | return pStep->WorkingProc(); |
| | | } |
| | | |
| | | CReadStep::CReadStep() : CStep() |
| | | { |
| | | m_nWordThreadAddr = 0; |
| | | m_hWorkStop = nullptr; |
| | | m_hWorkThreadHandle = nullptr; |
| | | m_hReadSignalOn = ::CreateEvent(NULL, TRUE, FALSE, NULL); |
| | | m_hReadSignalOff = ::CreateEvent(NULL, TRUE, FALSE, NULL); |
| | | m_nCurStep = 0; |
| | | } |
| | | |
| | | CReadStep::~CReadStep() |
| | | { |
| | | ASSERT(m_hReadSignalOn); |
| | | CloseHandle(m_hReadSignalOn); |
| | | m_hReadSignalOn = nullptr; |
| | | |
| | | ASSERT(m_hReadSignalOff); |
| | | CloseHandle(m_hReadSignalOff); |
| | | m_hReadSignalOff = nullptr; |
| | | } |
| | | |
| | | void CReadStep::setWriteSignalDev(int dev) |
| | | { |
| | | m_nWriteSignalDev = dev; |
| | | } |
| | | |
| | | void CReadStep::onReadSignal(BOOL bSignal) |
| | | { |
| | | Lock(); |
| | | if (m_nCurStep == 0 && bSignal) { |
| | | SetEvent(m_hReadSignalOn); |
| | | } |
| | | else if (m_nCurStep == 3 && !bSignal) { |
| | | SetEvent(m_hReadSignalOff); |
| | | } |
| | | |
| | | Unlock(); |
| | | } |
| | | |
| | | int CReadStep::onReadData() |
| | | { |
| | | return 0; |
| | | } |
| | | |
| | | unsigned CReadStep::WorkingProc() |
| | | { |
| | | HANDLE hEvent = ::CreateEvent(NULL, TRUE, FALSE, NULL); |
| | | BOOL bReadOk = FALSE; |
| | | |
| | | int nBeginAddr = 0x0; |
| | | while (1) { |
| | | RESET: |
| | | resetStep(); |
| | | |
| | | // å¾
éåºä¿¡å·ææ¶é´å° |
| | | HANDLE hEvents[] = { m_hWorkStop, m_hReadSignalOn }; |
| | | int nRet = WaitForMultipleObjects(2, hEvents, FALSE, INFINITE); |
| | | if (nRet == WAIT_OBJECT_0) { |
| | | ResetEvent(m_hWorkStop); |
| | | break; |
| | | } |
| | | |
| | | else if (nRet == WAIT_OBJECT_0 + 1) { |
| | | ResetEvent(m_hReadSignalOn); |
| | | |
| | | // 1.è¯»åæ°æ® |
| | | nextStep(); |
| | | ASSERT(m_pCclink); |
| | | if (0 == onReadData()) { |
| | | if (m_listener.onEvent != nullptr) { |
| | | m_listener.onEvent(this, STEP_EVENT_READDATA, nullptr); |
| | | } |
| | | } |
| | | |
| | | // 2.ç»å¯¹æ¹åON |
| | | nextStep(); |
| | | m_pCclink->SetBitDevice(m_station, DeviceType::B, m_nWriteSignalDev); |
| | | |
| | | |
| | | // 3.çå¾
对æ¹OFF |
| | | nextStep(); |
| | | int nStep3Ret = ::WaitForSingleObject(m_hReadSignalOff, TIMEOUT * 1000); |
| | | if (nStep3Ret == WAIT_TIMEOUT) { |
| | | m_pCclink->ResetBitDevice(m_station, DeviceType::B, m_nWriteSignalDev); |
| | | onTimeout(); |
| | | goto RESET; |
| | | } |
| | | ResetEvent(m_hReadSignalOff); |
| | | |
| | | |
| | | // 4.ç»å¯¹æ¹åOFF |
| | | nextStep(); |
| | | m_pCclink->ResetBitDevice(m_station, DeviceType::B, m_nWriteSignalDev); |
| | | |
| | | |
| | | // 6.宿 |
| | | nextStep(); |
| | | if (0 == onComplete()) { |
| | | if (m_listener.onEvent != nullptr) { |
| | | m_listener.onEvent(this, STEP_EVENT_COMPLETE, nullptr); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | if (hEvent != nullptr) { |
| | | CloseHandle(hEvent); |
| | | } |
| | | |
| | | // _endthreadex(0); |
| | | TRACE("CStep::WorkingProc 线ç¨éåº\n"); |
| | | return 0; |
| | | } |
| | | |
| | | void CReadStep::getAttributeVector(CAttributeVector& attrubutes) |
| | | { |
| | | CStep::getAttributeVector(attrubutes); |
| | | attrubutes.addAttribute(new CAttribute("Current Step", |
| | | std::to_string(m_nCurStep).c_str(), "")); |
| | | attrubutes.addAttribute(new CAttribute("Signal Dev", |
| | | std::to_string(m_nWriteSignalDev).c_str(), "")); |
| | | } |
| | | |
| | | void CReadStep::init() |
| | | { |
| | | CStep::init(); |
| | | |
| | | if (m_hWorkStop != nullptr) return; |
| | | m_hWorkStop = ::CreateEvent(NULL, TRUE, FALSE, NULL); |
| | | m_hWorkThreadHandle = (HANDLE)_beginthreadex(NULL, 0, SERVO::ReadStepWorkThreadFunction, this, |
| | | 0, &m_nWordThreadAddr); |
| | | } |
| | | |
| | | void CReadStep::term() |
| | | { |
| | | CStep::term(); |
| | | |
| | | ASSERT(m_hWorkStop); |
| | | SetEvent(m_hWorkStop); |
| | | if (m_hWorkThreadHandle != NULL) { |
| | | WaitForSingleObject(m_hWorkThreadHandle, INFINITE); |
| | | CloseHandle(m_hWorkThreadHandle); |
| | | m_hWorkThreadHandle = NULL; |
| | | } |
| | | CloseHandle(m_hWorkStop); |
| | | m_hWorkStop = NULL; |
| | | } |
| | | |
| | | void CReadStep::resetStep() |
| | | { |
| | | Lock(); |
| | | m_nCurStep = 0; |
| | | Unlock(); |
| | | } |
| | | |
| | | void CReadStep::nextStep() |
| | | { |
| | | Lock(); |
| | | m_nCurStep++; |
| | | Unlock(); |
| | | } |
| | | |
| | | |
| | | int CReadStep::onComplete() |
| | | { |
| | | return 0; |
| | | } |
| | | |
| | | int CReadStep::onTimeout() |
| | | { |
| | | return 0; |
| | | } |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | #pragma once |
| | | #include "CStep.h" |
| | | |
| | | |
| | | namespace SERVO { |
| | | class CReadStep : public CStep |
| | | { |
| | | public: |
| | | CReadStep(); |
| | | virtual ~CReadStep(); |
| | | |
| | | public: |
| | | unsigned WorkingProc(); |
| | | virtual void setWriteSignalDev(int dev); |
| | | virtual void onReadSignal(BOOL bSignal); |
| | | virtual int onReadData(); |
| | | virtual void init(); |
| | | virtual void term(); |
| | | virtual void getAttributeVector(CAttributeVector& attrubutes); |
| | | virtual int onComplete(); |
| | | virtual int onTimeout(); |
| | | inline void nextStep(); |
| | | inline void resetStep(); |
| | | |
| | | protected: |
| | | HANDLE m_hWorkThreadHandle; |
| | | unsigned m_nWordThreadAddr; |
| | | HANDLE m_hWorkStop; |
| | | HANDLE m_hReadSignalOn; |
| | | HANDLE m_hReadSignalOff; |
| | | int m_nCurStep; |
| | | int m_nWriteSignalDev; // 对æ¹BITå°å |
| | | }; |
| | | } |
| | | |
| | |
| | | |
| | | |
| | | namespace SERVO { |
| | | #define TIMEOUT 15 |
| | | |
| | | unsigned __stdcall StepWorkThreadFunction(LPVOID lpParam) |
| | | { |
| | | CStep* pStep = (CStep*)lpParam; |
| | | return pStep->WorkingProc(); |
| | | } |
| | | |
| | | CStep::CStep() |
| | | { |
| | | m_listener = {nullptr}; |
| | | m_nWordThreadAddr = 0; |
| | | m_hWorkStop = nullptr; |
| | | m_hWorkThreadHandle = nullptr; |
| | | m_hSignalOn = ::CreateEvent(NULL, TRUE, FALSE, NULL); |
| | | m_hSignalOff = ::CreateEvent(NULL, TRUE, FALSE, NULL); |
| | | m_nCurStep = 0; |
| | | m_pCclink = nullptr; |
| | | m_nWriteSignalDev = 0; |
| | | InitializeCriticalSection(&m_criticalSection); |
| | | } |
| | | |
| | | CStep::~CStep() |
| | | { |
| | | ASSERT(m_hSignalOn); |
| | | CloseHandle(m_hSignalOn); |
| | | m_hSignalOn = nullptr; |
| | | |
| | | ASSERT(m_hSignalOff); |
| | | CloseHandle(m_hSignalOff); |
| | | m_hSignalOff = nullptr; |
| | | |
| | | DeleteCriticalSection(&m_criticalSection); |
| | | } |
| | | |
| | |
| | | return m_strName; |
| | | } |
| | | |
| | | void CStep::setWriteSignalDev(int dev) |
| | | void CStep::getAttributeVector(CAttributeVector& attrubutes) |
| | | { |
| | | m_nWriteSignalDev = dev; |
| | | attrubutes.clear(); |
| | | attrubutes.addAttribute(new CAttribute("Network", |
| | | std::to_string(m_station.nNetNo).c_str(), "")); |
| | | attrubutes.addAttribute(new CAttribute("Station", |
| | | std::to_string(m_station.nStNo).c_str(), "")); |
| | | } |
| | | |
| | | void CStep::init() |
| | | { |
| | | if (m_hWorkStop != nullptr) return; |
| | | m_hWorkStop = ::CreateEvent(NULL, TRUE, FALSE, NULL); |
| | | m_hWorkThreadHandle = (HANDLE)_beginthreadex(NULL, 0, SERVO::StepWorkThreadFunction, this, |
| | | 0, &m_nWordThreadAddr); |
| | | |
| | | } |
| | | |
| | | void CStep::term() |
| | | { |
| | | ASSERT(m_hWorkStop); |
| | | SetEvent(m_hWorkStop); |
| | | if (m_hWorkThreadHandle != NULL) { |
| | | WaitForSingleObject(m_hWorkThreadHandle, INFINITE); |
| | | CloseHandle(m_hWorkThreadHandle); |
| | | m_hWorkThreadHandle = NULL; |
| | | |
| | | } |
| | | |
| | | void CStep::convertString(const char* pszBuffer, int size, std::string& strOut) |
| | | { |
| | | strOut.clear(); |
| | | int nLength = 0; |
| | | for (int i = 0; i < size; i++) { |
| | | if (pszBuffer[i] == '\0') break; |
| | | nLength++; |
| | | } |
| | | CloseHandle(m_hWorkStop); |
| | | m_hWorkStop = NULL; |
| | | } |
| | | |
| | | unsigned CStep::WorkingProc() |
| | | { |
| | | HANDLE hEvent = ::CreateEvent(NULL, TRUE, FALSE, NULL); |
| | | BOOL bReadOk = FALSE; |
| | | |
| | | int nBeginAddr = 0x0; |
| | | while (1) { |
| | | RESET: |
| | | resetStep(); |
| | | |
| | | // å¾
éåºä¿¡å·ææ¶é´å° |
| | | HANDLE hEvents[] = { m_hWorkStop, m_hSignalOn }; |
| | | int nRet = WaitForMultipleObjects(2, hEvents, FALSE, INFINITE); |
| | | if (nRet == WAIT_OBJECT_0) { |
| | | ResetEvent(m_hWorkStop); |
| | | break; |
| | | } |
| | | |
| | | else if (nRet == WAIT_OBJECT_0 + 1) { |
| | | ResetEvent(m_hSignalOn); |
| | | |
| | | // 1.è¯»åæ°æ® |
| | | nextStep(); |
| | | ASSERT(m_pCclink); |
| | | if (0 == onReadData()) { |
| | | if (m_listener.onEvent != nullptr) { |
| | | m_listener.onEvent(this, STEP_EVENT_READDATA, nullptr); |
| | | } |
| | | } |
| | | |
| | | // 2.ç»å¯¹æ¹åON |
| | | nextStep(); |
| | | m_pCclink->SetBitDevice(m_station, DeviceType::B, m_nWriteSignalDev); |
| | | |
| | | |
| | | // 3.çå¾
对æ¹OFF |
| | | nextStep(); |
| | | int nStep3Ret = ::WaitForSingleObject(m_hSignalOff, TIMEOUT * 1000); |
| | | if (nStep3Ret == WAIT_TIMEOUT) { |
| | | m_pCclink->ResetBitDevice(m_station, DeviceType::B, m_nWriteSignalDev); |
| | | onTimeout(); |
| | | goto RESET; |
| | | } |
| | | ResetEvent(m_hSignalOff); |
| | | |
| | | |
| | | // 4.ç»å¯¹æ¹åOFF |
| | | nextStep(); |
| | | m_pCclink->ResetBitDevice(m_station, DeviceType::B, m_nWriteSignalDev); |
| | | |
| | | |
| | | // 6.宿 |
| | | nextStep(); |
| | | if (0 == onComplete()) { |
| | | if (m_listener.onEvent != nullptr) { |
| | | m_listener.onEvent(this, STEP_EVENT_COMPLETE, nullptr); |
| | | } |
| | | } |
| | | } |
| | | if (nLength > 0) { |
| | | strOut = std::string(pszBuffer, nLength); |
| | | } |
| | | |
| | | if (hEvent != nullptr) { |
| | | CloseHandle(hEvent); |
| | | } |
| | | |
| | | // _endthreadex(0); |
| | | TRACE("CStep::WorkingProc 线ç¨éåº\n"); |
| | | return 0; |
| | | } |
| | | |
| | | void CStep::onSignal(BOOL bSignal) |
| | | { |
| | | Lock(); |
| | | if (m_nCurStep == 0 && bSignal) { |
| | | SetEvent(m_hSignalOn); |
| | | } |
| | | else if (m_nCurStep == 3 && !bSignal) { |
| | | SetEvent(m_hSignalOff); |
| | | } |
| | | |
| | | Unlock(); |
| | | } |
| | | |
| | | int CStep::onReadData() |
| | | { |
| | | return 0; |
| | | } |
| | | |
| | | int CStep::onComplete() |
| | | { |
| | | return 0; |
| | | } |
| | | |
| | | int CStep::onTimeout() |
| | | { |
| | | return 0; |
| | | } |
| | | |
| | | void CStep::resetStep() |
| | | { |
| | | Lock(); |
| | | m_nCurStep = 0; |
| | | Unlock(); |
| | | } |
| | | |
| | | void CStep::nextStep() |
| | | { |
| | | Lock(); |
| | | m_nCurStep++; |
| | | Unlock(); |
| | | } |
| | | } |
| | | |
| | |
| | | #pragma once |
| | | #include "CCLinkIEControl.h" |
| | | #include "CAttributeVector.h" |
| | | |
| | | |
| | | namespace SERVO { |
| | |
| | | virtual ~CStep(); |
| | | |
| | | public: |
| | | unsigned WorkingProc(); |
| | | void setListener(StepListener listener); |
| | | void setCcLink(CCCLinkIEControl* pCcLink); |
| | | void setEquipment(CEquipment* pEquipment); |
| | | CEquipment* getEquipment(); |
| | | void setName(const char* pszName); |
| | | std::string& getName(); |
| | | virtual void setWriteSignalDev(int dev); |
| | | virtual void getAttributeVector(CAttributeVector& attrubutes); |
| | | virtual void init(); |
| | | virtual void CStep::term(); |
| | | virtual void onSignal(BOOL bSignal); |
| | | virtual int onReadData(); |
| | | virtual int onComplete(); |
| | | virtual int onTimeout(); |
| | | virtual void term(); |
| | | |
| | | |
| | | protected: |
| | | inline void Lock() { EnterCriticalSection(&m_criticalSection); } |
| | | inline void Unlock() { LeaveCriticalSection(&m_criticalSection); } |
| | | inline void nextStep(); |
| | | inline void resetStep(); |
| | | void convertString(const char* pszBuffer, int size, std::string& strOut); |
| | | |
| | | protected: |
| | | StepListener m_listener; |
| | |
| | | CEquipment* m_pEquipment; |
| | | CCCLinkIEControl* m_pCclink; |
| | | CRITICAL_SECTION m_criticalSection; |
| | | std::string strName; |
| | | HANDLE m_hWorkThreadHandle; |
| | | unsigned m_nWordThreadAddr; |
| | | HANDLE m_hWorkStop; |
| | | HANDLE m_hSignalOn; |
| | | HANDLE m_hSignalOff; |
| | | int m_nCurStep; |
| | | int m_nWriteSignalDev; // 对æ¹BITå°å |
| | | }; |
| | | } |
| | | |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | #include "stdafx.h" |
| | | #include "CWriteStep.h" |
| | | #include "Common.h" |
| | | |
| | | |
| | | namespace SERVO { |
| | | #define TIMEOUT 15 |
| | | |
| | | unsigned __stdcall WriteStepWorkThreadFunction(LPVOID lpParam) |
| | | { |
| | | CWriteStep* pStep = (CWriteStep*)lpParam; |
| | | return pStep->WorkingProc(); |
| | | } |
| | | |
| | | CWriteStep::CWriteStep() : CStep() |
| | | { |
| | | m_nWordThreadAddr = 0; |
| | | m_hWorkStop = nullptr; |
| | | m_hWorkThreadHandle = nullptr; |
| | | m_nCurStep = 0; |
| | | m_nWriteSignalDev = 0; |
| | | m_nWriteDataSize = 0; |
| | | m_nWriteDevNo = 0; |
| | | m_hWriteSignalOn = ::CreateEvent(NULL, TRUE, FALSE, NULL); |
| | | m_hRecvSignalOn = ::CreateEvent(NULL, TRUE, FALSE, NULL); |
| | | } |
| | | |
| | | CWriteStep::~CWriteStep() |
| | | { |
| | | ASSERT(m_hWriteSignalOn); |
| | | CloseHandle(m_hWriteSignalOn); |
| | | m_hWriteSignalOn = nullptr; |
| | | |
| | | ASSERT(m_hRecvSignalOn); |
| | | CloseHandle(m_hRecvSignalOn); |
| | | m_hRecvSignalOn = nullptr; |
| | | } |
| | | |
| | | int CWriteStep::writeData(short devno, const char* pszData, int size) |
| | | { |
| | | if (size > 1024) return -1; |
| | | if (m_nCurStep != 0) return -2; |
| | | |
| | | memcpy(m_szBuffer, pszData, size); |
| | | m_nWriteDataSize = size; |
| | | m_nWriteDevNo = devno; |
| | | SetEvent(m_hWriteSignalOn); |
| | | |
| | | return 0; |
| | | } |
| | | |
| | | void CWriteStep::setWriteSignalDev(int dev) |
| | | { |
| | | m_nWriteSignalDev = dev; |
| | | } |
| | | |
| | | void CWriteStep::onRecvSignal(BOOL bSignal) |
| | | { |
| | | Lock(); |
| | | if (m_nCurStep == 3 && bSignal) { |
| | | SetEvent(m_hRecvSignalOn); |
| | | } |
| | | |
| | | Unlock(); |
| | | } |
| | | |
| | | unsigned CWriteStep::WorkingProc() |
| | | { |
| | | HANDLE hEvent = ::CreateEvent(NULL, TRUE, FALSE, NULL); |
| | | BOOL bReadOk = FALSE; |
| | | |
| | | int nBeginAddr = 0x0; |
| | | while (1) { |
| | | RESET: |
| | | resetStep(); |
| | | |
| | | // å¾
éåºä¿¡å·ææ¶é´å° |
| | | HANDLE hEvents[] = { m_hWorkStop, m_hWriteSignalOn }; |
| | | int nRet = WaitForMultipleObjects(2, hEvents, FALSE, INFINITE); |
| | | if (nRet == WAIT_OBJECT_0) { |
| | | ResetEvent(m_hWorkStop); |
| | | break; |
| | | } |
| | | |
| | | else if (nRet == WAIT_OBJECT_0 + 1) { |
| | | ResetEvent(m_hWriteSignalOn); |
| | | |
| | | // 1.åæ°æ® |
| | | nextStep(); |
| | | ASSERT(m_pCclink); |
| | | int nRet = m_pCclink->WriteData(m_station, (short)DeviceType::W, |
| | | m_nWriteDevNo, m_nWriteDataSize, (short*)m_szBuffer); |
| | | if (0 != nRet) { |
| | | onTimeout(); |
| | | goto RESET; |
| | | } |
| | | |
| | | |
| | | // 2.ç»å¯¹æ¹åON |
| | | nextStep(); |
| | | m_pCclink->SetBitDevice(m_station, DeviceType::B, m_nWriteSignalDev); |
| | | |
| | | |
| | | // 3.çå¾
对æ¹ON |
| | | nextStep(); |
| | | int nStep3Ret = ::WaitForSingleObject(m_hRecvSignalOn, TIMEOUT * 1000); |
| | | if (nStep3Ret == WAIT_TIMEOUT) { |
| | | m_pCclink->ResetBitDevice(m_station, DeviceType::B, m_nWriteSignalDev); |
| | | onTimeout(); |
| | | goto RESET; |
| | | } |
| | | ResetEvent(m_hRecvSignalOn); |
| | | |
| | | |
| | | // 4.дOFF |
| | | nextStep(); |
| | | m_pCclink->ResetBitDevice(m_station, DeviceType::B, m_nWriteSignalDev); |
| | | |
| | | |
| | | // 6.宿 |
| | | nextStep(); |
| | | if (0 == onComplete()) { |
| | | if (m_listener.onEvent != nullptr) { |
| | | m_listener.onEvent(this, STEP_EVENT_COMPLETE, nullptr); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | if (hEvent != nullptr) { |
| | | CloseHandle(hEvent); |
| | | } |
| | | |
| | | // _endthreadex(0); |
| | | TRACE("CStep::WorkingProc 线ç¨éåº\n"); |
| | | return 0; |
| | | } |
| | | |
| | | void CWriteStep::getAttributeVector(CAttributeVector& attrubutes) |
| | | { |
| | | CStep::getAttributeVector(attrubutes); |
| | | |
| | | attrubutes.addAttribute(new CAttribute("Current Step", |
| | | std::to_string(m_nCurStep).c_str(), "")); |
| | | attrubutes.addAttribute(new CAttribute("Signal Dev", |
| | | std::to_string(m_nWriteSignalDev).c_str(), "")); |
| | | } |
| | | |
| | | void CWriteStep::init() |
| | | { |
| | | CStep::init(); |
| | | |
| | | if (m_hWorkStop != nullptr) return; |
| | | m_hWorkStop = ::CreateEvent(NULL, TRUE, FALSE, NULL); |
| | | m_hWorkThreadHandle = (HANDLE)_beginthreadex(NULL, 0, SERVO::WriteStepWorkThreadFunction, this, |
| | | 0, &m_nWordThreadAddr); |
| | | } |
| | | |
| | | void CWriteStep::term() |
| | | { |
| | | CStep::term(); |
| | | |
| | | ASSERT(m_hWorkStop); |
| | | SetEvent(m_hWorkStop); |
| | | if (m_hWorkThreadHandle != NULL) { |
| | | WaitForSingleObject(m_hWorkThreadHandle, INFINITE); |
| | | CloseHandle(m_hWorkThreadHandle); |
| | | m_hWorkThreadHandle = NULL; |
| | | } |
| | | CloseHandle(m_hWorkStop); |
| | | m_hWorkStop = NULL; |
| | | } |
| | | |
| | | void CWriteStep::resetStep() |
| | | { |
| | | Lock(); |
| | | m_nCurStep = 0; |
| | | Unlock(); |
| | | } |
| | | |
| | | void CWriteStep::nextStep() |
| | | { |
| | | Lock(); |
| | | m_nCurStep++; |
| | | Unlock(); |
| | | } |
| | | |
| | | int CWriteStep::onComplete() |
| | | { |
| | | return 0; |
| | | } |
| | | |
| | | int CWriteStep::onTimeout() |
| | | { |
| | | return 0; |
| | | } |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | #pragma once |
| | | #include "CStep.h" |
| | | |
| | | |
| | | namespace SERVO { |
| | | class CWriteStep : public CStep |
| | | { |
| | | public: |
| | | CWriteStep(); |
| | | virtual ~CWriteStep(); |
| | | |
| | | public: |
| | | unsigned WorkingProc(); |
| | | virtual void setWriteSignalDev(int dev); |
| | | virtual void onRecvSignal(BOOL bSignal); |
| | | int writeData(short devno, const char* pszData, int size); |
| | | virtual void init(); |
| | | virtual void term(); |
| | | virtual void getAttributeVector(CAttributeVector& attrubutes); |
| | | virtual int onComplete(); |
| | | virtual int onTimeout(); |
| | | inline void nextStep(); |
| | | inline void resetStep(); |
| | | |
| | | protected: |
| | | HANDLE m_hWorkThreadHandle; |
| | | unsigned m_nWordThreadAddr; |
| | | HANDLE m_hWorkStop; |
| | | HANDLE m_hWriteSignalOn; |
| | | HANDLE m_hRecvSignalOn; |
| | | int m_nCurStep; |
| | | int m_nWriteSignalDev; // 对æ¹BITå°å |
| | | char m_szBuffer[1024]; |
| | | int m_nWriteDataSize; |
| | | int m_nWriteDevNo; |
| | | }; |
| | | } |
| | | |
| | |
| | | #define RX_HSMS_TERMINAL_TEXT 1003 |
| | | #define RX_CODE_EQ_ALIVE 1004 |
| | | #define RX_CODE_STEP_EVENT_READDATA 1005 |
| | | #define RX_CODE_SELECT_EQUIPMENT 1006 |
| | | #define RX_CODE_SELECT_STEP 1007 |
| | | |
| | | /* Channel Name */ |
| | | #define MC_CHANNEL1_NAME "McChannel1" |
| | | |
| | | |
| | | /* é¢è² */ |
| | | #define APPDLG_BACKGROUND_COLOR RGB(255, 255, 255) |
| | | #define LOGDLG_BACKGROUND_COLOR RGB(255, 255, 255) |
| | | #define APPDLG_BACKGROUND_COLOR RGB(255, 255, 255) |
| | | #define LOGDLG_BACKGROUND_COLOR RGB(255, 255, 255) |
| | | #define PANEL_MASTER_BACKGROUND_COLOR RGB(255, 255, 255) |
| | | #define PANEL_ATTRIBUTES_BACKGROUND_COLOR RGB(255, 255, 255) |
| | | #define PANEL_EQUIPMENT_BACKGROUND_COLOR RGB(255, 255, 255) |
| | | |
| | | |
| | | /* LOG BTN */ |
| | |
| | | /* Equipment ID */ |
| | | #define EQ_ID_EFEM 1 |
| | | #define EQ_ID_Bonder1 2 |
| | | #define EQ_ID_Bonder2 3 |
| | | #define EQ_ID_Bonder2 3 |
| | | |
| | | |
| | | /* step name */ |
| | | #define STEP_MODE _T("EQMode") |
| | | #define STEP_STATUS _T("EQStatus") |
| | | #define STEP_ALARM_START _T("EQAlarm") |
| | | #define STEP_ALARM_BLOCK1 _T("EQAlarm1") |
| | | #define STEP_ALARM_BLOCK2 _T("EQAlarm2") |
| | | #define STEP_ALARM_BLOCK3 _T("EQAlarm3") |
| | | #define STEP_ALARM_BLOCK4 _T("EQAlarm4") |
| | | #define STEP_ALARM_BLOCK5 _T("EQAlarm5") |
| | | #define STEP_PROCESS _T("EQProcess") |
| | | #define STEP_CIM_MODE_CHANGE _T("EQCimModeChange") |
| | | |
| | | |
| | | #define BASE_ALARM_EFEM 10000 |
| | | #define BASE_ALARM_BONDER1 20000 |
| | | #define BASE_ALARM_BONDER2 30000 |
| | | |
| | | |
| | | /* step event */ |
| | | #define STEP_EVENT_READDATA 0x01 |
| | | #define STEP_EVENT_COMPLETE 0x02 |
| | | #define STEP_EVENT_PROCESS_DATA 0x1001 |
| | | |
| | | |
| | | /* èªå®ä¹æ¶æ¯ */ |
| | | #define ID_MSG_PANEL_RESIZE WM_USER + 1998 |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | // HorizontalLine.cpp: implementation of the CHorizontalLine class. |
| | | // |
| | | ////////////////////////////////////////////////////////////////////// |
| | | |
| | | #include "stdafx.h" |
| | | #include "HorizontalLine.h" |
| | | |
| | | #ifdef _DEBUG |
| | | #undef THIS_FILE |
| | | static char THIS_FILE[]=__FILE__; |
| | | #define new DEBUG_NEW |
| | | #endif |
| | | |
| | | ////////////////////////////////////////////////////////////////////// |
| | | // Construction/Destruction |
| | | ////////////////////////////////////////////////////////////////////// |
| | | |
| | | CHorizontalLine::CHorizontalLine() |
| | | { |
| | | m_hWnd = NULL; |
| | | m_crBkgnd = RGB(255, 255, 255); |
| | | m_crLineColor = RGB(222, 222, 222); |
| | | } |
| | | |
| | | CHorizontalLine::~CHorizontalLine() |
| | | { |
| | | } |
| | | |
| | | BOOL CHorizontalLine::RegisterWndClass() |
| | | { |
| | | WNDCLASS wc; |
| | | wc.lpszClassName = BYHORIZONTALLINE_CLASS; |
| | | wc.hInstance = AfxGetInstanceHandle(); |
| | | wc.lpfnWndProc = WindowProc; |
| | | wc.hCursor = ::LoadCursor(NULL, IDC_ARROW); |
| | | wc.hIcon = 0; |
| | | wc.lpszMenuName = NULL; |
| | | wc.hbrBackground = NULL; |
| | | wc.style = CS_GLOBALCLASS|CS_DBLCLKS; |
| | | wc.cbClsExtra = 0; |
| | | wc.cbWndExtra = 0; |
| | | |
| | | // 注åèªå®ä¹ç±» |
| | | return (::RegisterClass(&wc) != 0); |
| | | } |
| | | |
| | | CHorizontalLine* CHorizontalLine::Hook(HWND hWnd) |
| | | { |
| | | CHorizontalLine* pHorizontalLine = (CHorizontalLine*)GetProp(hWnd, BYSTAG_HORIZONTALLINE); |
| | | if(pHorizontalLine == NULL) |
| | | { |
| | | pHorizontalLine = new CHorizontalLine; |
| | | pHorizontalLine->m_hWnd = hWnd; |
| | | |
| | | SetProp(hWnd, BYSTAG_HORIZONTALLINE, (HANDLE)pHorizontalLine); |
| | | } |
| | | |
| | | return pHorizontalLine; |
| | | } |
| | | |
| | | void CHorizontalLine::Release() |
| | | { |
| | | // delete |
| | | delete this; |
| | | } |
| | | |
| | | void CHorizontalLine::Notify(int nCode, int dwData, int dwData1/* = 0*/, int dwData2/* = 0*/) |
| | | { |
| | | HWND hParent; |
| | | hParent = GetParent(m_hWnd); |
| | | if(hParent != NULL) { |
| | | BYHORIZONTALLINE_NMHDR iii_nmhdr; |
| | | iii_nmhdr.nmhdr.hwndFrom = m_hWnd; |
| | | iii_nmhdr.nmhdr.idFrom = GetWindowLong(m_hWnd, GWL_ID); |
| | | iii_nmhdr.nmhdr.code = nCode; |
| | | iii_nmhdr.dwData = dwData; |
| | | iii_nmhdr.dwData1 = dwData1; |
| | | iii_nmhdr.dwData2 = dwData2; |
| | | SendMessage(hParent, WM_NOTIFY, (WPARAM)iii_nmhdr.nmhdr.idFrom, (LPARAM)&iii_nmhdr); |
| | | } |
| | | } |
| | | |
| | | //////////////////////////////// |
| | | // æ¦æªçªå£æ¶æ¯å½æ° |
| | | LRESULT CALLBACK CHorizontalLine::WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) |
| | | { |
| | | CHorizontalLine* pHorizontalLine = (CHorizontalLine *)GetProp(hWnd, BYSTAG_HORIZONTALLINE); |
| | | if(pHorizontalLine == NULL && uMsg != WM_NCCREATE) |
| | | { |
| | | return ::DefWindowProc(hWnd, uMsg, wParam, lParam); |
| | | } |
| | | |
| | | |
| | | // 妿Hookåååºæ¶æ¯ |
| | | ASSERT(hWnd); |
| | | switch(uMsg) |
| | | { |
| | | case WM_NCCREATE: |
| | | return OnNcCreate(hWnd, wParam, lParam); |
| | | |
| | | case WM_DESTROY: |
| | | return pHorizontalLine->OnDestroy(wParam, lParam); |
| | | |
| | | case WM_PAINT: |
| | | return pHorizontalLine->OnPaint(wParam, lParam); |
| | | |
| | | case WM_TIMER: |
| | | return pHorizontalLine->OnTimer(wParam, lParam); |
| | | |
| | | case WM_GETDLGCODE: |
| | | return DLGC_WANTALLKEYS; |
| | | |
| | | default: |
| | | break; |
| | | } |
| | | |
| | | return ::DefWindowProc(hWnd, uMsg, wParam, lParam); |
| | | } |
| | | |
| | | /////////////////////////////// |
| | | // WM_NCCREATE |
| | | // çªå£å建åçåå§åå·¥ä½ |
| | | LRESULT CHorizontalLine::OnNcCreate(HWND hWnd, WPARAM wParam, LPARAM lParam) |
| | | { |
| | | CHorizontalLine* pHorizontalLine = (CHorizontalLine *)GetProp(hWnd, BYSTAG_HORIZONTALLINE); |
| | | ASSERT(pHorizontalLine == NULL); |
| | | |
| | | Hook(hWnd); |
| | | return ::DefWindowProc(hWnd, WM_NCCREATE, wParam, lParam); |
| | | } |
| | | |
| | | /////////////////////////////// |
| | | // WM_DESTROY |
| | | LRESULT CHorizontalLine::OnDestroy(WPARAM wParam, LPARAM lParam) |
| | | { |
| | | Release(); |
| | | return ::DefWindowProc(m_hWnd, WM_DESTROY, wParam, lParam); |
| | | } |
| | | |
| | | /////////////////////////////// |
| | | // WM_TIMER |
| | | LRESULT CHorizontalLine::OnTimer(WPARAM wParam, LPARAM lParam) |
| | | { |
| | | return ::DefWindowProc(m_hWnd, WM_TIMER, wParam, lParam); |
| | | } |
| | | |
| | | |
| | | /////////////////////////////// |
| | | // WM_PAINT |
| | | LRESULT CHorizontalLine::OnPaint(WPARAM wParam, LPARAM lParam) |
| | | { |
| | | HDC hDC, hMemDC; |
| | | HBITMAP hBitmap; |
| | | RECT rcClient; |
| | | CString strText; |
| | | HFONT hFont; |
| | | HBRUSH hBrushBK; |
| | | |
| | | |
| | | // BeginPaint |
| | | PAINTSTRUCT ps; |
| | | hDC = BeginPaint(m_hWnd, &ps); |
| | | GetClientRect(m_hWnd, &rcClient); |
| | | |
| | | hMemDC = ::CreateCompatibleDC(hDC); |
| | | hBitmap = ::CreateCompatibleBitmap(hDC, rcClient.right-rcClient.left, |
| | | rcClient.bottom-rcClient.top); |
| | | ::SelectObject(hMemDC, hBitmap); |
| | | |
| | | hFont = (HFONT)GetStockObject(DEFAULT_GUI_FONT); |
| | | ::SelectObject(hMemDC, hFont); |
| | | |
| | | |
| | | // èæ¯é¢è² |
| | | hBrushBK = CreateSolidBrush( m_crBkgnd ); |
| | | ::FillRect(hMemDC, &rcClient, hBrushBK); |
| | | DeleteObject(hBrushBK); |
| | | |
| | | |
| | | // ç»çº¿ |
| | | HPEN hPen = CreatePen(PS_SOLID, 1, m_crLineColor); |
| | | HPEN hOldPen = (HPEN)::SelectObject(hMemDC, hPen); |
| | | ::MoveToEx(hMemDC, 0, 0, NULL); |
| | | LineTo(hMemDC, rcClient.right, 0); |
| | | ::SelectObject(hMemDC, hOldPen); |
| | | |
| | | |
| | | // EndPaint |
| | | ::BitBlt(hDC, 0, 0, rcClient.right-rcClient.left, rcClient.bottom-rcClient.top, |
| | | hMemDC, 0, 0, SRCCOPY); |
| | | EndPaint(m_hWnd, &ps); |
| | | ::DeleteObject(hBitmap); |
| | | ::DeleteDC(hMemDC); |
| | | |
| | | |
| | | return 1; |
| | | } |
| | | |
| | | void CHorizontalLine::SetBkgndColor(COLORREF cr) |
| | | { |
| | | m_crBkgnd = cr; |
| | | } |
| | | |
| | | void CHorizontalLine::SetLineColor(COLORREF cr) |
| | | { |
| | | m_crLineColor = cr; |
| | | } |
| | | |
| | | |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | // HorizontalLine.h: interface for the CHorizontalLine class. |
| | | // |
| | | ////////////////////////////////////////////////////////////////////// |
| | | |
| | | #if !defined(AFX_HORIZONTALLINE_H__FBB8916A_DE77_4EA3_9C21_E51E6B06194C__INCLUDED_) |
| | | #define AFX_HORIZONTALLINE_H__FBB8916A_DE77_4EA3_9C21_E51E6B06194C__INCLUDED_ |
| | | |
| | | |
| | | #pragma comment(lib, "Msimg32.lib") // TransparentBlt |
| | | |
| | | |
| | | |
| | | //====== HorizontalLine ===================================================== |
| | | |
| | | #ifndef NOHORIZONTALLINE |
| | | |
| | | #ifdef _WIN32 |
| | | |
| | | #define BYHORIZONTALLINE_CLASSA "BYHorizontalLine" |
| | | #define BYHORIZONTALLINE_CLASSW L"BYHorizontalLine" |
| | | |
| | | #ifdef UNICODE |
| | | #define BYHORIZONTALLINE_CLASS BYHORIZONTALLINE_CLASSW |
| | | #else |
| | | #define BYHORIZONTALLINE_CLASS BYHORIZONTALLINE_CLASSA |
| | | #endif |
| | | |
| | | #else |
| | | #define BYHORIZONTALLINE_CLASS "BYHorizontalLine" |
| | | #endif |
| | | |
| | | |
| | | #define BYSTAG_HORIZONTALLINE _T("ISHORIZONTALLINE") |
| | | |
| | | |
| | | //====== WM_NOTIFY codes (NMHDR.code values) ================================== |
| | | #define BYHORIZONTALLINE_FIRST (0U-590U) // |
| | | #define BYHORIZONTALLINE_LAST (0U-550U) |
| | | #define BYHORIZONTALLINE_ (BYHORIZONTALLINE_FIRST - 1) |
| | | |
| | | |
| | | typedef struct tagBYHORIZONTALLINE_NMHDR |
| | | { |
| | | NMHDR nmhdr; |
| | | DWORD dwData; |
| | | DWORD dwData1; |
| | | DWORD dwData2; |
| | | } BYHORIZONTALLINE_NMHDR; |
| | | |
| | | |
| | | |
| | | #endif |
| | | |
| | | |
| | | |
| | | |
| | | #if _MSC_VER > 1000 |
| | | #pragma once |
| | | #endif // _MSC_VER > 1000 |
| | | |
| | | |
| | | class CHorizontalLine |
| | | { |
| | | public: |
| | | CHorizontalLine(); |
| | | virtual ~CHorizontalLine(); |
| | | |
| | | public: |
| | | static BOOL RegisterWndClass(); |
| | | static CHorizontalLine* Hook(HWND hWnd); |
| | | void Notify(int nCode, int dwData, int dwData1 = 0, int dwData2 = 0); |
| | | void Release(); |
| | | void SetBkgndColor(COLORREF cr); |
| | | void SetLineColor(COLORREF cr); |
| | | static LRESULT CALLBACK WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); |
| | | static LRESULT OnNcCreate(HWND hWnd, WPARAM wParam, LPARAM lParam); |
| | | LRESULT OnDestroy(WPARAM wParam, LPARAM lParam); |
| | | LRESULT OnTimer(WPARAM wParam, LPARAM lParam); |
| | | LRESULT OnPaint(WPARAM wParam, LPARAM lParam); |
| | | |
| | | private: |
| | | HWND m_hWnd; |
| | | COLORREF m_crBkgnd; |
| | | COLORREF m_crLineColor; |
| | | }; |
| | | |
| | | #endif // !defined(AFX_HORIZONTALLINE_H__FBB8916A_DE77_4EA3_9C21_E51E6B06194C__INCLUDED_) |
| | |
| | | #include "Model.h" |
| | | #include "Log.h" |
| | | #include "Common.h" |
| | | #include "ToolUnits.h" |
| | | #include "CEqAlarmStep.h" |
| | | #include "AlarmManager.h" |
| | | |
| | | |
| | | CModel::CModel() |
| | |
| | | pStep->getName().c_str(), pData); |
| | | notifyPtr(RX_CODE_STEP_EVENT_READDATA, pStep); |
| | | |
| | | // å¤çè¦åä¿¡æ¯ |
| | | if (isAlarmStep(pStep)) { |
| | | // ä¿åå°æ°æ®åº |
| | | AlarmManager& alarmManager = AlarmManager::getInstance(); |
| | | std::string strAlarmText; |
| | | SERVO::CEquipment* pEquipment = pStep->getEquipment(); |
| | | SERVO::CEqAlarmStep* pEqAlarmStep = (SERVO::CEqAlarmStep*)pStep; |
| | | const AlarmInfo* pAlarmInfo = alarmManager.getAlarmInfoByID(pEqAlarmStep->getAlarmId()); |
| | | if (pAlarmInfo != nullptr) { |
| | | strAlarmText = pAlarmInfo->strAlarmText; |
| | | } |
| | | int state = pEqAlarmStep->getAlarmState(); |
| | | if (state == 1) { |
| | | LOGE("<CAlarmDlg> åçè¦å"); |
| | | std::string startTime = CToolUnits::timeToString2(CToolUnits::getTimestamp()); |
| | | std::string endTime = ""; |
| | | bool result = alarmManager.addAlarm(std::to_string(pEqAlarmStep->getAlarmId()), |
| | | pEquipment->getName(), strAlarmText, startTime, endTime); |
| | | if (result) { |
| | | LOGI("<CAlarmDlg> Alarm added successfully!"); |
| | | } |
| | | else { |
| | | LOGE("<CAlarmDlg> Failed to add alarm."); |
| | | } |
| | | } |
| | | else { |
| | | LOGE("<CAlarmDlg> iæ¶é¤è¦å"); |
| | | //alarmManager.updateAlarmEndTime(std::to_string(pEqAlarmStep->getAlarmId()), |
| | | // pEquipment->getName()); |
| | | } |
| | | |
| | | m_hsmsPassive.requestAlarmReport(pEqAlarmStep->getAlarmState(), |
| | | pEquipment->getBaseAlarmId() + pEqAlarmStep->getAlarmId(), |
| | | strAlarmText.c_str()); |
| | | } |
| | | } |
| | | }; |
| | | |
| | | m_master.setListener(masterListener); |
| | | |
| | | |
| | | // å è½½è¦åä¿¡æ¯ |
| | | AlarmManager& alarmManager = AlarmManager::getInstance(); |
| | | char szBuffer[MAX_PATH]; |
| | | sprintf_s(szBuffer, MAX_PATH, "%s\\AlarmList.csv", (LPTSTR)(LPCTSTR)m_strWorkDir); |
| | | alarmManager.readAlarmFile(szBuffer); |
| | | |
| | | |
| | | |
| | | return 0; |
| | | } |
| | |
| | | |
| | | return 0; |
| | | } |
| | | |
| | | bool CModel::isAlarmStep(SERVO::CStep* pStep) |
| | | { |
| | | return CToolUnits::startsWith(pStep->getName(), STEP_ALARM_START); |
| | | } |
| | |
| | | void setWorkDir(const char* pszWorkDir); |
| | | int init(); |
| | | int term(); |
| | | bool isAlarmStep(SERVO::CStep* pStep); |
| | | |
| | | public: |
| | | int notify(int code); |
| | |
| | | #include "ServoGraph.h" |
| | | #include "AlarmManager.h" |
| | | #include "SECSRuntimeManager.h" |
| | | #include "VerticalLine.h" |
| | | |
| | | |
| | | // 声æå
¨å±åéï¼ç¨äºç®¡ç GDI+ åå§å |
| | | ULONG_PTR g_diplusToken; |
| | |
| | | |
| | | // æ³¨åæ§ä»¶ |
| | | CServoGraph::RegisterWndClass(); |
| | | CVerticalLine::RegisterWndClass(); |
| | | |
| | | |
| | | // åå§åRxåº |
| | |
| | | <ItemGroup> |
| | | <ClInclude Include="AlarmDlg.h" /> |
| | | <ClInclude Include="AlarmManager.h" /> |
| | | <ClInclude Include="ApredTreeCtrl2.h" /> |
| | | <ClInclude Include="BlButton.h" /> |
| | | <ClInclude Include="CAttribute.h" /> |
| | | <ClInclude Include="CAttributeVector.h" /> |
| | | <ClInclude Include="CBonder.h" /> |
| | | <ClInclude Include="CCLinkPerformance\CCLinkIEControl.h" /> |
| | | <ClInclude Include="CCLinkPerformance\PerformanceMelsec.h" /> |
| | | <ClInclude Include="CEqAlarmStep.h" /> |
| | | <ClInclude Include="CEqCimModeChangeStep.h" /> |
| | | <ClInclude Include="CEqModeStep.h" /> |
| | | <ClInclude Include="CEqProcessStep.h" /> |
| | | <ClInclude Include="CEqStatusStep.h" /> |
| | | <ClInclude Include="CPanelAttributes.h" /> |
| | | <ClInclude Include="CPanelEquipment.h" /> |
| | | <ClInclude Include="CPanelMaster.h" /> |
| | | <ClInclude Include="CReadStep.h" /> |
| | | <ClInclude Include="CStep.h" /> |
| | | <ClInclude Include="CWriteStep.h" /> |
| | | <ClInclude Include="DevicePropertyDlg.h" /> |
| | | <ClInclude Include="CEFEM.h" /> |
| | | <ClInclude Include="CEquipment.h" /> |
| | |
| | | <ClInclude Include="targetver.h" /> |
| | | <ClInclude Include="TerminalDisplayDlg.h" /> |
| | | <ClInclude Include="ToolUnits.h" /> |
| | | <ClInclude Include="VerticalLine.h" /> |
| | | </ItemGroup> |
| | | <ItemGroup> |
| | | <ClCompile Include="AlarmDlg.cpp" /> |
| | | <ClCompile Include="AlarmManager.cpp" /> |
| | | <ClCompile Include="ApredTreeCtrl2.cpp" /> |
| | | <ClCompile Include="BlButton.cpp" /> |
| | | <ClCompile Include="CAttribute.cpp" /> |
| | | <ClCompile Include="CAttributeVector.cpp" /> |
| | | <ClCompile Include="CBonder.cpp" /> |
| | | <ClCompile Include="CCLinkPerformance\CCLinkIEControl.cpp" /> |
| | | <ClCompile Include="CCLinkPerformance\PerformanceMelsec.cpp" /> |
| | | <ClCompile Include="CEqAlarmStep.cpp" /> |
| | | <ClCompile Include="CEqCimModeChangeStep.cpp" /> |
| | | <ClCompile Include="CEqModeStep.cpp" /> |
| | | <ClCompile Include="CEqProcessStep.cpp" /> |
| | | <ClCompile Include="CEqStatusStep.cpp" /> |
| | | <ClCompile Include="CPanelAttributes.cpp" /> |
| | | <ClCompile Include="CPanelEquipment.cpp" /> |
| | | <ClCompile Include="CPanelMaster.cpp" /> |
| | | <ClCompile Include="CReadStep.cpp" /> |
| | | <ClCompile Include="CStep.cpp" /> |
| | | <ClCompile Include="CWriteStep.cpp" /> |
| | | <ClCompile Include="DevicePropertyDlg.cpp" /> |
| | | <ClCompile Include="CEFEM.cpp" /> |
| | | <ClCompile Include="CEquipment.cpp" /> |
| | |
| | | </ClCompile> |
| | | <ClCompile Include="TerminalDisplayDlg.cpp" /> |
| | | <ClCompile Include="ToolUnits.cpp" /> |
| | | <ClCompile Include="VerticalLine.cpp" /> |
| | | </ItemGroup> |
| | | <ItemGroup> |
| | | <ResourceCompile Include="Servo.rc" /> |
| | |
| | | <ClCompile Include="CEqStatusStep.cpp" /> |
| | | <ClCompile Include="CEqAlarmStep.cpp" /> |
| | | <ClCompile Include="AlarmDlg.cpp" /> |
| | | <ClCompile Include="CEqProcessStep.cpp" /> |
| | | <ClCompile Include="CAttribute.cpp" /> |
| | | <ClCompile Include="CAttributeVector.cpp" /> |
| | | <ClCompile Include="CPanelMaster.cpp" /> |
| | | <ClCompile Include="VerticalLine.cpp" /> |
| | | <ClCompile Include="ApredTreeCtrl2.cpp" /> |
| | | <ClCompile Include="CPanelAttributes.cpp" /> |
| | | <ClCompile Include="CReadStep.cpp" /> |
| | | <ClCompile Include="CWriteStep.cpp" /> |
| | | <ClCompile Include="CEqCimModeChangeStep.cpp" /> |
| | | <ClCompile Include="CPanelEquipment.cpp" /> |
| | | </ItemGroup> |
| | | <ItemGroup> |
| | | <ClInclude Include="AlarmManager.h" /> |
| | |
| | | <ClInclude Include="CEqStatusStep.h" /> |
| | | <ClInclude Include="CEqAlarmStep.h" /> |
| | | <ClInclude Include="AlarmDlg.h" /> |
| | | <ClInclude Include="CEqProcessStep.h" /> |
| | | <ClInclude Include="CAttribute.h" /> |
| | | <ClInclude Include="CAttributeVector.h" /> |
| | | <ClInclude Include="CPanelMaster.h" /> |
| | | <ClInclude Include="VerticalLine.h" /> |
| | | <ClInclude Include="ApredTreeCtrl2.h" /> |
| | | <ClInclude Include="CPanelAttributes.h" /> |
| | | <ClInclude Include="CReadStep.h" /> |
| | | <ClInclude Include="CWriteStep.h" /> |
| | | <ClInclude Include="CEqCimModeChangeStep.h" /> |
| | | <ClInclude Include="CPanelEquipment.h" /> |
| | | </ItemGroup> |
| | | <ItemGroup> |
| | | <ResourceCompile Include="Servo.rc" /> |
| | |
| | | <RemoteDebuggerCommand>D:\CLH\Servo\Servo.exe</RemoteDebuggerCommand> |
| | | <RemoteDebuggerWorkingDirectory>D:\CLH\Servo\</RemoteDebuggerWorkingDirectory> |
| | | <RemoteDebuggerServerName>Boounion-0106</RemoteDebuggerServerName> |
| | | <DebuggerFlavor>WindowsRemoteDebugger</DebuggerFlavor> |
| | | <DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor> |
| | | </PropertyGroup> |
| | | </Project> |
| | |
| | | #include "Common.h" |
| | | #include "Log.h" |
| | | #include "SecsTestDlg.h" |
| | | #include "AlarmDlg.h" |
| | | #include <chrono> |
| | | #include <thread> |
| | | #include <cmath> |
| | |
| | | m_pAlarmDlg = nullptr; |
| | | m_pTerminalDisplayDlg = nullptr; |
| | | m_pObserver = nullptr; |
| | | m_pPanelMaster = nullptr; |
| | | m_pPanelEquipment = nullptr; |
| | | m_pPanelAttributes = nullptr; |
| | | } |
| | | |
| | | void CServoDlg::DoDataExchange(CDataExchange* pDX) |
| | |
| | | ON_WM_TIMER() |
| | | ON_WM_ERASEBKGND() |
| | | ON_BN_CLICKED(IDC_BUTTON_ALARM, &CServoDlg::OnBnClickedButtonAlarm) |
| | | ON_BN_CLICKED(IDC_BUTTON_ALARM, &CServoDlg::OnBnClickedButtonAlarm) |
| | | ON_NOTIFY(BYSERVOGRAPH_ITEM_CLICKED, IDC_SERVO_GRAPH1, &CServoDlg::OnGraphItemClicked) |
| | | ON_MESSAGE(ID_MSG_PANEL_RESIZE, OnPanelResize) |
| | | END_MESSAGE_MAP() |
| | | |
| | | |
| | |
| | | } |
| | | } |
| | | } |
| | | else if (RX_CODE_SELECT_EQUIPMENT == code) { |
| | | SERVO::CEquipment* pEquipment = nullptr; |
| | | if (pAny->getPtrValue("ptr", (void*&)pEquipment)) { |
| | | ASSERT(pEquipment); |
| | | ASSERT(m_pPanelEquipment); |
| | | ASSERT(m_pPanelAttributes); |
| | | m_pPanelEquipment->SetEquipment(pEquipment); |
| | | m_pPanelAttributes->ShowWindow(SW_HIDE); |
| | | if (!m_pPanelEquipment->IsWindowVisible()) { |
| | | m_pPanelEquipment->ShowWindow(SW_SHOW); |
| | | Resize(); |
| | | } |
| | | } |
| | | } |
| | | else if (RX_CODE_SELECT_STEP == code) { |
| | | SERVO::CStep* pStep = nullptr; |
| | | if (pAny->getPtrValue("ptr", (void*&)pStep)) { |
| | | ASSERT(pStep); |
| | | ASSERT(m_pPanelEquipment); |
| | | ASSERT(m_pPanelAttributes); |
| | | m_pPanelEquipment->ShowWindow(SW_HIDE); |
| | | m_pPanelAttributes->loadDataFromStep(pStep); |
| | | if (!m_pPanelAttributes->IsWindowVisible()) { |
| | | m_pPanelAttributes->ShowWindow(SW_SHOW); |
| | | Resize(); |
| | | } |
| | | } |
| | | } |
| | | |
| | | pAny->release(); |
| | | }, [&]() -> void { |
| | | // onComplete |
| | |
| | | m_pGraph->SetBoxText(INDICATE_ROBOT_ARM2, "6", "Robot"); |
| | | |
| | | |
| | | |
| | | |
| | | // Vacuum bake |
| | | m_pGraph->AddIndicateBox(INDICATE_VACUUM_BAKE, 396, 516, 48, RGB(22, 22, 22), |
| | | RGB(255, 127, 39), RGB(0, 176, 80)); |
| | |
| | | m_pGraph->AddIndicateBox(INDICATE_MEASUREMENT, 736, 516, 48, RGB(22, 22, 22), |
| | | RGB(255, 127, 39), RGB(0, 176, 80)); |
| | | m_pGraph->SetBoxText(INDICATE_MEASUREMENT, "13", "Measurement"); |
| | | |
| | | |
| | | |
| | | m_pPanelMaster = new CPanelMaster(); |
| | | m_pPanelMaster->Create(IDD_PANEL_MASTER, this); |
| | | m_pPanelMaster->ShowWindow(SW_SHOW); |
| | | m_pPanelEquipment = new CPanelEquipment(); |
| | | m_pPanelEquipment->Create(IDD_PANEL_EQUIPMENT, this); |
| | | m_pPanelAttributes = new CPanelAttributes(); |
| | | m_pPanelAttributes->Create(IDD_PANEL_ATTRIBUTES, this); |
| | | |
| | | |
| | | |
| | | // è°æ´åå§çªå£ä½ç½® |
| | |
| | | |
| | | // ç¸å½äºå»¶æ¶è°ç¨masterçåå§å |
| | | theApp.m_model.m_master.init(); |
| | | |
| | | |
| | | // ç»å®æ°æ® |
| | | { |
| | | SERVO::CEquipment* pEquipment = theApp.m_model.m_master.getEquipment(EQ_ID_EFEM); |
| | | m_pGraph->SetIndicateBoxData(INDICATE_ROBOT_ARM1, pEquipment); |
| | | } |
| | | |
| | | |
| | | return TRUE; // é¤éå°ç¦ç¹è®¾ç½®å°æ§ä»¶ï¼å¦åè¿å TRUE |
| | |
| | | m_pTerminalDisplayDlg = nullptr; |
| | | } |
| | | |
| | | if (m_pPanelMaster != nullptr) { |
| | | m_pPanelMaster->DestroyWindow(); |
| | | delete m_pPanelMaster; |
| | | m_pPanelMaster = nullptr; |
| | | } |
| | | |
| | | if (m_pPanelEquipment != nullptr) { |
| | | m_pPanelEquipment->DestroyWindow(); |
| | | delete m_pPanelEquipment; |
| | | m_pPanelEquipment = nullptr; |
| | | } |
| | | |
| | | if (m_pPanelAttributes != nullptr) { |
| | | m_pPanelAttributes->DestroyWindow(); |
| | | delete m_pPanelAttributes; |
| | | m_pPanelAttributes = nullptr; |
| | | } |
| | | |
| | | if (m_hbrBkgnd != nullptr) { |
| | | ::DeleteObject(m_hbrBkgnd); |
| | | } |
| | |
| | | |
| | | x = 0; |
| | | y = 0; |
| | | int nPanelWidth = 0; |
| | | if (m_pPanelMaster != nullptr) { |
| | | nPanelWidth = m_pPanelMaster->getPanelWidth(); |
| | | m_pPanelMaster->MoveWindow(x, y, nPanelWidth, rcClient.Height()); |
| | | x += nPanelWidth; |
| | | } |
| | | |
| | | if (m_pPanelEquipment != nullptr && m_pPanelEquipment->IsWindowVisible()) { |
| | | nPanelWidth = m_pPanelEquipment->getPanelWidth(); |
| | | m_pPanelEquipment->MoveWindow(x, y, nPanelWidth, rcClient.Height()); |
| | | x += nPanelWidth; |
| | | } |
| | | |
| | | if (m_pPanelAttributes != nullptr && m_pPanelAttributes->IsWindowVisible()) { |
| | | nPanelWidth = m_pPanelAttributes->getPanelWidth(); |
| | | m_pPanelAttributes->MoveWindow(x, y, nPanelWidth, rcClient.Height()); |
| | | x += nPanelWidth; |
| | | } |
| | | |
| | | pItem = GetDlgItem(IDC_SERVO_GRAPH1); |
| | | pItem->GetClientRect(&rcItem); |
| | | pItem->MoveWindow(x, y, rcItem.Width(), rcItem.Height()); |
| | |
| | | void CServoDlg::OnBnClickedButtonAlarm() |
| | | { |
| | | // TODO: 卿¤æ·»å æ§ä»¶éç¥å¤çç¨åºä»£ç |
| | | m_bShowAlarmWnd = !m_bShowAlarmWnd; |
| | | |
| | | // å¦æè¦æ¾ç¤ºæ¥è¦çªå£ï¼åéèæ¥å¿çªå£ |
| | | if (m_bShowAlarmWnd) { |
| | | m_bShowLogWnd = false; |
| | | if (m_pLogDlg != nullptr) { |
| | | m_pLogDlg->ShowWindow(SW_HIDE); |
| | | UpdateLogBtn(); |
| | | } |
| | | } |
| | | |
| | | if (m_pAlarmDlg == nullptr) { |
| | | m_pAlarmDlg = new CAlarmDlg(); |
| | | m_pAlarmDlg->Create(IDD_DIALOG_ALARM, this); |
| | | |
| | | CRect rcWnd; |
| | | GetWindowRect(&rcWnd); |
| | | m_pAlarmDlg->MoveWindow(rcWnd.left, rcWnd.bottom - 8, rcWnd.Width(), 200); |
| | | } |
| | | ASSERT(m_pAlarmDlg); |
| | | m_pAlarmDlg->ShowWindow(m_bShowAlarmWnd ? SW_SHOW : SW_HIDE); |
| | | |
| | | UpdateAlarmBtn(); |
| | | CAlarmDlg dlg; |
| | | dlg.DoModal(); |
| | | } |
| | | |
| | | void CServoDlg::OnGraphItemClicked(NMHDR* pNMHDR, LRESULT* pResult) |
| | | { |
| | | BYSERVOGRAPH_NMHDR* pGraphNmhdr = reinterpret_cast<BYSERVOGRAPH_NMHDR*>(pNMHDR); |
| | | CString s; s.Format(_T("OnGraphItemClicked %d"), pGraphNmhdr->dwData); |
| | | SERVO::CEquipment* pEquipment = (SERVO::CEquipment*)m_pGraph->GetIndicateBoxData(pGraphNmhdr->dwData); |
| | | if (pEquipment != nullptr) { |
| | | AfxMessageBox(pEquipment->getName().c_str()); |
| | | } |
| | | |
| | | |
| | | *pResult = 0; |
| | | } |
| | | |
| | | LRESULT CServoDlg::OnPanelResize(WPARAM wParam, LPARAM lParam) |
| | | { |
| | | int width = wParam; |
| | | // m_pPanel->SetPanelWidth(width); |
| | | Resize(); |
| | | |
| | | return 0; |
| | | } |
| | | |
| | |
| | | #include "LogDlg.h" |
| | | #include "AlarmDlg.h" |
| | | #include "TerminalDisplayDlg.h" |
| | | #include "CPanelMaster.h" |
| | | #include "CPanelEquipment.h" |
| | | #include "CPanelAttributes.h" |
| | | |
| | | |
| | | enum DeviceStatus { |
| | | ONLINE, // å¨çº¿ |
| | |
| | | HBRUSH m_hbrBkgnd; |
| | | CBlButton m_btnLog; |
| | | CBlButton m_btnAlarm; |
| | | |
| | | CPanelMaster* m_pPanelMaster; |
| | | CPanelEquipment* m_pPanelEquipment; |
| | | CPanelAttributes* m_pPanelAttributes; |
| | | |
| | | // çæçæ¶æ¯æ å°å½æ° |
| | | virtual BOOL OnInitDialog(); |
| | |
| | | afx_msg void OnTimer(UINT_PTR nIDEvent); |
| | | afx_msg BOOL OnEraseBkgnd(CDC* pDC); |
| | | afx_msg void OnBnClickedButtonAlarm(); |
| | | afx_msg void OnGraphItemClicked(NMHDR* pNMHDR, LRESULT* pResult); |
| | | afx_msg LRESULT OnPanelResize(WPARAM wParam, LPARAM lParam); |
| | | }; |
| | |
| | | graphics.DrawImage(&bitmap, item.x, item.y); |
| | | graphics.ResetTransform(); |
| | | } |
| | | } |
| | | |
| | | void CServoGraph::SetIndicateBoxData(int id, void* pData) |
| | | { |
| | | INDICATEBOX* pib = GetIndicateBox(id); |
| | | if (pib != nullptr) { |
| | | pib->m_pData = pData; |
| | | } |
| | | } |
| | | |
| | | void* CServoGraph::GetIndicateBoxData(int id) |
| | | { |
| | | INDICATEBOX* pib = GetIndicateBox(id); |
| | | if (pib != nullptr) { |
| | | return pib->m_pData; |
| | | } |
| | | |
| | | return nullptr; |
| | | } |
| | |
| | | this->box2BackgroundColor = RGB(0, 255, 255);; |
| | | this->box2FrameColor = RGB(255, 255, 0);; |
| | | this->bBox2Visible = FALSE; |
| | | this->m_pData = nullptr; |
| | | }; |
| | | ~INDICATEBOX() {}; |
| | | |
| | |
| | | COLORREF box2FrameColor; |
| | | BOOL bBox2Visible; |
| | | std::vector<void*> m_contexts; |
| | | void* m_pData; |
| | | }; |
| | | |
| | | class INDICATEBKGND |
| | |
| | | BOOL RemoveIndicateBoxAllContext(int id); |
| | | const std::vector<void*>& GetIndicateBoxContexts(int id); |
| | | bool IsIndicateBoxContextsEmpty(int id); |
| | | void SetIndicateBoxData(int id, void* pData); |
| | | void* GetIndicateBoxData(int id); |
| | | void ShowIndicateBoxInterior(int id, COLORREF color); |
| | | void HideIndicateBoxInterior(int id); |
| | | CServoGraph::INDICATEBOX* GetIndicateBox(int id); |
| | |
| | | ltm.tm_hour, ltm.tm_min, ltm.tm_sec); |
| | | |
| | | return std::string(buffer); |
| | | } |
| | | |
| | | bool CToolUnits::startsWith(const std::string& str, const std::string& prefix) |
| | | { |
| | | return str.size() >= prefix.size() && str.compare(0, prefix.size(), prefix) == 0; |
| | | } |
| | |
| | | static std::vector<CString> GetFileNamesInDirectory(const CString& strFolderPath, const CString& strExtension); |
| | | static std::string getRecipePath(); |
| | | static std::string getCurrentTimeString(); |
| | | static bool startsWith(const std::string& str, const std::string& prefix); |
| | | }; |
| | | |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | // VerticalLine.cpp: implementation of the CVerticalLine class. |
| | | // |
| | | ////////////////////////////////////////////////////////////////////// |
| | | |
| | | #include "stdafx.h" |
| | | #include "VerticalLine.h" |
| | | |
| | | #ifdef _DEBUG |
| | | #undef THIS_FILE |
| | | static char THIS_FILE[]=__FILE__; |
| | | #define new DEBUG_NEW |
| | | #endif |
| | | |
| | | ////////////////////////////////////////////////////////////////////// |
| | | // Construction/Destruction |
| | | ////////////////////////////////////////////////////////////////////// |
| | | |
| | | CVerticalLine::CVerticalLine() |
| | | { |
| | | m_hWnd = NULL; |
| | | m_crBkgnd = RGB(255, 255, 255); |
| | | m_crLineColor = RGB(222, 222, 222); |
| | | m_bEnableResize = FALSE; |
| | | } |
| | | |
| | | CVerticalLine::~CVerticalLine() |
| | | { |
| | | } |
| | | |
| | | BOOL CVerticalLine::RegisterWndClass() |
| | | { |
| | | WNDCLASS wc; |
| | | wc.lpszClassName = BYVERTICALLINE_CLASS; |
| | | wc.hInstance = AfxGetInstanceHandle(); |
| | | wc.lpfnWndProc = WindowProc; |
| | | wc.hCursor = ::LoadCursor(NULL, IDC_ARROW); |
| | | wc.hIcon = 0; |
| | | wc.lpszMenuName = NULL; |
| | | wc.hbrBackground = NULL; |
| | | wc.style = CS_GLOBALCLASS|CS_DBLCLKS; |
| | | wc.cbClsExtra = 0; |
| | | wc.cbWndExtra = 0; |
| | | |
| | | // 注åèªå®ä¹ç±» |
| | | return (::RegisterClass(&wc) != 0); |
| | | } |
| | | |
| | | CVerticalLine* CVerticalLine::Hook(HWND hWnd) |
| | | { |
| | | CVerticalLine* pVerticalLine = (CVerticalLine*)GetProp(hWnd, BYSTAG_VERTICALLINE); |
| | | if(pVerticalLine == NULL) |
| | | { |
| | | pVerticalLine = new CVerticalLine; |
| | | pVerticalLine->m_hWnd = hWnd; |
| | | |
| | | SetProp(hWnd, BYSTAG_VERTICALLINE, (HANDLE)pVerticalLine); |
| | | } |
| | | |
| | | return pVerticalLine; |
| | | } |
| | | |
| | | void CVerticalLine::Release() |
| | | { |
| | | // delete |
| | | delete this; |
| | | } |
| | | |
| | | void CVerticalLine::Notify(int nCode, int dwData, int dwData1/* = 0*/, int dwData2/* = 0*/) |
| | | { |
| | | HWND hParent; |
| | | hParent = GetParent(m_hWnd); |
| | | if(hParent != NULL) { |
| | | BYVERTICALLINE_NMHDR iii_nmhdr; |
| | | iii_nmhdr.nmhdr.hwndFrom = m_hWnd; |
| | | iii_nmhdr.nmhdr.idFrom = GetWindowLong(m_hWnd, GWL_ID); |
| | | iii_nmhdr.nmhdr.code = nCode; |
| | | iii_nmhdr.dwData = dwData; |
| | | iii_nmhdr.dwData1 = dwData1; |
| | | iii_nmhdr.dwData2 = dwData2; |
| | | SendMessage(hParent, WM_NOTIFY, (WPARAM)iii_nmhdr.nmhdr.idFrom, (LPARAM)&iii_nmhdr); |
| | | } |
| | | } |
| | | |
| | | //////////////////////////////// |
| | | // æ¦æªçªå£æ¶æ¯å½æ° |
| | | LRESULT CALLBACK CVerticalLine::WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) |
| | | { |
| | | CVerticalLine* pVerticalLine = (CVerticalLine *)GetProp(hWnd, BYSTAG_VERTICALLINE); |
| | | if(pVerticalLine == NULL && uMsg != WM_NCCREATE) |
| | | { |
| | | return ::DefWindowProc(hWnd, uMsg, wParam, lParam); |
| | | } |
| | | |
| | | |
| | | // 妿Hookåååºæ¶æ¯ |
| | | ASSERT(hWnd); |
| | | switch(uMsg) |
| | | { |
| | | case WM_NCCREATE: |
| | | return OnNcCreate(hWnd, wParam, lParam); |
| | | |
| | | case WM_DESTROY: |
| | | return pVerticalLine->OnDestroy(wParam, lParam); |
| | | |
| | | case WM_PAINT: |
| | | return pVerticalLine->OnPaint(wParam, lParam); |
| | | |
| | | case WM_TIMER: |
| | | return pVerticalLine->OnTimer(wParam, lParam); |
| | | |
| | | case WM_SETCURSOR: |
| | | return pVerticalLine->OnSetCursor(wParam, lParam); |
| | | |
| | | case WM_LBUTTONDOWN: |
| | | return pVerticalLine->OnLButtonDown(wParam, lParam); |
| | | |
| | | case WM_GETDLGCODE: |
| | | return DLGC_WANTALLKEYS; |
| | | |
| | | default: |
| | | break; |
| | | } |
| | | |
| | | return ::DefWindowProc(hWnd, uMsg, wParam, lParam); |
| | | } |
| | | |
| | | /////////////////////////////// |
| | | // WM_NCCREATE |
| | | // çªå£å建åçåå§åå·¥ä½ |
| | | LRESULT CVerticalLine::OnNcCreate(HWND hWnd, WPARAM wParam, LPARAM lParam) |
| | | { |
| | | CVerticalLine* pVerticalLine = (CVerticalLine *)GetProp(hWnd, BYSTAG_VERTICALLINE); |
| | | ASSERT(pVerticalLine == NULL); |
| | | |
| | | Hook(hWnd); |
| | | return ::DefWindowProc(hWnd, WM_NCCREATE, wParam, lParam); |
| | | } |
| | | |
| | | /////////////////////////////// |
| | | // WM_DESTROY |
| | | LRESULT CVerticalLine::OnDestroy(WPARAM wParam, LPARAM lParam) |
| | | { |
| | | Release(); |
| | | return ::DefWindowProc(m_hWnd, WM_DESTROY, wParam, lParam); |
| | | } |
| | | |
| | | /////////////////////////////// |
| | | // WM_TIMER |
| | | LRESULT CVerticalLine::OnTimer(WPARAM wParam, LPARAM lParam) |
| | | { |
| | | return ::DefWindowProc(m_hWnd, WM_TIMER, wParam, lParam); |
| | | } |
| | | |
| | | /////////////////////////////// |
| | | // WM_SETCURSOR |
| | | LRESULT CVerticalLine::OnSetCursor(WPARAM wParam, LPARAM lParam) |
| | | { |
| | | if(m_bEnableResize) { |
| | | SetCursor(::LoadCursor(NULL, IDC_SIZEWE)); |
| | | return TRUE; |
| | | } |
| | | |
| | | return ::DefWindowProc(m_hWnd, WM_SETCURSOR, wParam, lParam); |
| | | } |
| | | |
| | | /* |
| | | * WM_LBUTTONDOWN |
| | | * é¼ æ å·¦é®æä¸ |
| | | */ |
| | | LRESULT CVerticalLine::OnLButtonDown(WPARAM wParam, LPARAM lParam) |
| | | { |
| | | if (!m_bEnableResize) { |
| | | return ::DefWindowProc(m_hWnd, WM_LBUTTONDOWN, wParam, lParam); |
| | | } |
| | | |
| | | |
| | | POINT pt, ptNew; |
| | | pt.x = LOWORD(lParam); |
| | | pt.y = HIWORD(lParam); |
| | | int nMoveX = 0; |
| | | |
| | | |
| | | // ææé¼ æ æ¶æ¯ï¼æ£æµæ¯å¦æå¨ |
| | | RECT rcParent, rcWindows; |
| | | GetClientRect(m_hWnd, &rcWindows); |
| | | ::ClientToScreen(m_hWnd, (LPPOINT)&rcWindows); |
| | | ::ClientToScreen(m_hWnd, (LPPOINT)&rcWindows.right); |
| | | GetClientRect(GetParent(m_hWnd), &rcParent); |
| | | ::ClientToScreen(GetParent(m_hWnd), (LPPOINT)&rcParent); |
| | | HDC hDC = GetDC(GetDesktopWindow()); |
| | | ::DrawFocusRect(hDC, &rcWindows); |
| | | |
| | | if (::GetCapture() == NULL) { |
| | | SetCapture(m_hWnd); |
| | | ASSERT(m_hWnd == GetCapture()); |
| | | AfxLockTempMaps(); |
| | | for (;;) { |
| | | MSG msg; |
| | | VERIFY(::GetMessage(&msg, NULL, 0, 0)); |
| | | |
| | | if (GetCapture() != m_hWnd) break; |
| | | |
| | | switch (msg.message) |
| | | { |
| | | case WM_MOUSEMOVE: |
| | | ptNew = msg.pt; |
| | | if (ptNew.x < rcParent.left) ptNew.x = rcParent.left; |
| | | ::DrawFocusRect(hDC, &rcWindows); |
| | | rcWindows.left = ptNew.x - 3; |
| | | rcWindows.right = ptNew.x + 3; |
| | | ::DrawFocusRect(hDC, &rcWindows); |
| | | ::ScreenToClient(m_hWnd, &ptNew); |
| | | break; |
| | | |
| | | case WM_LBUTTONUP: |
| | | ptNew = msg.pt; |
| | | ::ScreenToClient(m_hWnd, &ptNew); |
| | | nMoveX = ptNew.x - pt.x; |
| | | goto ExitLoop; |
| | | |
| | | case WM_KEYDOWN: |
| | | if (msg.wParam == VK_ESCAPE) { |
| | | goto ExitLoop; |
| | | } |
| | | break; |
| | | |
| | | default: |
| | | DispatchMessage(&msg); |
| | | break; |
| | | } |
| | | } |
| | | |
| | | ExitLoop: |
| | | ::DrawFocusRect(hDC, &rcWindows); |
| | | ReleaseDC(GetDesktopWindow(), hDC); |
| | | ReleaseCapture(); |
| | | ::InvalidateRect(m_hWnd, NULL, TRUE); |
| | | Notify((int)BYVERTICALLINE_MOVEX, nMoveX); |
| | | AfxUnlockTempMaps(FALSE); |
| | | } |
| | | |
| | | |
| | | return ::DefWindowProc(m_hWnd, WM_LBUTTONDOWN, wParam, lParam); |
| | | } |
| | | |
| | | /////////////////////////////// |
| | | // WM_PAINT |
| | | LRESULT CVerticalLine::OnPaint(WPARAM wParam, LPARAM lParam) |
| | | { |
| | | HDC hDC, hMemDC; |
| | | HBITMAP hBitmap; |
| | | RECT rcClient; |
| | | CString strText; |
| | | HFONT hFont; |
| | | HBRUSH hBrushBK; |
| | | |
| | | |
| | | // BeginPaint |
| | | PAINTSTRUCT ps; |
| | | hDC = BeginPaint(m_hWnd, &ps); |
| | | GetClientRect(m_hWnd, &rcClient); |
| | | |
| | | hMemDC = ::CreateCompatibleDC(hDC); |
| | | hBitmap = ::CreateCompatibleBitmap(hDC, rcClient.right-rcClient.left, |
| | | rcClient.bottom-rcClient.top); |
| | | ::SelectObject(hMemDC, hBitmap); |
| | | |
| | | hFont = (HFONT)GetStockObject(DEFAULT_GUI_FONT); |
| | | ::SelectObject(hMemDC, hFont); |
| | | |
| | | |
| | | // èæ¯é¢è² |
| | | hBrushBK = CreateSolidBrush( m_crBkgnd ); |
| | | ::FillRect(hMemDC, &rcClient, hBrushBK); |
| | | DeleteObject(hBrushBK); |
| | | |
| | | |
| | | // ç»çº¿ |
| | | HPEN hPen = CreatePen(PS_SOLID, 1, m_crLineColor); |
| | | HPEN hOldPen = (HPEN)::SelectObject(hMemDC, hPen); |
| | | ::MoveToEx(hMemDC, rcClient.right-1, 0, NULL); |
| | | LineTo(hMemDC, rcClient.right - 1, rcClient.bottom); |
| | | ::SelectObject(hMemDC, hOldPen); |
| | | |
| | | |
| | | // EndPaint |
| | | ::BitBlt(hDC, 0, 0, rcClient.right-rcClient.left, rcClient.bottom-rcClient.top, |
| | | hMemDC, 0, 0, SRCCOPY); |
| | | EndPaint(m_hWnd, &ps); |
| | | ::DeleteObject(hBitmap); |
| | | ::DeleteDC(hMemDC); |
| | | |
| | | |
| | | return 1; |
| | | } |
| | | |
| | | void CVerticalLine::SetBkgndColor(COLORREF cr) |
| | | { |
| | | m_crBkgnd = cr; |
| | | } |
| | | |
| | | void CVerticalLine::SetLineColor(COLORREF cr) |
| | | { |
| | | m_crLineColor = cr; |
| | | } |
| | | |
| | | void CVerticalLine::EnableResize() |
| | | { |
| | | m_bEnableResize = TRUE; |
| | | } |
| | | |
| | | void CVerticalLine::DisableResize() |
| | | { |
| | | m_bEnableResize = FALSE; |
| | | } |
| | | |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | // VerticalLine.h: interface for the CVerticalLine class. |
| | | // |
| | | ////////////////////////////////////////////////////////////////////// |
| | | |
| | | #if !defined(AFX_VERTICALLINE_H__FBB8916A_DE77_4EA3_9C21_E51E6B06194C__INCLUDED_) |
| | | #define AFX_VERTICALLINE_H__FBB8916A_DE77_4EA3_9C21_E51E6B06194C__INCLUDED_ |
| | | |
| | | |
| | | #pragma comment(lib, "Msimg32.lib") // TransparentBlt |
| | | |
| | | |
| | | |
| | | //====== VerticalLine ===================================================== |
| | | |
| | | #ifndef NOVERTICALLINE |
| | | |
| | | #ifdef _WIN32 |
| | | |
| | | #define BYVERTICALLINE_CLASSA "BYVerticalLine" |
| | | #define BYVERTICALLINE_CLASSW L"BYVerticalLine" |
| | | |
| | | #ifdef UNICODE |
| | | #define BYVERTICALLINE_CLASS BYVERTICALLINE_CLASSW |
| | | #else |
| | | #define BYVERTICALLINE_CLASS BYVERTICALLINE_CLASSA |
| | | #endif |
| | | |
| | | #else |
| | | #define BYVERTICALLINE_CLASS "BYVerticalLine" |
| | | #endif |
| | | |
| | | |
| | | #define BYSTAG_VERTICALLINE _T("ISVERTICALLINE") |
| | | |
| | | |
| | | //====== WM_NOTIFY codes (NMHDR.code values) ================================== |
| | | #define BYVERTICALLINE_FIRST (0U-2330U) // |
| | | #define BYVERTICALLINE_LAST (0U-2320U) |
| | | #define BYVERTICALLINE_MOVEX (BYVERTICALLINE_FIRST - 1) |
| | | |
| | | |
| | | typedef struct tagBYVERTICALLINE_NMHDR |
| | | { |
| | | NMHDR nmhdr; |
| | | DWORD dwData; |
| | | DWORD dwData1; |
| | | DWORD dwData2; |
| | | } BYVERTICALLINE_NMHDR; |
| | | |
| | | |
| | | |
| | | #endif |
| | | |
| | | |
| | | |
| | | |
| | | #if _MSC_VER > 1000 |
| | | #pragma once |
| | | #endif // _MSC_VER > 1000 |
| | | |
| | | |
| | | class CVerticalLine |
| | | { |
| | | public: |
| | | CVerticalLine(); |
| | | virtual ~CVerticalLine(); |
| | | |
| | | |
| | | public: |
| | | void EnableResize(); |
| | | void DisableResize(); |
| | | static BOOL RegisterWndClass(); |
| | | static CVerticalLine* Hook(HWND hWnd); |
| | | void Notify(int nCode, int dwData, int dwData1 = 0, int dwData2 = 0); |
| | | void Release(); |
| | | void SetBkgndColor(COLORREF cr); |
| | | void SetLineColor(COLORREF cr); |
| | | static LRESULT CALLBACK WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); |
| | | static LRESULT OnNcCreate(HWND hWnd, WPARAM wParam, LPARAM lParam); |
| | | LRESULT OnDestroy(WPARAM wParam, LPARAM lParam); |
| | | LRESULT OnTimer(WPARAM wParam, LPARAM lParam); |
| | | LRESULT OnSetCursor(WPARAM wParam, LPARAM lParam); |
| | | LRESULT OnPaint(WPARAM wParam, LPARAM lParam); |
| | | LRESULT OnLButtonDown(WPARAM wParam, LPARAM lParam); |
| | | |
| | | private: |
| | | HWND m_hWnd; |
| | | COLORREF m_crBkgnd; |
| | | COLORREF m_crLineColor; |
| | | |
| | | private: |
| | | BOOL m_bEnableResize; |
| | | }; |
| | | |
| | | #endif // !defined(AFX_VERTICALLINE_H__FBB8916A_DE77_4EA3_9C21_E51E6B06194C__INCLUDED_) |