refactor(opc): 移除信号1相关功能并更新配置

移除前端信号1配置项、后端信号1处理逻辑及相关API
更新OPC配置节点信息及启动脚本conda初始化
This commit is contained in:
2026-04-30 13:12:32 +08:00
parent 3ef502d737
commit 1e41834e46
7 changed files with 59 additions and 32 deletions

5
.gitignore vendored
View File

@@ -21,16 +21,11 @@ __pycache__/
*$py.class
# 虚拟环境
.env/
.venv/
env/
venv/
ENV/
# 环境变量文件 (包含敏感信息)
.env
.env.local
.env.*.local
# 数据库文件 (SQLite 本地缓存)
*.db

11
backend/.env Normal file
View File

@@ -0,0 +1,11 @@
# Oracle Database
ORACLE_DSN=localhost:1521/orcl
ORACLE_USER=pltm
ORACLE_PASSWORD=pltm123
# OPC-UA Server
OPC_URL=opc.tcp://127.0.0.1:49320
OPC_COUNTER_NODE=ns=2;s=通道 1.PLCFur.LineMeasure-1.SystemCounter
OPC_POLL_INTERVAL=2

View File

@@ -653,7 +653,6 @@ def get_coils_by_range(start: int = Query(1), end: int = Query(5)):
def get_signal_config():
"""获取信号节点配置"""
return {
"signal1_node": opc_service.signal1_node,
"signal2_node": opc_service.signal2_node,
}
@@ -661,7 +660,6 @@ def get_signal_config():
@app.post("/api/opc/signals")
async def save_signal_config(data: dict):
"""保存信号节点配置"""
opc_service.signal1_node = data.get("signal1_node", opc_service.signal1_node)
opc_service.signal2_node = data.get("signal2_node", opc_service.signal2_node)
try:
opc_service.save_config()
@@ -675,11 +673,7 @@ async def save_signal_config(data: dict):
# 模拟信号接口 (用于测试)
# ─────────────────────────────────────────────
@app.post("/api/track/simulate/signal1")
async def simulate_signal1():
"""模拟信号1触发 - 获取下5个钢卷"""
await opc_service._handle_signal1()
return {"message": "信号1已触发"}
# 信号1模拟API已移除 - 信号1不再使用
@app.post("/api/track/simulate/signal2")

View File

@@ -1,15 +1,39 @@
{
"opc_url": "opc.tcp://127.0.0.1:49320",
"counter_node": "ns=2;s=PL.TRACKMAP.COUNTER",
"counter_node": "ns=2;s=通道 1.PLCFur.LineMeasure-1.COUNTER",
"poll_interval": 2,
"trackmap_nodes": {},
"signal1_node": "ns=2;s=PL.Signal.EntryCoil",
"signal2_node": "ns=2;s=PL.Signal.WeldDone",
"write_counter_node": "",
"write_source_node": "",
"write_target_node": "",
"signal2_node": "ns=2;s=通道 1.PLCFur.LineMeasure-1.WeldDone",
"write_counter_node": "ns=2;s=通道 1.PLCFur.LineMeasure-1.WriteCounter",
"write_source_node": "ns=2;s=通道 1.PLCFur.LineMeasure-1.Source",
"write_target_node": "ns=2;s=通道 1.PLCFur.LineMeasure-1.Target",
"write_s7_endpoint": "140.80.0.2:102",
"write_s7_rack": 0,
"write_s7_slot": 1,
"write_nodes": {
"1": {},
"2": {}
"1": {
"setup_data_revision": "DB35501.DINT0",
"coilid": "DB35501.DBB4",
"entry_coil_weight": "DB35501.DBD26",
"entry_of_coil_length": "DB35501.DBD30",
"entry_coil_width": "DB35501.DBD34",
"entry_coil_thickness": "DB35501.DBD38",
"entry_of_coil_inner_diameter": "DB35501.DBD42",
"entry_of_coil_outer_diameter": "DB35501.DBD46",
"alloy_code": "DB35501.DBB50",
"material": "DB35501.DBB56"
},
"2": {
"setup_data_revision": "DB35501.DINT0",
"coilid": "DB35501.DBB78",
"entry_coil_weight": "DB35501.DBD100",
"entry_of_coil_length": "DB35501.DBD104",
"entry_coil_width": "DB35501.DBD108",
"entry_coil_thickness": "DB35501.DBD112",
"entry_of_coil_inner_diameter": "DB35501.DBD116",
"entry_of_coil_outer_diameter": "DB35501.DBD120",
"alloy_code": "DB35501.DBB124",
"material": "DB35501.DBB130"
}
}
}

View File

@@ -272,14 +272,12 @@ class OpcService:
counter_changed = current_counter != self.last_counter_at_state_change
# State machine for signal processing
# Signal1自动化处理已禁用 - 只允许手动调用_handle_signal1函数
# 信号1不再响应自动化触发确保双向保护
if self.track_state == "WAIT_S1":
if signal1_value is not None and self.signal1_last is not None:
if self.signal1_last == 0 and signal1_value == 1 and counter_changed:
self._log(f"Signal1: Entry coil triggered (0->1) with counter change, state={self.track_state}")
await self._handle_signal1()
self.track_state = "WAIT_S2"
self.last_counter_at_state_change = current_counter
# 不再处理信号1的自动化触发
# 信号1只能通过手动调用API或信号2内部逻辑触发
pass
elif self.track_state == "WAIT_S2":
if signal2_value is not None and self.signal2_last is not None:

View File

@@ -18,10 +18,6 @@
<el-input v-model="form.counter_node" placeholder="ns=2;s=PL.TRACKMAP.COUNTER" style="width:360px" />
<span class="hint">追踪流程计数器节点值变化时触发采集</span>
</el-form-item>
<el-form-item label="信号1(入口钢卷)">
<el-input v-model="form.signal1_node" placeholder="ns=2;s=PL.Signal.EntryCoil" style="width:360px" />
<span class="hint">入口钢卷信号01触发</span>
</el-form-item>
<el-form-item label="信号2(焊接完成)">
<el-input v-model="form.signal2_node" placeholder="ns=2;s=PL.Signal.WeldDone" style="width:360px" />
<span class="hint">焊接完成信号01且计数器变化触发</span>

View File

@@ -15,6 +15,12 @@ set "BACKEND_DIR=backend"
set "FRONTEND_DIR=frontend"
:: =====================================================
:: 初始化 conda关键让脚本内部能使用 conda 命令)
for /f "delims=" %%i in ('conda info --base') do set "CONDA_BASE=%%i"
call "%CONDA_BASE%\shell\condabin\conda-hook.cmd"
echo ✅ conda 环境初始化完成
echo.
echo [1/4] 检查并创建 conda 环境...
conda env list | findstr %CONDA_ENV%
if %errorlevel% equ 0 (
@@ -33,8 +39,11 @@ cd ..
echo.
echo [4/4] 启动前后端...
start "【后端】" cmd /k "chcp 65001 & call conda activate %CONDA_ENV% & cd /d ""%BACKEND_DIR%"" & uvicorn main:app --host 0.0.0.0 --port 8000 --reload"
:: 启动后端
start "【后端】" cmd /k "chcp 65001 & for /f "delims=" %%i in ('conda info --base') do set "CONDA_BASE=%%i" & call "%%CONDA_BASE%%\shell\condabin\conda-hook.cmd" & call conda activate %CONDA_ENV% & cd /d ""%BACKEND_DIR%"" & uvicorn main:app --host 0.0.0.0 --port 8000 --reload"
timeout /t 2 /nobreak >nul
:: 启动前端
start "【前端】" cmd /k "chcp 65001 & cd /d ""%FRONTEND_DIR%"" & npm run serve"
echo.