ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

基于S7-1200的PLC多电机编号启动控制方案详解

基于S7-1200的PLC多电机编号启动控制方案详解 做现场的朋友应该都有这种经历控制柜上一排启动按钮标识磨到看不清操作工赶时间随手一拍“嗡”的一声旁边的设备转了。这种误操作在电机台数多的场合特别要命轻则流程紊乱重则设备损坏甚至出人身事故。前阵子我改造一套供水系统一共7台水泵原来的按钮柜就是这种状态。后来整个控制方案推倒重来核心思路改成了“电机编号启动”——操作员在触摸屏上输入要启动的泵号PLC校验通过后才允许启动从控制逻辑上把误触发这条路彻底堵住。实现平台用的是西门子S7-1200编程环境是博途TIA Portal。这篇文章把这个项目的完整思路、硬件选型、程序结构和踩坑经过都翻出来给要处理多电机启动控制的朋友做个参考。1. 从现场误操作说起多电机设备的“编号启动”到底要解决什么问题1.1 一张控制柜按钮引发的改造那套供水系统有7台泵分三组并联平时根据水压开1到3台。原来的控制柜就是经典的“一启一停”硬接线每台泵一个绿色启动按钮、一个红色停止按钮加上电流表、转换开关。按钮用了五六年丝网印刷的编号早就擦掉了电工用记号笔写过两轮后来记号笔也褪色。操作工老周说他那天本来想开3号泵结果按到旁边的4号等发现时4号泵已经空转了两分钟。幸好泵进口还有水没烧干但这件事让车间下决心改控制。改造讨论时提过几个方案换带指示灯的新按钮、给按钮加透明护罩、甚至用双按钮启动同时按两个按钮才有效。最后我建议直接上触摸屏加PLC做一个“编号启动”的画面。操作工在主画面上输入要启动的泵号按“启动确认”PLC先判断这个编号合不合法、这台泵有没有故障、当前急停又没有按下一系列检查全过才给出启动输出。停止也是同样操作输入编号按“停止确认”对应泵才停下来。紧急情况下现场还有硬接线的急停按钮直接切断接触器电源不依赖PLC程序。1.2 拆解控制需求不是简单“按编号开一台”那么轻松把需求全部列出来才会发现“编号启动”这四个字背后有讲究编号范围固定1到7超出范围的输入一律不动作还要在HMI上弹窗提示“请输入1-7”。同一台泵只能单次启动运行中重复按启动不能造成输出抖动。泵与泵之间不需要工艺联锁因为这套系统允许同时开多台但要防止操作工误把3号开成4号。急停按下时所有启动输出立即复位现场硬回路也要能独立切断接触器电源。热继电器或电机综合保护器动作后该泵继续运行没有意义PLC应立即复位输出并给出故障提示。运行状态要反馈到HMI不能只看PLC输出灯亮不亮接触器是否真的吸合要由辅助触点告诉PLC。附加工艺要求支持顺序启动1到7号、逆序停止7到1号用来做管网的冲洗流程。这些需求看着不复杂但每一项都会影响程序结构。比如“故障后需要人工复位”和“运行反馈判断”如果前期不定义清楚后面写SCL就很纠结。1.3 为什么选S7-1200而不是200 SMART或300这种10几I/O点的小项目可能有人会选S7-200 SMART价格便宜、编程软件免费梯形图也熟。但我在这个项目里坚持用S7-1200原因有几条第一通信整合省事。S7-1200自带Profinet以太网口可以直接连KTP系列触摸屏组态在博途里一个项目搞定不用额外配线。将来如果要把泵改成变频驱动S7-1200加个CM1241 RS485模块就能走Modbus RTU和市面上的ABB、施耐德变频器都能通信。200 SMART虽然也有以太网口但如果你习惯用博途多套软件来回切很烦人。第二程序结构化更舒服。S7-1200支持SCL语言多台电机用数组加FOR循环处理代码量能压缩得很小。要是用梯形图写7台甚至32台电机的启停逻辑那一屏屏的并联网络看着都头大。200 SMART虽然也能写STL但和博途对接的舒适度比不了。第三模块化组成灵活。S7-1200的CPU本体已经带了数字量输入输出还能扩展信号模块和通信模块。比如我这套系统后面新增了液位模拟量直接加一块SM1231模拟量输入模块就解决不需要换PLC。S7-300当然更强但成本高出一截对这个项目属于杀鸡用牛刀。下面把硬件选型的情况单独拉出来说方便需要照抄的人直接对型号。2. 硬件配置与程序骨架博途里的第一步2.1 硬件清单参考用不用模拟量模块取决于现场工艺。我的项目因为后面要加液位闭环所以提前加了一块SM1231通信模块CM1241也是先装上备用。如果是纯粹做多台电机启停CPU本体足够了。名称型号订货号数量用途CPU模块CPU 1214C DC/DC/DC6ES7214-1AG40-0XB01主控制器14DI/10DO模拟量输入模块SM1231 AI 8x13bit6ES7231-4HD32-0XB01备用采集水池液位信号RS485通信模块CM1241 RS4856ES7241-1CH30-1XB01备用与变频器Modbus通信触摸屏KTP700 Basic PN6AV2123-2GB03-0AX01人机交互输入编号、状态显示开关电源24V/10A1给PLC、HMI、中间继电器供电中间继电器24VDC线圈8路底座7或8隔离PLC输出与接触器线圈接触器/热继电器根据电机额定电流选型7套主回路控制与过载保护急停按钮红色蘑菇头按钮一开一闭1硬回路急停这里有个容易被新手忽略的点S7-1200的型号后缀里DC/DC/DC分别代表电源类型、输入类型、输出类型。最后一组DC表示晶体管输出也就是输出24V高电平不能直接驱动220V或者380V接触器线圈所以必须通过中间继电器转接。如果选的是继电器输出型CPU本体输出触点容量也就是2A直接带接触器线圈同样不推荐因为大电感负载拉弧会烧触点。对电机频繁启停的场合中间继电器这道隔离墙非常必要。2.2 I/O地址分配与规划硬件回来之后先在博途里组态好硬件再把I/O地址分配清楚。我习惯先做一张纸上的地址表再往博途里录这样到了现场接线不会乱。输入输出分配表长这样地址元件说明I0.0急停按钮常闭触点PLC读到1表示急停未按下I0.1~I0.71~7号泵热继电器故障常闭触点正常运行1故障动作0I1.0~I1.61~7号泵接触器辅助常开触点吸合反馈1Q0.0~Q0.61~7号泵启动输出驱动中间继电器线圈Q1.0故障指示输出接柜顶三色灯红色Q1.1运行指示输出接柜顶三色灯绿色热继电器故障触点全部用常闭而不是常开这个设计要养成习惯。常闭触点在线路断开时PLC读到的信号会从1变成0程序能立刻识别出断线故障如果用了常开触点线路断了你看到的状态和正常没区别故障就“藏”起来了。急停按钮同理硬回路用常闭触点串在接触器控制回路里随便哪根线断了接触器都会掉电设备不会因为断线而失去保护。2.3 程序块与数据结构怎么规划在博途里我建了一个OB1、一个FC_MotorControl和一个全局数据块DB_Motor。OB1里只调用FC_MotorControl其他逻辑全部封装在函数里。HMI要访问的变量都放在DB_Motor中避免HMI直接去读程序内部变量这样分工清楚。DB_Motor里面最关键的是用一个数组来管理7台电机的数据TYPE MotorData : STRUCT RunFeedback : Bool; // 接触器辅助触点反馈 FaultIn : Bool; // 热继电器常闭触点输入状态 FaultFlag : Bool; // 综合故障标志 StartQ : Bool; // 启动保持位 RunState : Bool; // 运行状态给HMI显示 END_STRUCT END_TYPE全局DB里声明Motors : ARRAY[1..7] OF MotorData; // 电机数据数组 HMI_StartCmd : Bool; // HMI启动按钮脉冲 HMI_StopCmd : Bool; // HMI停止按钮脉冲 HMI_MotorID : Int; // HMI输入的要启动/停止的电机编号 HMI_ResetCmd : Bool; // 故障复位按钮脉冲 EStopFlag : Bool; // 急停状态为什么一开始就要用数组而不是每台电机建一套变量因为后面写SCL时7台电机用循环处理逻辑只写一遍。如果不用数组你得把同样的网络复制7遍改一台漏一台排查起来能把自己坑死。数组索引用电机编号1号电机就对应Motors[1]HMI输入的编号直接当成下标来用逻辑和人的直觉一致。2.4 博途组态里容易漏掉的基础设置组态PLC时我给CPU设了固定IP地址192.168.0.10触摸屏设成192.168.0.11两个设备保持同一网段。博途里的Profinet接口设置必须要和实际规划一致否则HMI下载完程序后找不到PLC。另一个容易漏的是“系统时钟存储器”。在CPU属性里勾选“启用系统存储器字节”我习惯用MB100作为时钟存储器字节。这样程序里可以用M100.4这样的位来做HMI上故障灯的闪烁提示不用自己写时间逻辑。还有一个技巧是设置“保持性存储器”把DB_Motor中需要断电保持的位比如某些工艺参数勾选为保持这样断电重启后不会被清零但启动保持位我不要保持因为不允许设备掉电后自己重新启动。3. 编号启动核心逻辑校验、互锁与单按钮启停3.1 先想清楚操作流程再写代码我在代码注释里会把整个操作流程写成自然语言然后再翻译成SCL。比如启动流程操作员在HMI输入编号点“启动确认”。HMI弹窗“确认启动3号电机”再点确定HMI_StartCmd置TRUE一个扫描周期。PLC检测到HMI_StartCmd上升沿先把HMI_MotorID保存到临时变量。判断编号是否在1到7之间如果不在置位一个错误提示并退出。判断当前有没有急停、该泵是否有故障、是否已经在运行。全部通过把对应Motors[编号].StartQ置TRUE。物理输出Q点根据StartQ和急停、故障状态综合输出。停止流程类似只是把置位改成复位。这里核心点在于启动输出不能直接用HMI按钮的电平去驱动必须用内部“保持位”。因为HMI按钮按下是短暂的如果用临时信号驱动Q输出手一松接触器就跳闸根本没法自锁。很多新手栽在这一点上以为触摸屏按钮按下去之后输出就一直有其实HMI按钮默认只是一个脉冲信号要保持输出必须靠PLC内部置位或自锁逻辑。3.2 SCL实现8台以内的最清晰写法下面这段是FC_MotorControl里的核心代码我简写了部分输出映射但逻辑完整。// 上升沿检测 #RTrigStart(CLK : DB_Motor.HMI_StartCmd); #RTrigStop(CLK : DB_Motor.HMI_StopCmd); #RTrigReset(CLK : DB_Motor.HMI_ResetCmd); // 急停标识I0.0常闭读到1正常0急停 #EStopActive : NOT I_EStop_OK; // 启动逻辑 IF #RTrigStart.Q THEN #TempID : DB_Motor.HMI_MotorID; // 编号合法性校验 IF (#TempID 1) AND (#TempID 7) THEN // 互锁条件无急停、无故障、未运行 IF (NOT #EStopActive) AND (NOT DB_Motor.Motors[#TempID].FaultFlag) AND (NOT DB_Motor.Motors[#TempID].RunFeedback) THEN // 启动保持位置位 DB_Motor.Motors[#TempID].StartQ : TRUE; ELSE // 不满足条件置位提示位 #StartBlocked : TRUE; END_IF; ELSE // 编号非法 #IDInvalid : TRUE; END_IF; END_IF; // 停止逻辑 IF #RTrigStop.Q THEN #TempID : DB_Motor.HMI_MotorID; IF (#TempID 1) AND (#TempID 7) THEN DB_Motor.Motors[#TempID].StartQ : FALSE; END_IF; END_IF; // 故障复位逻辑 IF #RTrigReset.Q THEN FOR #i : 1 TO 7 DO // 只有故障触点已经恢复为常闭状态时才允许复位 IF DB_Motor.Motors[#i].FaultIn THEN DB_Motor.Motors[#i].StartQ : FALSE; END_IF; END_FOR; END_IF; // 状态刷新与输出映射 FOR #i : 1 TO 7 DO // 热继电器常闭触点1正常0故障 DB_Motor.Motors[#i].FaultFlag : NOT DB_Motor.Motors[#i].FaultIn; DB_Motor.Motors[#i].RunState : DB_Motor.Motors[#i].RunFeedback; END_FOR; // 输出综合急停或故障时强制切断启动输出 FOR #i : 1 TO 7 DO #OutArray[#i] : DB_Motor.Motors[#i].StartQ AND NOT #EStopActive AND NOT DB_Motor.Motors[#i].FaultFlag; END_FOR; // 将#OutArray映射到Q0.0~Q0.6 Q_MotorStart_1 : #OutArray[1]; Q_MotorStart_2 : #OutArray[2]; // ...... 以此类推代码里需要特别解释几个点第一上升沿检测。SCL里的RTrig指令是函数块要先实例化。我用了一个临时背景DB或者静态变量来存RTrig实例。如果没有上升沿检测HMI按钮信号只要还是TRUE程序就可能在一个扫描周期内反复执行置位逻辑但看起来似乎没影响。真正的风险是停止逻辑你按一下停止如果信号持续几秒停止指令会一直执行这倒也无所谓。但如果启动按钮和停止按钮都用同一个电平信号控制一个SR触发器没有边沿就会有“最后一次指令胜出”的怪毛病。所以脉冲按钮的场景一定配合边沿检测。第二数组越界问题。代码里先用IF判断编号范围再访问Motors[#TempID]这个顺序不能反过来。因为SCL访问数组下标越界S7-1200会进入STOP状态整个PLC停机。这是现场最怕的故障耽误生产还有理说不清。HMI端虽然我限制了输入范围是1到7但PLC侧必须再做一次校验因为通讯干扰可能把变量改成异常值不能依赖HMI做安全边界。第三互锁条件里用了RunFeedback而不是StartQ。这是多一层保护即使PLC已经输出启动但如果接触器因为机械卡住没吸合那么你再次按启动时程序会认为“这台泵已经通过启动命令了”不予重复启动。实际上更精细的控制应该分“启动输出已给出”和“接触器已反馈”两个状态。对于泵类负载我用RunFeedback作为最硬的互锁条件。如果接触器反馈坏了PLC会误判泵没运行导致无法诊断问题。所以现场调试时第一件事就是核对每个反馈点的状态。3.3 为什么输出映射要分开写程序里用了#OutArray暂存最终输出然后在末尾赋给物理Q点。为什么不直接在循环里写“Q0.0 : ...”呢因为SCL里没法用数组下标动态访问物理输出地址除非用POKE或者地址间接寻址那会降低可读性也容易出地址错位。用#OutArray临时数组然后在末尾一条条赋值虽然多写几行但排查问题时一目了然。别人维护程序时看到Q0.0被哪个数组元素驱动也很快能理清关系。3.4 顺起逆停编号启动的自然扩展改造提需求时工艺说要支持“顺序启动”和“逆序停止”用于冲洗管网。顺序启动就是从1号泵开始每隔2秒启动一台一直到7号逆序停止是从7号开始每隔3秒停一台一直到1号。这样做的目的是避免多台大功率泵同时启动造成母线电压跌落和水锤冲击对管网系统特别重要。这个功能可以用一个简单的定时器步进逻辑实现。我在FC里增加了两个变量#SeqStep : Int; // 当前执行到的电机编号 #SeqTimer : TON; // 顺序间隔定时器 #SeqBusy : Bool; // 顺序执行中 #SeqInterval : Time; // 间隔时间默认T#2S核心伪代码IF #RTrigSeqStart.Q THEN #SeqStep : 1; #SeqBusy : TRUE; #SeqTimer(IN : FALSE); END_IF; IF #SeqBusy AND #SeqStep 7 THEN #SeqTimer(IN : #SeqTimerEnable, PT : #SeqInterval); IF #SeqTimer.Q THEN // 启动当前编号电机 IF (NOT DB_Motor.Motors[#SeqStep].FaultFlag) AND (NOT DB_Motor.Motors[#SeqStep].RunFeedback) THEN DB_Motor.Motors[#SeqStep].StartQ : TRUE; END_IF; #SeqStep : #SeqStep 1; #SeqTimer(IN : FALSE); // 重置定时器 END_IF; ELSE #SeqBusy : FALSE; END_IF;这个写法有一个细节TON的IN如果一直为TRUEQ会在PT到达后一直保持TRUE所以每次启动完一台后要把IN置FALSE再置TRUE才能开始下一次计时。SCL里用实例调用TON时直接写#SeqTimer(IN : ..., PT : ...)但想要重置定时器必须让IN从TRUE变成FALSE再变成TRUE所以我用了#SeqTimerEnable这个中间变量来控制而不是直接把IN写死TRUE。初学者最容易卡在这个定时器重置上以为调用一次自动清零。4. HMI交互设计防止手滑的那道“防呆锁”4.1 主画面应该长什么样KTP700 Basic的屏幕不算大我把它分成三个区域上方是7台泵的状态指示中间是编号输入和操作按钮下方是故障信息和系统按钮。状态指示区使用圆形指示灯绿色代表运行红色代表故障灰色代表停止。如果故障了指示灯用系统时钟存储器做成闪烁更容易引起注意。每台泵旁边标好“1号泵”“2号泵”这样的文本。这些文本放到HMI的画面属性里操作工不用看柜体铭牌直接看屏幕就知道哪台泵有问题。中间操作区放置一个“IO域”用于输入编号旁边放“启动”“停止”“故障复位”三个按钮。IO域要设置成数值型变量对应DB_Motor.HMI_MotorID上下限制分别填1和7。注意这里HMI的限制只是减轻PLC负担不能作为安全屏障真正安全校验还是在PLC里。4.2 按钮确认对话框和变量连接HMI上最大的“防呆锁”是启动确认环节。我在KTP700的按钮上直接把“按下”动作配置成“弹出一个确认对话框”对话框文本用动态变量比如“确认启动[编号]号泵”这样操作工点了启动按钮后HMI先弹窗确认确认后才把HMI_StartCmd置位一个周期。如果只是想输入编号、不想启动直接取消即可。停止按钮同样加确认对话框防止误停正在运行的设备。这个确认对话框的意义在于硬按钮一旦按下就立刻触发没有后悔余地触摸屏可以多一步人机确认操作员必须明确知道自己选的编号对不对。从人的工程心理学角度看多一道确认能防住绝大多数“顺手误触”。HMI变量连接上建议直接在博途的HMI变量表里连接“DB_Motor.HMI_StartCmd”等PLC变量不要用单独的HMI内部变量再传值那样多一道映射调试时头晕。触屏和PLC走Profinet接线就是一根普通网线两边IP设到同一个网段很简单。我第一次接KTP时忘了设IP结果HMI一直显示找不到PLC后来发现是出厂默认地址和设备规划地址不一致改过来就好。4.3 操作权限分级现场作业要求操作员和工程师权限分开。KTP700支持用户管理我给操作员组分配了启动、停止、复位权限工程师组额外拥有顺序启动间隔时间设置、系统参数修改权限。这样一来工艺参数不会被普通操作工乱改动出了问题也能根据账号追踪到是谁操作的。维护层面看这个功能成本几乎为零收益却很实在——有次夜班操作工说“我没动过参数”用户管理一查他确实进过参数画面只是没保存结果对话就变得顺理成章。5. 联调排障实录上电之后那些“意料之中”的意外5.1 先仿真的优点与局限这个项目我在博途里用PLCSIM做了好几轮仿真。仿真时可以通过变量表强制输入点状态比如把I0.0强制成TRUE模拟急停未动作把I0.1强制成FALSE模拟1号泵热继电器故障。启动流程在仿真里走得很顺但仿真和实际最大区别是PLCSIM不模拟硬件接线问题更暴露不了工程现场强电干扰。仿真时我遇到的最大问题就是数组越界。有一次我把HMI输入编号设为0然后在程序里先访问了Motors[0]再判断合法性结果PLCSIM直接停了状态栏提示“数组下标越界”。这个错误让我意识到无论HMI怎么限制PLC程序里都得先做合法性判断。使用S7-1200时如果写入非法地址CPU会进入STOP现场表现为所有输出断开、系统死机。后来我干脆把编号校验写在一个独立的FC里任何访问数组的操作都通过这个FC给出的合法下标。5.2 接线问题漏型源型、中间继电器、RC吸收到了现场接线阶段好几个问题差点让我怀疑程序。第一个是输入信号类型。CPU 1214C的输入通道可以接漏型或源型但接线方式不同接源型PNP时公共端接0V信号从传感器流出高电平到输入点接漏型NPN时公共端接24V信号把输入点拉低。我现场用了24V电源和接近开关是PNP输出这没问题。但电工师傅习惯性地把公共端接到了24V导致输入点全部常亮。这种问题光看逻辑根本发现不了得用万用表量PLC输入点的电压。检查完改成公共端接0V后输入信号才恢复正常。第二个是输出回路。S7-1200晶体管输出只能输出24V/0.5A左右绝对不能直接接220V交流接触器线圈。我的做法是PLC输出点接24V中间继电器线圈中间继电器的一组常开触点串到接触器线圈控制回路里。接触器线圈是电感负载断开瞬间会产生反电动势所以在接触器线圈两端并联了一个RC阻容吸收。否则用不了多少次中间继电器触点就会拉弧烧黑触点电阻变大泵就会出现“时灵时不灵”的诡异问题。第三个是反馈信号的电源。接触器辅助触点是无源干接点我把它们接到PLC输入点和公共端0V之间这样辅助触点闭合时输入点读到的是24V。如果辅助触点串到别的电源回路里容易烧坏PLC输入模块。所有反馈线都用了RV软线并压了冷压端子。5.3 和变频器结合的扩展编号启动不只是开关量如果是变频电机所谓“编号启动”就不仅仅是置位一个Q点而是要通过通信把启动命令和给定频率发给对应变频器。现场经常看到ABB变频器和西门子PLC做Modbus RTU通信或者用一个PLC控制多台变频器。S7-1200加CM1241 RS485模块就能做Modbus RTU主站每台变频器设一个从站地址PLC在通信里访问该地址的控制字。编号启动逻辑本身不变变的只是把“置位Motors[编号].StartQ”替换成“调用Modbus写指令向第N号变频器写控制字”。而第N号变频器的Modbus地址要做一个映射表。我的经验是把电机编号和变频器从站地址分开维护电机编号变频器从站地址Modbus控制字地址1116#20002216#2000.........程序里用一个数组存从站地址根据编号索引即可。S7-1200串口通信的轮询要自己写状态机尤其是多台变频器时不能一股脑把全部请求同时发出去否则RS485总线上会冲突。一般每个从站给50到100ms的通信窗口32台设备一轮下来就是3秒多所以对实时性要求高的场合要评估好。好在泵类设备对启动响应也没那么敏感这种轮询方式足够用。5.4 现场疑难杂症排查清单联调过程中间遇到过几个常见现象我把排查思路整理成表方便遇到类似问题的人按顺序查故障现象可能原因检查步骤输入编号后按启动无反应PLC程序未进入启动逻辑看HMI按钮变量是否在监视表里翻转用变量表强制HMI_StartCmd确认程序是否能启动启动保持位置位但接触器不吸合中间继电器线圈无电、Q点输出异常、接触器线圈回路断量中间继电器线圈两端24V量PLC输出点是否输出高电平量接触器线圈两端电压运行反馈一直为0导致逻辑认为未运行辅助触点接线错、触点选用了常闭用万用表通断档量PLC输入点接线端子热继电器故障复位后仍不能启动故障复位逻辑输出还是TRUE查看故障输入是否恢复为1程序里FaultFlag是否复位顺序启动执行到一半停了中间编号的电机有故障或已经运行检查该电机状态把顺序启动改为跳过故障电机或直接终止这里要特别强调排查问题时先看输入信号再看程序块最后看输出。不要一上来就怀疑PLC死机。我用博途的“在线监视”功能在梯形图里实时看每个变量状态比在纸上猜快得多。S7-1200支持在线修改功能但涉及安全联锁的修改我都会先备份项目避免停机后现场恢复不了。6. 从8台到32台如何让这段代码“长大”6.1 数组上限和循环改两个数字的事这套代码最让我得意的地方就是扩展性。如果要把7台改成32台核心SCL基本不用改只改三处一是Motors数组的声明范围改成ARRAY[1..32]二是FC里所有FOR循环的结束值从7改成32三是输出映射和输入地址分配增加相应点。因为编号启动和输出控制都是基于数组索引的新增电机不需要复制粘贴逻辑块完全符合模块化思想。这个思路在热词“plc控制32台变频器程序设计”同样适用。当然硬件方面就不能只靠CPU本体那点I/O了。S7-1200最多能扩展8个信号模块CPU 1214C本体的DQ只有10点要输出32个启动命令需要加SM1222数字量输出模块。如果输出点是交流还是直流也要考虑我这里全部用直流输出加中间继电器。模拟量模块同理每增加16路数字量输入就加一块SM1221。硬件组态时要注意机架电流和功耗预算模块太多时电源容量也要跟着加大。6.2 和Modbus轮询结合时的一个思路如果32台电机都用变频器控制那程序就不只是处理数字量了而是变成一套“PLC主站 32个Modbus从站”的轮询系统。S7-1200的CM1241 RS485模块通信距离和波特率要规划好建议波特率9600或者19200距离长用低波特率。站号和通信地址通过拨码开关或变频器面板设置PLC程序里维护一张“站号表”。轮询的核心是一个状态机给每台变频器分配一个“正在发送请求”“等待响应”“写入成功”“写入失败”的状态。启动第N号电机时把它对应的请求插入轮询队列PLC在下一个轮询周期把启动命令发给它。这个东西写起来比数字量逻辑绕但是编号启动的主体思想没变——编号仍然是访问数组或站号表的钥匙合法性校验、故障判断、急停联锁全部可以复用。6.3 维护经验命名、注释与备份项目做完不算完后面要维护几十年。我在DB变量命名上统一用了前缀I_开头是输入Q_开头是输出HMI_开头是触摸屏接口内部计算变量用Tmp开头。这样打开变量表扫一眼就知道这个变量是干什么的。HMI画面里的文本标签我都写了完整中文描述比如“1号泵接触器反馈”“2号泵热继电器故障”而不是只写地址。电工师傅看画面文字就能解决问题不用拿图纸翻半天。另一个容易被忽略的是备份。博途项目每改一次我就另存为一个带日期的版本比如“MotorControl_20250115”然后把整个项目文件夹拷贝到移动硬盘。S7-1200的程序存储区比200大但也不是无限量源文件和归档分开保存。有一次我误删了一个FC还好前一天刚备份过五分钟就恢复过来了。做现场项目的朋友应该都有过“手一抖就删库”的经历备份习惯真的要用血泪去换。最后再分享一个小技巧修改完程序下载后一定在HMI上重新走一遍完整的“启动-运行-故障-停止”流程并且观察PLC模块上的输入输出指示灯状态。你会发现很多看似“奇怪”的BUG其实是程序逻辑和现场状态错位造成的比如明明看到Q0.0灯亮了但接触器不吸合那就是中间继电器或者接线的问题和PLC一点关系都没有。多台电机编号启动这种功能做完之后最好让操作工试操作几天他们才是最终用户好不好用他们说了算。
返回列表