diff --git a/backend/opc_service.py b/backend/opc_service.py index bb97f9e..de79a02 100644 --- a/backend/opc_service.py +++ b/backend/opc_service.py @@ -406,12 +406,14 @@ class OpcService: revision_address = target_cfg.get("setup_data_revision") if revision_address: try: - next_rev = self._read_s7_int32( + curr_rev = self._read_s7_int32( endpoint=self.write_s7_endpoint, address=revision_address, rack=self.write_s7_rack, slot=self.write_s7_slot, - ) + 1 + ) + # 循环计数:0..999,达到999后回到0 + next_rev = 0 if curr_rev >= 999 else curr_rev + 1 await self.write_s7_value( endpoint=self.write_s7_endpoint, address=revision_address, @@ -421,6 +423,10 @@ class OpcService: rack=self.write_s7_rack, slot=self.write_s7_slot, ) + self._log( + f"Write setup_data_revision success (U{target_uncoiler}): " + f"{curr_rev} -> {next_rev}, address={revision_address}" + ) except Exception as exc: self._log(f"Write setup_data_revision failed (U{target_uncoiler}): {exc}") @@ -1114,8 +1120,29 @@ class OpcService: if area_part.startswith("DB"): area_part = area_part[2:] - area_code = area_part[:1] - offset_part = area_part[1:] + # Normalize aliases: + # X0.0 / B2 / W4 / D8 / DINT0 / INT4 / WORD6 / REAL8 / BYTE10 + if area_part.startswith("DINT"): + area_code = "D" + offset_part = area_part[4:] + elif area_part.startswith("DWORD"): + area_code = "D" + offset_part = area_part[5:] + elif area_part.startswith("REAL"): + area_code = "D" + offset_part = area_part[4:] + elif area_part.startswith("INT"): + area_code = "W" + offset_part = area_part[3:] + elif area_part.startswith("WORD"): + area_code = "W" + offset_part = area_part[4:] + elif area_part.startswith("BYTE"): + area_code = "B" + offset_part = area_part[4:] + else: + area_code = area_part[:1] + offset_part = area_part[1:] bit_index = None if area_code == "X": @@ -1129,6 +1156,8 @@ class OpcService: else: if "." in offset_part: raise ValueError(f"Only X area may include bit index: {address}") + if not offset_part or not offset_part.lstrip("-").isdigit(): + raise ValueError(f"Invalid S7 byte offset in address: {address}") byte_offset = int(offset_part) if byte_offset < 0: