这套作品是我在课程设计里做的一条虚拟柔性产线:用 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~45.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 场景、驱动面板,以及可选的触摸屏/上位机。三层之间只有两个方向的数据流——传感器状态往上走,执行器指令往下走,中间由驱动搬运地址。

监控层

控制层

现场层

V0.0–V1.2

V0.5–V1.2

Q0.0–Q0.7

S7 协议 TCP

入口输送带 Entry conveyor

出口/转运输送带 Exit conveyor

两轴机械手 X 轴 / Z 轴

夹爪 Grab

光电传感器 Item at entry / exit / detected

操作面板与三色灯 Start / Reset / 停止 / 急停 / Auto

S7-200 SMART CPU IP 192.168.31.195

梯形图程序 OB1 逻辑 / T37 / VW4 计数

Factory IO 场景 3D 动画与运行状态

ComDrvS7 驱动面板 I/O 映射

触摸屏或上位机(通用方案)

这张图有个容易忽略的细节:Factory IO 场景并不「认识」PLC 的地址,它只认识自己的信号名(tag);把两者对上的是驱动面板里那张点表。所以日后改地址,改的是驱动面板和符号表两处,场景本身不用动。

1.3 工艺流程与节拍目标

单件循环的动作用文字说一遍,后面看梯形图时对着走就行:

  1. 按下面板 Start,入口输送带启动,运行灯亮、停止灯灭;
  2. 工件随入口带前进,遮住入口光电 Item_at_entry,入口带立即停;
  3. Z 轴下降指令 Move_Z 置位,夹爪降到取料高度;
  4. 取料位检测 Item_detected 到位后夹紧 Grab,Z 轴随即回上位;
  5. 夹紧保持 1.0 s(T37:PT=10,100 ms 时基),X 轴横移 Move_X 把工件送到出口侧;
  6. X 轴到位后 Z 轴再次下降,出口光电 Item_at_exit 确认工件到位;
  7. 松爪放料,机械手回原点,入口带重新启动,放行下一件;
  8. 每放行一件,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 entryV0.0驱动 → PLC入口有料检测
出口光电Item at exitV0.1驱动 → PLC出口到位检测
X 轴Moving XV0.2驱动 → PLCX 轴运动中反馈
Z 轴Moving ZV0.3驱动 → PLCZ 轴运动中反馈
夹爪Item detectedV0.4驱动 → PLC抓取位工件检测
面板按钮StartV0.5驱动 → PLC启动
面板按钮ResetV0.6驱动 → PLC复位
面板按钮停止按钮V0.7驱动 → PLC停止
面板按钮Emergency stopV1.0驱动 → PLC急停
面板开关AutoV1.1驱动 → PLC自动模式选择
场景状态FACTORY I/O (Running)V1.2驱动 → PLC仿真运行状态
入口带Entry conveyorQ0.0PLC → 驱动入口输送带电机
出口带Exit conveyorQ0.1PLC → 驱动出口/转运输送带电机
X 轴Move XQ0.2PLC → 驱动X 轴动作指令
Z 轴Move ZQ0.3PLC → 驱动Z 轴动作指令
夹爪GrabQ0.4PLC → 驱动夹爪/吸盘
指示灯Start lightQ0.5PLC → 驱动运行指示灯
指示灯Reset lightQ0.6PLC → 驱动复位指示灯
指示灯Stop lightQ0.7PLC → 驱动停止指示灯
产量CounterVW4PLC 内部整数计数,不参与通信

表右边能看出一个规律:输入侧 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 entryV0.0BOOL驱动写 PLC入口有料
Item at exitV0.1BOOL驱动写 PLC出口到位
Moving XV0.2BOOL驱动写 PLCX 轴运动中
Moving ZV0.3BOOL驱动写 PLCZ 轴运动中
Item detectedV0.4BOOL驱动写 PLC抓取位有件
StartV0.5BOOL驱动写 PLC启动
ResetV0.6BOOL驱动写 PLC复位
停止按钮V0.7BOOL驱动写 PLC停止
Emergency stopV1.0BOOL驱动写 PLC急停
AutoV1.1BOOL驱动写 PLC自动模式
FACTORY I/O (Running)V1.2BOOL驱动写 PLC场景运行中
Entry conveyorQ0.0BOOLPLC 写驱动入口带
Exit conveyorQ0.1BOOLPLC 写驱动出口带
Move XQ0.2BOOLPLC 写驱动X 轴指令
Move ZQ0.3BOOLPLC 写驱动Z 轴指令
GrabQ0.4BOOLPLC 写驱动夹爪
Start lightQ0.5BOOLPLC 写驱动运行灯
Reset lightQ0.6BOOLPLC 写驱动复位灯
Stop lightQ0.7BOOLPLC 写驱动停止灯
CounterVW4INTPLC 内部产量计数

为什么传感器地址是 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 只能由驱动写、程序只能读;程序若也写这几位,每个周期都会被覆盖,表现就是「程序里改了、场景里没反应」,这是联调最常见的假故障。第四,这些按钮只是软信号,不能当安全回路用。

一次扫描里的数据流

把上面这套读写关系画成时序,更容易理解谁先谁后。下图是稳定运行时一个通信周期的数据流,周期数值是量级示意,不是精确测量:

梯形图 OB1S7-200 SMART 存储区ComDrvS7 驱动Factory IO 场景梯形图 OB1S7-200 SMART 存储区ComDrvS7 驱动Factory IO 场景场景切到 Run、驱动 Connect 成功后开始周期读写传感器状态变化(Item_at_entry、Moving_X…)写 V0.0–V1.2(11 个 BOOL)扫描周期读取 V 区写 Q0.0–Q0.7(8 个 BOOL)读 Q0.0–Q0.7驱动执行器(输送带、Move_X/Z、Grab)T37 定时、VW4 计数

这张图说明一件事: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服务端 IPFactory 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 地址方向
Coils0–7Q0.0–Q0.7PLC → Factory IO(写)
Discrete Inputs0–10V0.0–V1.2Factory IO → PLC(读)
—不参与VW4PLC 内部计数

用 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_entryV0.0入口有无料检测
Item_at_exitV0.1出口到位检测
Moving_XV0.2X 轴运动中反馈
Moving_ZV0.3Z 轴运动中反馈
Item_detectedV0.4抓取位工件检测
StartV0.5启动按钮(驱动面板)
ResetV0.6复位按钮
停止按钮V0.7停止按钮
Emergency_stopV1.0急停
AutoV1.1自动模式选择
FIO_RUNV1.2Factory IO 运行状态
Entry_conveyorQ0.0入口输送带电机
Exit_conveyorQ0.1出口/转运输送带电机
Move_XQ0.2X 轴动作指令
Move_ZQ0.3Z 轴动作指令
GrabQ0.4夹爪/吸盘
Start_lightQ0.5运行指示灯
Reset_lightQ0.6复位指示灯
Stop_lightQ0.7停止指示灯
CounterVW4产量计数(整数,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 V0.5

Item_at_entry V0.0 上升沿

置位 Move_Z Q0.3

Item_detected V0.4

Grab Q0.4 上升沿

T37 到点 1.0 s

Moving_X 撤销

Item_at_exit V0.1

/Grab 复位 Q0.2、Q0.3

置位 Entry_conveyor Q0.0

停止按钮 V0.7

Emergency_stop V1.0

重新 Start

复位后重新 Start

待机

运行

工件到位

Z 轴下降

抓取

Z 轴回升

横移

放料下降

松爪

回原点

停止

急停

这张图能看出两个结构性不足:一是「停止」和「急停」都只是回到待机,没有故障恢复流程,按完还得重新 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_ReadyV1.3BOOL 输入下游允许入料
Downstream_ItemV1.4BOOL 输入下游入口有料(防叠料)
Transfer_DoneV1.5BOOL 输入转运完成反馈
Transfer_LiftQ1.0BOOL 输出顶升/移载动作
Transfer_CountVW6INT转运计数

地址从 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 时间都做成可配置项,方便对比不同节拍下的产能。

十、参考资料

  1. 西门子,《S7-200 SMART 系统手册》,Modbus TCP 库与 MBUS_CLIENT 指令说明。
  2. 西门子,STEP 7-Micro/WIN SMART 软件帮助文档(指令表、符号表、状态表)。
  3. Factory IO 官方文档与驱动说明:https://factoryio.com
  4. ComDrvS7 驱动说明与下载:https://www.mhj-tools.com
  5. 西门子,PC Access SMART 用户手册(OPC DA 服务器配置)。
  6. 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 符号示例地址,按实际分配
Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐