博途西门子1200PLC+HMI流水灯控制仿真程序:掌握FC函数块、循环移位指令与比较指令的应用

张开发
2026/4/4 23:33:28 15 分钟阅读

分享文章

博途西门子1200PLC+HMI流水灯控制仿真程序:掌握FC函数块、循环移位指令与比较指令的应用
基于博途西门子1200PLCHMI流水灯的控制仿真控制 程序掌握FC函数块的使用、循环移位指令、比较指令 博途V16HMI 三种循环点亮模式切换 给想做循环移位程序的朋友参考 可直接模拟运行刚帮同实验室的学弟搞定他的PLC实训作业其中流水灯的部分我特意抠了点细节比他一开始写的硬接线逻辑好用太多刚好可以拿出来唠唠给想练循环移位的朋友当个参考全程都能在博途V16里直接仿真不用真买硬件。基于博途西门子1200PLCHMI流水灯的控制仿真控制 程序掌握FC函数块的使用、循环移位指令、比较指令 博途V16HMI 三种循环点亮模式切换 给想做循环移位程序的朋友参考 可直接模拟运行这次的需求是做三种可切换的流水灯模式单灯依次循环亮、双灯对称循环亮、全亮全灭闪烁学弟一开始的写法是挨个给Q0.0到Q0.7写置位复位改个模式要改七八行而且没法快速切换。我给他改成用FC块封装逻辑搭配循环移位和比较指令整个结构清爽得一批。先唠唠整体思路我们用的是1214C PLC博途V16HMI用KTP700的仿真面板就能搞定。核心就是把流水灯的移位逻辑封装成FC函数块用比较指令判断当前模式再通过HMI的数值输入快速切换还能顺便调闪烁速度。第一步封装通用流水灯FC块首先得做一个可复用的FC块把移位逻辑和模式判断都塞进去以后加新模式直接改分支就行不用碰主程序。我建了个名叫FCSHIFTLIGHT的FC接口参数大概是这样参数名类型方向说明ENBoolIN使能端定时触发就行MODE_SELIntIN模式选择1/2/3对应三种模式LAST_STATEByteIN上一次的灯状态保存循环进度DELAY_TIMETimeIN闪烁间隔从HMI传过来CURRENT_QB0ByteOUT直接输出到QB0对应8个灯NEXT_STATEByteOUT下一次的状态传给DB块存起来FC里的核心ST代码这里踩过巨多坑一开始用了普通左移指令移到最高位灯直接灭了一定要用循环移位// 局部临时变量存移位位数和初始亮灯掩码 VAR_TEMP shift_num: Int; light_mask: Byte; END_VAR // 根据模式选移位参数和初始亮灯样式 CASE MODE_SEL OF 1: // 单灯循环模式 shift_num : 1; light_mask : 2#0000_0001; // 先点亮Q0.0 2: // 双灯对称模式 shift_num : 1; light_mask : 2#1000_0001; // Q0.0和Q0.7同时亮 3: // 全亮全灭闪烁 shift_num : 0; light_mask : 2#0000_0000; ELSE shift_num : 1; light_mask : 2#0000_0001; END_CASE; // 处理灯的状态更新 IF EN THEN IF MODE_SEL 3 THEN // 循环左移移出去的位会从最低位补回来不会丢灯 CURRENT_QB0 : ROL_B(IN : LAST_STATE, N : shift_num); // 第一次运行状态为0时用初始掩码初始化 IF CURRENT_QB0 0 THEN CURRENT_QB0 : light_mask; END_IF; ELSE // 闪烁模式就是简单取反当前状态 CURRENT_QB0 : NOT LAST_STATE; END_IF; // 把当前状态传给下一次调用保存进度 NEXT_STATE : CURRENT_QB0; END_IF;第二步主程序OB1的触发逻辑主程序就负责定时触发FC块还要把上一次的灯状态存在全局DB里不然每次调用FC都会重置。先建一个DB块DB1LIGHTCFG里面存三个变量SELECT_MODE: Int模式选择1-3SPEED_TIME: Time闪烁间隔LASTLIGHTSTATE: Byte保存上一次的灯状态OB1里的代码就很简洁了// 做一个100ms的定时器用来触发移位逻辑 TON_SHIFT(IN : M0.0, PT : DB1_LIGHT_CFG.SPEED_TIME, Q M0.1); // 定时器到点就调用封装好的FC块 IF M0.1 THEN FC_SHIFT_LIGHT( EN : TRUE, MODE_SEL : DB1_LIGHT_CFG.SELECT_MODE, LAST_STATE : DB1_LIGHT_CFG.LAST_LIGHT_STATE, DELAY_TIME : DB1_LIGHT_CFG.SPEED_TIME, CURRENT_QB0 : QB0, NEXT_STATE : DB1_LIGHT_CFG.LAST_LIGHT_STATE ); // 复位定时器准备下一次计时 M0.0 : FALSE; END_IF; // 下一个扫描周期把M0.0置TRUE让定时器重新开始计时 M0.0 : TRUE;第三步HMI配置一键切换模式博途里添加KTP700 Basic仿真面板拖两个控件就行数值输入域绑定DB1LIGHTCFG.SELECT_MODE范围设1-3默认值1时间输入域绑定DB1LIGHTCFG.SPEED_TIME默认设成T#100MS再加个文本显示控件实时显示当前模式直接绑定SELECT_MODE的值就行最后说下仿真和踩坑细节直接在博途里启动PLC仿真和HMI仿真下载项目就能玩了完全不用接线一开始我踩的坑还挺多一开始用了普通左移SHLB移到最高位直接把1丢了灯直接灭后来才反应过来要用循环移位ROLB忘了保存循环状态每次调用FC都是从头开始灯一直亮在第一个位置后来才知道要把上一次的状态存在全局DB里一开始用了好多个IF ELSE判断模式后来改成CASE语句代码瞬间清爽了十倍其实这个项目没啥难度主要是把模块化编程和循环移位的用法搞明白比硬写硬接线的逻辑好用太多以后想加新模式比如反向流水灯直接在FC的CASE分支里加就行主程序一行都不用动。代码我都贴上面了直接复制到博途里就能用给想练循环移位的朋友当个参考~

更多文章