Yao Chunli
2022-06-21 e00d5a1575d26f8fec1be6fa8a844203cd66a24c
MTerm2/MTerm2View.cpp
@@ -16,7 +16,7 @@
#include "DialogSetCoil.h"
#include "DialogSetData.h"
#include "DialogIoComment.h"
#include "KDefine.h"
#ifdef _DEBUG
#define new DEBUG_NEW
@@ -196,8 +196,8 @@
   xform1.eM12 = 0;
   xform1.eM21 = 0;
   xform1.eM22 = 1;
   xform1.eDx = -scroll1.x;
   xform1.eDy = -scroll1.y;
   xform1.eDx = float(-scroll1.x);
   xform1.eDy = float(-scroll1.y);
   XFORM xform2 = { 1, 0, 0, 1, 0, 0 };
@@ -209,6 +209,34 @@
   return 0;
}
int CMTerm2View::ScrollToCell(int nRow, int nCol)
{
   int CellTotalHeight = m_CellHeight + (m_bShowComments ? m_CommentHeight : 0);
   CSize sizeTotal;
   // TODO: 计算此视图的合计大小
   sizeTotal.cx = m_LeftMargin + m_CellWidth * m_CellPerLine + m_CellWidth * 2;
   sizeTotal.cy = m_TopMargin + CellTotalHeight * (m_nTotalRow );
   CSize sizeSb;
   GetScrollBarSizes(sizeSb);
   POINT pt1;
   pt1.x = 0;
   pt1.y = nRow * CellTotalHeight;
   ScrollToPosition(pt1);
   return 0;
}
int CMTerm2View::ScrollCellIntoView(int nRow, int nCol)
{
   int CellTotalHeight = m_CellHeight + (m_bShowComments ? m_CommentHeight : 0);
   return 0;
}
int CMTerm2View::isCellInView(int nRow, int nCol)
{
   int CellTotalHeight = m_CellHeight + (m_bShowComments ? m_CommentHeight : 0);
   return 0;
}
int CMTerm2View::DrawLDSGraph(CDC* pDC)
{
@@ -1164,8 +1192,8 @@
   s1.Format(_T("LD db Clk %d %d  %02X  Scroll %d %d  Total %d %d Row %d Col %d"),
      point.x, point.y, nFlags, scroll1.x, scroll1.y, tx, ty, nRow, nCol);
   m_pStatusBar->SetPaneText(6, s1);
   m_pStatusBar->SetPaneBackgroundColor(6, RGB(255, 255, 0));
   m_pStatusBar->SetPaneTextColor(6, RGB(0, 0, 255));
//   m_pStatusBar->SetPaneBackgroundColor(6, RGB(255, 255, 0));
//   m_pStatusBar->SetPaneTextColor(6, RGB(0, 0, 255));
//   m_pStatusBar->EnablePaneProgressBar(6);
//   m_pStatusBar->SetPaneProgress(6, 5);
   SysLog(s1);
@@ -1417,11 +1445,39 @@
         Cells[m_FocusRow][j].bLeftLineDn = 1;
      }
   }
   m_bModified = 1;
   needReDraw = 1;
   this->RedrawWindow();
}
int FindTypeIndex(CString str[], CString strType, int num)
{
   for (int i = 0;i < num;i++)
   {
      if (strType == str[i])
      {
         return i;
      }
   }
   return -1;
}
void CMTerm2View::GetIncToView(stCell cell1)               //**************************************************************************************************//
{
   Cells[m_FocusRow][m_FocusCol] = cell1;
   m_bModified = 1;
   needReDraw = 1;
   m_FocusCol += 1;
   if (m_FocusCol >= 16)
   { m_FocusCol = 0;m_FocusRow += 1; }
   this->RedrawWindow();
}
void CMTerm2View::OnUpdateInsertBlankLine(CCmdUI *pCmdUI)
{
   // TODO: 在此添加命令更新用户界面处理程序代码
@@ -1507,17 +1563,17 @@
      if (!pDoc->m_bOnline) {
         s1 = _T("离线");
         m_pStatusBar->SetPaneText(idxOnline, s1);
         m_pStatusBar->SetPaneBackgroundColor(idxOnline);
//         m_pStatusBar->SetPaneBackgroundColor(idxOnline);
      }
      else if (pDoc->m_bOnline) {
         if (pDoc->m_bSimulate)   {
            s1 = _T("在线(仿真)");
            m_pStatusBar->SetPaneText(2, s1);
            m_pStatusBar->SetPaneBackgroundColor(idxOnline, OnlineColor);
//            m_pStatusBar->SetPaneBackgroundColor(idxOnline, OnlineColor);
         }else{
            s1 = _T("在线");
            m_pStatusBar->SetPaneText(2, s1);
            m_pStatusBar->SetPaneBackgroundColor(idxOnline, OnlineColor);
//            m_pStatusBar->SetPaneBackgroundColor(idxOnline, OnlineColor);
         }
      }
   }
@@ -1525,20 +1581,20 @@
      if (!pDoc->m_bOnline)      {
         s1 = _T("");
         m_pStatusBar->SetPaneText(idxRunning, s1);
         m_pStatusBar->SetPaneBackgroundColor(idxRunning);
         m_pStatusBar->SetPaneWidth(idxRunning, 0);
//         m_pStatusBar->SetPaneBackgroundColor(idxRunning);
//         m_pStatusBar->SetPaneWidth(idxRunning, 0);
         m_pStatusBar->SetPaneStyle(idxRunning, SBPS_DISABLED);
      }else if (!pDoc->m_bPlcRunning) {
         s1 = _T("PROG");
         m_pStatusBar->SetPaneText(idxRunning, s1);
         m_pStatusBar->SetPaneWidth(idxRunning, s1.GetLength()*8);
         m_pStatusBar->SetPaneBackgroundColor(idxRunning, ProgColor);
//         m_pStatusBar->SetPaneWidth(idxRunning, s1.GetLength()*8);
//         m_pStatusBar->SetPaneBackgroundColor(idxRunning, ProgColor);
      }else {
         s1 = _T("RUN");
         m_pStatusBar->SetPaneText(idxRunning, s1);
         m_pStatusBar->SetPaneWidth(idxRunning, s1.GetLength() * 8);
         m_pStatusBar->SetPaneBackgroundColor(idxRunning, RunningColor);
//         m_pStatusBar->SetPaneWidth(idxRunning, s1.GetLength() * 8);
//         m_pStatusBar->SetPaneBackgroundColor(idxRunning, RunningColor);
      }
   }
   if (nIndex == idxMonitor || nIndex == -1) { // 监控 //
@@ -1546,11 +1602,11 @@
      if (!m_bMonitoring) {
         s1 = _T("[监控停止]");
         m_pStatusBar->SetPaneText(idxMonitor, s1);
         m_pStatusBar->SetPaneBackgroundColor(idxMonitor);
//         m_pStatusBar->SetPaneBackgroundColor(idxMonitor);
      }else{
         s1 = _T("[正在监控]");
         m_pStatusBar->SetPaneText(idxMonitor, s1);
         m_pStatusBar->SetPaneBackgroundColor(idxMonitor, MonitorColor);
//         m_pStatusBar->SetPaneBackgroundColor(idxMonitor, MonitorColor);
      }
   }
   if (nIndex == idxAddress || nIndex == -1) { // 地址,本站
@@ -1558,11 +1614,11 @@
      if (!pDoc->m_bOnline) {
         s1 = _T("本站");
         m_pStatusBar->SetPaneText(idxAddress, s1);
         m_pStatusBar->SetPaneBackgroundColor(idxMonitor);
//         m_pStatusBar->SetPaneBackgroundColor(idxMonitor);
      }else {
         s1 = _T("本站");
         m_pStatusBar->SetPaneText(idxAddress, s1);
         m_pStatusBar->SetPaneBackgroundColor(idxMonitor, AddressColor);
//         m_pStatusBar->SetPaneBackgroundColor(idxMonitor, AddressColor);
      }
   }
@@ -1631,12 +1687,12 @@
   if (pDoc->m_bPlcRunning) {
      s1 = _T("运行");
      m_pStatusBar->SetPaneText(3, s1);
      m_pStatusBar->SetPaneTextColor(3, RGB(0, 0, 0));
//      m_pStatusBar->SetPaneTextColor(3, RGB(0, 0, 0));
   }
   else {
      s1 = _T("停止");
      m_pStatusBar->SetPaneText(3, s1);
      m_pStatusBar->SetPaneTextColor(3, RGB(0, 0, 0));
//      m_pStatusBar->SetPaneTextColor(3, RGB(0, 0, 0));
   }
   s1.Format(_T("PCmdUI %d %d"), pCmdUI->m_nID, pCmdUI->m_nIndex);
   DbgLog(s1);
@@ -2265,6 +2321,7 @@
int CMTerm2View::TransLDSToProg()
{
   // TODO: 在此处添加实现代码.
   CMTerm2Doc * pDoc = GetDocument();
   CString s1;
   s1.Format(_T("Trans LDS to PRrog"));
   DbgLog(s1);
@@ -2292,6 +2349,7 @@
         nDivCount++;
      }
   }
   stProgSection allprogs;
   //每段单独处理
   for (int i = 0; i < nDivCount; i++)   {
      int nStartLine, nEndLine;
@@ -2342,25 +2400,54 @@
      nCurPosX = 0;
      CString sProg;
      int nAllSteps=0;
      stProgSection Progsec;
      for (int i = nStartLine; i <= nEndLine; i++){
         CString ProgSec;
         CString sProgSec;
         int nSteps = 0;;
         nCurPosY = i;
         stProgSection thisprogsec;
         if (Cells[i][0].nType)
         ScanLDSCells(nStartLine, nEndLine, nCurPosY, nCurPosX, 0, ProgSec,nSteps);
         sProg += ProgSec;
         ScanLDSCells(nStartLine, nEndLine, nCurPosY, nCurPosX, 0, thisprogsec, sProgSec,nSteps);
         sProg += sProgSec;
         nAllSteps += nSteps;
         Progsec += thisprogsec;
      }
      DbgLog(_T("\r\n")+ sProg);
      int n = int(Progsec.Progs.size());
      s1.Format(_T("progSec steps %d "), n);
      DbgLog(s1);
      for (int i = 0; i < n; i++) {
         int optype = Progsec.Progs[i].nOpType1;
         CStringA OpTxtA, OpShowTxtA;
         CString OpTxt, OpShowTxt;
         pDoc->OpToTxt(optype, OpTxtA);
         pDoc->OpToShowTxt(optype, OpShowTxtA);
         OpTxt = OpTxtA;
         OpShowTxt = OpShowTxtA;
         s1.Format(_T("%d %s %s"), optype, OpTxt, OpShowTxt);
         DbgLog(s1);
      }
      allprogs += Progsec;
   }
   //输出程序
   int n=(int)allprogs.Progs.size();
   s1.Format(_T("all prog steps %d "), n);
   DbgLog(s1);
   for (int i = 0; i < n; i++)   {
      int optype=allprogs.Progs[i].nOpType1;
      CStringA OpTxtA,OpShowTxtA;
      CString OpTxt,OpShowTxt;
      pDoc->OpToTxt(optype, OpTxtA);
      pDoc->OpToShowTxt(optype, OpShowTxtA);
      OpTxt = OpTxtA;
      OpShowTxt = OpShowTxtA;
      s1.Format(_T("%d %s %s"), optype, OpTxt, OpShowTxt);
//      DbgLog(s1);
   }
   return 0;
}
int CMTerm2View::ScanLDSCells(int nStartLine, int nEndLine, int nPosY, int nPosX, int nLevel, CString & sProgSec, int &nSteps)
int CMTerm2View::ScanLDSCells(int nStartLine, int nEndLine, int nPosY, int nPosX, int nLevel, stProgSection & progsec, CString & sProgSec, int &nSteps)
{
   // TODO: 在此处添加实现代码.
   CString s1;
@@ -2374,14 +2461,20 @@
      //先处理当前单元;
      int nType = Cells[nCurPosY][nCurPosX].nType;
      CString sCellName = Cells[nCurPosY][nCurPosX].sCoilName;
      CMTerm2Doc::stProg theprog;
      if (nType == typeNO) {
         if (j==0) {
            s1.Format(_T("%d %d ST %s"), nCurPosY, nCurPosX,sCellName);
            sProgSec.AppendFormat(_T("ST %s\r\n"),sCellName);
            theprog.nOpType1 = OP_ST;
            progsec.Append(theprog);
         }
         else {
            s1.Format(_T("%d %d AN %s"), nCurPosY, nCurPosX, sCellName);
            sProgSec.AppendFormat(_T("NO %s\r\n"), sCellName);
            theprog.nOpType1 = OP_AN;
            progsec.Append(theprog);
         }
         nSteps += 1;
         DbgLog(s1);
@@ -2391,11 +2484,16 @@
         if (j == 0) {
            s1.Format(_T("%d %d ST/ %s"), nCurPosY, nCurPosX, sCellName);
            sProgSec.AppendFormat(_T("ST/ %s\r\n"), sCellName);
            theprog.nOpType1 = OP_ST_;
            progsec.Append(theprog);
         }
         else
         {
            s1.Format(_T("%d %d AN/ %s"), nCurPosY, nCurPosX, sCellName);
            sProgSec.AppendFormat(_T("AN/ %s\r\n"), sCellName);
            theprog.nOpType1 = OP_AN_;
            progsec.Append(theprog);
         }
         DbgLog(s1);
         nSteps += 1;
@@ -2404,6 +2502,7 @@
      if (nType == typePP) {
         s1.Format(_T("%d %d PP %s"), nCurPosY, nCurPosX, sCellName);
         DbgLog(s1);
         //progsec.Append(theprog);
         sProgSec.AppendFormat(_T("PP %s\r\n"), sCellName);
         nSteps += 1;
         nNextX =  1;
@@ -2411,6 +2510,7 @@
      if (nType == typePN) {
         s1.Format(_T("%d %d PN %s"), nCurPosY, nCurPosX, sCellName);
         DbgLog(s1);
         //progsec.Append(theprog);
         sProgSec.AppendFormat(_T("PN %s\r\n"), sCellName, sCellName);
         nSteps += 1;
         nNextX =  1;
@@ -2419,6 +2519,8 @@
         s1.Format(_T("%d %d NOT %s"), nCurPosY, nCurPosX, sCellName);
         DbgLog(s1);
         sProgSec.AppendFormat(_T("NOT %s\r\n"), sCellName);
         theprog.nOpType1 = OP_NOT;
         progsec.Append(theprog);
         nSteps += 1;
         nNextX =  1;
      }else 
@@ -2426,6 +2528,8 @@
         s1.Format(_T("%d %d DF %s"), nCurPosY, nCurPosX, sCellName);
         DbgLog(s1);
         sProgSec.AppendFormat(_T("DF %s\r\n"), sCellName);
         theprog.nOpType1 = OP_DF;
         progsec.Append(theprog);
         nSteps += 1;
         nNextX =  1;
      }else 
@@ -2433,6 +2537,8 @@
         s1.Format(_T("%d %d DF/ %s"), nCurPosY, nCurPosX, sCellName);
         DbgLog(s1);
         sProgSec.AppendFormat(_T("DF/ %s\r\n"), sCellName);
         theprog.nOpType1 = OP_DF_;
         progsec.Append(theprog);
         nSteps += 1;
         nNextX =  1;
      }else 
@@ -2440,6 +2546,8 @@
         s1.Format(_T("%d %d OUT %s"), nCurPosY, nCurPosX, sCellName);
         DbgLog(s1);
         sProgSec.AppendFormat(_T("OUT %s\r\n"), sCellName);
         theprog.nOpType1 = OP_OUT;
         progsec.Append(theprog);
         nSteps += 1;
         nNextX =  1;
      }else 
@@ -2447,6 +2555,8 @@
         s1.Format(_T("%d %d SET %s"), nCurPosY, nCurPosX, sCellName);
         DbgLog(s1);
         sProgSec.AppendFormat(_T("SET %s\r\n"), sCellName);
         theprog.nOpType1 = OP_SET;
         progsec.Append(theprog);
         nSteps += 1;
         nNextX =  1;
      }else 
@@ -2454,12 +2564,16 @@
         s1.Format(_T("%d %d RESET %s"), nCurPosY, nCurPosX, sCellName);
         DbgLog(s1);
         sProgSec.AppendFormat(_T("RESET %s\r\n"), sCellName);
         theprog.nOpType1 = OP_RESET;
         progsec.Append(theprog);
         nSteps += 1;
         nNextX =  1;
      }else 
      if (nType == typeCMP) {
         s1.Format(_T("%d %d CMP %s %s %s"), nCurPosY, nCurPosX, sCellName,Cells[nCurPosY][nCurPosX+1].sParam,Cells[nCurPosY][nCurPosX + 2].sParam);
         DbgLog(s1);
         theprog.nOpType1 = OP_ST_GT;
         progsec.Append(theprog);
         sProgSec.AppendFormat(_T("CMP %s %s %s \r\n"), sCellName, Cells[nCurPosY][nCurPosX + 1].sParam, Cells[nCurPosY][nCurPosX + 2].sParam);
         nSteps += 1;
         nNextX =  3;
@@ -2467,6 +2581,8 @@
      if (nType == typeTM) {
         s1.Format(_T("%d %d TM %s %d %s"), nCurPosY, nCurPosX, sCellName,Cells[nCurPosY][nCurPosX+1].sParam,Cells[nCurPosY][nCurPosX + 2].sParam);
         DbgLog(s1);
         theprog.nOpType1 = OP_TMX;
         progsec.Append(theprog);
         sProgSec.AppendFormat(_T("TM %s %d %s\r\n"), sCellName, Cells[nCurPosY][nCurPosX+1].sParam, Cells[nCurPosY][nCurPosX + 2].sParam);
         nSteps += 1;
         nNextX =  3;
@@ -2474,6 +2590,8 @@
      if (nType == typeFN1) {
         s1.Format(_T("%d %d FN1 %s %s"), nCurPosY, nCurPosX, sCellName,Cells[nCurPosY][nCurPosX + 1].sParam);
         DbgLog(s1);
         theprog.nOpType1 = OP_INC;
         progsec.Append(theprog);
         sProgSec.AppendFormat(_T("FN1 %s %s\r\n"), sCellName, Cells[nCurPosY][nCurPosX + 1].sParam);
         nSteps += 1;
         nNextX =  2;
@@ -2481,6 +2599,8 @@
      if (nType == typeFN2) {
         s1.Format(_T("%d %d FN2 %s %s %s "), nCurPosY, nCurPosX, sCellName, Cells[nCurPosY][nCurPosX + 1].sParam, Cells[nCurPosY][nCurPosX + 2].sParam);
         DbgLog(s1);
         theprog.nOpType1 = OP_MV;
         progsec.Append(theprog);
         sProgSec.AppendFormat(_T("FN2 %s %s %s \r\n"), sCellName, Cells[nCurPosY][nCurPosX + 1].sParam, Cells[nCurPosY][nCurPosX + 2].sParam);
         nSteps += 1;
         nNextX =  3;
@@ -2488,6 +2608,8 @@
      if (nType == typeFN3) {
         s1.Format(_T("%d %d FN3 %s %s %s %s"), nCurPosY, nCurPosX, sCellName, Cells[nCurPosY][nCurPosX + 1].sParam, Cells[nCurPosY][nCurPosX + 2].sParam, Cells[nCurPosY][nCurPosX + 3].sParam);
         DbgLog(s1);
         theprog.nOpType1 = OP_ADD3;
         progsec.Append(theprog);
         sProgSec.AppendFormat(_T("FN3 %s %s %s %s\r\n"), sCellName, Cells[nCurPosY][nCurPosX + 1].sParam, Cells[nCurPosY][nCurPosX + 2].sParam, Cells[nCurPosY][nCurPosX + 3].sParam);
         nSteps += 1;
         nNextX =  4;
@@ -2495,12 +2617,15 @@
         nNextX =  1;
         //continue;
      }
      if (j + nNextX >= m_CellPerLine) continue;
      if (Cells[nCurPosY][j + nNextX].bLeftLineUp || Cells[nCurPosY][j + nNextX].bLeftLineDn) {   // 发现竖线
         //先看往上面有没有连接
         if (Cells[nCurPosY][j + nNextX].bLeftLineUp) { // 往上面有连接
            s1.Format(_T("%d %d ORS "), nCurPosY, nCurPosX);
            DbgLog(s1);
            theprog.nOpType1 = OP_ORS;
            progsec.Append(theprog);
            sProgSec.AppendFormat(_T("ORS \r\n"));
            nSteps += 1;
            nLevel -= 1;
@@ -2524,6 +2649,8 @@
               if ( nPosX >0 || nLevel > 0) {
               s1.Format(_T("%d %d ANS "), nCurPosY, nCurPosX);
               DbgLog(s1);
               theprog.nOpType1 = OP_ANS;
               progsec.Append(theprog);
               sProgSec.AppendFormat(_T("ANS \r\n"));
               nSteps += 1;
               nLevel -= 1;
@@ -2552,9 +2679,11 @@
               DbgLog(s1);
               CString ProgSec;
               int theSteps = 0;
               int r = ScanLDSCells(nStartLine, nEndLine, nLineTop, j + nNextX, nLevel,ProgSec,theSteps);
               stProgSection thisprogsec;
               int r = ScanLDSCells(nStartLine, nEndLine, nLineTop, j + nNextX, nLevel,thisprogsec, ProgSec,theSteps);
               sProgSec += ProgSec;
               nSteps += theSteps;
               progsec += thisprogsec;
               s1.Format(_T("<<<< Re %d : %d , Result %d "), nLineTop, j + nNextX, r);
               DbgLog(s1);
            }
@@ -2576,9 +2705,11 @@
                     CString ProgSec;
                     int theSteps = 0;
                     nLevel += 1;
                     res[nRightCount] = ScanLDSCells(nStartLine, nEndLine, k, j + nNextX, nLevel ,ProgSecs[nRightCount],theSteps);
                     stProgSection thisprogsec;
                     res[nRightCount] = ScanLDSCells(nStartLine, nEndLine, k, j + nNextX, nLevel ,thisprogsec,ProgSecs[nRightCount],theSteps);
                     nLastResult = res[nRightCount];
                     nSteps += theSteps;
                     progsec += thisprogsec;
                     //if (res[nRightCount] > 0) nLevel += 1;
                     sProgSec += ProgSec;
                     s1.Format(_T(" <<< Re %d : %d , Result %d Steps %d Last %d"), k, j + nNextX, res[nRightCount],theSteps,nLastSteps);
@@ -2619,3 +2750,4 @@
   }
   return 0;
}