# Factory IO + S7-200 SMART 柔性产线:两轴分拣、搬运、数控监控与跨线转运
这套作品是我在课程设计里做的一条虚拟柔性产线:用 Factory IO 搭出「双输送带 + 两轴直角坐标机械手」的场景,用真实的 S7-200 SMART 做控制器,靠一个第三方 S7 驱动把仿真软件和 PLC 直接连起来,跑通了「上料—检测—抓取—横移—放料—计数」的单件循环。本文按「案例复盘 + 建模组态过程」两条线写:先讲场景、点表、通信,再逐网络拆梯形图,最后列出这份程序里确实存在的问题。截图都来自我自己的工程,地址一个没改;看不清的地方我标了「以原程序为准」,没有硬编。
项目信息以实际工程为准,下表里凡是我不确定的项都留了「按实物填写」:
| 项目 | 内容 |
|---|---|
| 课题 | Factory IO 虚拟柔性产线 + S7-200 SMART 控制器 |
| 控制器 | S7-200 SMART CPU(型号按实物填写) |
| 编程软件 | STEP 7-Micro/WIN SMART(版本按实物填写) |
| 仿真软件 | Factory IO(版本按实物填写) |
| 通信方式 | ComDrvS7 第三方驱动,S7 协议直连,PLC IP 192.168.31.195 |
| 作者 / 日期 | 学生课程作业 / 2026 年 11 月(示例,按实际修改) |
一、案例概述
1.1 任务书拆解
任务书给的是一条「柔性产线」的四段功能:入口上料、两轴机械手分拣、机械手搬运到位、数控加工监控与跨线转运。落到 Factory IO + S7-200 SMART 上,能实际跑起来的是前三段的输送与抓放,加产量统计;数控监控和跨线转运属于「有余力再加」的部分,本文按通用方案补齐并标注。
拆解结果如下表,读者可以对照自己的任务书,缺哪一项补哪一项:
| 任务条目 | 落地方式 | 本文对应章节 | 完成情况 |
|---|---|---|---|
| 两轴机器人分拣 | 入口带 + X/Z 直角坐标机械手 + 夹爪,梯形图网络 1~4 | 5.2~5.4、6.1 | 已实现 |
| 机器人搬运 | Move_X 横移 + 出口侧 Move_Z 下降 + 松爪 | 5.4、6.2 | 已实现 |
| 数控加工监控中心 | 触摸屏或上位机读取 VW4 与状态位 | 6.3 | 通用方案(未实拍) |
| 跨产线转运 | Exit_conveyor 送出 + 转运台 + 下游联锁 | 6.4 | 通用方案(未实拍) |
| 产量统计 | VW4 + INC_W 指令 | 5.5 | 已实现 |
| 停止 / 急停 / 手自动 | 停止按钮、急停信号、面板 Auto 开关 | 5.2、5.5、第八节 | 部分实现,急停逻辑有错 |
要提前说清楚:本工程没有用 Modbus TCP 做主通信。Factory IO 原生不支持 S7-200 SMART,实际做法是装第三方驱动,让 Factory IO 用 S7 协议直接读写 PLC 的 V 区和 Q 区。明白这一点,后面「传感器地址为什么是 V0.0 而不是 I0.0」才讲得通。
1.2 系统总体架构
整条线按三层划分:现场层是输送带、机械手、夹爪、光电和操作面板;控制层是一台 S7-200 SMART 加一段梯形图程序;监控层是 Factory IO 的 3D 场景、驱动面板,以及可选的触摸屏/上位机。三层之间只有两个方向的数据流——传感器状态往上走,执行器指令往下走,中间由驱动搬运地址。
这张图有个容易忽略的细节:Factory IO 场景并不「认识」PLC 的地址,它只认识自己的信号名(tag);把两者对上的是驱动面板里那张点表。所以日后改地址,改的是驱动面板和符号表两处,场景本身不用动。
1.3 工艺流程与节拍目标
单件循环的动作用文字说一遍,后面看梯形图时对着走就行:
- 按下面板
Start,入口输送带启动,运行灯亮、停止灯灭; - 工件随入口带前进,遮住入口光电
Item_at_entry,入口带立即停; - Z 轴下降指令
Move_Z置位,夹爪降到取料高度; - 取料位检测
Item_detected到位后夹紧Grab,Z 轴随即回上位; - 夹紧保持 1.0 s(
T37:PT=10,100 ms 时基),X 轴横移Move_X把工件送到出口侧; - X 轴到位后 Z 轴再次下降,出口光电
Item_at_exit确认工件到位; - 松爪放料,机械手回原点,入口带重新启动,放行下一件;
- 每放行一件,
VW4加一,面板Reset可清零。
节拍上,稳定运行时单件约 7~9 s(示例值,请按实测替换),其中夹紧保持固定占 1.0 s,其余是输送带运送和机械手 X/Z 行程时间。若任务书要求 5 s 以内,最直接的两个改法是缩短 T37 保持时间、提高输送带速度,但前者受夹爪机械特性限制,不能一味压。
二、Factory IO 侧建模
2.1 场景组成与工位布局
场景用 Factory IO 自带零件拼成,核心就是「两条平行输送带 + 一台跨在两条带上方的两轴机械手」。下图是我工程里的实际布局:

图 1|Factory IO 场景:后侧入口输送带、前侧出口输送带、左端红色两轴直角坐标机械手,右上为托盘位
从图 1 能读出几个建模要点。两条带平行布置,机械手放在同一端,X 轴沿水平方向跨过两条带,Z 轴带夹爪垂直升降,一次横移就能把工件从入口带搬到出口带,不用转序。两条带末端各装一个蓝色光电,场景里标着 Item at entry、Item at exit;夹爪旁标着 Grab 和 Item detected,和符号表里的同名点是同一个信号。右上方虚线框加绿色箭头是托盘/放料位示意。右侧电控柜、三色灯柱和墙面急停属于「产线该有的东西」,联调时不参与程序逻辑。
2.2 传感器与执行器清单
把场景里所有要接进 PLC 的信号列成表,是后面点表和符号表的共同来源。下表按「场景元件—信号名—PLC 地址—方向」组织,地址与驱动面板完全一致:
| 场景元件 | 信号名(场景标签) | PLC 地址 | 方向 | 说明 |
|---|---|---|---|---|
| 入口光电 | Item at entry | V0.0 | 驱动 → PLC | 入口有料检测 |
| 出口光电 | Item at exit | V0.1 | 驱动 → PLC | 出口到位检测 |
| X 轴 | Moving X | V0.2 | 驱动 → PLC | X 轴运动中反馈 |
| Z 轴 | Moving Z | V0.3 | 驱动 → PLC | Z 轴运动中反馈 |
| 夹爪 | Item detected | V0.4 | 驱动 → PLC | 抓取位工件检测 |
| 面板按钮 | Start | V0.5 | 驱动 → PLC | 启动 |
| 面板按钮 | Reset | V0.6 | 驱动 → PLC | 复位 |
| 面板按钮 | 停止按钮 | V0.7 | 驱动 → PLC | 停止 |
| 面板按钮 | Emergency stop | V1.0 | 驱动 → PLC | 急停 |
| 面板开关 | Auto | V1.1 | 驱动 → PLC | 自动模式选择 |
| 场景状态 | FACTORY I/O (Running) | V1.2 | 驱动 → PLC | 仿真运行状态 |
| 入口带 | Entry conveyor | Q0.0 | PLC → 驱动 | 入口输送带电机 |
| 出口带 | Exit conveyor | Q0.1 | PLC → 驱动 | 出口/转运输送带电机 |
| X 轴 | Move X | Q0.2 | PLC → 驱动 | X 轴动作指令 |
| Z 轴 | Move Z | Q0.3 | PLC → 驱动 | Z 轴动作指令 |
| 夹爪 | Grab | Q0.4 | PLC → 驱动 | 夹爪/吸盘 |
| 指示灯 | Start light | Q0.5 | PLC → 驱动 | 运行指示灯 |
| 指示灯 | Reset light | Q0.6 | PLC → 驱动 | 复位指示灯 |
| 指示灯 | Stop light | Q0.7 | PLC → 驱动 | 停止指示灯 |
| 产量 | Counter | VW4 | PLC 内部 | 整数计数,不参与通信 |
表右边能看出一个规律:输入侧 11 个点全是 BOOL,输出侧 8 个点也全是 BOOL,且恰好落在 V0.0–V1.2 和 Q0.0–Q0.7 两段连续地址里。这不是巧合,是驱动面板逐点添加时按顺序排下来的结果,4.2 节会讲这种排布的好处和代价。
2.3 场景搭建的五个细节
场景搭得好不好,直接决定调试顺不顺。我踩过的坑按重要性排一下:
第一是输送带方向。入口带和出口带的运行方向必须相反(相对机械手一个送进来、一个送出去),搭的时候用场景里的箭头确认,别指望运行起来再看。
第二是光电位置。Item_at_entry 要装在入口带末端、工件刚好停在取料位的地方,否则「停车」和「抓取」在空间上对不上;Item_at_exit 装在出口带末端,作为放料完成的确认。这两个点的位置,本质上决定了梯形图里上升沿触发那一瞬间工件在哪。
第三是机械手行程。X 轴要覆盖两条带的工作位置,Z 轴下降高度要保证夹爪能碰到工件又不撞带面;参数调完截图记下来,答辩被问「行程多少」不至于卡壳。
第四是命名规范。场景标签、驱动面板、PLC 符号表用同一套名字(Item_at_entry、Move_X 这种下划线风格),名字别带空格和中文,否则显示和导出容易乱。
第五是固定机位。录屏和答辩的视角提前固定,最好一屏同时看到入口带、出口带和机械手,省得现场来回切视图。
2.4 驱动面板上的按钮与开关
Factory IO 场景自带一个「操作面板」,上面有 Start、Reset、停止按钮、Emergency_stop、Auto 五个操作件,以及三色指示灯。它们全部通过驱动映射进 PLC,本质上是「软按钮」:Start(V0.5) 启动循环,Reset(V0.6) 清产量、点复位灯,停止按钮(V0.7) 停入口带、点亮停止灯,Emergency_stop(V1.0) 是急停信号,Auto(V1.1) 是手动/自动选择开关。其中 Auto 和 FACTORY I/O (Running)(V1.2) 在本程序里没有参与任何逻辑,这是个实打实的缺口。
这里必须提醒一句:这些按钮只是仿真面板上的信号,不能代替真实的硬件急停回路。真实产线上急停要直接切断执行机构电源,PLC 程序里的急停逻辑只能算第二道防线;课设里可以不接硬件,但报告里要写清这个边界。
三、Factory IO 与 S7-200 SMART 的通信组态(ComDrvS7)
3.1 为什么不用 PLCSIM
刚开始我也想走「PLC 仿真器 + Factory IO」这条路,查了一圈才明白行不通,原因有三条。
第一,S7-200 SMART 没有对应的 PLCSIM。西门子的 PLCSIM 面向 S7-1200/1500 和 TIA 博途,Micro/WIN SMART 里没有给 200 SMART 用的仿真器。网上搜到的「200 SMART 仿真」大多是拿 300/400 的仿真环境硬凑,地址和指令都对不上,不能用于交付。
第二,就算有仿真器,它只仿真 PLC 内部程序,不解决 Factory IO 的 I/O 绑定。Factory IO 要的是「某个地址上的位」,仿真器给不了这个地址空间,除非再套一层 OPC/网关,链路反而更长。
第三,现实原因:仿真路线要么买博途授权,要么租 1200/1500 硬件,对课程作业不划算。而 ComDrvS7 这类第三方驱动的思路很直接——让 Factory IO 用 S7 协议直接读写真实 PLC 的内存区,PLC 侧一行通信程序都不用写。
补充一句:「S7-1200 + PLCSIM Advanced + Factory IO 原生 S7 驱动」确实是另一条成熟路线,实验室本来就有 1200 和博途授权的话走那条更正规;但在「只有 200 SMART、没有博途」的约束下,ComDrvS7 最省事。
3.2 三种接入方案对比
把三条路线摆在一起对比,选择就很清楚了。下表费用一列写的是「相对成本」,具体报价随版本和授权方式变化,不作为采购依据:
| 方案 | 是否需额外 PLC 编程 | 是否需博途/1500 | 费用 | 稳定性 | 适用场景 |
|---|---|---|---|---|---|
| ComDrvS7 第三方驱动 | 不需要,驱动代劳 | 不需要 | 低(第三方驱动,按作者说明获取) | 依赖 S7 协议实现与网络质量,实测够用 | 只有 200 SMART、想快速跑通课设 |
Modbus TCP(MBUS_CLIENT) | 需要,自写轮询与互锁 | 不需要(Micro/WIN SMART V2.4+) | 免费(内置库) | 稳定,但异步时序要自己处理好 | 想练通信编程、或不允许装第三方驱动 |
| OPC 网关(PC Access SMART / 商业 OPC) | 不需要 PLC 编程,需网关组态 | 不需要 | 中到高(商业 OPC 授权) | 稳定,适合多品牌共存 | 实验室/产线已有 OPC 体系 |
我最终选 ComDrvS7,理由排序是:不写通信程序(课设时间有限)、不需要额外授权、链路最短。代价是它属于第三方组件,换电脑、换 Factory IO 版本时都要重新确认兼容性。
3.3 ComDrvS7 驱动安装与配置步骤
驱动的具体字段名各版本略有差异,下面按通用流程写,界面可能不同的地方都注明「按驱动版本界面为准」。
第一步,确认版本匹配。驱动包一般会写明支持的 Factory IO 版本范围,装之前先看自己的版本;装之前把当前工程备份一份,驱动装错导致工程打不开的情况是有的。
第二步,放驱动文件。关闭 Factory IO,把驱动包里的文件(通常是 .dll 或驱动插件,按驱动包说明)复制到 Factory IO 安装目录下的 Drivers 文件夹,放完再启动。
第三步,选驱动。File → Drivers,在列表里找到这个 S7 驱动(显示名可能是 ComDrvS7 或 Siemens S7,按界面为准),选中后进入配置面板。
第四步,填主机参数。主机填 PLC 的 IP 192.168.31.195;端口按驱动默认(S7 协议通常走 102,界面不开放端口字段说明驱动内部固定);机架/槽位字段如果界面有,S7-200 SMART 一般按 0/1 或默认值试,连不上再换,以驱动界面和实测为准。
第五步,逐点建表。左列添加输入:名称照抄场景标签,地址 V0.0~V1.2,类型 BOOL,方向 Input;右列添加输出:地址 Q0.0~Q0.7,类型 BOOL,方向 Output;最后一个数值点 Counter 选 INT,地址 VW4。顺序无所谓,但地址必须和符号表一一对应。
第六步,点 Connect。面板每行左侧小图标变绿、状态显示已连接,就说明驱动握上手了;面板底部能看到 Powered by ComDrvS7 / www.mhj-tools.com 的标识,可用来确认装的是哪个驱动。
3.4 I/O 点表定义
下图是驱动面板的实际配置截图,左边一列是场景信号映射到 PLC 的 V 区(驱动写入 PLC),右边一列是 PLC 的 Q 区映射到场景执行器(PLC 写入驱动),最下面是 (INT) VW4 计数点:

图 2|驱动面板:主机 192.168.31.195,左侧 11 个输入映射到 V 区,右侧 8 个输出映射到 Q 区,Counter 为 VW4
按面板逐行抄成表,就是本工程的通信点表。这张表和 2.2 的清单是同一批点,区别只在于这里标了方向:
| 场景信号 | PLC 地址 | 类型 | 方向 | 含义 |
|---|---|---|---|---|
| Item at entry | V0.0 | BOOL | 驱动写 PLC | 入口有料 |
| Item at exit | V0.1 | BOOL | 驱动写 PLC | 出口到位 |
| Moving X | V0.2 | BOOL | 驱动写 PLC | X 轴运动中 |
| Moving Z | V0.3 | BOOL | 驱动写 PLC | Z 轴运动中 |
| Item detected | V0.4 | BOOL | 驱动写 PLC | 抓取位有件 |
| Start | V0.5 | BOOL | 驱动写 PLC | 启动 |
| Reset | V0.6 | BOOL | 驱动写 PLC | 复位 |
| 停止按钮 | V0.7 | BOOL | 驱动写 PLC | 停止 |
| Emergency stop | V1.0 | BOOL | 驱动写 PLC | 急停 |
| Auto | V1.1 | BOOL | 驱动写 PLC | 自动模式 |
| FACTORY I/O (Running) | V1.2 | BOOL | 驱动写 PLC | 场景运行中 |
| Entry conveyor | Q0.0 | BOOL | PLC 写驱动 | 入口带 |
| Exit conveyor | Q0.1 | BOOL | PLC 写驱动 | 出口带 |
| Move X | Q0.2 | BOOL | PLC 写驱动 | X 轴指令 |
| Move Z | Q0.3 | BOOL | PLC 写驱动 | Z 轴指令 |
| Grab | Q0.4 | BOOL | PLC 写驱动 | 夹爪 |
| Start light | Q0.5 | BOOL | PLC 写驱动 | 运行灯 |
| Reset light | Q0.6 | BOOL | PLC 写驱动 | 复位灯 |
| Stop light | Q0.7 | BOOL | PLC 写驱动 | 停止灯 |
| Counter | VW4 | INT | PLC 内部 | 产量计数 |
为什么传感器地址是 V0.0 而不是 I0.0
这是全文最值得停下来讲清楚的一点:明明传感器应该接在输入点 I0.x 上,为什么程序里读的是 V0.0?
原因在驱动这一层。ComDrvS7 允许在配置输入侧映射时选择 PLC 的内存区(I、Q、M 或 V 区),本工程选的是 V 区。驱动做的事是:读 Factory IO 场景里的传感器状态,通过 S7 协议写到 PLC 的 V0.0~V1.2;PLC 程序再把这几段 V 位当输入用。输出侧反过来:程序把执行器状态写到 Q0.0~Q0.7,驱动读 Q 区,再驱动场景里的输送带和机械手。
这么安排有四个好处。其一,不占用物理输入点:I0.x 是真实接线端子,拿它做仿真信号,现场接真实按钮时会打架;落在 V 区则完全在内存里。其二,11 个输入、8 个输出各自连续,方便成组读写。其三,调试可直接用状态表强制 V 位。其四,日后若换成 Modbus TCP 备选方案,地址形态恰好一致,梯形图几乎不用改。
代价也要说清楚。第一,V 区和 VW4、通信缓冲区共用,地址必须一次规划死。第二,V0.0 不如 I0.0 直观,符号表成了刚需。第三,V0.0~V1.2 只能由驱动写、程序只能读;程序若也写这几位,每个周期都会被覆盖,表现就是「程序里改了、场景里没反应」,这是联调最常见的假故障。第四,这些按钮只是软信号,不能当安全回路用。
一次扫描里的数据流
把上面这套读写关系画成时序,更容易理解谁先谁后。下图是稳定运行时一个通信周期的数据流,周期数值是量级示意,不是精确测量:
这张图说明一件事:PLC 侧程序就是「读 V 区、算、写 Q 区」的普通扫描,跟有没有 Factory IO 无关,驱动只是在扫描之外替它搬数据。所以逻辑正确性可以脱离仿真软件单独验证。
3.5 联调三查法
通信不上时不要一头扎进程序,按下面三层顺序查,绝大多数问题在前两层就能定位。
查网络层。 PLC 的 IP 是 192.168.31.195,PC 网卡要设成同一网段(例如 192.168.31.10,示例值,请按实测替换),子网掩码一致;用 ping 192.168.31.195 确认能通。直连或经交换机都行,但不要把 PLC 和 PC 接在两个不同网段的路由器后面。Windows 防火墙一般不拦 S7 的 102 出站,但装了安全软件、或之前为 Modbus 方案开过 502 规则,先临时关掉防火墙试一次。
查驱动层。 看 Connect 状态和每行左侧图标:全绿说明连上了;某行变灰或变红,通常是地址填错、类型选错或方向反了。再确认主机 IP 和驱动选择。重装过软件时,确认驱动文件还在 Drivers 目录里。
查程序层。 Factory IO 切到 Run,场景面板拨到 Auto,打开状态表按顺序看:先看 V0.0~V1.2 是否随场景变化(遮挡光电、按面板按钮),再看 Q0.0~Q0.7 是否随程序变化,最后按 Start 看入口带是否启动。三层都通了,再谈联调。
3.6 备选方案:不装第三方驱动时的 Modbus TCP
如果环境不允许装第三方驱动,或者你想借这个题目练通信编程,可以走 Modbus TCP。前提必须先讲清楚:Factory IO 原生不支持 S7-200 SMART,也不支持 S7-200,它没有对应的原生驱动;能走通是因为 S7-200 SMART 固件/软件里有 Modbus TCP 客户端库。
链路是:Factory IO 作 Modbus TCP 服务端(端口 502,驱动面板里选 Modbus TCP Server,逐点配置 Coils 与 Discrete Inputs 的地址);S7-200 SMART 用 MBUS_CLIENT 指令作客户端。MBUS_CLIENT 是 STEP 7-Micro/WIN SMART V2.4 及以上才提供的库指令,选题阶段就要确认版本。
指令的关键引脚如下表,参数名与库指令一致:
| 引脚 | 含义 | 本工程取值(示例,请按实测替换) |
|---|---|---|
| EN | 使能 | 常 1 |
| Connect | 连接控制 | 1 = 连接,0 = 断开 |
| IPAddr | 服务端 IP | Factory IO 所在 PC 的 IP,如 '192.168.31.100' |
| IPPort | 端口 | 502 |
| Req | 请求触发 | 上升沿触发,一个请求给一个脉冲 |
| RW | 读 / 写 | 0 = 读,1 = 写 |
| Addr | 起始地址(从 0 开始) | 读:0;写:0 |
| Count | 数量 | 读 11(位),写 8(位) |
| DataPtr | 数据指针 | 读 &VB0;写 &QB0 |
| Done | 完成 | 本次请求完成置 1 |
| Error | 错误码 | 0 正常,非 0 查手册 |
地址映射与 ComDrvS7 方案对照如下,注意这是「结果一致」而不是「实现相同」:
| 数据区 | Modbus 地址 | PLC 地址 | 方向 |
|---|---|---|---|
| Coils | 0–7 | Q0.0–Q0.7 | PLC → Factory IO(写) |
| Discrete Inputs | 0–10 | V0.0–V1.2 | Factory IO → PLC(读) |
| — | 不参与 | VW4 | PLC 内部计数 |
用 MBUS_CLIENT 有三条硬性注意,写错任何一条都会「时好时坏」。第一,它是异步指令,同一连接同一时刻只能有一个请求在飞,读写靠 Done 互锁或轮询状态机切换。第二,Req 必须是上升沿,常 1 只发一次。第三,DataPtr 要和方向匹配:读指向 &VB0 这类 V 区缓冲,写指向 &QB0 这类输出区;若库对 Q 区指针支持不佳,先用 MOV_B 把 QB0 搬到 VB10,再以 &VB10 作 DataPtr,多一步但稳定。
// Modbus TCP 备选方案:读写轮询的关键骨架(STL 示意)
// 读:把 Discrete Inputs 0–10 读进 VB0 起的位区
LD Always_On
A Read_Req // 上一轮 Done 后的下一拍
EU
= Req_Read
// 读请求:RW=0,Addr=0,Count=11,DataPtr=&VB0
// 写:把 QB0 的 8 位写到 Coils 0–7
LD Done_Read
EU
MOV_B QB0, VB10 // 若库对 &QB0 支持不佳,先搬到 VB10
// 写请求:RW=1,Addr=0,Count=8,DataPtr=&VB10
一句话总结:ComDrvS7 把搬数据交给驱动,PLC 只留业务逻辑;Modbus TCP 把搬数据也写进 PLC,代码多、时序要自己管,但不需第三方组件。课设优先前者,想练通信选后者。
四、I/O 地址分配与符号表
4.1 符号表
下面是 Micro/WIN SMART 里实际使用的符号表截图,地址与驱动面板逐行对应,本文后续所有梯图讲解都以它为准:

图 3|PLC 符号表:11 个 V 区输入、8 个 Q 区输出,加一个 VW4 计数
把截图逐行抄成表,就是本文的地址基准,一个字没改:
| 符号 | 地址 | 类型/作用 |
|---|---|---|
| Item_at_entry | V0.0 | 入口有无料检测 |
| Item_at_exit | V0.1 | 出口到位检测 |
| Moving_X | V0.2 | X 轴运动中反馈 |
| Moving_Z | V0.3 | Z 轴运动中反馈 |
| Item_detected | V0.4 | 抓取位工件检测 |
| Start | V0.5 | 启动按钮(驱动面板) |
| Reset | V0.6 | 复位按钮 |
| 停止按钮 | V0.7 | 停止按钮 |
| Emergency_stop | V1.0 | 急停 |
| Auto | V1.1 | 自动模式选择 |
| FIO_RUN | V1.2 | Factory IO 运行状态 |
| Entry_conveyor | Q0.0 | 入口输送带电机 |
| Exit_conveyor | Q0.1 | 出口/转运输送带电机 |
| Move_X | Q0.2 | X 轴动作指令 |
| Move_Z | Q0.3 | Z 轴动作指令 |
| Grab | Q0.4 | 夹爪/吸盘 |
| Start_light | Q0.5 | 运行指示灯 |
| Reset_light | Q0.6 | 复位指示灯 |
| Stop_light | Q0.7 | 停止指示灯 |
| Counter | VW4 | 产量计数(整数,INC_W/MOV_W 操作) |
表里有两处命名不一致:停止按钮 用了中文符号,其余都是英文;FIO_RUN 比场景标签 FACTORY I/O (Running) 简洁。个人项目里无伤大雅,但多人协作或交给下一届时,建议统一成英文并写注释。
4.2 地址规划的三条原则
第一,输入输出分开、各自连续。输入 V0.0~V1.2 共 11 位,输出 Q0.0~Q0.7 共 8 位,两段互不重叠。好处是可用整字节操作,例如停机时 (R) Entry_conveyor, 7 一次复位 Q0.0~Q0.6。代价是地址必须连续,改一个点可能牵动一片。
第二,计数放在 VW4,远离 VB0~VB1。ComDrvS7 方案下 V 区只有 V0.0~V1.2 被驱动占用,VW4 是纯内部变量,不参与通信,不会和输入数据打架。若以后走 Modbus 方案,读 Discrete Inputs 会占 VB0~VB1,VW4 依然安全;但把缓冲放到 VW4 附近就要重新算地址,越早规划越省事。
第三,留出扩展区。V1.3 以后到 V3.7 留给跨线转运的联锁信号(见 6.4)和报警字;Q1.0 以后留给转运台/顶升移载这类扩展执行器。留白不写进符号表,但心里要有这张地图。
4.3 符号表怎么用
符号表不是写完就锁进抽屉的。日常调试主要用它做三件事:一是状态表监控,按符号名直接添加变量,比记 V0.0 直观,监控顺序按工艺流程排(入口光电 → Z 指令 → 抓取检测 → X 指令 → 出口光电 → 计数),一眼看出卡在哪一步;二是强制单点,把 Move_Z、Grab、Move_X 逐个强制确认动作方向,强制前先断开驱动或停止场景,否则驱动每周期写 V 区会把强制值冲掉;三是打印点表贴电控柜,答辩时老师会问「这个点接什么」,一张打印表比现场翻软件可靠。
五、程序设计与梯形图讲解
5.1 程序块划分
整个程序放在主程序 OB1 里,按功能分成四段网络:启动与上料检测(图 4 两个网络)、抓取与 X/Z 时序(图 5 两个网络)、产量计数与复位停机(图 6 两个网络)、急停处理(也在图 6 的停机网络里)。程序里没有用 M 区,也没有子程序,中间状态都靠 V 位和 Q 位自身保持——短平快,但可读性和可维护性一般。
讲解前先统一说明:截图中有几处梯级在第一个触点之后还串了一个未标注符号的触点(图 4 网络 1、图 5 网络 3、图 6 计数网络都有),按上下文应该是使能或联锁条件,但截图上看不出具体符号。本文对这些位置一律标「【以原程序为准】」,不替原程序编造条件。
5.2 启动、停止与急停回路
先看启动网络。图 4 是同一个程序段里的两个网络,上半是启动支路,下半是上料检测与抓取支路:

图 4|启动支路(上)与上料/抓取支路(下),同一张截图包含两个网络
启动网络的逻辑是:Start 触点成立时,同时置位入口带(连续两位,Q0.0 和 Q0.1 一起启动)、点亮运行灯、复位停止灯。用文字化梯图表示:
图4 网络 1(启动) LAD 文字化
Start --+--( S ) Entry_conveyor Q0.0, 2 // Q0.0、Q0.1 两条输送带同时启动
|
+--( S ) Start_light Q0.5, 1
|
+--( R ) Stop_light Q0.7, 1
对应的 STL 就是三行输出指令:
// 图4 网络 1 STL(按截图还原)
LD Start // V0.5
S Entry_conveyor, 2 // 置位 Q0.0、Q0.1
S Start_light, 1 // 置位 Q0.5
R Stop_light, 1 // 复位 Q0.7
这里有个值得学的写法:S bit, N 是 S7-200 的「从 bit 开始连续置位 N 位」,一次就把入口带和出口带都启动了。这是因为两者地址相邻(Q0.0、Q0.1),一条指令覆盖两个输出。方便是方便,但可读性差,改地址时容易误伤,复盘第 3 条会讲。
停止和急停不在这张图里,而在图 6 的停机网络中(图 6 见 5.5 节)。停止网络的逻辑是:停止按钮 的常闭触点成立时,置位停止灯 Q0.7,同时复位 Q0.0~Q0.6 共 7 位——正好把两条输送带、X/Z 指令、夹爪和运行/复位灯全部清掉,只留停止灯亮。急停网络则是 Emergency_stop 的常闭触点成立时,对 Q 区做 8 位操作,截图显示的是 (S) ...,8(置位 8 位)。这两处的触点极性和急停的置位/复位选择属于本文要重点复盘的逻辑问题,详见第八节第 1 条。
5.3 上料检测与抓取
图 4 的下半段是上料检测与抓取。Item_at_entry 成立后分出三路:一路复位入口带(工件到位就停车),一路置位 Z 轴下降,第三路在「Z 轴下降指令有效 + 抓取位检测到工件」时置位夹爪;夹爪置位后再用它的上升沿复位 Z 轴,让机械手带着工件回升。
图4 网络 2(上料检测与抓取) LAD 文字化(按截图)
Item_at_entry --+--[P]-------------------------( R ) Entry_conveyor Q0.0, 1
|
+--[P]-------------------------( S ) Move_Z Q0.3, 1
|
+--|Move_Z|--|Item_detected|--+--[P]--( S ) Grab Q0.4, 1
|
+--|Grab|--[P]--( R ) Move_Z Q0.3, 1
// 图4 网络 2 STL(按截图还原)
LD Item_at_entry
EU
R Entry_conveyor, 1 // 工件到位,入口带停
LD Item_at_entry
EU
S Move_Z, 1 // Z 轴下降取件
LD Move_Z
A Item_detected
EU
S Grab, 1 // 到位后夹紧
LD Move_Z
A Item_detected
A Grab
EU
R Move_Z, 1 // 夹紧后 Z 轴回升
三处细节值得说。第一,入口带用的是上升沿 P,工件挡住光电的瞬间动作一次,之后哪怕工件停在传感器上也不会反复触发。第二,抓取条件是「Z 下降指令 + 工件检测」串联,含义是「夹爪已经往下走,且取料位确实有件」,避免空中抓空。第三,抓取后复位 Z 用的是 Grab 上升沿,形成「夹紧→回升」的自握手,逻辑上通,但依赖扫描顺序。
需要说明一处与任务书描述的差异:任务书里写的抓取条件是 Item_at_entry 与 Item_detected 串联,而截图上实际串联的是 Move_Z 与 Item_detected。从动作安全角度看,截图这版更合理(Z 已下降才夹紧),本文按截图讲;如果你手上的程序不是这一版,以原程序为准。
5.4 X/Z 时序与松爪放行
图 5 是抓取之后的时序网络,包含夹紧保持定时和横移/放料/松爪两组动作:

图 5|网络 3 夹紧保持定时(T37,1.0 s)与网络 4 横移、放料下降、松爪、放行
网络 3 很简单:Grab 成立后启动 TON T37,预置值 PT=10,时基 100 ms,折算下来 1.0 s(该时间要覆盖夹爪闭合和 Z 轴回升的机械时间,按实测调整)。网络 4 以 T37 为起点分出四路:
图5 网络 4(横移、放料、松爪、放行) LAD 文字化(按截图)
T37 --+--[P]---------------------------------------( S ) Move_X Q0.2, 1
|
+--|Move_X|--|Moving_X|--|N|-----------------( S ) Move_Z Q0.3, 1
|
+--|Item_at_exit|--|Grab|--|Item_detected|---( R ) Grab Q0.4, 1
|
+--|/Grab|--+--------------------------------( R ) Move_X Q0.2, 2 // Q0.2、Q0.3
+--------------------------------( S ) Entry_conveyor Q0.0, 1
第一路:T37 到点后用上升沿置位 Move_X,机械手横移到出口侧。第二路:Move_X 有效、Moving_X 有效、再串一个标注为 N 的触点,才置位 Move_Z 让 Z 轴下降放料。这个 N 触点的符号和极性在截图里看不清,按动作意图它应该是「X 轴运动结束(Moving_X 撤销)」的反相条件;以原程序为准。第三路:Item_at_exit、Grab、Item_detected 三个条件串联,复位 Grab 松爪。第四路:Grab 常闭触点成立(已松爪)时,用 (R) ...,2 一次复位 Q0.2、Q0.3,让 X、Z 指令同时撤销、机械手回原点,并置位入口带放行下一件。
网络 4 最值得学的是 (R) Move_X, 2:从 Q0.2 起连续复位两位,恰好覆盖 X、Z 两条指令。写起来短,但把「地址必须连续」变成隐含前提,插一个新输出进来就会复位错对象。
第三路的松爪条件留个问号:Item_detected 注释是「抓取位工件检测」,若它在出口位不亮,松爪条件永远不成立,机械手会卡在出口侧。7.2 排查表单列了一条,是否成立要看传感器安装位置——以场景实物为准。
5.5 产量计数、复位与停机
图 6 是第三个程序段,上半是计数,下半是复位、停止和急停:

图 6|网络 1 出口上升沿计数(INC_W,VW4),网络 2 复位/停止/急停三支共用 Always_On 使能
计数网络的逻辑:Item_at_exit 每来一个上升沿,INC_W 把 VW4 加一。
图6 网络 1(产量计数) LAD 文字化
Item_at_exit --[P]--[ INC_W EN=1, IN=Counter, OUT=Counter ] // VW4 = VW4 + 1
// 图6 网络 1 STL(按截图还原)
LD Item_at_exit
EU
INCW VW4 // 每出一件加 1
用上升沿而不是电平,是为了避免工件压在光电上时每个扫描周期都加一。这一条是本程序里写得比较规范的地方。
复位/停止/急停三支共用 Always_On 作使能,结构如下:
图6 网络 2(复位 / 停止 / 急停) LAD 文字化(按截图)
Always_On --+--|Reset|---------------------+--[ MOV_W 0 → VW4 ]
| +--( ) Reset_light Q0.6
|
+--|/停止按钮 V0.7|-----------+--( S ) Stop_light Q0.7, 1
| +--( R ) Entry_conveyor Q0.0, 7 // Q0.0~Q0.6
|
+--|/Emergency_stop V1.0|--------( S ) Entry_conveyor Q0.0, 8 // Q0.0~Q0.7
三支的动作分别是:Reset 把 VW4 清零并点亮复位灯;停止按钮 点亮停止灯、复位 Q0.0~Q0.6 七位;Emergency_stop 对 Q 区做 8 位置位。前两支意图是对的,第三支有问题:急停对输出执行 (S)(置位)而不是 (R)(复位),等于按下急停反而把两条输送带、X/Z 指令、夹爪和指示灯全部打开——这是必须改的逻辑错误,第八节第 1 条给出改法。另外,截图里 停止按钮 和 Emergency_stop 两个触点都画成常闭,实际信号极性是常开还是常闭,以原程序为准,调试时用状态表确认按下与松开时 V0.7、V1.0 的 0/1 变化即可。
复位这一支还有第二个隐患:MOV_W 由 Always_On 直接驱动,没有上升沿。Reset 按住不放(或改成保持型开关)时,计数每个扫描周期都被清零,表现为「产量永远是 0」。改法见第八节第 2 条。
5.6 状态机总览
把四段网络的动作串起来,就是一个带起止条件的状态机。下图按程序实际行为画,括号里标了触发信号:
这张图能看出两个结构性不足:一是「停止」和「急停」都只是回到待机,没有故障恢复流程,按完还得重新 Start 从头来;二是状态机里没有 Auto 和 FIO_RUN 的位置,手动模式和通信掉线都不影响状态迁移,这正是复盘第 4 条要补的。
六、四个工位的实现
6.1 两轴机器人分拣
两轴分拣的核心是「X 定位、Z 升降、夹爪抓放」三个动作的时序配合。X 轴负责在入口带取料位和出口带放料位之间横移,Z 轴负责把夹爪送到工件高度再提起,夹爪只在 Z 到位且检测到工件时才闭合。程序里的分拣只做了单品种——入口来的工件不分颜色/材质,全部走同一条路径,严格说是「单品种分拣 + 搬运」;如果任务书要求多品种分拣,需要加颜色/材质传感器并在程序里加分支,属于扩展项(见 9.3)。
分拣动作能成立,靠三个互锁:入口带在工件到位后必须停(否则工件继续往前撞机械手)、Z 轴必须在入口带停止后才下降(否则夹爪和运动中的工件抢位置)、夹爪必须等 Item_detected 才闭合(否则抓空)。这三个互锁在 5.3 的梯级里都有对应。
6.2 机器人搬运
搬运段是分拣的延续:夹紧后先等 1.0 s(T37)确保夹稳、Z 轴回升到位,再横移 X,横移到位后 Z 下降放料,最后松爪、回原点、放行下一件。这一段最怕「Z 还没完全抬起就横移」,会撞到入口带边沿或工件;程序用固定延时 T37 躲这个风险,属于「用时间换安全」,能跑通但不够稳——如果夹爪或 Z 轴动作变慢,1.0 s 就不够了。更稳的做法是用 Moving_Z 的下降沿确认 Z 轴真的回到上位再横移,这也是复盘第 5 条的建议。
另一个观察点是放料位置。出口带上的工件最终会被 Exit_conveyor 送走,所以 Item_at_exit 的安装位置决定了「松爪」和「送出」的先后。程序里松爪条件串了 Item_at_exit,本意是「到出口位才松」,意图是对的,问题在附加的 Item_detected 条件(见 5.4 末尾的疑点)。
6.3 数控加工与监控中心
(本节实现方式为通用方案,按本人实际替换)
任务书里的「数控加工监控中心」,在虚拟产线里落地成「一个能看到产线状态、产量和报警的监控画面」。有两条可落地的路线,选一条即可:
路线一:触摸屏。 用 SMART 700 IE V3 通过以太网口直连 CPU 的以太网口(同一交换机下),用 WinCC flexible SMART V3 组态。画面分三块:状态区显示入口带/出口带/机械手 X/Z/夹爪的当前状态(直接绑 Q0.0~Q0.7)、产量区显示 VW4、报警区显示 Stop_light 与 Emergency_stop 的状态。注意 HMI 上的启动/复位按钮与 Factory IO 面板的按钮会争抢同一批 V 位,要么 HMI 只做显示不做操作,要么加互锁。
路线二:PC 上位机。 用 PC Access SMART 作 OPC DA 服务器连 S7-200 SMART,WinCC 或组态王通过 OPC 读取 VW4 和状态位;或者让 PLC 侧用 Modbus TCP 服务器库对外提供保持寄存器,上位机按 Modbus 读。两条的区别在于要不要装 OPC 组件,组态工作量差不多。刷新周期建议 200~500 ms(示例值,请按实测替换)。
监控中心在答辩里的价值不是画面好不好看,而是能讲清「数据从哪来、刷新多快、报警怎么定义」。建议加一栏「当前工位」(待机/上料/抓取/搬运/放料),由程序里的状态位驱动,比纯动画更有说服力。
6.4 跨产线转运
(本节实现方式为通用方案,按本人实际替换)
跨线转运要解决的是「这条线的出口怎么交给下一条线」。程序里现有的 Exit_conveyor 把工件送出后就没有下文,真正接第二条线还需要一段转运机构(转运台、顶升移载或短皮带)和一组联锁信号。通用做法是:Exit_conveyor 送出 → 转运台接料 → 顶升/移载 → 第二产线入料带,中间至少要有三个联锁:下游允许入料(下游没满)、防叠料(转运台上没有第二件)、Item_at_exit 上升沿才允许启动转运(确认是「新来的一件」而不是残留信号)。
要在现有符号表上扩展,需要新增下面这些点(地址是示例值,需在 ComDrvS7 面板里同步补点并改符号表,请按实测替换):
| 符号 | 地址 | 类型 | 作用 |
|---|---|---|---|
| Downstream_Ready | V1.3 | BOOL 输入 | 下游允许入料 |
| Downstream_Item | V1.4 | BOOL 输入 | 下游入口有料(防叠料) |
| Transfer_Done | V1.5 | BOOL 输入 | 转运完成反馈 |
| Transfer_Lift | Q1.0 | BOOL 输出 | 顶升/移载动作 |
| Transfer_Count | VW6 | INT | 转运计数 |
地址从 V1.3 和 Q1.0 往后排,是为了不动现有的 V0.0~V1.2 和 Q0.0~Q0.7。联锁逻辑可以写成一段独立网络:Item_at_exit 上升沿且 Downstream_Ready 且非 Downstream_Item 时,置位 Transfer_Lift;Transfer_Done 到位后复位 Transfer_Lift 并给 Transfer_Count 加一。这段逻辑和主程序的耦合点只有 Item_at_exit,改动风险可控。
七、联调与故障排查
7.1 调试步骤
我按「先单点、后联动、最后异常」分五阶段调,每阶段先定通过标准:
第一阶段,空载点动。断开驱动,用状态表逐个强制 Q0.0~Q0.7,确认输送带、X/Z 轴、夹爪、指示灯方向都对——8 个输出不能有一个反的。
第二阶段,传感器单点。接回驱动,遮挡三个光电、手动拨动机械手,确认 V0.0~V1.2 逐位变化——11 个输入全部对得上号。
第三阶段,单工位联调。只跑「上料—检测—抓取」,看入口带是否停在工件到位处、Z 轴是否下降、夹爪是否闭合——三件连续上料都能准确抓取。
第四阶段,全自动。跑完整循环,看 T37 到点是否横移、出口侧是否下降放料、松爪后是否回原点并放行——连续 10 件不出错。
第五阶段,异常注入。按停止、按急停、拔网线,看输出是否按预期停止、恢复后能否重启——急停必须立即停(这版做不到,见第八节),断线后不出现乱动作。
7.2 故障排查表
下表是我调试中实际遇到和预判到的问题,按「现象—可能原因—处理」组织,共 13 条:
| 现象 | 可能原因 | 处理 |
|---|---|---|
| 驱动面板 Connect 失败 | PC 与 PLC 不同网段、IP 写错、网线/交换机故障 | ping 192.168.31.195,确认 PC 网卡同网段、网线插对 |
| 面板显示已连接但场景无动作 | Factory IO 未切 Run、面板开关未拨 Auto、场景未加载 | 切到 Run、拨 Auto、重新打开场景 |
| 传感器 V 位不变化 | 点表地址填错、类型选成非 BOOL、场景传感器未接对 | 状态表逐位核对,重填地址 |
| 输送带不转 | Q0.0 未置位;停止支路常闭条件一直成立;启动网络被旁路 | 状态表看 Q0.0;检查停止/急停支路触点极性 |
| 机械手不下降 | Move_Z 未置位:Item_at_entry 未到/上升沿丢失 | 状态表看 V0.0 是否有跳变,必要时改电平触发 |
| 抓不到件 | Item_detected 不亮:工件位置偏、Z 下降高度不够、夹爪地址错 | 调传感器位置和 Z 行程,核对 Q0.4 |
| 到出口不松爪 | 松爪条件里的 Item_detected 在出口位不亮 | 确认传感器安装位置,必要时删除该条件 |
| 产量不增加或乱跳 | 计数网络被复位网络持续清零;工件停在光电上 | 检查 Reset 是否长按;改用上升沿触发清零 |
| 按停止后输送带又转 | 启动网络存在常通旁路(见 5.2 空白触点),每周期重复置位 | 核对原程序该支路,删除旁路条件 |
| 急停后输出全亮 | 急停网络对 Q 区执行了 (S) ...,8 | 立即改为 (R) ...,8(见第八节第 1 条) |
| 改地址后动作错乱 | (R) ...,7、(S) ...,8 依赖地址连续性 | 逐位显式赋值,或锁死符号表 |
| PLC 与 PC 间歇断开 | IP 冲突、交换机供电不稳、防火墙/安全软件拦截 | 换 IP 试、换交换机端口、临时关防火墙 |
| 状态表强置无效 | 驱动每个周期覆盖 V/Q 区 | 强制前断开驱动或停止场景 |
表里「急停后输出全亮」和「按停止后输送带又转」两条属于会伤设备甚至伤人的问题,调试时优先处理,别带着跑。
八、程序复盘:6 处可改进
下面六条是我逐网络对照截图核对后确认的问题,每条按「现象—风险—改法」写,改法给了可直接试的 STL 片段。
第 1 条:急停对输出做了置位而不是复位。 现象:图 6 的急停支路对 Entry_conveyor 执行 (S) ...,8,一次置位 Q0.0~Q0.7 八位。风险:按下急停的瞬间,两条输送带继续转、X/Z 指令有效、夹爪闭合、三个灯全亮——急停反而让设备全动作,这是最危险的一条。改法:用 (R) 复位全部输出位,并加硬件急停回路直接断执行机构电源:
// 改进:急停切断全部输出(极性按实际按钮信号调整)
LD Emergency_stop // V1.0,常闭/常开以实际接线为准
R Entry_conveyor, 8 // Q0.0~Q0.7 全部复位
R Start_light, 1
第 2 条:计数复位没有上升沿。 现象:MOV_W 0 → VW4 由 Always_On 与 Reset 串联直接驱动。风险:Reset 按住或改成保持型开关后,计数被每个周期清零,产量永远上不去。改法:用上升沿触发:
LD Reset
EU // 只在按下的那一拍清零
MOVW 0, VW4
第 3 条:连续位写法依赖地址连续性。 现象:(R) Entry_conveyor, 7、(S) Entry_conveyor, 8、(R) Move_X, 2 都是「从某位开始连续操作 N 位」。风险:可读性差,而且哪天在 Q0.2 和 Q0.3 之间插一个新输出,(R) Move_X, 2 就会复位错对象。改法:关键位置逐位显式赋值,或把需要成组复位的点集中排布并在符号表里写死顺序:
// 显式复位,改地址也不会误伤
LD 停止按钮
R Entry_conveyor, 1
R Exit_conveyor, 1
R Move_X, 1
R Move_Z, 1
R Grab, 1
第 4 条:缺手动/自动互锁与通信掉线保护。 现象:Auto(V1.1) 和 FIO_RUN(V1.2) 两个信号采进来了,但程序里一次都没用。风险:手动调试和自动运行无法区分,误操作没人拦;驱动断开后程序还在跑,输出保持最后状态。改法:启动条件里串 Auto,用 FIO_RUN 的下降沿复位输出并报警:
// 启动条件串自动模式
LD Start
A Auto
S Entry_conveyor, 2
// 通信掉线(场景停止)时复位输出
LD FIO_RUN
ED // FIO_RUN 由 1 变 0
R Entry_conveyor, 8
S Comm_Fault, 1 // 报警位(地址示例)
第 5 条:固定延时没有动作完成反馈。 现象:夹紧后只靠 T37 等 1.0 s 就横移,Moving_X、Moving_Z 没有参与抓放的互锁。风险:夹爪慢一点、工件滑一点,1.0 s 就不够,轻则掉件重则撞机;调长又拖慢节拍。改法:用 Moving_Z 下降沿确认 Z 轴回上位,再加超时定时器兜底:
// Z 轴确认回上位后再横移
LD Grab
A Item_detected
TON T37, 10 // 最短保持 1.0 s
LD T37
A /Moving_Z // Z 已不在运动中(回上位)
S Move_X, 1
// 超时报警:T38 5.0 s 未完成则置报警位
LD Grab
TON T38, 50
LD T38
S Axis_Timeout, 1
第 6 条:没有故障复位后的状态恢复,也没有报警代码。 现象:按停止或急停后只能回待机、重新 Start 从头来;程序里没有报警字。风险:排查靠试错。改法:增加报警字(如 VW10),按位定义急停、通信中断、Z 轴超时、计数清零,在面板或 HMI 上显示;再写一段「复位回原点」的初始化网络,机械手回安全位后才允许启动。
// 报警字按位置位(示例:VW10 的 bit0=急停,bit1=通信中断,bit2=轴超时)
LD Emergency_stop
S Alarm_Word.0, 1 // 符号写法,实际用 V10.0
LD Comm_Fault
S Alarm_Word.1, 1
九、案例总结
9.1 完成情况对照
把开头的任务书拆解表再对一遍,结果如下:
| 任务项 | 实现情况 | 证据 | 结论 |
|---|---|---|---|
| 两轴分拣 | 完成 | 图 4、图 5 的梯级,连续 10 件测试 | 满足基本要求 |
| 机器人搬运 | 完成 | X 横移 + 出口侧 Z 下降 + 松爪 | 满足基本要求 |
| 产量统计 | 完成 | INC_W VW4,出口上升沿计数 | 满足,复位待改 |
| 停止/急停 | 部分完成 | 停止可用,急停逻辑错误 | 必须整改 |
| 数控监控中心 | 通用方案 | 6.3 两条路线 | 未实拍,需补 |
| 跨线转运 | 通用方案 | 6.4 联锁与地址扩展 | 未实拍,需补 |
| 手自动/掉线保护 | 未实现 | Auto、FIO_RUN 未使用 | 建议补 |
9.2 收获与不足
最大的收获不是把梯形图写通了,而是搞清楚了「仿真软件和 PLC 之间到底靠什么说话」。一开始我以为 Factory IO 里选个 S7-200 SMART 就能连,结果发现它根本没有这个原生驱动;换成 Modbus TCP 又要自己写轮询,异步时序、Req 上升沿、Done 互锁这些概念都是那时候补上的。最后用 ComDrvS7 把链路缩短,反而更清楚地看到:驱动只是搬数据,真正的逻辑还是在 PLC 里。
不足也很明确。第一,急停逻辑写反了,这是硬伤,说明对「置位/复位」的语义还没形成条件反射。第二,连续位技巧用得多,图省事,代价是可读性和可维护性。第三,手自动互锁、掉线保护、报警代码一个都没做,程序还停留在「能跑」。第四,数控监控和跨线转运只给方案没有实拍,报告里必须标注。
9.3 扩展方向
如果还有时间,我会按这个顺序加东西。一是加视觉分拣:入口加颜色或二维码相机,把结果写进 V2.0 起的几个位,程序按品种分支到不同出口带或托盘位,这才算真正的「柔性」。二是加 MES 接口:用 Modbus TCP 服务器库或 OPC UA 网关,把 VW4、状态位、报警字对外发布,把「单机仿真」变成「产线级联调」。三是加追溯:给每个工件配一个虚拟 ID,记录「上料—抓取—放料—转运」时间。四是把场景参数化:输送带速度、传感器位置、T37 时间都做成可配置项,方便对比不同节拍下的产能。
十、参考资料
- 西门子,《S7-200 SMART 系统手册》,Modbus TCP 库与
MBUS_CLIENT指令说明。 - 西门子,STEP 7-Micro/WIN SMART 软件帮助文档(指令表、符号表、状态表)。
- Factory IO 官方文档与驱动说明:https://factoryio.com
- ComDrvS7 驱动说明与下载:https://www.mhj-tools.com
- 西门子,PC Access SMART 用户手册(OPC DA 服务器配置)。
- WinCC flexible SMART V3 组态手册(SMART 700 IE V3 触摸屏)。
附录 A 待替换/待补充清单
本文里凡是「我没实测、或者你环境里可能不同」的地方,都汇总在这张表里,发布或提交前逐条替换:
| 位置 | 待替换/待确认内容 | 说明 |
|---|---|---|
| 文首项目信息表 | CPU 型号、软件版本、Factory IO 版本、日期 | 按实物填写 |
| 1.3 节 | 单件节拍 7~9 s | 示例值,请按实测替换 |
| 2.2 节 | 场景元件件名 | 按 Factory IO 零件库实际名称改 |
| 3.3 节 | 驱动界面字段名、机架/槽位 | 按驱动版本界面为准 |
| 3.4 节 | PC 网段示例 192.168.31.10 | 示例值,请按实测替换 |
| 3.6 节 | Modbus 服务端 IP 192.168.31.100、Count 等 | 示例值,请按实测替换 |
| 5.4 节 | T37 保持时间 1.0 s | 示例值,请按实测替换 |
| 5.4 节 | N 触点、Item_detected 在出口位的含义 | 【以原程序为准】 |
| 5.2 节 | 启动网络第二个触点、停止/急停触点极性 | 【以原程序为准】 |
| 6.3 节 | 触摸屏/上位机画面 | 通用方案,按本人实际替换 |
| 6.4 节 | 转运台与新增地址 V1.3~V1.5、Q1.0、VW6 | 示例地址,需同步改驱动点表 |
| 第八节 | 报警字地址 VW10、Alarm_Word 符号 | 示例地址,按实际分配 |
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐

所有评论(0)