做定点机械臂项目的那些年最怕的不是PLC程序写不出来也不是WinCC画面画得丑而是机械、电气、程序这三波人在现场互相甩锅。我这次用S7-1200加WinCC组态做的一套定点搬运机械臂从硬件选型到梯形图调试再到上位机画面和通讯前前后后折腾了快一个月。今天把整套设计与实现过程完整拆一遍重点讲梯形图里那几个核心程序段的写法以及接线和通讯阶段我自己踩过的坑希望能给正在做类似课题的朋友省点时间。1. 需求起点为什么是“S7-1200 WinCC”这个配置组合1.1 项目从哪来机械臂要做什么这套系统不是六轴工业机器人那种级别它是一台典型的定点机械手臂结构上就是三个自由度底座旋转电机带动整个手臂水平转动一个升降气缸控制手臂上下末端是气动夹爪负责抓取和释放工件。工作区域划分成三个固定的位置点——原点待机位、工位A上料位、工位B下料位。机械臂的任务就是在三个点之间做循环搬运从工位A抓取工件转到工位B放下再回工位A继续中途必须在原点做一次位置校准防止累积误差。控制要求看起来不复杂但细节挺多。手动模式下要通过按钮分别控制旋转正转、旋转反转、升降上升、升降下降、夹爪夹紧、夹爪松开方便现场调试和维修。自动模式下只需要按一次启动机械臂就按照预设的节拍持续循环。任何时候按下急停所有输出必须立刻切断重新启动后必须先回原点不能直接接着跑。另外每个动作执行后都要有时间限制比如旋转到位的最大时间设为5秒超时没有收到到位信号就判定为卡阻停机报警。把这些需求理顺之后我第一反应是这东西用小型PLC完全能扛住剩下的问题就是选哪个型号、配什么上位机。1.2 方案对比为什么没选S7-200 SMART也没走单片机这里先说结论机械臂控制这种场景我很不建议用单片机或者Arduino去做。带电机的启停控制、限位开关的互锁、现场信号的滤波抗干扰PLC在工业环境下的可靠性是单片机比不了的尤其在调试阶段遇到输出继电器抖动、传感器信号毛刺这些问题时PLC的诊断能力和梯形图在线监控功能能帮你省下大量时间。至于选哪个PLC我对比过S7-200 SMART和S7-1200。S7-200 SMART确实便宜梯形图指令也够用做简单的点位控制绰绰有余。但我这次有三个考虑让我最终还是选了S7-1200。第一S7-1200的PROFINET接口是标配和上位机通讯不用额外买通讯模块直接用标准以太网线就能连第二S7-1200支持用博途软件做模块化编程程序里可以建FC、FB、DB代码结构比200 SMART清晰很多后期维护方便第三WinCC在上位机组态软件中的地位摆在那S7-1200和WinCC同属西门子体系原生通讯协议支持非常顺不需要中间加OPC服务器转接。有人可能会说用WinCC做这么小的项目是不是大材小用这个说法我部分认同但从学习和课程设计的角度讲WinCC的价值不在于画面有多炫而在于它把变量管理、报警记录、历史趋势曲线、脚本这整套监控系统开发流程串起来了这套方法论放到以后做任何SCADA项目都通用。1.3 控制系统总体架构整套系统从上到下分三层设备层、控制层、监控层。设备层包括旋转电机、气缸电磁阀、夹爪、限位开关、光电传感器以及各种中间继电器控制层就是S7-1200 PLC型号选的是CPU 1214C DC/DC/DC自带14路数字量输入和10路数字量输出外扩了一个SM 1223数字量输入输出模块保证IO点数有余量监控层是一台装WinCC V7.5的工控机通过工业以太网交换机与PLC连接用TCP/IP协议通讯。这里说一下为什么选DC/DC/DC型。旋转电机我准备用直流减速电机配两个中间继电器做正反转控制传感器和电磁阀也都是DC 24V整台设备不需要交流接触器驱动大功率负载所以用晶体管输出的DC类型正好响应速度比继电器输出快接线也干净。如果要用220V交流电机那就要选带继电器输出的型号或者外接接触器这个后面接线章节再细讲。2. 硬件组网与接线设计先把物理层铺好2.1 输入点分配传感器与开关PLC的程序再巧妙物理接线不靠谱也是白搭。我先说输入点的分配逻辑。选用的都是NPN常开型光电传感器和机械式行程开关这在接线时要特别注意S7-1200的数字量输入通道默认是按源型输入设计的也就是说传感器需要提供PNP类型的信号即高电平有效。如果你手上只有NPN传感器强行接上去会出现信号时有时无、监控画面里输入点乱跳的情况。我在这次项目中统一采购了PNP常开型传感器接线方式是传感器棕色线接DC 24V正极蓝色线接0V黑色信号线接PLC输入点。限位开关则全部选用三线制常开形式PLC内部程序用常开指令检测。输入点分配表大致是这样输入地址信号名称元件类型功能说明I0.0原点到位行程开关机械臂旋转回到原点位置I0.1工位A到位光电传感器旋转到上料位I0.2工位B到位光电传感器旋转到下料位I0.3升降上位磁性开关气缸缩回到位I0.4升降下位磁性开关气缸伸出到位I0.5夹爪夹紧到位磁性开关工件已夹紧I0.6自动模式旋钮开关选择自动运行I0.7启动按钮带灯按钮自动循环启动I1.0停止按钮带灯按钮自动循环停止I1.1急停按钮自锁急停硬件切断所有输出有一点容易忽略停止按钮我特意用了常闭触点程序里用常开指令读取这样一旦按钮接线断了或者按钮本身损坏PLC会认为停止信号一直存在设备无法启动实现失效安全。急停按钮更特殊它的处理分硬件和软件两层后面讲梯形图时会细说。2.2 输出点分配电磁阀、接触器与电机输出部分相对简单但是出问题的概率反而高。因为S7-1200晶体管输出模块的带载能力有限每路最大输出0.5A左右直接驱动24V电磁阀没问题但驱动继电器、接触器线圈这种感性负载时必须加续流二极管和中间继电器做隔离否则断电瞬间的反向电动势会击穿PLC输出晶体管。我的输出分配方案是输出地址信号名称负载类型驱动方式Q0.0旋转正转中间继电器→直流电机PLC经中间继电器Q0.1旋转反转中间继电器→直流电机PLC经中间继电器Q0.2升降气缸伸出电磁阀线圈PLC直接驱动Q0.3升降气缸缩回电磁阀线圈PLC直接驱动Q0.4夹爪夹紧电磁阀线圈PLC直接驱动Q0.5夹爪松开电磁阀线圈PLC直接驱动Q0.6自动运行指示灯LEDPLC直接驱动Q0.7故障报警灯LEDPLC直接驱动电机正反转控制是我在接线阶段最谨慎的地方。两个中间继电器控制直流电机的正极和负极换向如果程序逻辑没做好互锁正转和反转输出同时接通等于电源短路中间继电器触点瞬间烧毁。所以梯形图里必须做双重互锁Q0.0和Q0.1的线圈回路互相串常闭触点同时在输出端还串了硬件接触器互锁。哪怕程序某个瞬间发生了错误硬件层面也能切断。2.3 接线中的几个关键细节第一急停按钮必须做成硬回路。所谓硬回路就是急停按钮的常闭触点直接串在外部中间继电器线圈的供电回路里这个中间继电器的常开触点又串在每一路输出负载的供电线上。按下急停后不管PLC程序状态如何中间继电器断电所有负载全部失电。PLC只检测急停信号用于状态显示和后续复位逻辑。这比单纯在程序里做急停处理可靠得多因为程序可能跑飞PLC可能死机但硬线回路永远在。第二PLC的24V电源尽量单独供电。不要和传感器、继电器共用同一个开关电源的同一组端子容易产生地电位漂移。我用了一个24V 5A的开关电源给PLC主模块供电另一个24V 3A电源给传感器和中间继电器供电两个电源的0V在PLC接线端子处单点共地。第三旋转电机的正反转主回路和PLC信号线要分开走线槽。我在现场见过太多的干扰问题最简单的原因就是动力线和信号线绑扎在一起电机一启动PLC的输入信号就开始乱跳。这次我把信号线全部用屏蔽电缆单端接地动力线用普通电缆走另一个线槽两者间距至少20厘米实测下来信号非常稳定。第四磁性开关接线的极性不能弄反。气缸磁性开关有两根线棕线接正蓝线接负接反了不会烧但灯不亮、信号出不来。现场调试时经常因为这种低级问题折腾半天先拿万用表量一下最省事。3. 梯形图程序解析用步序号实现定点搬运3.1 程序结构规划OB1、FC/FB和DB怎么配机械臂的控制程序我用博途TIA Portal V17写的。程序结构上没有搞得太复杂但也不是把所有逻辑堆在一个OB1里。我做了一个主组织块OB1一个全局数据块DB_MechanicalArm一个手动控制功能FC_Manual一个自动流程功能块FB_Auto一个报警处理功能FC_Alarm。这种划分思路是这样的手动控制和自动控制虽然是同一套IO设备但逻辑完全不同拆开写互不干扰也方便单独调试。全局数据块DB_MechanicalArm里存放所有系统状态比如当前步序号、动作超时设定值、运行模式标志、故障代码等。注意S7-1200里的DB块默认有保持性设置但断电保持区域很有限所以我只在DB里放了需要在断电后保持的参数比如超时时间设定值其他临时运行状态用了非保持区。梯形图程序用到的指令也不复杂主要就是常开常闭触点、置位复位指令、比较指令、定时器TON以及边沿检测指令。整个程序最核心的设计思路就是把定点搬运流程拆成若干个固定步骤用一个整数型步序变量来标记当前走到哪一步每步只干这一件事干完就跳下一步。3.2 手动/自动共用一套IO的互锁处理手动控制程序段的逻辑比较直白每个输出对应一个按钮按钮按下输出置位或者接通松开就断开。但这里有个关键问题手动模式下如果反转到原点还一直按着按钮机械臂会卡死。所以我给旋转输出加了限位保护当原点到位信号为1时反转输出被强制断开当工位A到位信号为1时正转输出被强制断开。限位开关的作用不只是给自动程序提供到位信号它本身就是机械臂物理上的安全边界。手动控制功能FC_Manual的梯形图逻辑大致是旋转正转输出 手动正转按钮 AND NOT 工位A到位 AND NOT 急停有效 AND NOT 自动模式。升降输出同理上位限位和下限位互相串常闭触点。夹爪输出则做了互锁夹紧和松开不能同时接通。自动模式信号I0.6在这里起到了总闸的作用。旋钮拨到自动时所有手动按钮全部失效这样就算有人误按了手动按钮机械臂也不会突然动作安全性提升一大截。3.3 定点动作链步进状态机的实现方式这是整个梯形图程序的核心。三步前进、位置检测、执行动作是这种定点搬运设备的基本范式。S7-1200没有三菱PLC那种专门的步进顺控指令STL我用的是最常见的做法步序号计数器加置位复位。我定义了一个Int型变量DB_MechanicalArm.StepNo取值范围0到50每个值代表一个动作步骤。自动循环的动作链拆解如下步序号动作内容转移条件下一站0待机等待启动启动按钮按下且不在原点1010旋转回原点原点到位2020升降缩回到上位气缸上位到位3030从原点旋转至工位A工位A到位4040升降伸出至下位气缸下位到位5050夹爪夹紧抓取工件夹爪夹紧到位6060升降缩回上位气缸上位到位7070从工位A旋转至工位B工位B到位8080升降伸出至下位气缸下位到位9090夹爪松开放下工件延时0.5秒100100升降缩回上位气缸上位到位10你没看错第100步执行完后是跳回第10步也就是先从机器人回到原点再开始下一轮。这样每次循环都会做一次原点校准对机械臂这类开环控制的设备来说非常必要。梯形图里怎么实现步进逻辑我举第30步到第40步的写法作为示例。网络开头是步序号判断当StepNo等于30且工位A到位信号为1且旋转电机没有在转的时候就把第40步的使能位置位同时复位第30步。用程序表达就是这个效果网络1步30旋转至工位A的使能条件 %DB1.StepNo 30 AND I0.1(工位A到位) AND NOT Q0.0(正转输出) → 置位 M_Step40_Active 复位 M_Step30_Active 网络2步30段的实际动作输出 M_Step30_Active → 置位 Q0.0旋转正转 → 复位 Q0.1反转每一步都是由“使能标志位”加“动作输出”两个网络组成。使能标志位用M区或DB区的Bool变量动作输出网络里包含了互锁条件、超时条件、急停条件。这样做的好处是出问题时能非常直观地从在线监控画面看到程序卡在哪一步哪个动作有输出哪个使能标志位没置位现场排查效率极高。这里补充一个很多人容易犯错的点步进逻辑里的跳转条件一定不能直接用到位信号去触发置位要把到位信号的边沿事件处理一下或者先等动作输出断开再触发跳转。否则机械臂刚运动到位时传感器信号触发跳步但电机惯性还没停程序已经进入下一步容易造成机械冲击和误触发。我这次在每步跳转条件里都加了“动作输出已经复位”的逻辑宁可让程序反应慢半拍也要让它运行平稳。3.4 超时保护与急停复位逻辑超时保护逻辑是我这次特别强调的部分。机械臂如果发生卡阻比如机械部件卡住导致旋转不到位或者气管漏气导致气缸伸缩不到位程序会一直在当前步骤等待现场又没人盯着电机会一直通电硬顶轻则烧电机重则损坏机械结构。解决方法是给每一步配置一个超时定时器。用法是当前步使能标志位置位的同时启动一个该步专用的TON定时器。正常情况下在设定的时间内到位信号到来步跳转定时器复位计数器清0。如果超时时间到了还没有到位信号定时器输出为1触发报警FC_Alarm置位故障标志位同时复位所有输出。超时参数放在DB块里且支持WinCC画面在线修改。比如旋转到位超时默认5秒升降到位超时3秒夹爪夹紧超时2秒。这样现场如果发现某一步动作偏慢不需要重新下载程序直接在WinCC画面里改一个数值就能调。急停复位逻辑也是梯形图里必须处理好的。我的思路是程序里用急停信号的下降沿把当前步序号清0并复位所有输出和步使能标志。急停按钮松开后系统不会自动接着跑必须满足两个条件才能再启动一是步序号已经回到0二是机械臂当前位置在原点。如果急停发生时机械臂停在半途中启动按钮无效需要手动模式把机械臂摇回原点然后才能切自动。4. WinCC组态让机械臂“看得见”4.1 建立连接WinCC与S7-1200通讯WinCC这边我用了V7.5版本和博途V17配合使用。需要特别注意的是WinCC连接S7-1200时走的是以太网通讯不是传统的MPI或者DP。在WinCC的变量管理器中建立一个TCP/IP类型的通讯驱动添加通道然后在通道属性里填写PLC的IP地址默认是192.168.0.1。这里有一个常见的坑S7-1200的以太网接口默认开启了优化块访问也就是数据块的访问可能需要符号寻址WinCC的变量驱动无法直接访问未优化的DB块结构。实测下来最稳妥的做法是在博途的PLC项目里把需要被WinCC读取的DB块属性中的“优化的块访问”选项取消勾选勾选“允许通过通讯进行访问”。如果不做这一步WinCC里建变量时会报错或者变量一直是坏的数据读不出来。这个坑我在调试阶段反复横跳了很多次最后在西门子官方文档里才确认到根因。新建WinCC项目后在变量管理里建立连接再为每个需要监控的量建立外部变量。外部变量的数据类型和PLC侧DB变量严格对应比如StepNo对应整数输出状态对应二进制变量。WinCC变量名我建议命名成和PLC侧一样的名字加上前缀区分养成习惯后画面脚本引用变量时不容易出错。4.2 主监控画面的设计思路WinCC画面怎么画直接决定这套系统好不好用。我的主画面分了三大区域左边是系统状态区域中间是机械臂实时状态区域右边是操作按钮区域。左侧状态区放了运行模式指示、当前步序号显示、故障报警在线列表。当前步序号显示用的是WinCC的输出域直接关联PLC侧DB里的StepNo变量这样现场人员一眼就能看出机械臂正在执行第几步动作。故障报警在线列表用WinCC自带的报警控件配置好报警变量后PLC置位故障标志位WinCC这边立即弹出报警记录。中间机械臂状态区是整个画面的亮点但不是真的做三维动画而是用几何图形配合变量颜色变化来模拟。我先画了两个圆形代表工位A和工位B在画面中间画一个代表机械臂旋转座的小方块然后把小方块的旋转角度绑定到一个整数型变量上——这个变量的值由PLC在旋转动作执行过程中递增或递减动作完成后保持不变。这样机械臂旋转时画面上的方块也会跟着转动位置虽然不是精确的实时机械运动映射但作为操作人员的状态指引已经足够直观。升降状态和夹爪状态用颜色变化表示气缸在上位时绿色下位时红色过渡状态是黄色。夹爪夹紧时图形变成实心松开时变空心。这种动态化比单纯显示几个指示灯更友好操作人员不需要理解梯形图就能判断设备当前处于什么姿态。4.3 变量归档、历史趋势曲线与脚本补充历史趋势曲线这部分我在热门搜索词里看到很多人问WinCC历史趋势曲线脚本怎么写。我的做法是这样的WinCC自带的变量记录功能不需要写脚本也能实现数据归档和曲线显示前提是你要先建立“定时器”然后在变量记录的“归档”配置里把需要记录的外部变量分配到某个定时器下。我建了两个定时器一个500毫秒周期的用于记录设备运行状态比如当前步序号、旋转位置变量一个5秒周期的用于记录产量计数和环境温度。归档数据默认存储在WinCC项目文件夹下的SQL Server数据库里注意要定期清理不然时间长了数据库体积会非常庞大。趋势曲线显示用WinCC在线趋势控件新建一个趋势窗口把归档变量拖进去就能显示历史曲线。至于脚本我用的地方不多主要是一个启动画面时的初始化脚本用C语言给几个内部变量赋初值以及在画面关闭时弹出一个确认对话框。另一个脚本是统计当日生产数量的用动作触发周期性执行把PLC里的累计计数变量的变化值每分钟写入一次内部变量。脚本虽小但真正用下来我体会到WinCC的脚本是双刃剑能用组态功能解决的事尽量别写脚本脚本越多运行卡顿和内存泄漏的风险越大稳定性才是第一位的。值得一提的是如果你的项目不是西门子PLC而是其他品牌比如汇川、三菱或者第三方仪表那就需要KepServerEX或者OPC UA协议来做中转。热门搜索里也看到KepServerEX与WinCC通讯的问题实际上就是先把设备数据采集到实时数据库然后在WinCC里建立OPC通道连接KepServerEX读取变量。这也是SCADA组态的标准玩法但像我们这种全西门子的项目直接用原生TCP/IP驱动就可以了少一层中转更稳定。5. 现场联调阶段的实际问题与排错记录5.1 WinCC组态访问节点报错与通讯掉线联调时遇到的第一个大问题就是WinCC连接PLC时提示“在线连接所组态访问节点的接口不可用”。项目刚组态完PLC程序也下载成功了WinCC变量管理里却一直报这个错打开变量状态全是灰色的不可用。很多人第一次遇到这个提示都会以为IP地址配置错了实际上更常见的原因是通讯驱动类型选错了。S7-1200必须使用WinCC里名为“SIMATIC S7-1200, S7-1500”的通道而不是普通的“工业以太网”通道。我最初就是选成了后者结果怎么改IP都不通。换成专用通道后再检查一遍网络接口名称是否和PLC的PROFINET接口名称一致问题立刻解决。第二次掉线则是硬件原因。现场调试时WinCC画面时不时卡住变量显示无刷新检查PLC和工控机的网线接头都正常最后发现是用的普通网络交换机质量太差在电机启动的瞬间发生了电平抖动。我换了一台工业以太网交换机并把PLC和工控机的网线换成超六类屏蔽线掉线问题彻底消失。做工业通讯网线质量和交换机等级真的不能省。5.2 定位不准传感器、机械、程序谁背锅设备跑起来之后我原以为最稳定可靠的旋转定位出现了偏差。现象是机械臂转到工位A时偶尔出现过冲传感器触发了但机械臂停止后距离目标位置还有一段小偏差。虽然控制逻辑上传感器信号已经到位并跳步了但机械的实际停止位置每次都有一点区别。这个问题的原因不在PLC程序而是机械结构的惯性。直流减速电机带的是涡轮蜗杆减速箱理论上自锁效果很好但实际装调后有间隙加上机械臂在高速旋转时惯性大传感器触发之后电机制动响应需要时间导致过冲量不一致。处理办法分两步。软件上我在传感器到位信号的判断里加上了一个去抖延时必须等到传感器连续接通达到50毫秒才判定为有效到位。同时动作输出在传感器触发后不是立即切断而是维持一个非常短的时间再断开这样机械臂可以利用一点点额外驱动力把位置走正。硬件上我在传感器安装支架上加了一个小型的机械限位缓冲块让机械臂在接近到位时先接触缓冲块传感器触发后再靠缓冲块吸收剩余惯性。这套组合拳打下来定位重复精度从原来的误差3毫米左右提升到了1毫米以内。5.3 历史趋势曲线不显示数据WinCC画面的趋势曲线联调时出现过一个奇怪现象曲线窗口能打开但一条数据都没有下部数据显示为空。我当时第一反应是变量没关联对但检查了半天变量状态明明是绿色可用的。最后在归档配置里发现归档变量虽然建好了但没有在“过程值归档”里把该变量分配到具体的“归档周期”中。WinCC的机制是变量记录功能里要分两步先建定时器再把变量拖到某个定时器下这两步缺一不可。另外SQL Server的数据库服务因为之前异常断电没有正常启动也会导致曲线不显示。启动Windows服务管理器里SQL Server相关服务重启WinCC项目后问题解决。5.4 上电瞬间输出乱跳的惊吓联调到最后阶段出现了一个让我冷汗直冒的问题每次PLC重新上电的瞬间Q0.0和Q0.1偶尔会瞬间接通一下也就是旋转电机在上电时瞬间抖动了一下。这要是发生在现场有人伸手操作的时候后果不堪设想。排查后确认是中间继电器线圈两端的续流二极管加了但PLC输出晶体管在上电初始化瞬间CPU输出映像区还没有稳定时外部负载短暂获得供电。解决方法是把所有输出中间继电器的线圈供电回路串上急停中间继电器的常开触点也就是上电瞬间急停中间继电器还没吸合所有输出负载的电源是断开的等PLC程序运行稳定后急停中间继电器才吸合输出才能正常工作。这个时序问题在原理图设计时就要想清楚临时补救虽然能解决问题但不如一开始就做好输出电源管理。6. 项目移交后的自我复盘整套系统交付之后我整理了一些体会。机械臂控制在控制领域算入门级项目但正因为入门它把PLC编程、电气接线、上位机组态、现场调试这些基本功全部串起来了值不值得做看你怎么做。我在实际维护中最大的体会是程序结构比程序技巧更重要。这套梯形图里我没有用任何高级指令全是常开常闭触点、定时器、比较指令和置位复位但因为我坚持用步序号状态机的方式拆解流程出问题时十分钟就能定位到是哪一步、哪个输出、哪个信号出了问题。团队里有同事用三菱STL写类似逻辑写出来确实更省代码但排查逻辑时反而因为指令嵌套太深看不明白。另一个体会是机械臂硬件上的限位和缓冲永远是第一优先级程序上的判断只是锦上添花。设备好不好用最终看的不是程序多聪明而是机械结构多稳定、电气设计多细心。那个上电瞬时输出抖动的问题如果当时没有在意交付后现场出了事故那才是真正的兜底失败。最后分享一个小技巧。调试梯形图时我习惯把当前步序号StepNo这个变量添加到博途的监控表里同时放在WinCC画面最显眼的位置。联调时看画面上的步序号跳动比盯着一排指示灯更直观每一步动作是否执行到位、程序卡在哪一步一眼就能看出来。这个习惯我之后做所有流程类PLC项目都用上了确实省了不少扯皮的功夫。