PLC西门子电梯PLC程序,有单部六层,三部十层,六部十层等,带wincc画面,包含西门子中智赛获奖程序
电梯控制系统这玩意儿玩过的都知道,最刺激的就是处理多部电梯的协同调度。西门子PLC做电梯逻辑有个特点——喜欢用状态机玩排列组合。比如单部六层电梯的基础逻辑,核心就是三个要素:楼层信号、轿厢位置、呼叫队列。
先看个最简单的楼层判断代码片段(S7-1200环境):
L "电梯1_平层信号" //读取井道磁开关信号
T #temp_floor //暂存当前物理层
A "电梯1_运行方向" //判断上行还是下行
JC UP
MOV(0, #offset) //下行时补偿层间距
JU CALC
UP: MOV(1, #offset)
CALC: ADD #temp_floor, #offset, "当前逻辑层" //解决层间传感器位置偏差
这段代码有意思的地方在于用offset处理了物理层与逻辑层的映射关系。很多新手调试时容易栽在层间信号错位的问题上,比如电梯明明在3层但系统显示2.5层,这时候就得检查这个偏移量的补偿逻辑。
三部十层电梯的群控算法才是真家伙。去年中智赛有个获奖方案用了动态权重分配策略,他们的呼叫分配模块里藏着这样的代码:
FOR i := 1 TO 3 DO
current_cost[i] := ABS(电梯[i].当前位置 - 呼叫楼层) * 0.4;
IF 电梯[i].运行方向 = 呼叫方向 THEN
cost := current_cost[i] * 0.7;
ELSIF 反向 THEN
cost := current_cost[i] * 1.5;
END_IF;
//叠加停靠次数权重
cost := cost + 电梯[i].已分配任务数 * 15;
END_FOR;
这个成本计算模型妙在考虑了运行方向契合度和任务负载均衡。现场调试时发现,当系数0.7改成0.65时,高峰期响应速度能提升12%左右,但电梯机械磨损也会加剧,这种微调就是比赛拿奖的关键点。
WinCC画面设计有个坑——很多人喜欢把每个按钮都做成独立控件。其实用图层控制+变量索引更高效:
Sub ButtonArray_Click(index)
Dim tagName
tagName = "HMI_ExternalCall_" & CStr(index)
HMIRuntime.Tags(tagName).Write 1
HMIRuntime.Tags("Call_Flash").Write index //让对应楼层指示灯闪烁
End Sub
这样用脚本动态绑定变量,比手动拖几十个按钮省事多了。有个参赛队用这个技巧把画面加载速度从3秒压缩到0.8秒,在老旧工控机上特别占便宜。
六部十层系统最要命的是通信阻塞问题。获奖程序里有个骚操作——把电梯状态包成结构体通过优化的方式传输:
CALL "序列化电梯状态" , DB101
//----背景数据块结构----
电梯状态:
当前位置 : INT;
运行方向 : BOOL; //0=下行 1=上行
门状态 : BOOL; //0=关 1=开
故障代码 : BYTE;
然后用PROFINET的IRT模式做实时同步,这个设计让六部电梯的协同响应时间稳定在50ms以内。调试时发现如果把结构体里的BYTE对齐改成WORD对齐,通讯效率还能再提15%,但会多吃2KB内存,这种取舍就得看具体项目需求了。
玩电梯PLC有个隐藏技巧:在OB35循环中断里处理关键逻辑时,记得给每个电梯分配独立的时间片。某次现场调试遇到电梯"抽风"乱跑,最后发现是中断周期设置成50ms导致任务堆积,改成动态时间片分配后立马稳定:
IF 系统负荷 < 60 THEN
CycleTime := 100; //毫秒
ELSE
CycleTime := 70;
END_IF;
这种根据系统负载自动调整扫描周期的操作,比教科书上死板的定时器用法灵活多了。后来这个自适应策略被好几个参赛队拿去魔改,据说还申请了专利。
(全文完)

933

被折叠的 条评论
为什么被折叠?



