阀门Portion Size运行时设置问题求助:如何在启动阶段从数据库读取初始份容量值
我看你已经试过三种方法了,核心问题就是系统初始化时会优先读取Properties里的PortionSize,而Main > On Start up的执行时机在这之后,导致初始值总是被硬编码的数值覆盖。给你两个针对性的解决方案:
方案1:让变量提前从数据库取值(优先推荐)
如果你的系统支持变量初始化时绑定数据库查询,直接把parcel_size变量的默认值设置为数据库查询语句(比如SELECT default_portion FROM valve_config WHERE valve_id='your_valve_id'),而不是在On Start up里赋值。这样系统在初始化变量的时候,会直接从数据库拉取数值,后续把parcel_size填入PortionSize输入框时,系统就能在启动早期拿到正确的初始值,不会再报“PortionSize不能为零”的错误。
要是系统不支持变量直接绑定数据库,那可以找有没有预启动钩子(比如Before Start up环节),在这个更早的阶段完成数据库读取并赋值给parcel_size,确保系统加载Properties时变量已经有值。
方案2:手动接管阀门初始化流程
这个方案能绕过系统的自动初始化逻辑,完全由你控制初始值:
- 在Properties里,把PortionSize设为一个和后续单位一致的极小值(比如0.0001 TON,注意单位必须和你数据库里存的parcel_size单位匹配),同时取消勾选“Recurrent action on portion”。
- 在
Main > On Start up里,按顺序执行以下操作:- 先从数据库读取值并赋值给
parcel_size,确保数值和单位都正确(比如数据库存的是吨,就统一用TON单位)。 - 调用
valve.set_portionSize(parcel_size, TON);(这里的单位必须和Properties里临时值的单位完全一致,否则会报参数不兼容错误)。 - 再启用循环动作:
valve.actionOnPortion = true;。 - 最后同步valve2的参数,确保它的dispense参数和valve的PortionSize匹配:
valve2.set_portionSize(parcel_size, TON);(如果valve2也需要一致的份容量),再执行valve2.dispense(parcel_size, TON);。
- 先从数据库读取值并赋值给
为什么之前尝试3会报错?
你遇到的“Volume and mass parameters are incompatible”错误,本质是单位不匹配:比如阀门默认用的是质量单位(TON),但你用体积单位(CUBIC_METER)去设置PortionSize,或者反过来。只要保证Properties里的临时值、数据库读取的数值单位、set_portionSize的参数单位三者完全统一,这个错误就能解决。
另外,要是数据库读取是异步操作,记得加个等待逻辑(比如判断parcel_size是否不为空/零),确保数值加载完成后再执行阀门设置,避免空值或零值导致的问题。
内容的提问来源于stack exchange,提问作者bluechimp

