|
|
@@ -391,6 +391,9 @@ def _network_ip_monitor_loop():
|
|
|
idx = screen_current_panel_index
|
|
|
if 0 <= idx < len(panels):
|
|
|
screen_refresh_queue.put((panels[idx][0],))
|
|
|
+ else:
|
|
|
+ # 没有配线架也要刷新 IP,避免屏幕停留在 HMI 默认文字
|
|
|
+ screen_refresh_queue.put((None,))
|
|
|
except Exception as e:
|
|
|
logger.error(f"网络 IP 监测异常: {e}")
|
|
|
time.sleep(3)
|
|
|
@@ -404,7 +407,12 @@ def _screen_refresh_worker():
|
|
|
if item is None:
|
|
|
break
|
|
|
panel_id = item[0]
|
|
|
- refresh_screen_panel(panel_id)
|
|
|
+ if panel_id is None:
|
|
|
+ # 没有配线架时也要把 IP/状态刷到屏幕
|
|
|
+ if screen_display.get_status().get('connected'):
|
|
|
+ _send_screen_header()
|
|
|
+ else:
|
|
|
+ refresh_screen_panel(panel_id)
|
|
|
except Exception as e:
|
|
|
logger.error(f"屏幕刷新工作线程异常: {e}")
|
|
|
finally:
|
|
|
@@ -414,6 +422,32 @@ def _screen_refresh_worker():
|
|
|
pass
|
|
|
|
|
|
|
|
|
+def _send_screen_header(panel_name=None):
|
|
|
+ """下发与具体 panel 无关的屏幕信息:本机 IP、终端名、版本、MQTT 状态。
|
|
|
+
|
|
|
+ 即使一个配线架都没发现(panel_count=0)也调用,否则屏幕会一直停留在
|
|
|
+ HMI 工程的默认文字(例如默认占位 IP)。
|
|
|
+ """
|
|
|
+ online_count = sum(
|
|
|
+ 1 for pid, _ in get_sorted_panels()
|
|
|
+ if device_last_seen.get(pid, 0) > time.time() - 60
|
|
|
+ )
|
|
|
+ mqtt_st = mqtt_client.get_status()
|
|
|
+ mqtt_connected = mqtt_st.get('connected', False) if isinstance(mqtt_st, dict) else bool(mqtt_st)
|
|
|
+
|
|
|
+ delay_ms = NEXTION_CMD_DELAY_MS
|
|
|
+ if panel_name is None:
|
|
|
+ panel_name = f'{NEXTION_PANEL_NAME_PREFIX}0'
|
|
|
+
|
|
|
+ screen_display.send_cmd(f't2.txt="{panel_name}"', delay_ms=delay_ms)
|
|
|
+ screen_display.send_cmd(f't1.txt="{_get_display_ip()}"', delay_ms=delay_ms)
|
|
|
+ screen_display.send_cmd(f't4.txt="{dtu_config.get("firmware_version", "v1.0.0")}"', delay_ms=delay_ms)
|
|
|
+
|
|
|
+ mqtt_str = '已连接' if mqtt_connected else '未连接'
|
|
|
+ screen_display.send_cmd(f'g0.txt="MQTT:{mqtt_str} 当前终端数:{online_count}"', delay_ms=delay_ms)
|
|
|
+ screen_display.send_cmd(f'g0.pco={0 if mqtt_connected else 63488}', delay_ms=delay_ms)
|
|
|
+
|
|
|
+
|
|
|
def refresh_screen_panel(panel_id):
|
|
|
"""将指定 panel 的数据下发到 Nextion 屏幕。"""
|
|
|
global screen_current_panel_index
|
|
|
@@ -427,30 +461,13 @@ def refresh_screen_panel(panel_id):
|
|
|
if not screen_display.get_status().get('connected'):
|
|
|
return False, '屏幕串口未连接'
|
|
|
|
|
|
- ps = port_state.get(panel_id, {})
|
|
|
- now = time.time()
|
|
|
- online_count = sum(1 for pid in panel_ids if device_last_seen.get(pid, 0) > now - 60)
|
|
|
idx = panel_ids.index(panel_id)
|
|
|
screen_current_panel_index = idx
|
|
|
|
|
|
- mqtt_st = mqtt_client.get_status()
|
|
|
- mqtt_connected = mqtt_st.get('connected', False) if isinstance(mqtt_st, dict) else bool(mqtt_st)
|
|
|
-
|
|
|
- delay_ms = NEXTION_CMD_DELAY_MS
|
|
|
-
|
|
|
- # 获取本机 IP 地址显示在 t1.txt
|
|
|
- ip_address = _get_display_ip()
|
|
|
-
|
|
|
# 当前 panel 对应的设备地址
|
|
|
device_address = panel_config.get(panel_id, {}).get('address', 1)
|
|
|
|
|
|
- screen_display.send_cmd(f't2.txt="{NEXTION_PANEL_NAME_PREFIX}{idx + 1}"', delay_ms=delay_ms)
|
|
|
- screen_display.send_cmd(f't1.txt="{ip_address}"', delay_ms=delay_ms)
|
|
|
- screen_display.send_cmd(f't4.txt="{dtu_config.get("firmware_version", "v1.0.0")}"', delay_ms=delay_ms)
|
|
|
-
|
|
|
- mqtt_str = '已连接' if mqtt_connected else '未连接'
|
|
|
- screen_display.send_cmd(f'g0.txt="MQTT:{mqtt_str} 当前终端数:{online_count}"', delay_ms=delay_ms)
|
|
|
- screen_display.send_cmd(f'g0.pco={0 if mqtt_connected else 63488}', delay_ms=delay_ms)
|
|
|
+ _send_screen_header(panel_name=f'{NEXTION_PANEL_NAME_PREFIX}{idx + 1}')
|
|
|
|
|
|
for port_id in range(1, 25):
|
|
|
# 屏幕网口图片显示 LED:由端口真实连接状态推导(连接/断开/非法/未知)
|
|
|
@@ -840,12 +857,15 @@ def mqtt_status_handler(status):
|
|
|
|
|
|
# MQTT 状态变化时刷新当前屏幕显示
|
|
|
panels = get_sorted_panels()
|
|
|
- if panels and screen_display.get_status().get('connected'):
|
|
|
+ if screen_display.get_status().get('connected'):
|
|
|
try:
|
|
|
- with screen_lock:
|
|
|
- current_idx = screen_current_panel_index
|
|
|
- if 0 <= current_idx < len(panels):
|
|
|
- screen_refresh_queue.put((panels[current_idx][0],))
|
|
|
+ if panels:
|
|
|
+ with screen_lock:
|
|
|
+ current_idx = screen_current_panel_index
|
|
|
+ if 0 <= current_idx < len(panels):
|
|
|
+ screen_refresh_queue.put((panels[current_idx][0],))
|
|
|
+ else:
|
|
|
+ screen_refresh_queue.put((None,))
|
|
|
except Exception as e:
|
|
|
logger.error(f"MQTT 状态变化刷新屏幕失败: {e}")
|
|
|
except Exception as e:
|
|
|
@@ -4922,6 +4942,9 @@ if __name__ == '__main__':
|
|
|
panels = get_sorted_panels()
|
|
|
if panels:
|
|
|
refresh_screen_panel(panels[0][0])
|
|
|
+ else:
|
|
|
+ # 没有配线架时也要把 IP/版本/MQTT 状态刷到屏幕
|
|
|
+ _send_screen_header()
|
|
|
else:
|
|
|
logger.warning(f"Nextion 屏幕连接失败: {msg}")
|
|
|
except Exception as e:
|