6部10层电梯程序,采用以太网通信。 2019年西门子智能制造挑战赛, 6部10层电梯程序,包含各个功能模块。 采用博途软件V14 sp1编程, 采用以太网通信,控制器选用PLC S7-1200。 主要涉及逻辑控制、梯形图语言、置位复位。

当时搞那个电梯项目的时候,我电脑屏幕上密密麻麻的梯形图看得人头皮发麻。六部十层电梯的联动控制,光是想清楚楼层请求的优先级就够喝一壶的。记得最魔幻的一次调试,五号梯在七楼和八楼之间反复横跳,活像卡BUG的游戏角色。

先说说核心的楼层请求处理模块。这玩意儿得用MOV指令把十个楼层的按钮状态打包成WORD类型,操作起来像在玩二进制积木。下面这段代码专门处理上升请求的置位逻辑:

      M10.0                         DB1.DBX0.0
      |----] [----------------------(S)-----|
      M10.1                         DB1.DBX0.1
      |----] [----------------------(S)-----|
      ...(省略8个楼层)

每个M10.x对应物理按钮的输入信号,一旦按下就直接置位对应的DB块位地址。这时候电梯调度算法就开始疯狂运转,得算清楚哪部电梯响应最快。我们用了个骚操作——把当前电梯位置和请求楼层的绝对差值存在临时寄存器里,然后RS触发器决定响应顺序。

6部10层电梯程序,采用以太网通信。 2019年西门子智能制造挑战赛, 6部10层电梯程序,包含各个功能模块。 采用博途软件V14 sp1编程, 采用以太网通信,控制器选用PLC S7-1200。 主要涉及逻辑控制、梯形图语言、置位复位。

通信这块坑最深,六部电梯的S7-1200通过以太网玩接龙。在博途里配置TSEND_C模块时,凌晨三点的咖啡都压不住想砸键盘的冲动。关键参数设置得像这样:

TSEND_C_1(
    REQ   := "Send_Trigger",  // 发送触发信号
    CONT  := TRUE,            // 持续连接
    DATA   := P#DB2.DBX0.0 BYTE 10, // 10字节数据块
    LEN    := 10,             // 数据长度
    DONE   => "Send_Done",    // 发送完成标志
    BUSY   => "Send_Busy")    // 忙状态检测

最刺激的是电梯联动测试阶段。当三号梯卡在五楼时,我们突然发现急停复位的上升沿检测没做消抖处理。改完程序后的深夜,六部电梯的楼层指示灯在测试台上交替闪烁,恍惚间有种在指挥钢铁交响乐的错觉。

现在想起来,那些用RESET线圈清除楼层标志的深夜,调试时偶然发现用XOR指令能优化状态切换的惊喜,才是这个项目最上头的部分。毕竟能把一堆铁箱子调教得跟贪吃蛇一样听话,这种成就感可比通关游戏带劲多了。

更多推荐