微网站门户东营专业网站建设公司电话
微网站门户,东营专业网站建设公司电话,贵州网站设计,重庆最火十大景区排名西门子PLC程序大型项目#xff0c;siemens博途V16 V17版#xff0c;配方处理程序#xff0c;多个昆仑通态触摸屏配方#xff0c;ScL语言#xff0c;485通讯控制变频器#xff0c;模拟量压力处理#xff0c;多个1200cpu处理#xff0c;称重数据读取。半夜两点盯着博途V…西门子PLC程序大型项目siemens博途V16 V17版配方处理程序多个昆仑通态触摸屏配方ScL语言485通讯控制变频器模拟量压力处理多个1200cpu处理称重数据读取。半夜两点盯着博途V17的工程树发呆突然意识到这项目要是再不把配方模块理顺了明天现场调试又得被电工班那帮兄弟怼到自闭。西门子这套生态玩大型项目配方处理绝对是绕不过的鬼门关。昆仑通态的触摸屏配了六个不同型号每个屏的配方数据结构还特么长得不一样。这时候就得祭出SCL的骚操作了FUNCTION_BLOCK RecipeHandler VAR currentRecipe : ARRAY[1..50] OF REAL; // 50个参数的配方 hmiMapping : ARRAY[1..6,1..50] OF INT; // 六台触摸屏的地址映射表 END_VAR METHOD LoadRecipe : BOOL VAR_INPUT hmiID : INT; END_VAR VAR tempData : ARRAY[1..50] OF REAL; i : INT; BEGIN FOR i : 1 TO 50 DO tempData[i] : HMI_ReadReal(hmiMapping[hmiID,i]); // 动态地址映射 END_FOR; IF CheckCRC(tempData) THEN currentRecipe : tempData; RETURN TRUE; ENDIF; END_METHOD这代码有个坑——不同型号的触摸屏对浮点数的存储格式竟然不一样有个型号的高字节在前另一个偏要玩低字节在前。逼得老子在HMI_ReadReal里加了字节逆序处理这破事折腾了三天才定位到。说到485控制变频器西门子的MODBUS库有时候比变频器本身还不靠谱。现场十八台变频器用RS485菊花链结果发现只要有一台报故障整个总线就崩。后来改成这结构// 通讯故障自动跳转 FOR #i : 1 TO 18 DO IF NOT #CommBuffer[#i].Busy THEN CASE #step OF 0: MB_MASTER(REQ:TRUE, UNIT_ADDRESS:#i, DATA_ADDR:16#3200, DATA_LEN:10, DATA_PTR:#tempData); #step : 10; 10: IF #status.DONE THEN ProcessFrequencyData(#tempData); #step : 0; #i : #i 1; // 成功才切下一台 ELSIF #status.ERROR THEN RecordError(#i); #i : #i 1; // 失败也强行切 END_IF; END_CASE; EXIT; // 每次循环只处理一台 END_IF; END_FOR;这逻辑的关键在于强制推进#i计数器否则遇到故障机就会死循环。有个现场小哥不信邪非要改成失败重试三次结果生产线直接卡成PPT——这特么就是实时系统的残酷。西门子PLC程序大型项目siemens博途V16 V17版配方处理程序多个昆仑通态触摸屏配方ScL语言485通讯控制变频器模拟量压力处理多个1200cpu处理称重数据读取。模拟量处理更是个玄学现场。压力传感器的4-20mA信号总带着诡异的毛刺最后上了移动平均滤波突变阈值VAR pressureRaw : ARRAY[0..9] OF REAL; // 10点滑动窗口 pressureIndex : INT : 0; lastValid : REAL : 0.0; END_VAR pressureRaw[pressureIndex] : AI_Read(Channel1); pressureIndex : (pressureIndex 1) MOD 10; // 滤波处理 currentPressure : MEAN(pressureRaw); // 突变保护 IF ABS(currentPressure - lastValid) 50.0 THEN // 50kPa突变视为异常 currentPressure : lastValid; ELSE lastValid : currentPressure; END_IF;调试时发现个反直觉的现象——有时候平均值反而会放大噪声。后来改成去掉最大值和最小值再求平均才把曲线捋顺了。多CPU协同这事两个1200之间走S7通讯数据同步得玩心跳包。有次现场断电再上电主从站数据版本对不上直接引发产线逻辑混乱。现在改成这德行// 主站发送 IF heartbeatCounter MOD 30 0 THEN // 每3秒发心跳 PUT( ID : 1, ADDR_1 : DB101.VersionTag, ADDR_2 : DB101.ProductionCounter); heartbeatCounter : 0; END_IF; // 从站接收 IF heartbeatTimer.Q THEN IF localVersion remoteVersion THEN InitDataSync(); // 版本不一致触发同步 END_IF; heartbeatTimer.IN : FALSE; END_IF;称重模块的数据解析才是真·地狱模式。某国产称重仪表的校验算法竟然用CRC16异或协议文档写得像天书。最后逆向出来的解析函数长这样FUNCTION ParseWeight : REAL VAR_INPUT data : ARRAY[0..7] OF BYTE; END_VAR VAR crc : WORD; sum : WORD : 0; i : INT; BEGIN // 国产仪表经典坑校验值CRC16结果异或0xFFFF crc : (WORD(data[6]) 8) | data[7]; FOR i : 0 TO 5 DO sum : CalcCRC(data[i], sum); END_FOR; IF (sum XOR 16#FFFF) crc THEN RETURN (INT(data[4]) 24) | (INT(data[5]) 16) | (INT(data[2]) 8) | INT(data[3]) / 100.0; ELSE RAISE ChecksumError; END_IF; END_FUNCTION这代码在现场跑起来后仪表厂家的人跑来问我们是不是破解了他们的协议。呵要不是被这破校验算法逼得连续通宵三天谁特么想当黑客啊项目上线那天十八台变频器同步启动时的电流啸叫像极了胜利的号角。只是当触摸屏终于弹出配方加载成功的绿色弹窗时恍惚间总觉得那颜色里透着加班咖啡的褐色残影。