200smart 医药洁净室空调箱程序 温湿度串级PID 模拟结构体变量 去年开始西门子PLC1500 CPU以及模块都涨价非常厉害,而且缺货严重,这个项目刚好是赶上这个情况,从最初选型1500 CPU最后折中选择用200smart来作为控制器。 在刚开始做的时候也对200smart的控制功能也有担心,毕竟不想1500功能强大,而且对于200smart而言还有一个很大的弊端,就是没有办法和1500一样创建结构图变量,这样对于PLC和上位机WinCC通讯非常繁琐,但是处于之前的项目经验还是想办法在200smart也做了一个类似结构体变量的功能,最终实现和上位机WinCC的通讯。 目前项目已经基本结束,控制效果还是蛮不错的,有需要借鉴的可以拿来看看。
最近在医药洁净室空调箱控制项目里被迫解锁了200smart的隐藏技能。这个项目原本计划用1500系列PLC,结果去年那波缺货涨价潮直接打乱了节奏——预算和货期都不允许,硬着头皮切到200smart平台。
老司机们都知道200smart和1500最大的差距在哪:结构体变量缺失。这个硬伤直接导致WinCC通讯时得用最原始的地址映射方式。想象一下要给每个温度、湿度、风机状态单独建立通讯变量,那画面太美不敢看...
不过办法总比困难多,祭出指针操作大法。既然不能直接定义结构体,就用数组+间接寻址来模拟。先定义一组连续的V区地址作为空调箱对象的数据存储区:
//VW1000起分配结构体 VW1000: 温度设定值 (Real) VW1004: 湿度设定值 (Real) VW1008: 当前温度 (Real) VW1012: 当前湿度 (Real) VW1016: 风机状态 (Bool)然后用指针寄存器实现结构体成员的访问。比如要修改1号空调箱的湿度设定值:
MOVD &VB1000, AC1 //结构体基地址 MOVD AC1 + 4, AC2 //偏移4字节到湿度设定 MOVR 55.5, [AC2] //写入新设定值配合WinCC端做地址绑定的时候,只需要把整个V区块映射成DB块。上位机看到的是规整的结构体数据,实际底层是200smart的连续V区地址,完美实现"伪结构体"通讯。
温湿度控制采用串级PID架构是个亮点。外层湿度PID的输出作为内层温度PID的设定值,这种嵌套结构在200smart里用两个PID指令实现:
//湿度PID计算 PID_CTRL(湿度设定, 实际湿度, 湿度输出, 湿度参数) //温度设定=基础温度 + 湿度输出补偿 MOVR 基础温度, 临时温度设定 +R 湿度输出, 临时温度设定 //温度PID计算 PID_CTRL(临时温度设定, 实际温度, 阀门开度, 温度参数)调试时发现200smart的PID自整定功能比想象中靠谱。配合模拟量输入信号的滑动平均滤波,在洁净室实测温度波动能控制在±0.3℃,湿度±2%RH的精度。
这个项目最大的收获是:不要被硬件限制框住思维。虽然200smart没有结构体变量,但通过地址规划和指针操作,照样能搭出类似1500的工程架构。当然代价是调试时得多烧点脑细胞——那些个指针偏移量算错的时候,分分钟让你体验寻址跑飞的刺激感。