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