西门子pLc程序十KTp1200 屏画面,siemens博途v14 v15 v16 v17版均可打开,Cpu为s7~1215DC,有温度压力控制,液压功能,模拟量处理,趋势图,配方功能,电能表M0dbus485通讯读取数据
最近在车间折腾了个西门子S7-1200的项目,用1215DC CPU配合KTP1200触摸屏搞了套液压控制系统。这玩意儿既要处理模拟量又要做配方管理,顺手把电能表数据也薅过来监控,整个过程踩了不少坑,分享点干货给大伙儿。
先说模拟量处理这块。现场接了4路PT100和2路压力变送器,硬件组态里记得把AI模块的滤波时间设置成100ms。关键是要做好量程转换,下面这段SCL代码比梯形图清爽多了:
FUNCTION_BLOCK AnalogScaling VAR_INPUT rawValue : INT; END_VAR VAR_OUTPUT scaledValue : REAL; END_VAR VAR minRaw : INT := 5530; //4mA对应值 maxRaw : INT := 27648; //20mA对应值 engMin : REAL := 0.0; engMax : REAL := 10.0; //压力量程0-10MPa END_VAR scaledValue := (engMax - engMin) * (rawValue - minRaw) / (maxRaw - minRaw) + engMin;这段代码直接甩到函数块里调用,比用"Scale"指令灵活得多。调试时候发现个坑爹问题——传感器断线时数值会卡在32767,后来在OB1里加了段异常值检测才搞定。
西门子pLc程序十KTp1200 屏画面,siemens博途v14 v15 v16 v17版均可打开,Cpu为s7~1215DC,有温度压力控制,液压功能,模拟量处理,趋势图,配方功能,电能表M0dbus485通讯读取数据
配方管理用到了SQLite数据库,触摸屏上的配方选择对应DB块偏移量。重点是要处理好数据同步,这里用了个取巧的方法:
//HMI触发配方加载 IF "HMI_RecipeSelect" <> "LastRecipe" THEN SFC20复制(源DB:=RecipeDB[ "HMI_RecipeSelect" ], 目标DB:=ProcessDB); "LastRecipe" := "HMI_RecipeSelect"; END_IF;趋势图展示要控制数据刷新频率,在WinCC里设置归档周期为1秒,同时PLC端用循环中断OB30做数据缓存。突然断电会导致归档文件损坏,后来加了个每天自动备份到SD卡的脚本。
Modbus通讯搞485电能表时,记得在硬件配置里把RS485端口的响应超时设为300ms。用了官方的Modbus库,但需要自己处理字节序:
//读取电能值 MB_MASTER_DB(REQ:=TRUE, MB_ADDR:=3, MODE:=0, DATA_ADDR:=40001, DATA_LEN:=4, DATA_PTR:=P#DB201.DBX0.0 BYTE 4); //处理浮点转换 L DB201.DBD0 T #TempReal实测发现当多个从站时响应会超时,最后改成每次主循环只处理一个从站的请求才稳定下来。液压控制部分用状态机实现,不同压力阶段切换时加了10%的死区,防止执行机构频繁动作。
整个项目在博途V17里最终编译时,发现V15创建的部分报警文本丢失了。所以跨版本移植时,最好先用自带的项目迁移工具处理一遍。最后在触摸屏上做了个隐藏的工程师菜单,长按右下角5秒调出PID参数调整界面,方便现场调试。