ProjectController.py
changeset 3402 3f54a680fe45
parent 3396 8c8cb5c9ff38
child 3421 70ef15fca028
equal deleted inserted replaced
3393:a65bcbb6af20 3402:3f54a680fe45
   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 
   969             try:
   970             try:
   970                 csvfile = os.path.join(self._getBuildPath(), "VARIABLES.csv")
   971                 csvfile = os.path.join(self._getBuildPath(), "VARIABLES.csv")
   971                 # describes CSV columns
   972                 # describes CSV columns
   972                 ProgramsListAttributeName = ["num", "C_path", "type"]
   973                 ProgramsListAttributeName = ["num", "C_path", "type"]
   973                 VariablesListAttributeName = [
   974                 VariablesListAttributeName = [
   974                     "num", "vartype", "IEC_path", "C_path", "type", "derived"]
   975                     "num", "vartype", "IEC_path", "C_path", "type", "derived", "retain"]
   975                 self._ProgramList = []
   976                 self._ProgramList = []
   976                 self._VariablesList = []
   977                 self._VariablesList = []
   977                 self._DbgVariablesList = []
   978                 self._DbgVariablesList = []
   978                 self._IECPathToIdx = {}
   979                 self._IECPathToIdx = {}
   979 
   980 
  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         retain_indexes = []
  1056         for v in self._DbgVariablesList:
  1057         for i, v in enumerate(self._DbgVariablesList):
  1057             sz = DebugTypesSize.get(v["type"], 0)
  1058             variable_decl_array.append(
  1058             variable_decl_array += [
       
  1059                 "{&(%(C_path)s), " % v +
  1059                 "{&(%(C_path)s), " % v +
  1060                 {
  1060                 {
  1061                     "EXT": "%(type)s_P_ENUM",
  1061                     "EXT": "%(type)s_P_ENUM",
  1062                     "IN":  "%(type)s_P_ENUM",
  1062                     "IN":  "%(type)s_P_ENUM",
  1063                     "MEM": "%(type)s_O_ENUM",
  1063                     "MEM": "%(type)s_O_ENUM",
  1064                     "OUT": "%(type)s_O_ENUM",
  1064                     "OUT": "%(type)s_O_ENUM",
  1065                     "VAR": "%(type)s_ENUM"
  1065                     "VAR": "%(type)s_ENUM"
  1066                 }[v["vartype"]] % v +
  1066                 }[v["vartype"]] % v +
  1067                 "}"]
  1067                 "}")
  1068             bofs += sz
  1068 
       
  1069             if v["retain"] == "1":
       
  1070                 retain_indexes.append("/* "+v["C_path"]+" */ "+str(i))
       
  1071 
  1069         debug_code = targets.GetCode("plc_debug.c") % {
  1072         debug_code = targets.GetCode("plc_debug.c") % {
  1070             "buffer_size": bofs,
       
  1071             "programs_declarations": "\n".join(["extern %(type)s %(C_path)s;" %
  1073             "programs_declarations": "\n".join(["extern %(type)s %(C_path)s;" %
  1072                                                 p for p in self._ProgramList]),
  1074                                                 p for p in self._ProgramList]),
  1073             "extern_variables_declarations": "\n".join([
  1075             "extern_variables_declarations": "\n".join([
  1074                 {
  1076                 {
  1075                     "EXT": "extern __IEC_%(type)s_p %(C_path)s;",
  1077                     "EXT": "extern __IEC_%(type)s_p %(C_path)s;",
  1079                     "VAR": "extern __IEC_%(type)s_t %(C_path)s;",
  1081                     "VAR": "extern __IEC_%(type)s_t %(C_path)s;",
  1080                     "FB":  "extern       %(type)s   %(C_path)s;"
  1082                     "FB":  "extern       %(type)s   %(C_path)s;"
  1081                 }[v["vartype"]] % v
  1083                 }[v["vartype"]] % v
  1082                 for v in self._VariablesList if v["C_path"].find('.') < 0]),
  1084                 for v in self._VariablesList if v["C_path"].find('.') < 0]),
  1083             "variable_decl_array": ",\n".join(variable_decl_array),
  1085             "variable_decl_array": ",\n".join(variable_decl_array),
       
  1086             "retain_vardsc_index_array": ",\n".join(retain_indexes),
  1084             "var_access_code": targets.GetCode("var_access.c")
  1087             "var_access_code": targets.GetCode("var_access.c")
  1085         }
  1088         }
  1086 
  1089 
  1087         return debug_code
  1090         return debug_code
  1088 
  1091 
  1553                                     if not IECdebug_data[4] and len(values_buffer) > 0:
  1556                                     if not IECdebug_data[4] and len(values_buffer) > 0:
  1554                                         values_buffer[-1] = (value, forced)
  1557                                         values_buffer[-1] = (value, forced)
  1555                                     else:
  1558                                     else:
  1556                                         values_buffer.append((value, forced))
  1559                                         values_buffer.append((value, forced))
  1557                             self.DebugTicks.append(debug_tick)
  1560                             self.DebugTicks.append(debug_tick)
       
  1561                         else:
       
  1562                             # complain if trace is incomplete, but only once per debug session
       
  1563                             if self.LastComplainDebugToken != self.DebugToken :
       
  1564                                 self.logger.write_warning(
       
  1565                                     _("Debug: target couldn't trace all requested variables.\n"))
       
  1566                                 self.LastComplainDebugToken = self.DebugToken
       
  1567 
       
  1568 
  1558 
  1569 
  1559         buffers, self.DebugValuesBuffers = (self.DebugValuesBuffers,
  1570         buffers, self.DebugValuesBuffers = (self.DebugValuesBuffers,
  1560                                             [list() for dummy in xrange(len(self.TracedIECPath))])
  1571                                             [list() for dummy in xrange(len(self.TracedIECPath))])
  1561 
  1572 
  1562         ticks, self.DebugTicks = self.DebugTicks, []
  1573         ticks, self.DebugTicks = self.DebugTicks, []
  1563 
  1574 
  1564         return debug_status, ticks, buffers
  1575         return debug_status, ticks, buffers
       
  1576 
       
  1577     RegisterDebugVariableErrorCodes = { 
       
  1578         # TRACE_LIST_OVERFLOW
       
  1579         1 : _("Debug: Too many variables traced. Max 1024.\n"),
       
  1580         # FORCE_LIST_OVERFLOW
       
  1581         2 : _("Debug: Too many variables forced. Max 256.\n"),
       
  1582         # FORCE_BUFFER_OVERFLOW
       
  1583         3 : _("Debug: Cumulated forced variables size too large. Max 1KB.\n")
       
  1584     }
  1565 
  1585 
  1566     def RegisterDebugVarToConnector(self):
  1586     def RegisterDebugVarToConnector(self):
  1567         Idxs = []
  1587         Idxs = []
  1568         self.TracedIECPath = []
  1588         self.TracedIECPath = []
  1569         self.TracedIECTypes = []
  1589         self.TracedIECTypes = []
  1594             if Idxs:
  1614             if Idxs:
  1595                 Idxs.sort()
  1615                 Idxs.sort()
  1596                 IdxsT = zip(*Idxs)
  1616                 IdxsT = zip(*Idxs)
  1597                 self.TracedIECPath = IdxsT[3]
  1617                 self.TracedIECPath = IdxsT[3]
  1598                 self.TracedIECTypes = IdxsT[1]
  1618                 self.TracedIECTypes = IdxsT[1]
  1599                 self.DebugToken = self._connector.SetTraceVariablesList(zip(*IdxsT[0:3]))
  1619                 res = self._connector.SetTraceVariablesList(zip(*IdxsT[0:3]))
       
  1620                 if res is not None and res > 0:
       
  1621                     self.DebugToken = res
       
  1622                 else:
       
  1623                     self.DebugToken = None
       
  1624                     self.logger.write_warning(
       
  1625                         self.RegisterDebugVariableErrorCodes.get(
       
  1626                             -res, _("Debug: Unknown error")))
  1600             else:
  1627             else:
  1601                 self.TracedIECPath = []
  1628                 self.TracedIECPath = []
  1602                 self._connector.SetTraceVariablesList([])
  1629                 self._connector.SetTraceVariablesList([])
  1603                 self.DebugToken = None
  1630                 self.DebugToken = None
  1604             self.debug_status, _debug_ticks, _buffers = self.SnapshotAndResetDebugValuesBuffers()
  1631             self.debug_status, _debug_ticks, _buffers = self.SnapshotAndResetDebugValuesBuffers()