feat(钢卷跟踪): 从哪开始获取计划?一次性获取多少个计划?不同批次的顺序号相同怎么处理?
已实现的功能:
Systemcount+信号变化才算有效
状态机逻辑:信号1必须配合计数器变化才触发,然后等待信号2
信号2必须配合计数器变化+保持2秒才触发
第一批1-5,第二批2-6,第三批3-7
每次取5个钢卷,顺序号滑动+1
信号2触发时更新Oracle追踪表
OPC页面配置点位
信号1(入口钢卷)节点配置
信号2(焊接完成)节点配置
计数器节点配置
保存后自动重启OPC服务
前端操作中间表 ✅
TrackCoil页面可增删改查临时表
可手动调整顺序
模拟信号1/信号2按钮可测试
- 后端新增钢卷跟踪相关API和数据库表
- 前端添加钢卷跟踪管理页面
- OPC服务增加信号节点监控和状态机处理
- 实现钢卷跟踪的自动更新逻辑
This commit is contained in:
@@ -102,6 +102,12 @@ CREATE TABLE IF NOT EXISTS PDI_PLTM (
|
||||
C REAL, SI REAL, MN REAL, P REAL, S REAL,
|
||||
CU REAL, NI REAL, CR REAL, MO REAL, V REAL,
|
||||
TI REAL, SOL_AL REAL, FE REAL, NB REAL, N REAL, B REAL,
|
||||
MG REAL, PB REAL, SN REAL, ZN REAL, ZR REAL,
|
||||
NA REAL, LI REAL, GA REAL, CA REAL,
|
||||
BE REAL, BI REAL, W REAL,
|
||||
TA REAL, O REAL, H REAL,
|
||||
AR REAL, AG REAL, AS1 REAL, CD REAL, CL REAL,
|
||||
CO REAL, K REAL, SB REAL, SE REAL,
|
||||
SEND_FLAG TEXT,
|
||||
SEND_DATE TEXT,
|
||||
TRANSACTION_ID TEXT,
|
||||
@@ -152,6 +158,16 @@ CREATE TABLE IF NOT EXISTS CMPT_PL_TRACKMAP (
|
||||
)
|
||||
"""
|
||||
|
||||
COIL_TRACK_DDL = """
|
||||
CREATE TABLE IF NOT EXISTS COIL_TRACK_TEMP (
|
||||
ID INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
COILID TEXT NOT NULL,
|
||||
SEQUENCENB INTEGER NOT NULL,
|
||||
ROLLPROGRAMNB INTEGER NOT NULL,
|
||||
CREATED_DT TEXT DEFAULT (datetime('now')),
|
||||
POSITION INTEGER DEFAULT 0
|
||||
)
|
||||
"""
|
||||
|
||||
def init_db():
|
||||
"""Create tables if they don't exist."""
|
||||
@@ -159,6 +175,7 @@ def init_db():
|
||||
try:
|
||||
conn.execute(PDI_DDL)
|
||||
conn.execute(TRACKMAP_DDL)
|
||||
conn.execute(COIL_TRACK_DDL)
|
||||
conn.commit()
|
||||
logger.info("SQLite schema ready: %s", DB_PATH)
|
||||
finally:
|
||||
@@ -301,3 +318,107 @@ def sqlite_upsert_trackmap(row: Dict[str, Any]):
|
||||
sc.commit()
|
||||
finally:
|
||||
sc.close()
|
||||
|
||||
|
||||
def sqlite_get_max_sequencenb() -> Optional[int]:
|
||||
sc = get_sqlite()
|
||||
try:
|
||||
cursor = sc.execute("SELECT MAX(SEQUENCENB) FROM PDI_PLTM")
|
||||
row = cursor.fetchone()
|
||||
return row[0] if row and row[0] is not None else None
|
||||
finally:
|
||||
sc.close()
|
||||
|
||||
|
||||
def sqlite_get_coils_by_sequencenb_range(start_seq: int, end_seq: int) -> List[Dict[str, Any]]:
|
||||
sc = get_sqlite()
|
||||
try:
|
||||
cursor = sc.execute("""
|
||||
SELECT COILID, SEQUENCENB, ROLLPROGRAMNB
|
||||
FROM PDI_PLTM
|
||||
WHERE SEQUENCENB >= ? AND SEQUENCENB <= ?
|
||||
ORDER BY SEQUENCENB DESC
|
||||
""", (start_seq, end_seq))
|
||||
rows = cursor.fetchall()
|
||||
return [{"coilid": r[0], "sequencenb": r[1], "rollprogramnb": r[2]} for r in rows]
|
||||
finally:
|
||||
sc.close()
|
||||
|
||||
|
||||
def sqlite_save_coils_to_track(coils: List[Dict[str, Any]]):
|
||||
sc = get_sqlite()
|
||||
try:
|
||||
sc.execute("DELETE FROM COIL_TRACK_TEMP")
|
||||
reversed_coils = list(reversed(coils))
|
||||
for i, coil in enumerate(reversed_coils):
|
||||
sc.execute("""
|
||||
INSERT INTO COIL_TRACK_TEMP (COILID, SEQUENCENB, ROLLPROGRAMNB, POSITION)
|
||||
VALUES (?, ?, ?, ?)
|
||||
""", (coil["coilid"], coil["sequencenb"], coil["rollprogramnb"], i + 1))
|
||||
sc.commit()
|
||||
logger.info(f"Saved {len(coils)} coils to track temp")
|
||||
finally:
|
||||
sc.close()
|
||||
|
||||
|
||||
def sqlite_get_coil_track() -> List[Dict[str, Any]]:
|
||||
sc = get_sqlite()
|
||||
try:
|
||||
cursor = sc.execute("""
|
||||
SELECT ID, COILID, SEQUENCENB, ROLLPROGRAMNB, CREATED_DT, POSITION
|
||||
FROM COIL_TRACK_TEMP
|
||||
ORDER BY POSITION ASC
|
||||
""")
|
||||
rows = cursor.fetchall()
|
||||
return [
|
||||
{"id": r[0], "coilid": r[1], "sequencenb": r[2], "rollprogramnb": r[3], "created_dt": r[4], "position": r[5]}
|
||||
for r in rows
|
||||
]
|
||||
finally:
|
||||
sc.close()
|
||||
|
||||
|
||||
def sqlite_update_coil_track_item(id: int, coilid: str, sequencenb: int, rollprogramnb: int, position: int):
|
||||
sc = get_sqlite()
|
||||
try:
|
||||
sc.execute("""
|
||||
UPDATE COIL_TRACK_TEMP
|
||||
SET COILID = ?, SEQUENCENB = ?, ROLLPROGRAMNB = ?, POSITION = ?
|
||||
WHERE ID = ?
|
||||
""", (coilid, sequencenb, rollprogramnb, position, id))
|
||||
sc.commit()
|
||||
finally:
|
||||
sc.close()
|
||||
|
||||
|
||||
def sqlite_add_coil_track_item(coilid: str, sequencenb: int, rollprogramnb: int):
|
||||
sc = get_sqlite()
|
||||
try:
|
||||
cursor = sc.execute("SELECT MAX(POSITION) FROM COIL_TRACK_TEMP")
|
||||
row = cursor.fetchone()
|
||||
max_pos = (row[0] or 0) + 1
|
||||
sc.execute("""
|
||||
INSERT INTO COIL_TRACK_TEMP (COILID, SEQUENCENB, ROLLPROGRAMNB, POSITION)
|
||||
VALUES (?, ?, ?, ?)
|
||||
""", (coilid, sequencenb, rollprogramnb, max_pos))
|
||||
sc.commit()
|
||||
finally:
|
||||
sc.close()
|
||||
|
||||
|
||||
def sqlite_delete_coil_track_item(id: int):
|
||||
sc = get_sqlite()
|
||||
try:
|
||||
sc.execute("DELETE FROM COIL_TRACK_TEMP WHERE ID = ?", (id,))
|
||||
sc.commit()
|
||||
finally:
|
||||
sc.close()
|
||||
|
||||
|
||||
def sqlite_clear_coil_track():
|
||||
sc = get_sqlite()
|
||||
try:
|
||||
sc.execute("DELETE FROM COIL_TRACK_TEMP")
|
||||
sc.commit()
|
||||
finally:
|
||||
sc.close()
|
||||
|
||||
Reference in New Issue
Block a user