ProjectController.py
branchRuntimeLists
changeset 3395 93ad018fb602
parent 3380 794e39598e46
child 3396 8c8cb5c9ff38
equal deleted inserted replaced
3394:9ea29ac18837 3395:93ad018fb602
   274         self.debug_break = False
   274         self.debug_break = False
   275         self.previous_plcstate = None
   275         self.previous_plcstate = None
   276         # copy StatusMethods so that it can be later customized
   276         # copy StatusMethods so that it can be later customized
   277         self.StatusMethods = [dic.copy() for dic in self.StatusMethods]
   277         self.StatusMethods = [dic.copy() for dic in self.StatusMethods]
   278         self.DebugToken = None
   278         self.DebugToken = None
       
   279         self.LastComplainDebugToken = None
   279         self.debug_status = PlcStatus.Stopped
   280         self.debug_status = PlcStatus.Stopped
   280 
   281 
   281         self.IECcodeDigest = None
   282         self.IECcodeDigest = None
   282         self.LastBuiltIECcodeDigest = None
   283         self.LastBuiltIECcodeDigest = None
   283 
   284 
  1050         """
  1051         """
  1051         self.GetIECProgramsAndVariables()
  1052         self.GetIECProgramsAndVariables()
  1052 
  1053 
  1053         # prepare debug code
  1054         # prepare debug code
  1054         variable_decl_array = []
  1055         variable_decl_array = []
  1055         bofs = 0
       
  1056         for v in self._DbgVariablesList:
  1056         for v in self._DbgVariablesList:
  1057             sz = DebugTypesSize.get(v["type"], 0)
       
  1058             variable_decl_array += [
  1057             variable_decl_array += [
  1059                 "{&(%(C_path)s), " % v +
  1058                 "{&(%(C_path)s), " % v +
  1060                 {
  1059                 {
  1061                     "EXT": "%(type)s_P_ENUM",
  1060                     "EXT": "%(type)s_P_ENUM",
  1062                     "IN":  "%(type)s_P_ENUM",
  1061                     "IN":  "%(type)s_P_ENUM",
  1063                     "MEM": "%(type)s_O_ENUM",
  1062                     "MEM": "%(type)s_O_ENUM",
  1064                     "OUT": "%(type)s_O_ENUM",
  1063                     "OUT": "%(type)s_O_ENUM",
  1065                     "VAR": "%(type)s_ENUM"
  1064                     "VAR": "%(type)s_ENUM"
  1066                 }[v["vartype"]] % v +
  1065                 }[v["vartype"]] % v +
  1067                 "}"]
  1066                 "}"]
  1068             bofs += sz
       
  1069         debug_code = targets.GetCode("plc_debug.c") % {
  1067         debug_code = targets.GetCode("plc_debug.c") % {
  1070             "buffer_size": bofs,
       
  1071             "programs_declarations": "\n".join(["extern %(type)s %(C_path)s;" %
  1068             "programs_declarations": "\n".join(["extern %(type)s %(C_path)s;" %
  1072                                                 p for p in self._ProgramList]),
  1069                                                 p for p in self._ProgramList]),
  1073             "extern_variables_declarations": "\n".join([
  1070             "extern_variables_declarations": "\n".join([
  1074                 {
  1071                 {
  1075                     "EXT": "extern __IEC_%(type)s_p %(C_path)s;",
  1072                     "EXT": "extern __IEC_%(type)s_p %(C_path)s;",
  1553                                     if not IECdebug_data[4] and len(values_buffer) > 0:
  1550                                     if not IECdebug_data[4] and len(values_buffer) > 0:
  1554                                         values_buffer[-1] = (value, forced)
  1551                                         values_buffer[-1] = (value, forced)
  1555                                     else:
  1552                                     else:
  1556                                         values_buffer.append((value, forced))
  1553                                         values_buffer.append((value, forced))
  1557                             self.DebugTicks.append(debug_tick)
  1554                             self.DebugTicks.append(debug_tick)
       
  1555                         else:
       
  1556                             # complain if trace is incomplete, but only once per debug session
       
  1557                             if self.LastComplainDebugToken != self.DebugToken :
       
  1558                                 self.logger.write_warning(
       
  1559                                     _("Debug: target couldn't trace all requested variables.\n"))
       
  1560                                 self.LastComplainDebugToken = self.DebugToken
       
  1561 
       
  1562 
  1558 
  1563 
  1559         buffers, self.DebugValuesBuffers = (self.DebugValuesBuffers,
  1564         buffers, self.DebugValuesBuffers = (self.DebugValuesBuffers,
  1560                                             [list() for dummy in xrange(len(self.TracedIECPath))])
  1565                                             [list() for dummy in xrange(len(self.TracedIECPath))])
  1561 
  1566 
  1562         ticks, self.DebugTicks = self.DebugTicks, []
  1567         ticks, self.DebugTicks = self.DebugTicks, []
  1563 
  1568 
  1564         return debug_status, ticks, buffers
  1569         return debug_status, ticks, buffers
       
  1570 
       
  1571     RegisterDebugVariableErrorCodes = { 
       
  1572         # TRACE_LIST_OVERFLOW
       
  1573         1 : _("Debug: Too many variables traced. Max 1024.\n"),
       
  1574         # FORCE_LIST_OVERFLOW
       
  1575         2 : _("Debug: Too many variables forced. Max 256.\n"),
       
  1576         # FORCE_BUFFER_OVERFLOW
       
  1577         3 : _("Debug: Cumulated forced variables size too large. Max 1KB.\n")
       
  1578     }
  1565 
  1579 
  1566     def RegisterDebugVarToConnector(self):
  1580     def RegisterDebugVarToConnector(self):
  1567         Idxs = []
  1581         Idxs = []
  1568         self.TracedIECPath = []
  1582         self.TracedIECPath = []
  1569         self.TracedIECTypes = []
  1583         self.TracedIECTypes = []
  1594             if Idxs:
  1608             if Idxs:
  1595                 Idxs.sort()
  1609                 Idxs.sort()
  1596                 IdxsT = zip(*Idxs)
  1610                 IdxsT = zip(*Idxs)
  1597                 self.TracedIECPath = IdxsT[3]
  1611                 self.TracedIECPath = IdxsT[3]
  1598                 self.TracedIECTypes = IdxsT[1]
  1612                 self.TracedIECTypes = IdxsT[1]
  1599                 self.DebugToken = self._connector.SetTraceVariablesList(zip(*IdxsT[0:3]))
  1613                 res = self._connector.SetTraceVariablesList(zip(*IdxsT[0:3]))
       
  1614                 if res is not None and res > 0:
       
  1615                     self.DebugToken = res
       
  1616                 else:
       
  1617                     self.DebugToken = None
       
  1618                     self.logger.write_warning(
       
  1619                         self.RegisterDebugVariableErrorCodes.get(
       
  1620                             -res, _("Debug: Unknown error")))
  1600             else:
  1621             else:
  1601                 self.TracedIECPath = []
  1622                 self.TracedIECPath = []
  1602                 self._connector.SetTraceVariablesList([])
  1623                 self._connector.SetTraceVariablesList([])
  1603                 self.DebugToken = None
  1624                 self.DebugToken = None
  1604             self.debug_status, _debug_ticks, _buffers = self.SnapshotAndResetDebugValuesBuffers()
  1625             self.debug_status, _debug_ticks, _buffers = self.SnapshotAndResetDebugValuesBuffers()