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( |