From ed73abaf3f48b358403cb3b6ad19147f1a26bc39 Mon Sep 17 00:00:00 2001 From: yanganjie Date: Tue, 4 Nov 2025 11:40:52 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=BA=86=E4=B8=8A=E6=96=99?= =?UTF-8?q?=E6=96=97=E5=8F=98=E9=80=81=E5=99=A8=E8=AF=BB=E5=8F=96=EF=BC=8C?= =?UTF-8?q?=E6=98=BE=E7=A4=BA=E5=88=B0=E7=95=8C=E9=9D=A2=EF=BC=8C=E6=9B=B4?= =?UTF-8?q?=E6=96=B0=E9=97=B4=E9=9A=94=E4=B8=BA5=E7=A7=92?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- controller/main_controller.py | 19 +++++++------ hardware/transmitter.py | 52 ++++++++++++++++++++++++++++++++++- 2 files changed, 61 insertions(+), 10 deletions(-) diff --git a/controller/main_controller.py b/controller/main_controller.py index 060fe1c..c97ed15 100644 --- a/controller/main_controller.py +++ b/controller/main_controller.py @@ -33,17 +33,18 @@ class MainController: def _onTimer(self): # 定时任务逻辑 # 变送器是 192.168.250.63,端口 502 - loc_tra=TransmitterController(RelayController(host="192.168.250.63", port=502)) - upper_weight=loc_tra.read_data(1) - lower_weight=loc_tra.read_data(2) - if upper_weight is None: - upper_weight=0 + loc_tra=TransmitterController(RelayController()) + upper_weight=loc_tra.read_data(1) # 目前只有上料斗安装了变送器 + # lower_weight=loc_tra.read_data(2) + if upper_weight is not None: + # upper_weight=0 + self.main_window.hopper_widget.setUpperHopperWeight(upper_weight) - if lower_weight is None: - lower_weight=0 + # if lower_weight is None: + # lower_weight=0 - self.main_window.hopper_widget.setUpperHopperWeight(upper_weight) - self.main_window.hopper_widget.setLowerHopperWeight(lower_weight) + # self.main_window.hopper_widget.setUpperHopperWeight(upper_weight) + # self.main_window.hopper_widget.setLowerHopperWeight(lower_weight) # 重新启动定时器以实现重复执行 self.timer = threading.Timer(5.0, self._onTimer) self.timer.start() diff --git a/hardware/transmitter.py b/hardware/transmitter.py index 1bf6a19..dd72798 100644 --- a/hardware/transmitter.py +++ b/hardware/transmitter.py @@ -20,7 +20,7 @@ class TransmitterController: } } - def read_data(self, transmitter_id): + def read_data_back(self, transmitter_id): """读取变送器数据""" try: if transmitter_id not in self.config: @@ -67,3 +67,53 @@ class TransmitterController: return None finally: self.relay_controller.modbus_client.close() + + # 直接读取 变送器返回的数据 + def read_data(self, transmitter_id): + """ + Args: transmitter_id 为1 表示上料斗, 为2 表示下料斗 + return: 读取成功返回重量 weight: int, 失败返回 None + """ + if transmitter_id == 1: + # 上料斗变送器的信息: + IP = "192.168.250.63" + PORT = 502 + TIMEOUT = 5 # 超时时间为 5秒 + weight = None + + import socket + with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: + try: + s.settimeout(TIMEOUT) + s.connect((IP, PORT)) + print(f"✅ 连接 {IP}:{PORT} 成功") + + # 接收数据(变送器主动推送,单次recv即可获取一条完整数据) + data = s.recv(1024) + if data: + # print(f"收到原始数据:{data}") + weight = self.parse_weight(data) + else: + print("❌ 未收到设备数据") + + except ConnectionRefusedError: + print(f"❌ 连接失败:{IP}:{PORT} 拒绝连接(设备离线/端口错误)") + except socket.timeout: + print(f"❌ 超时:{TIMEOUT}秒内未收到数据") + except Exception as e: + print(f"❌ 读取异常:{e}") + + # 成功返回重量(int),失败返回None + return weight + + def parse_weight(raw_data): + """解析函数:提取重量数值(如从 b'ST,NT,+0000175\r\n' 中提取 175)""" + try: + data_str = raw_data.decode('utf-8').strip() + parts = data_str.split(',') + weight_part = parts[2].strip() + return int(''.join(filter(str.isdigit, weight_part))) + except (IndexError, ValueError, UnicodeDecodeError) as e: + # print(f"数据解析失败:{e},原始数据:{raw_data}") + # 注意:可能会出现解析失败的情况,此时返回None,界面不用更新数据就行 + return None \ No newline at end of file