问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

EPICS加热器控制PID仿真

创作时间:
作者:
@小白创作中心

EPICS加热器控制PID仿真

引用
CSDN
1.
https://m.blog.csdn.net/yuyuyuliang00/article/details/138443657

本文详细介绍了使用PID控制算法对水箱加热系统的仿真设计。内容涵盖PID控制的基本原理、系统架构,并通过具体的代码示例展示了如何在实际系统中实现PID控制。

PID控制框图

PID控制的基本框架包括以下几个关键组件:

  1. 更新周期(dT)
  2. 误差读数(E(n))
  3. 输出读数(O(n))
  4. 比例增益(Kp)、积分增益(KI)和微分增益(KD)

水箱加热控制模拟

水箱加热控制模拟涉及多个关键组件:

  1. 室温设置($(P)Room):默认25摄氏度,范围0-100摄氏度。
  2. 加热电压设置($(P)Heat_V):默认0V,范围0-110V。
  3. 加热功率计算($(P)Heat_Pwr):根据加热电压计算加热功率。
  4. 水箱温度计算($(P)Tank_clc):每秒根据当前温度、室温和加热计算新的温度。
  5. 传感器状态($(P)Sensor):模拟传感器是否正常工作。

以下是具体的配置代码:

record(ao, "$(P)Room") {
  field(DESC, "Room Temperature")
  field(SCAN, "Passive")
  field(PINI, "YES")
  field(DTYP, "Soft Channel")
  field(DOL, "25")
  field(EGU, "oC")
  field(DRVH, "100")
  field(DRVL, "0")
  field(HOPR, "100")
  field(LOPR, "0")
}

record(ao, "$(P)Heat_V") {
  field(DESC, "Heater Voltage")
  field(SCAN, "Passive")
  field(PINI, "YES")
  field(DTYP, "Soft Channel")
  field(LINR, "NO CONVERSION")
  field(EGU, "V")
  field(DRVH, "110")
  field(DRVL, "0")
  field(HIGH, "110")
  field(HSV, "MINOR")
  field(IVOA, "Set output to IVOV")
  field(IVOV, "0")
}

record(calc, "$(P)Heat_Pwr") {
  field(DESC, "Heater Power")
  field(SCAN, "Passive")
  field(CALC, "A*A / 12.1")
  field(INPA, "$(P)Heat_V PP")
  field(EGU, "W")
}

record(bi, "$(P)Sensor") {
  field(DESC, "Sensor Simulation")
  field(SCAN, "Passive")
  field(PINI, "YES")
  field(ZNAM, "OK")
  field(ONAM, "Broken")
}

record(calc, "$(P)Tank_clc") {
  field(DESC, "Water Tank Simulation")
  field(SCAN, "1 second")
  field(PINI, "YES")
  field(FLNK, "$(P)Tank")
  field(CALC, "A+(B-A)*D+C*E")
  field(INPA, "$(P)Tank_clc")
  field(INPB, "$(P)Room")
  field(INPC, "$(P)Heat_Pwr PP")
  field(INPD, "0.01")
  field(INPE, "0.001")
  field(EGU, "oC")
  field(PREC, "4")
}

record(calc, "$(P)Tank") {
  field(DESC, "Tank Temperature or Invalid")
  field(SCAN, "Passive")
  field(CALC, "A?C:B")
  field(INPA, "$(P)Sensor")
  field(INPB, "$(P)Tank_clc")
  field(INPC, "-100")
  field(EGU, "oC")
  field(PREC, "1")
  field(HOPR, "100")
  field(LOPR, "0")
  field(HIHI, "100")
  field(LOLO, "-100")
  field(HIGH, "70")
  field(LOW, "0")
  field(HHSV, "MAJOR")
  field(LLSV, "INVALID")
  field(HSV, "MINOR")
  field(LSV, "MINOR")
}

PI控制部分设计

PI控制部分涉及以下组件:

  1. 温度设置点($(P)Setpoint):默认30摄氏度,范围0-100摄氏度。
  2. 温度偏差计算($(P)Error):计算设置温度和水箱温度之间的偏差。
  3. 积分温度偏差($(P)Integral):对温度偏差进行积分。
  4. PID运算($(P)PID):计算输出电压。
  5. P系数设置($(P)P)和I系数设置($(P)I)。

以下是具体的配置代码:

record(ao, "$(P)Setpoint") {
  field(DESC, "Temperature Setpoint")
  field(SCAN, "Passive")
  field(PINI, "YES")
  field(DOL, "30")
  field(PREC, "1")
  field(EGU, "oC")
  field(DRVH, "100")
  field(DRVL, "0")
  field(HIHI, "90")
  field(LOLO, "0")
  field(HIGH, "80")
  field(LOW, "0")
  field(HHSV, "MAJOR")
  field(LLSV, "NO_ALARM")
  field(HSV, "MINOR")
  field(LSV, "NO_ALARM")
}

record(calc, "$(P)Error") {
  field(DESC, "Temperature Error")
  field(SCAN, "1 second")
  field(PINI, "NO")
  field(FLNK, "$(P)Integral")
  field(CALC, "A-B")
  field(INPA, "$(P)Setpoint")
  field(INPB, "$(P)Tank MS")
  field(EGU, "oC")
  field(PREC, "1")
}

record(calc, "$(P)Integral") {
  field(DESC, "Integrate Error for PID")
  field(SCAN, "Passive")
  field(CALC, "(B+A>C)?C:(B+A<-C)?(-C):(A+B)")
  field(INPA, "$(P)Error")
  field(INPB, "$(P)Integral")
  field(INPC, "20")
  field(PREC, "3")
  field(FLNK, "$(P)PID")
}

record(calc, "$(P)PID") {
  field(DESC, "Water Tank PID")
  field(SCAN, "Passive")
  field(PINI, "NO")
  field(CALC, "A*B+C*D")
  field(INPA, "$(P)Error")
  field(INPB, "$(P)P")
  field(INPC, "$(P)Integral")
  field(INPD, "$(P)I")
  field(PREC, "3")
  field(HOPR, "1000")
  field(LOPR, "-1000")
  field(HIHI, "900")
  field(LOLO, "-900")
  field(HIGH, "500")
  field(LOW, "500")
  field(HHSV, "MAJOR")
  field(LLSV, "MAJOR")
  field(HSV, "MINOR")
  field(LSV, "MINOR")
}

record(ao, "$(P)P") {
  field(DESC, "Proportional")
  field(SCAN, "Passive")
  field(PINI, "YES")
  field(DOL, "10")
  field(OMSL, "supervisory")
  field(PREC, "2")
  field(DRVH, "100")
  field(DRVL, "0")
}

record(ao, "$(P)I") {
  field(DESC, "Intergral")
  field(SCAN, "Passive")
  field(PINI, "YES")
  field(DTYP, "Soft Channel")
  field(DOL, "5")
  field(OMSL, "supervisory")
  field(PREC, "2")
  field(DRVH, "100")
  field(DRVL, "0")
}

record(ao, "$(P)Heat_V") {
  field(DOL, "$(P)PID")
  field(OMSL, "closed_loop")
}

添加微分项D控制部分

为了实现完整的PID控制,需要添加微分项(D)的计算:

  1. 修改$(P)Error的SCAN属性为被动,使其由新的$(P)Error_Diff触发。
  2. 添加微分误差计算项$(P)Error_Diff
  3. 在PID计算中增加微分项的计算

以下是具体的配置代码:

record(calc, "$(P)Error") {
    field(SCAN, "Passive")
}

record(calc, "$(P)Error_Diff") {
    field(DESC, "Temperature Difference")
    field(SCAN, "1 second")
    field(INPA, "$(P)Error")
    field(INPB, "$(P)Error MS PP")
    field(CALC, "(B-A)/1.0")
}

record(calc, "$(P)PID") {
    field(INPE, "$(P)D")
    field(INPF, "$(P)Error_Diff MS")
    field(CALC, "A*B+C*D+E*F")
}

通过以上配置,可以实现一个完整的PID控制系统,用于水箱加热的温度控制。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号