西门子PLC S7-200编写的立体车库联系
用西门子S7-200搞立体车库,说难不难,核心就是把升降、横移、安全这几块逻辑拆碎了,挨个怼明白。毕竟车库要的是稳,不是花里胡哨的算法,先从最基础的车位状态采集说起。
1. 先搞定车位空满检测
立体车库最基础的就是知道哪个车位空着,我一般用光电传感器或者压力传感器接输入点,比如I0.0到I0.7对应8个车位,传感器感应到车位没车就输出1,有车输出0。直接把这些状态存到一个字节里,后面找空车位方便得很:
// 车位状态采集:I0.0-I0.7对应1-8号车位,1为空,0为满
LD SM0.0
MOVB I0.0, VB0.0
MOVB I0.1, VB0.1
MOVB I0.2, VB0.2
MOVB I0.3, VB0.3
MOVB I0.4, VB0.4
MOVB I0.5, VB0.5
MOVB I0.6, VB0.6
MOVB I0.7, VB0.7
这里用SM0.0循环扫,把每个输入点的状态直接塞到VB0的各个位里。后面找空车位不用挨个读I点,直接查VB0就行——比如VB0.0是1,就代表1号车位空着,省了不少重复代码,维护的时候也一眼能对应上哪个位管哪个车位。

西门子PLC S7-200编写的立体车库联系
之前踩过的坑:传感器偶尔会因为车库里的灰尘或者灯光干扰抖一下,导致车位状态误判。后来给每个输入点加了50ms的延时滤波,用TON定时器卡一下:
// I0.0的滤波处理,抖信号直接过滤
LD I0.0
TON T37, 5 // 50ms延时(S7-200的TON定时基数是10ms,5就是50)
LD T37
= M0.0
// 再把M0.0存到VB0.0里
几十毫秒的延时完全不影响正常检测,却能把大部分干扰信号挡在外面,客户再也不会抱怨“明明车位空的怎么显示满了”。
2. 自动找空车位
用户按存车键后,程序得自动找第一个空车位。S7-200的循环处理位变量有点绕,不如直接挨个判断来得直观——毕竟车位数量一般不会太多,写起来快,维护也方便:
// 找第一个空车位:存车触发信号M0.1有效时,把车位号存到VW10
LD M0.1
LPS
MOVW 0, VW10 // 默认0表示无空车位
// 查1号车位
LD VB0.0
JMP 0
// 查2号车位
LD VB0.1
MOVW 2, VW10
JMP 1
// 查3号车位
LD VB0.2
MOVW 3, VW10
JMP 1
// ... 后面依次查VB0.3到VB0.7
LPP
JMP 1
LBL 0
MOVW 1, VW10 // 找到1号空车位
LBL 1
这里用JMP跳转来减少无效判断,找到第一个空车位就直接跳出,不用再查后面的,响应速度快。要是车位多的话,其实也可以用FOR循环遍历VB0的每个位,但写起来不如这个直观,新手接手也能秒懂。
3. 升降横移的核心逻辑
载车板的上升下降是关键,必须加限位和互锁,不然升过顶或者降到底,电机直接废了。比如Q0.0控制上升接触器,Q0.1控制下降接触器,I1.0是上限位,I1.1是下限位:
// 载车板上升控制:M0.2是上升指令,串上限位和急停
LD M0.2
O Q0.0 // 自锁
AN I1.0 // 上限位常闭,碰到就停
AN M0.3 // 下降指令互锁,上升时不能触发下降
AN I1.2 // 急停常闭,按下直接断电
= Q0.0
// 载车板下降控制:同理
LD M0.3
O Q0.1
AN I1.1 // 下限位
AN M0.2 // 上升互锁
AN I1.2 // 急停
= Q0.1
这里的启保停电路是PLC入门级操作,但千万别省互锁和限位——之前见过有人图省事没加互锁,误操作同时触发上升下降,直接把接触器烧了,赔了钱不说,还耽误客户使用。

急停逻辑必须拉满,除了程序里串常闭,硬件上最好让急停按钮直接切断主回路,双重保险才靠谱。毕竟车库里有人取车的时候,万一载车板失控,急停是最后一道防线。
最后碎碎念
其实用S7-200做立体车库,真不用搞什么复杂算法,把每个动作的输入输出对应清楚,安全逻辑焊死,再把常见的干扰问题提前过滤掉,就八九不离十了。调试的时候别嫌麻烦,每个车位都要试存取,每个限位都要模拟触发,毕竟稳定才是工业项目的核心——客户要的是每天能正常存车取车,不是看你写了多么牛逼的代码。

769

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



