ProjectController.py
changeset 2416 1ca207782dde
parent 2415 f7d8891fe708
child 2418 5587c490a070
equal deleted inserted replaced
2415:f7d8891fe708 2416:1ca207782dde
    59 from PLCControler import PLCControler
    59 from PLCControler import PLCControler
    60 from plcopen.structures import IEC_KEYWORDS
    60 from plcopen.structures import IEC_KEYWORDS
    61 from plcopen.types_enums import ComputeConfigurationResourceName, ITEM_CONFNODE
    61 from plcopen.types_enums import ComputeConfigurationResourceName, ITEM_CONFNODE
    62 import targets
    62 import targets
    63 from runtime.typemapping import DebugTypesSize, UnpackDebugBuffer
    63 from runtime.typemapping import DebugTypesSize, UnpackDebugBuffer
       
    64 from runtime import PlcStatus
    64 from ConfigTreeNode import ConfigTreeNode, XSDSchemaErrorMessage
    65 from ConfigTreeNode import ConfigTreeNode, XSDSchemaErrorMessage
    65 
    66 
    66 base_folder = paths.AbsParentDir(__file__)
    67 base_folder = paths.AbsParentDir(__file__)
    67 
    68 
    68 MATIEC_ERROR_MODEL = re.compile(
    69 MATIEC_ERROR_MODEL = re.compile(
  1420         "_Connect": True,
  1421         "_Connect": True,
  1421         "_Disconnect": False
  1422         "_Disconnect": False
  1422     }
  1423     }
  1423 
  1424 
  1424     MethodsFromStatus = {
  1425     MethodsFromStatus = {
  1425         "Started":      {"_Stop": True,
  1426         PlcStatus.Started:      {"_Stop": True,
  1426                          "_Transfer": True,
  1427                                  "_Transfer": True,
  1427                          "_Connect": False,
  1428                                  "_Connect": False,
  1428                          "_Disconnect": True},
  1429                                  "_Disconnect": True},
  1429         "Stopped":      {"_Run": True,
  1430         PlcStatus.Stopped:      {"_Run": True,
  1430                          "_Transfer": True,
  1431                                  "_Transfer": True,
  1431                          "_Connect": False,
  1432                                  "_Connect": False,
  1432                          "_Disconnect": True},
  1433                                  "_Disconnect": True},
  1433         "Empty":        {"_Transfer": True,
  1434         PlcStatus.Empty:        {"_Transfer": True,
  1434                          "_Connect": False,
  1435                                  "_Connect": False,
  1435                          "_Disconnect": True},
  1436                                  "_Disconnect": True},
  1436         "Broken":       {"_Connect": False,
  1437         PlcStatus.Broken:       {"_Connect": False,
  1437                          "_Disconnect": True},
  1438                                  "_Disconnect": True},
  1438         "Disconnected": {},
  1439         PlcStatus.Disconnected: {},
  1439     }
  1440     }
  1440 
  1441 
  1441     def UpdateMethodsFromPLCStatus(self):
  1442     def UpdateMethodsFromPLCStatus(self):
  1442         updated = False
  1443         updated = False
  1443         status = None
  1444         status = None
  1446             if PLCstatus is not None:
  1447             if PLCstatus is not None:
  1447                 status, log_count = PLCstatus
  1448                 status, log_count = PLCstatus
  1448                 self.UpdatePLCLog(log_count)
  1449                 self.UpdatePLCLog(log_count)
  1449         if status is None:
  1450         if status is None:
  1450             self._SetConnector(None, False)
  1451             self._SetConnector(None, False)
  1451             status = "Disconnected"
  1452             status = PlcStatus.Disconnected
  1452         if self.previous_plcstate != status:
  1453         if self.previous_plcstate != status:
  1453             allmethods = self.DefaultMethods.copy()
  1454             allmethods = self.DefaultMethods.copy()
  1454             allmethods.update(
  1455             allmethods.update(
  1455                 self.MethodsFromStatus.get(status, {}))
  1456                 self.MethodsFromStatus.get(status, {}))
  1456             for method, active in allmethods.items():
  1457             for method, active in allmethods.items():
  1457                 self.ShowMethod(method, active)
  1458                 self.ShowMethod(method, active)
  1458             self.previous_plcstate = status
  1459             self.previous_plcstate = status
  1459             if self.AppFrame is not None:
  1460             if self.AppFrame is not None:
  1460                 updated = True
  1461                 updated = True
  1461                 self.AppFrame.RefreshStatusToolBar()
  1462                 self.AppFrame.RefreshStatusToolBar()
  1462                 if status == "Disconnected":
  1463                 if status == PlcStatus.Disconnected:
  1463                     self.AppFrame.ConnectionStatusBar.SetStatusText(
  1464                     self.AppFrame.ConnectionStatusBar.SetStatusText(
  1464                         self.GetTextStatus(status), 1)
  1465                         _(status), 1)
  1465                     self.AppFrame.ConnectionStatusBar.SetStatusText('', 2)
  1466                     self.AppFrame.ConnectionStatusBar.SetStatusText('', 2)
  1466                 else:
  1467                 else:
  1467                     self.AppFrame.ConnectionStatusBar.SetStatusText(
  1468                     self.AppFrame.ConnectionStatusBar.SetStatusText(
  1468                         _("Connected to URI: %s") % self.BeremizRoot.getURI_location().strip(), 1)
  1469                         _("Connected to URI: %s") % self.BeremizRoot.getURI_location().strip(), 1)
  1469                     self.AppFrame.ConnectionStatusBar.SetStatusText(
  1470                     self.AppFrame.ConnectionStatusBar.SetStatusText(
  1470                         self.GetTextStatus(status), 2)
  1471                         _(status), 2)
  1471         return updated
  1472         return updated
  1472 
       
  1473     def GetTextStatus(self, status):
       
  1474         msgs = {
       
  1475             "Started":      _("Started"),
       
  1476             "Stopped":      _("Stopped"),
       
  1477             "Empty":        _("Empty"),
       
  1478             "Broken":       _("Broken"),
       
  1479             "Disconnected": _("Disconnected")
       
  1480         }
       
  1481         return msgs.get(status, status)
       
  1482 
  1473 
  1483     def ShowPLCProgress(self, status="", progress=0):
  1474     def ShowPLCProgress(self, status="", progress=0):
  1484         self.AppFrame.ProgressStatusBar.Show()
  1475         self.AppFrame.ProgressStatusBar.Show()
  1485         self.AppFrame.ConnectionStatusBar.SetStatusText(
  1476         self.AppFrame.ConnectionStatusBar.SetStatusText(
  1486             self.GetTextStatus(status), 1)
  1477             _(status), 1)
  1487         self.AppFrame.ProgressStatusBar.SetValue(progress)
  1478         self.AppFrame.ProgressStatusBar.SetValue(progress)
  1488 
  1479 
  1489     def HidePLCProgress(self):
  1480     def HidePLCProgress(self):
  1490         # clear previous_plcstate to restore status
  1481         # clear previous_plcstate to restore status
  1491         # in UpdateMethodsFromPLCStatus()
  1482         # in UpdateMethodsFromPLCStatus()
  1499     def SnapshotAndResetDebugValuesBuffers(self):
  1490     def SnapshotAndResetDebugValuesBuffers(self):
  1500         if self._connector is not None:
  1491         if self._connector is not None:
  1501             plc_status, Traces = self._connector.GetTraceVariables()
  1492             plc_status, Traces = self._connector.GetTraceVariables()
  1502             # print [dict.keys() for IECPath, (dict, log, status, fvalue) in
  1493             # print [dict.keys() for IECPath, (dict, log, status, fvalue) in
  1503             # self.IECdebug_datas.items()]
  1494             # self.IECdebug_datas.items()]
  1504             if plc_status == "Started":
  1495             if plc_status == PlcStatus.Started:
  1505                 if len(Traces) > 0:
  1496                 if len(Traces) > 0:
  1506                     for debug_tick, debug_buff in Traces:
  1497                     for debug_tick, debug_buff in Traces:
  1507                         debug_vars = UnpackDebugBuffer(
  1498                         debug_vars = UnpackDebugBuffer(
  1508                             debug_buff, self.TracedIECTypes)
  1499                             debug_buff, self.TracedIECTypes)
  1509                         if debug_vars is not None and len(debug_vars) == len(self.TracedIECPath):
  1500                         if debug_vars is not None and len(debug_vars) == len(self.TracedIECPath):
  1568                 self.TracedIECPath = []
  1559                 self.TracedIECPath = []
  1569                 self._connector.SetTraceVariablesList([])
  1560                 self._connector.SetTraceVariablesList([])
  1570             self.SnapshotAndResetDebugValuesBuffers()
  1561             self.SnapshotAndResetDebugValuesBuffers()
  1571 
  1562 
  1572     def IsPLCStarted(self):
  1563     def IsPLCStarted(self):
  1573         return self.previous_plcstate == "Started"
  1564         return self.previous_plcstate == PlcStatus.Started
  1574 
  1565 
  1575     def ReArmDebugRegisterTimer(self):
  1566     def ReArmDebugRegisterTimer(self):
  1576         if self.DebugTimer is not None:
  1567         if self.DebugTimer is not None:
  1577             self.DebugTimer.cancel()
  1568             self.DebugTimer.cancel()
  1578 
  1569 
  1807         else:
  1798         else:
  1808             self.CompareLocalAndRemotePLC()
  1799             self.CompareLocalAndRemotePLC()
  1809 
  1800 
  1810             # Init with actual PLC status and print it
  1801             # Init with actual PLC status and print it
  1811             self.UpdateMethodsFromPLCStatus()
  1802             self.UpdateMethodsFromPLCStatus()
  1812             if self.previous_plcstate in ["Started", "Stopped"]:
  1803             if self.previous_plcstate in [PlcStatus.Started, PlcStatus.Stopped]:
  1813                 if self.DebugAvailable() and self.GetIECProgramsAndVariables():
  1804                 if self.DebugAvailable() and self.GetIECProgramsAndVariables():
  1814                     self.logger.write(_("Debugger ready\n"))
  1805                     self.logger.write(_("Debugger ready\n"))
  1815                     self._connect_debug()
  1806                     self._connect_debug()
  1816                 else:
  1807                 else:
  1817                     self.logger.write_warning(
  1808                     self.logger.write_warning(