EPICS加热器控制PID仿真
创作时间:
作者:
@小白创作中心
EPICS加热器控制PID仿真
引用
CSDN
1.
https://m.blog.csdn.net/yuyuyuliang00/article/details/138443657
本文详细介绍了使用PID控制算法对水箱加热系统的仿真设计。内容涵盖PID控制的基本原理、系统架构,并通过具体的代码示例展示了如何在实际系统中实现PID控制。
PID控制框图
PID控制的基本框架包括以下几个关键组件:
- 更新周期(dT)
- 误差读数(E(n))
- 输出读数(O(n))
- 比例增益(Kp)、积分增益(KI)和微分增益(KD)
水箱加热控制模拟
水箱加热控制模拟涉及多个关键组件:
- 室温设置($(P)Room):默认25摄氏度,范围0-100摄氏度。
- 加热电压设置($(P)Heat_V):默认0V,范围0-110V。
- 加热功率计算($(P)Heat_Pwr):根据加热电压计算加热功率。
- 水箱温度计算($(P)Tank_clc):每秒根据当前温度、室温和加热计算新的温度。
- 传感器状态($(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控制部分涉及以下组件:
- 温度设置点($(P)Setpoint):默认30摄氏度,范围0-100摄氏度。
- 温度偏差计算($(P)Error):计算设置温度和水箱温度之间的偏差。
- 积分温度偏差($(P)Integral):对温度偏差进行积分。
- PID运算($(P)PID):计算输出电压。
- 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)的计算:
- 修改$(P)Error的SCAN属性为被动,使其由新的$(P)Error_Diff触发。
- 添加微分误差计算项$(P)Error_Diff。
- 在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控制系统,用于水箱加热的温度控制。
热门推荐
NHK纪录片揭秘731部队:精英医学研究者的堕落与历史真相
消化系统异常?这些小妙招让你远离烦恼!
中医养生:从脾胃调养到全面健康管理
高纤维食物:改善消化的金钥匙
浙江丽水旅游攻略,探索丽水的自然美景与人文风情
浙江丽水最佳自驾路线攻略:绿谷仙境之旅
面粉质量检测:企业效益提升的关键
掌握比容积,用烘焙百分比提升面包质量!
金莎巧克力:高热量背后的甜蜜秘密
宣璐:用演技诠释角色内心的温度
红烧鸡爪要好吃很简单,轻松就让鸡爪无腥味,软烂入味,太好吃了
旺销的网红蒜香柠檬鸡爪,加入自制红油,风味十足(附详细配方与红油做法)
大人发烧较快退烧方法
四川观赏红叶的更佳时期:几月份最适宜?
笔记本电脑连不上网?这15招让你秒变IT达人!
Windows系统网络连接故障大揭秘!
双十一抢购前必看:笔记本电脑网络连接问题全攻略
从五阿哥到导演:苏有朋的多重宇宙人生
从五阿哥到花无缺:苏有朋的演艺之路
苏有朋:从五阿哥到花无缺,经典角色塑造演艺传奇
春节祈福:如何化解太岁影响?
SMART原则目标管理方法
心血管疾病合并CKD患者降压治疗指南:血压控制与药物选择
鲟鱼全身都是宝:营养价值与功效详解
奥特曼新作揭秘:雷德王角色大变脸
布莱泽奥特曼12月剧照:雷德王惊喜回归!
2025年春节档,姜文、刘德华、肖战谁更值得期待?
春节档双雄:《封神》与《射雕》带你穿越历史风云
莽山旅游攻略:景点门票、开放时间及美食住宿全攻略
软件项目中合作伙伴和供应商的有效策略