已实现的功能:
Systemcount+信号变化才算有效
状态机逻辑:信号1必须配合计数器变化才触发,然后等待信号2
信号2必须配合计数器变化+保持2秒才触发
第一批1-5,第二批2-6,第三批3-7
每次取5个钢卷,顺序号滑动+1
信号2触发时更新Oracle追踪表
OPC页面配置点位
信号1(入口钢卷)节点配置
信号2(焊接完成)节点配置
计数器节点配置
保存后自动重启OPC服务
前端操作中间表 ✅
TrackCoil页面可增删改查临时表
可手动调整顺序
模拟信号1/信号2按钮可测试
- 后端新增钢卷跟踪相关API和数据库表
- 前端添加钢卷跟踪管理页面
- OPC服务增加信号节点监控和状态机处理
- 实现钢卷跟踪的自动更新逻辑
187 lines
7.3 KiB
Python
187 lines
7.3 KiB
Python
from typing import Optional, List, Dict
|
||
from pydantic import BaseModel, Field
|
||
|
||
|
||
class PDIPLTMCreate(BaseModel):
|
||
coilid: str = Field(..., min_length=12, max_length=12, description="钢卷号,必须为12位")
|
||
rollprogramnb: Optional[int] = None
|
||
sequencenb: Optional[int] = None
|
||
schedule_code: Optional[str] = None
|
||
entry_coil_thickness: Optional[float] = None
|
||
entry_coil_thickness_max: Optional[float] = None
|
||
entry_coil_thickness_min: Optional[float] = None
|
||
entry_coil_width: Optional[float] = None
|
||
entry_coil_width_max: Optional[float] = None
|
||
entry_coil_width_min: Optional[float] = None
|
||
entry_coil_weight: Optional[float] = None
|
||
entry_of_coil_length: Optional[float] = None
|
||
entry_of_coil_inner_diameter: Optional[float] = None
|
||
entry_of_coil_outer_diameter: Optional[float] = None
|
||
trimming: Optional[int] = None
|
||
trimming_width: Optional[float] = None
|
||
smp_length: Optional[float] = None
|
||
smp_num: Optional[float] = None
|
||
smp_frq: Optional[str] = None
|
||
preceding_process_code: Optional[str] = None
|
||
next_process_code: Optional[str] = None
|
||
hot_mill_delivery_temp: Optional[float] = None
|
||
finished_coil_temp: Optional[float] = None
|
||
crown_average: Optional[float] = None
|
||
coil_flatness_average: Optional[float] = None
|
||
coil_flatness_max_value: Optional[float] = None
|
||
coil_flatness_min_value: Optional[float] = None
|
||
material_yield_point: Optional[float] = None
|
||
material_tensile: Optional[float] = None
|
||
hotactfmwedgeavg: Optional[float] = None
|
||
weight_mode: Optional[str] = None
|
||
dummy_coil_mrk: Optional[str] = None
|
||
cut_mode: Optional[str] = None
|
||
off_gauge_head_length: Optional[float] = None
|
||
off_gauge_tail_length: Optional[float] = None
|
||
exit_coil_no: Optional[str] = None
|
||
exit_coil_weight: Optional[float] = None
|
||
exit_coil_weight_max: Optional[float] = None
|
||
exit_coil_weight_min: Optional[float] = None
|
||
exit_coil_thickness: Optional[float] = None
|
||
exit_coil_thickness_max: Optional[float] = None
|
||
exit_coil_thickness_min: Optional[float] = None
|
||
exit_coil_width: Optional[float] = None
|
||
exit_coil_width_max: Optional[float] = None
|
||
exit_coil_width_min: Optional[float] = None
|
||
work_order_no: Optional[str] = None
|
||
order_quality: Optional[str] = None
|
||
steel_grade: Optional[str] = None
|
||
sg_sign: Optional[str] = None
|
||
order_thickness: Optional[float] = None
|
||
order_thickness_max: Optional[float] = None
|
||
order_thickness_min: Optional[float] = None
|
||
order_width: Optional[float] = None
|
||
order_width_max: Optional[float] = None
|
||
order_width_min: Optional[float] = None
|
||
sleeve_code_of_cold_coil: Optional[str] = None
|
||
packing_type_code: Optional[str] = None
|
||
thk_ds: Optional[str] = None
|
||
ext_num_01: Optional[str] = None
|
||
# chemical elements
|
||
c: Optional[float] = None
|
||
si: Optional[float] = None
|
||
mn: Optional[float] = None
|
||
p: Optional[float] = None
|
||
s: Optional[float] = None
|
||
cu: Optional[float] = None
|
||
ni: Optional[float] = None
|
||
cr: Optional[float] = None
|
||
mo: Optional[float] = None
|
||
v: Optional[float] = None
|
||
ti: Optional[float] = None
|
||
sol_al: Optional[float] = None
|
||
fe: Optional[float] = None
|
||
nb: Optional[float] = None
|
||
n: Optional[float] = None
|
||
b: Optional[float] = None
|
||
send_flag: Optional[str] = None
|
||
work_order_no: Optional[str] = None
|
||
coiler_diameter: Optional[int] = None
|
||
l2_grade: Optional[str] = None
|
||
scrap_cut_head_len: Optional[float] = None
|
||
scrap_cut_tail_len: Optional[float] = None
|
||
meterweight: Optional[float] = None
|
||
meter_d_outside: Optional[float] = None
|
||
meter_width: Optional[float] = None
|
||
uncoiler_tension: Optional[float] = None
|
||
looper_tension_1: Optional[float] = None
|
||
pl_tension: Optional[float] = None
|
||
looper_tension_2: Optional[float] = None
|
||
looper_tension_3: Optional[float] = None
|
||
|
||
|
||
class PDIPLTMUpdate(BaseModel):
|
||
rollprogramnb: Optional[int] = None
|
||
sequencenb: Optional[int] = None
|
||
schedule_code: Optional[str] = None
|
||
entry_coil_thickness: Optional[float] = None
|
||
entry_coil_thickness_max: Optional[float] = None
|
||
entry_coil_thickness_min: Optional[float] = None
|
||
entry_coil_width: Optional[float] = None
|
||
entry_coil_width_max: Optional[float] = None
|
||
entry_coil_width_min: Optional[float] = None
|
||
entry_coil_weight: Optional[float] = None
|
||
entry_of_coil_length: Optional[float] = None
|
||
entry_of_coil_inner_diameter: Optional[float] = None
|
||
entry_of_coil_outer_diameter: Optional[float] = None
|
||
trimming: Optional[int] = None
|
||
trimming_width: Optional[float] = None
|
||
smp_length: Optional[float] = None
|
||
smp_num: Optional[float] = None
|
||
smp_frq: Optional[str] = None
|
||
preceding_process_code: Optional[str] = None
|
||
next_process_code: Optional[str] = None
|
||
hot_mill_delivery_temp: Optional[float] = None
|
||
finished_coil_temp: Optional[float] = None
|
||
crown_average: Optional[float] = None
|
||
coil_flatness_average: Optional[float] = None
|
||
material_yield_point: Optional[float] = None
|
||
material_tensile: Optional[float] = None
|
||
weight_mode: Optional[str] = None
|
||
dummy_coil_mrk: Optional[str] = None
|
||
cut_mode: Optional[str] = None
|
||
off_gauge_head_length: Optional[float] = None
|
||
off_gauge_tail_length: Optional[float] = None
|
||
exit_coil_no: Optional[str] = None
|
||
exit_coil_weight: Optional[float] = None
|
||
exit_coil_weight_max: Optional[float] = None
|
||
exit_coil_weight_min: Optional[float] = None
|
||
exit_coil_thickness: Optional[float] = None
|
||
exit_coil_thickness_max: Optional[float] = None
|
||
exit_coil_thickness_min: Optional[float] = None
|
||
exit_coil_width: Optional[float] = None
|
||
exit_coil_width_max: Optional[float] = None
|
||
exit_coil_width_min: Optional[float] = None
|
||
work_order_no: Optional[str] = None
|
||
order_quality: Optional[str] = None
|
||
steel_grade: Optional[str] = None
|
||
sg_sign: Optional[str] = None
|
||
order_thickness: Optional[float] = None
|
||
order_thickness_max: Optional[float] = None
|
||
order_thickness_min: Optional[float] = None
|
||
order_width: Optional[float] = None
|
||
order_width_max: Optional[float] = None
|
||
order_width_min: Optional[float] = None
|
||
packing_type_code: Optional[str] = None
|
||
thk_ds: Optional[str] = None
|
||
c: Optional[float] = None
|
||
si: Optional[float] = None
|
||
mn: Optional[float] = None
|
||
p: Optional[float] = None
|
||
s: Optional[float] = None
|
||
cu: Optional[float] = None
|
||
ni: Optional[float] = None
|
||
cr: Optional[float] = None
|
||
mo: Optional[float] = None
|
||
v: Optional[float] = None
|
||
ti: Optional[float] = None
|
||
sol_al: Optional[float] = None
|
||
nb: Optional[float] = None
|
||
n: Optional[float] = None
|
||
b: Optional[float] = None
|
||
send_flag: Optional[str] = None
|
||
coiler_diameter: Optional[int] = None
|
||
l2_grade: Optional[str] = None
|
||
uncoiler_tension: Optional[float] = None
|
||
looper_tension_1: Optional[float] = None
|
||
pl_tension: Optional[float] = None
|
||
looper_tension_2: Optional[float] = None
|
||
looper_tension_3: Optional[float] = None
|
||
scrap_cut_head_len: Optional[float] = None
|
||
scrap_cut_tail_len: Optional[float] = None
|
||
meterweight: Optional[float] = None
|
||
|
||
|
||
class OpcConfig(BaseModel):
|
||
opc_url: str
|
||
counter_node: str
|
||
poll_interval: int = 2
|
||
trackmap_nodes: Dict[str, str] = {}
|
||
signal1_node: str = ""
|
||
signal2_node: str = ""
|