PLC学习笔记 1:基于博途V21与FactoryIO的流水线传送带货物计数程序设计
PLC学习笔记 1:基于博途V21与FactoryIO的流水线传送带货物计数程序设计
本文为个人学习记录,梳理博途与 Factory IO 联合仿真的实操流程与核心知识点,记录第一次使用博途的一点心得,便于后续查阅回顾。
方案选型
为降低入门难度,本次实验采用 Factory IO 搭建简易传送带流水线,搭配常闭型光电传感器完成物料到位检测;PLC 侧通过 S7-PLCSIM Advanced V8.0 创建 S7-1500 仿真实例,与博途 V21 客户端实现通信。
产线仿真
仿真场景基于 Factory IO 官方示例场景 From A to B 二次开发完成。
产线模型组成
最终效果如下图:

场景包含以下核心元件:
- 4 m 长传送带主体,负责物料连续输送
- 物料生成工位(绿色向下箭头标识):每隔 1~2 秒自动生成一个箱体物料
- 物料清除工位(黄色向上箭头标识):清除输送完成的物料,避免传送带末端堆积
- 常闭型光电传感器:无物料遮挡时处于闭合状态,DI 信号为 1;物料到达产生遮挡后,DI 信号变为 0,用于触发物料到位检测
按钮等其余元件本次实验未使用。
产线 IO 点位配置
本次仿真实验选用 S7-1500 系列 PLC,预留 8 路数字量输入与 8 路数字量输出(实际未全部占用)。为避免与 Factory IO 官方博途模板的变量地址冲突,所有 IO 点位均添加了地址偏移。
点位配置界面如下图:

实际用到的点位配置如下表:
| 点位类型 | 点位名称 | 地址 | 功能描述 |
|---|---|---|---|
| 输入信号 | FactoryIO设备运行状态 | %I5.0 | 采集 Factory IO 仿真场景整体运行状态,作为程序启停、逻辑执行的工况判断依据 |
| 输入信号 | 货物检测传感器 | %I5.1 | 传送带物料检测,检测到货物时触发计数指令,完成单次货物统计 |
| 输出信号 | 传送带运行控制 | %Q5.0 | 控制 Factory IO 中传送带电机启停,实现物料持续输送动作 |
在 Factory IO 中完成驱动点位配置后,点击驱动页面的导出按钮,将点位信息以 XML 格式导出备用。

通信设置
由于采用本机全仿真方案,通过 PLCSIM Advanced 实现虚拟 PLC 仿真,需保证 PLCSIM 实例与 Factory IO 主机驱动处于同一网段。为便于统一管理,主机 IP 统一设置为 192.168.0.1,网络适配器选择 Siemens PLCSIM Virtual Ethernet Adapter 实现桥接通信。
S7-PLCSIM Advanced 配置
S7-PLCSIM Advanced 的核心作用是创建虚拟 PLC 仿真实例。
主机网络 IP 修改
在系统网络设置中找到 Siemens PLCSIM Virtual Ethernet Adapter 虚拟网卡,修改其 IPv4 协议地址,确保与 Factory IO 驱动处于同一网段。

PLC 项目配置
本次实验使用博途 V21 版本。
创建项目后,依次添加 CPU 1511-1 PN PLC 设备与 KTP700 Basic PN 触摸屏。
添加 PLC 设备时,需关闭“机密的 PLC 数据保护”“仅支持 PG/PC 和 HMI 安全通信”选项,并取消 PLC 访问保护。
设备添加完成后,右键项目树中的 PLC 设备,打开属性面板,依次进入「防护与安全 → 连接机制」,勾选允许来自远程对象的 PUT/GET 通信访问,否则无法与 Factory IO 正常通信。

IO 点位变量表
完成设备添加后,在 PLC 变量编辑器中新建变量表,导入从 Factory IO 导出的 XML 格式点位文件,确保变量地址与 Factory IO 驱动配置一一对应。

主程序设计
数据块规划
- HMI 交互数据块
- 上升沿/下降沿(PLS/PLF)数据块
- 计数器数据块
- 开关量中间变量数据块
IO 映射函数块
该函数块的核心作用是将物理输入信号 %I5.1(物料到位)映射到开关量数据块的内部变量中。对应梯形图如下:

1. IO 映射 FC 块的设计意义
这是自动化项目的标准化设计规范:
- 所有物理输入
%I、物理输出%Q统一在专用 IO 映射函数块中完成中转; - 工艺逻辑程序(OB1、工艺 FC/FB)不直接读写物理 IO,仅操作 DB 中的中间镜像变量;
- 核心优势:
- 硬件 IO 地址变更时,仅需修改 IO 映射 FC 一处,无需逐行改动全部逻辑程序;
- 便于仿真调试、HMI 交互与硬件逻辑隔离;
- 程序分层清晰,实现硬件层与工艺逻辑层的解耦。
简言之,以少量重复的映射代码,换取后期硬件修改、调试与维护的极高便利性,是中大型自动化项目的标准化强制规范。
2. 本段梯形图逻辑拆解
| 元件 | 地址 | 类型 | 含义 |
|---|---|---|---|
| 启动条件 | %I5.0 | 数字量输入常开 | 设备总运行使能信号 |
| 到位互锁 | %I5.1 | 数字量输入常闭 | 正转到位传感器,触发后断开回路 |
| 映射输出 | 开关量数据DB内变量 | 内部Bool线圈 | 反向到位状态中转变量 |
运行逻辑: 当设备处于运行状态(I5.0 = 1),且未检测到物料到位(I5.1 = 0,常闭触点导通)时,内部状态位「传感器正转到位反转」置 1; 当传感器检测到物料到位(I5.1 = 1),常闭触点断开,该内部变量复位为 0。
Main函数块
在Factory IO中,系统会给出一个 "FACTORY I/O (Running)" 常开信号,在本实验的产线IO点位配置环节中,该信号作为输入信号配置在地址%I5.0,该信号表示仿真系统正在正常运行中,因此可以配合常开触电将其作为系统运行的起始条件判断标志。
1. 程序段一:IO映射
这里主要是用之前写好的IO映射的函数块就可以了。设备在正常运行的时候,因为 FACTORY I/O (Running) 的常开的,所以这里会一直是导通的状态,即IO映射始终起作用。

2. 程序段二:运行标志位控制
该程序段实现了系统运行状态的切换控制逻辑,其设计体现了工业自动化控制领域中经典的**状态机(State Machine)**设计模式。

使能条件"FACTORY I/O (Running)" 构成了系统运行的必要前提条件。程序通过监控HMI交互变量表中的启动和停止信号,对系统运行状态标志位进行原子性的置位和复位操作。
这种设计模式的核心价值在于实现了控制信号与系统状态的解耦(Decoupling),这在软件工程领域被广泛认为是提升系统可维护性和可扩展性的关键设计原则。该方案具有以下优势:
-
状态集中化管理:通过统一的系统运行标志位作为系统状态的核心表征,符合单一职责原则(Single Responsibility Principle)
-
有限状态机(Finite State Machine)实现:能够清晰地构建系统状态转换模型,便于实现复杂的运行逻辑,如启动前自检、安全停止序列等
-
架构解耦性:将用户界面交互信号与底层控制逻辑分离,符合关注点分离原则(Separation of Concerns)
-
可扩展性:当系统需要增加"急停"、"暂停"、"异常"等状态时,只需在状态机中添加相应的状态转换规则,而无需修改现有的控制逻辑,体现了开闭原则(Open-Closed Principle)
-
标准化接口:其他系统模块通过统一的运行标志位获取系统状态,降低了模块间的耦合度,提高了系统的模块化程度
这种设计模式在工业自动化、嵌入式系统等实时控制领域被广泛采用,是符合IEC 61131-3等工业控制标准的最佳实践之一。
3. 程序块三:传送带和出料机构控制
这段程序主要是用来控制传送带正转和出料机构启停。

这里主要有四条逻辑支路。其中,传送带有专门的复位和自动置位支路,而出料机构则由独立的置位和复位支路控制。
- 传送带运动:通过系统状态开关量控制,系统状态为关闭时,传送带正转的输出引脚
%Q0.0复位,系统状态为运行态时,置位输出引脚%Q0.1传送带正转。 - 出料机构:出料主要在系统运行时,通过判断HMI中的出料开关变量的值,对出料信号输出引脚
%Q0.2进行置位和复位就可以了,这样也可以算是将出料机构的控制和传送带运行状态进行了解耦。
4. 程序块四:计数器
在物料运输完成之后,会触发光电传感器,通过检测光电传感器的状态改变情况就可以实现简单的计数逻辑。

现在的程序主要有两条支路:
-
物料单次计数累加支路:在系统使能时,通过检测下降沿检测触点,触发执行
ADD指令。ADD指令主要是作为累加器,有EN、IN1和IN2三个输入点和一个OUT输出点。EN点接收到接通信号时,会将IN1和IN2中的数据相加,并输出到OUT对应变量地址。
-
逻辑说明
这里使用的光电传感器是常闭型,无物料遮挡信号为1,发生遮挡信号变为0,物料经过传感器时会产生一个由1变为0的瞬时信号。这里的计数使用下降沿信号是因为,下降沿仅产生1个扫描周期脉冲,满足一个箱体仅累加1次的计数逻辑,避免电平持续导通重复计数问题。 -
HMI单次清零计数:通过HMI交互布尔变量
"HMI交互".清除计数触发,执行MOVE指令,该指令用于将输入操作数IN中的数据传送到输出操作数OUT1中,相当于编程语言中的赋值操作,这里也就是将计数器赋值为0。
不过这里的计数逻辑写的很简单,在实际的工况里还有很多可以优化的地方。
比如:
- 增加计数上限溢出保护:DInt类型数据存在最大值上限,如果不对计数逻辑做上限处理的话,会导致数据溢出。基础逻辑就是增加比较指令,比较当前的计数值与DInt类型的大小,或者手动设置一个上限,达到时就将计数值赋值为一个自定义的最大上限(例如999999)。
HMI 通信配置与基本程序
添加设备与通信设置
本实验选择的HMI型号是KTP700 Basic PN,在项目树添加新设备以后,右键HMI节点,在属性中确保以太网的IPv4地址与PLC在同一网段下。
比如我的PLC实例的IP地址是192.168.0.1,那么HMI就应为192.168.0.X。

添加控件和修改样式
添加好设备之后,就可以进行界面配置。本项目只有简单的启跑停和计数逻辑,只用一个界面就可以实现所有逻辑,所以直接在根画面里面进行配置就好了。

根画面是博途默认的HMI起始画面,可以在设备的运行系统设置里面对根画面的路径进行配置和修改。

这里的操作逻辑其实和qtdesigner以及winform里面的逻辑差不多,从菜单栏中拖出预设的控件再调整样式就好了。
根据需要,只用进行启跑停和计数,所以控件也只需要使用几个按钮和一个用于显示计数量的文本框就好了。好像博途里面文本框是叫IO域?

配置HMI变量表
添加完成控件之后,为了完成和PLC的通信,需要建立一个HMI的变量表,这个变量表中的变量通过和PLC变量连接实现通信,配置的时候需要保证的是:
- PLC变量可以被HMI读写与展示;
- HMI变量与PLC变量的数据类型保持一致
- 变量地址正确

表里面的采样周期指的是HMI(人机界面)从PLC读取数据的时间间隔,设定的基本原则是:
- 优先级原则:关键变量设置短周期,次要变量设置长周期
- 变化率原则:信号变化越快,采样周期应越短
- 通信带宽原则:考虑网络负载,避免过多高频采样
- 显示需求原则:人眼可见的变化不需要过快刷新
常见的采样周期设置参考如下:
| 变量类型 | 建议采样周期 |
|---|---|
| 开关量状态 | 100-200ms |
| 模拟量监控 | 200-500ms |
| 控制回路变量 | 50-100ms |
| 统计数据 | 1s-5s |
| 非关键显示 | 1s以上 |
以下是所有变量的详细信息:
| 名称 | 数据类型 | 连接 | PLC名称 | PLC变量 | 采集周期 |
|---|---|---|---|---|---|
| HMI交互_停止 | Bool | HMI_连接_1 | PLC_1 | HMI交互.停止 | 100 ms |
| HMI交互_停止供料 | Bool | HMI_连接_1 | PLC_1 | HMI交互.停止供料 | 100 ms |
| HMI交互_启动 | Bool | HMI_连接_1 | PLC_1 | HMI交互.启动 | 100 ms |
| HMI交互_开始供料 | Bool | HMI_连接_1 | PLC_1 | HMI交互.开始供料 | 100 ms |
| HMI交互_清除计数 | Bool | HMI_连接_1 | PLC_1 | HMI交互.清除计数 | 100 ms |
| HMI交互_进入定次模式 | Bool | HMI_连接_1 | PLC_1 | HMI交互.进入定次模式 | 100 ms |
| HMI交互_退出定次模式 | Bool | HMI_连接_1 | PLC_1 | HMI交互.退出定次模式 | 100 ms |
| Tag_ScreenNumber | UInt | <内部变量> | - | <未定义> | 1 s |
| 计数器_CO | DInt | HMI_连接_1 | PLC_1 | 计数器.CO | 100 ms |
HMI控件属性与事件
配置事件的基本流程是:右键控件打开属性菜单,找到事件栏,根据交互逻辑为不同的交互形式配置对应的实践即可,具体的事件的说明写在“拓展”里了。
本实验的按钮主要作用是点击之后控制系统及模块的启停,基本逻辑的“按下”之后修改“系统开关量”的状态,所以配置的逻辑就是为按下交互配置置位事件,置位的输入输出变量就是对应的开关量。

文本框(IO作用域)控件是用来显示数据的,本身不参与信号的输出和控制逻辑,所以不需要配置事件也没有可以配置的事件。因此只需要将属性中的过程变量配置为计数器变量所在的地址,并将输入框设置为仅输出类型的模式。

总结
至此,Factory IO中的From A to B示例所需要的所有程序和配置都完成了,内容比较简单,主要是想借这个项目熟悉配置设备通信和编写梯形图程序的感觉,最终效果还蛮不错的,大概如下图。

踩坑点记录
踩坑点1
问题描述:修改本机虚拟网卡 IP 后,仍无法与 S7-PLCSIM Advanced 建立通信连接。
解决方案:
打开「控制面板 → 设置 PC/PG 接口」,访问点名称选择 S7ONLINE (STEP 7),网卡选择虚拟网卡 Siemens PLCSIM Virtual Ethernet Adapter.TCPIP.1。

踩坑点2
问题描述:写好plc程序之后,下载到设备之后没有反应,不能正常启动程序。
解决方案:
问题排查完之后发现,引起错误的主要原因是下载设备的时候没有选择“运行程序”,比较蠢的错误原因。
拓展:边沿检测逻辑
在 PLC 程序中,经常需要检测信号的变化状态(从 0 变 1 或从 1 变 0),即“边沿检测”。
- 上升沿:信号从 0 变为 1 的瞬间。在 S7-1500 中通常使用
P_TRIG指令或-|P|-触点。 - 下降沿:信号从 1 变为 0 的瞬间。在 S7-1500 中通常使用
N_TRIG指令或-|N|-触点。 应用场景: 本实验中,传感器信号从“无货(1)”变为“有货(0)”,是一个下降沿过程。使用下降沿检测可以捕捉到物料到达的那一瞬间,输出一个周期的脉冲信号,触发计数器加 1。如果不使用边沿检测,而是直接连接传感器信号,则在物料经过期间,每个扫描周期都会加 1,导致计数错误。
拓展:HMI 控件的交互事件
交互事件:
简单来说,事件就是“当发生了某件事,就执行某段逻辑”的机制。它是用户操作(如点击、按下、滑动)与后台程序(如修改PLC变量、运行脚本、切换画面)之间的桥梁。在博途里面不需要手动编写复杂的代码去监听鼠标或触摸信号,只需要配置好这些事件,系统会自动在特定的触发时刻执行预设的动作。
以“按钮”控件为例,它常见的事件类型及其触发时机如下:
- Click(单击事件):
- 触发时机:当用户按下鼠标左键并松开,或者手指点击屏幕后抬起时触发。
- 应用场景:这是最常用的事件。通常用于触发开关量的切换(如启动/停止设备的置位和复位),或者确认某个一次性指令。因为它包含了“按下”和“松开”的完整过程,可以防止误触。
- Press(按下事件):
- 触发时机:当用户刚刚按下鼠标左键,或者手指刚刚接触到屏幕的那一刻立即触发。它不需要等待松开动作。
- 应用场景:常用于需要即时响应的场合,或者在按下时改变按钮的颜色以提供视觉反馈。在某些“点动”控制中,也会配合“释放”事件使用。
- Release(释放事件):
- 触发时机:当用户松开鼠标左键,或者手指离开屏幕时触发。
- 应用场景:通常与
Press配合使用。例如,实现“按住运行,松开停止”的逻辑,或者用于取消按下时触发的某些视觉效果。
拓展:在线模式和离线模式
在博途(TIA Portal)中,在线模式和离线模式是两种不同的工作状态,理解它们的区别对于PLC编程和调试非常重要:
离线模式(Offline Mode)
特点:
- 程序存储在计算机本地,尚未下载到PLC
- 可以在没有连接PLC的情况下进行编程
- 支持程序的编辑、修改、仿真和测试
- 适合离线编程和项目设计 使用场景:
- 新建项目时的编程工作
- 程序的离线调试和仿真
- 项目备份和版本管理
- 在没有PLC设备时的程序开发
在线模式(Online Mode)
特点:
- 程序已下载到PLC并建立实时连接
- 可以实时监控PLC的运行状态
- 支持在线监控变量、强制值、诊断故障
- 可以在线修改程序(需相应权限) 主要功能:
- 监控变量:实时查看PLC中变量的当前值
- 强制值:临时修改变量值进行测试
- 诊断:查看错误信息和故障诊断
- 在线修改:在不停止PLC运行的情况下修改程序
- 状态监控:查看CPU运行状态、内存使用情况等
两种模式的切换
- 离线 → 在线:通过"在线" → "开始在线访问"连接PLC
- 在线 → 离线:通过"在线" → "结束在线访问"断开连接 重要提示:
- 在线模式下修改程序后,需要重新下载到PLC才能生效
- 建议在离线模式下完成主要编程工作,在线模式下主要用于调试和监控
- 在线模式下操作要谨慎,避免影响生产设备的正常运行
拓展:IO 映射的设计逻辑
物理 IO(%I/%Q)属于硬件层,设备动作、工艺逻辑、HMI 交互属于业务层。
IO 映射 FC 就是两者之间的隔离层:所有业务程序不允许直接读写 %I/%Q,仅读写 DB 中的中间镜像变量,硬件地址仅在 IO 映射 FC 中出现一次。
这种设计可以避免后续更换硬件点位时,逐块排查程序中的 IO 变量,大幅减少维护工作量。该规范在中大型项目中收益显著;点位极少的小型项目直接操作物理 IO 开发效率更高。