No.867 基于西门子S7-200 PLC和组态王自动售货机5种货物五种
大半夜饿得慌,站在自动售货机前哐当哐当按按钮的时候,有没有想过这铁家伙的"大脑"是怎么运转的?今天咱们就扒开这台基于S7-200 PLC的自动售货机外壳,看看它藏着什么硬核操作。
先看PLC的I/O分配表就有意思:
I0.0 硬币传感器 I0.1~I0.5 5个商品选择按钮 Q0.0 退币电机 Q0.1~Q0.5 5路出货电机 M10.0 找零标志位 VD100 当前金额存储核心逻辑其实就三件事:收钱认账、给货利索、找零痛快。来看这段关键代码:
LDN I0.0 // 硬币进来 EU // 上升沿触发 +D 1, VD100 // 金额+1 MOVW VD100, VW20 // 传给组态王显示 LDW>= VD100, 3 // 可乐3块钱 A I0.1 // 按了可乐按钮 AN M10.0 // 没找零需求 = Q0.1 // 出货电机启动 -D 3, VD100 // 扣款这段STL代码把自动售货机的"贪婪"暴露无遗——钱到位才给货。特别要注意那个EU指令,保证每次投币只加一次钱,不然熊孩子拿个硬币在投币口摩擦,分分钟刷爆金额计数器。
组态王这边搞了个骚操作,用用户策略脚本实现库存预警:
// 商品库存检测脚本 if(\\本站点\可乐库存 <5){ SetAlarm("可乐即将售罄",1); } if(\\本站点\金额累计 >1000){ FileWrite("销售日志","今日达标"); }这脚本每天半夜自动跑,搞得售货机比老板还操心库存。那个FileWrite函数生成的日志文件,打开全是销售数据的碎碎念。
调试时有个坑爹问题:出货电机偶尔卡壳。后来发现是PLC的扫描周期搞鬼,加了个50ms的定时中断专门伺候出货动作:
INT_0: // 定时中断程序 LDS>= Q0.1, 1 // 如果可乐电机启动 TON T37, 50 // 0.5秒定时 LD T37 RST Q0.1 // 强制停止这相当于给电机上了个"闹钟",到点不管货出没出来都停转,硬生生治好了电机的拖延症。
最后来个数据统计彩蛋:在VD200地址藏了个隐形计数器,记录每种商品的销量。组态王画面上长按退币键3秒,会弹出个密码框,输入"1107"就能看到各商品的江湖地位。这后门留的,比老板的Excel报表有意思多了。
说到底,这自动售货机就是个严格执行"钱货两清"原则的铁憨憨。下次买饮料时,想想背后这些跳动的寄存器,说不定投币的手都会带点敬畏——毕竟你是在跟一套跑了20年还没宕机的PLC程序打交道啊。