ProjectController.py
branchsvghmi
changeset 3257 095c73591b7e
parent 3239 fe819b4c62c0
child 3262 689ac4ac0dbe
equal deleted inserted replaced
3256:8d1cc99a8f54 3257:095c73591b7e
    38 import tempfile
    38 import tempfile
    39 from threading import Timer
    39 from threading import Timer
    40 from datetime import datetime
    40 from datetime import datetime
    41 from weakref import WeakKeyDictionary
    41 from weakref import WeakKeyDictionary
    42 from functools import reduce
    42 from functools import reduce
       
    43 from itertools import izip
    43 from distutils.dir_util import copy_tree
    44 from distutils.dir_util import copy_tree
    44 from six.moves import xrange
    45 from six.moves import xrange
    45 
    46 
    46 import wx
    47 import wx
    47 
    48 
  1510             if debug_status == PlcStatus.Started:
  1511             if debug_status == PlcStatus.Started:
  1511                 if len(Traces) > 0:
  1512                 if len(Traces) > 0:
  1512                     for debug_tick, debug_buff in Traces:
  1513                     for debug_tick, debug_buff in Traces:
  1513                         debug_vars = UnpackDebugBuffer(
  1514                         debug_vars = UnpackDebugBuffer(
  1514                             debug_buff, self.TracedIECTypes)
  1515                             debug_buff, self.TracedIECTypes)
  1515                         if debug_vars is not None and len(debug_vars) == len(self.TracedIECPath):
  1516                         if debug_vars is not None:
  1516                             for IECPath, values_buffer, value in zip(
  1517                             for IECPath, values_buffer, value in izip(
  1517                                     self.TracedIECPath,
  1518                                     self.TracedIECPath,
  1518                                     self.DebugValuesBuffers,
  1519                                     self.DebugValuesBuffers,
  1519                                     debug_vars):
  1520                                     debug_vars):
  1520                                 IECdebug_data = self.IECdebug_datas.get(
  1521                                 IECdebug_data = self.IECdebug_datas.get(
  1521                                     IECPath, None)
  1522                                     IECPath, None)
  1604         if IECdebug_data is None:
  1605         if IECdebug_data is None:
  1605             IECdebug_data = [
  1606             IECdebug_data = [
  1606                 WeakKeyDictionary(),  # Callables
  1607                 WeakKeyDictionary(),  # Callables
  1607                 [],                   # Data storage [(tick, data),...]
  1608                 [],                   # Data storage [(tick, data),...]
  1608                 "Registered",         # Variable status
  1609                 "Registered",         # Variable status
  1609                 None,
  1610                 None,                 # Forced value
  1610                 buffer_list]                # Forced value
  1611                 buffer_list]
  1611             self.IECdebug_datas[IECPath] = IECdebug_data
  1612             self.IECdebug_datas[IECPath] = IECdebug_data
  1612         else:
  1613         else:
  1613             IECdebug_data[4] |= buffer_list
  1614             IECdebug_data[4] |= buffer_list
  1614 
  1615 
  1615         IECdebug_data[0][callableobj] = buffer_list
  1616         IECdebug_data[0][callableobj] = buffer_list
  1679         if self._connector is None:
  1680         if self._connector is None:
  1680             return -1, "No runtime connected!"
  1681             return -1, "No runtime connected!"
  1681         return self._connector.RemoteExec(script, **kwargs)
  1682         return self._connector.RemoteExec(script, **kwargs)
  1682 
  1683 
  1683     def DispatchDebugValuesProc(self, event):
  1684     def DispatchDebugValuesProc(self, event):
       
  1685         event.Skip()
       
  1686         start_time = time.time()
  1684         self.debug_status, debug_ticks, buffers = self.SnapshotAndResetDebugValuesBuffers()
  1687         self.debug_status, debug_ticks, buffers = self.SnapshotAndResetDebugValuesBuffers()
  1685         start_time = time.time()
       
  1686         if len(self.TracedIECPath) == len(buffers):
       
  1687             for IECPath, values in zip(self.TracedIECPath, buffers):
       
  1688                 if len(values) > 0:
       
  1689                     self.CallWeakcallables(
       
  1690                         IECPath, "NewValues", debug_ticks, values)
       
  1691             if len(debug_ticks) > 0:
       
  1692                 self.CallWeakcallables(
       
  1693                     "__tick__", "NewDataAvailable", debug_ticks)
       
  1694 
  1688 
  1695         if self.debug_status == PlcStatus.Broken:
  1689         if self.debug_status == PlcStatus.Broken:
  1696             self.logger.write_warning(
  1690             self.logger.write_warning(
  1697                 _("Debug: token rejected - other debug took over - reconnect to recover\n"))
  1691                 _("Debug: token rejected - other debug took over - reconnect to recover\n"))
  1698         else:
  1692             return
  1699             delay = time.time() - start_time
  1693 
  1700             next_refresh = max(REFRESH_PERIOD - delay, 0.2 * delay)
  1694         for IECPath, values in zip(self.TracedIECPath, buffers):
  1701             if self.DispatchDebugValuesTimer is not None:
  1695             if len(values) > 0:
  1702                 self.DispatchDebugValuesTimer.Start(
  1696                 self.CallWeakcallables(
  1703                     int(next_refresh * 1000), oneShot=True)
  1697                     IECPath, "NewValues", debug_ticks, values)
  1704         event.Skip()
  1698         if len(debug_ticks) > 0:
       
  1699             self.CallWeakcallables(
       
  1700                 "__tick__", "NewDataAvailable", debug_ticks)
       
  1701 
       
  1702         delay = time.time() - start_time
       
  1703         next_refresh = max(REFRESH_PERIOD - delay, 0.2 * delay)
       
  1704         if self.DispatchDebugValuesTimer is not None:
       
  1705             res = self.DispatchDebugValuesTimer.Start(
       
  1706                 int(next_refresh * 1000), oneShot=True)
  1705 
  1707 
  1706     def KillDebugThread(self):
  1708     def KillDebugThread(self):
  1707         if self.DispatchDebugValuesTimer is not None:
  1709         if self.DispatchDebugValuesTimer is not None:
  1708             self.DispatchDebugValuesTimer.Stop()
  1710             self.DispatchDebugValuesTimer.Stop()
  1709 
  1711