1. 这套三菱组合到底能在实际设备里干什么
看到标题里"三菱FX3G+GS2110屏+JE伺服"这一串,估计不少刚入门的朋友第一反应是:三个名字都听过,但合在一起能做什么、为什么要这么搭,心里其实没底。我先把这个组合的定位讲清楚,后面再展开程序怎么写。
FX3G是三菱小微型PLC里性价比很高的一个型号,几十个点数的设备基本都够用;GS2110是GS系列人机界面里很常见的型号,十来寸的屏,画面对话框清晰,价格友好;JE伺服是三菱经济型伺服,用在一些定位精度要求不是极端、但也要靠脉冲控制走位置的场合。这三样组合在一起,常见的落地场景就是小型自动化设备:送料机构、分料定位台、小型装配机、皮带传送加定位挡停、裁切机的长度控制,等等。速度不快,但胜在整套电气方案都是同一家的,通信协议、软元件接口、调试工具链全部贯通,对于刚接触工业控制的初学者来说,这是最容易把"PLC程序、触摸屏画面、伺服参数"三者串起来的一套配置。
很多人问,为什么不用别家的PLC配别家的伺服,再配别家的屏,便宜不少?这话没错,但初学者阶段最怕的不是便宜,而是出问题了不知道问题出在哪个环节。全用同一家,触摸屏和PLC之间的通信协议不用自己折腾,伺服和PLC之间的接线定义、指令体系也是成体系的,软件上GX Works2写梯形图、GT Designer3做画面、MR Configurator2调伺服,三个软件各管一段,文档互相印证。真出了毛病,排查路径清晰得多。
硬件上怎么连也值得先说一句。FX3G的晶体管输出型PLC,Y0和Y1可以输出脉冲,接到JE伺服驱动器的脉冲指令输入端;方向信号一般也用Y2这样的高速输出口给出。GS2110触摸屏则通过串口和FX3G的编程口通信,或者通过扩展通信模块走以太网。伺服驱动器的报警输出、使能信号这些,再回到PLC的输入点上。整条信息流是:触摸屏下发命令给PLC,PLC按程序逻辑运算,发脉冲给伺服驱动器,伺服带着电机走到位,定位完成信号反馈回PLC,PLC再把状态刷新到触摸屏上。写程序前把这条链路在脑子里过一遍,后面每条指令都不容易糊涂。
这套工程还有一个特点,就是结构化的写法特别适合当范例。很多初学者第一版程序都是"一把梭"式的梯形图,想到哪写到哪,结果几十个线圈互相缠绕,改一个定时器恨不得把整个程序都翻一遍。标题里特意强调"结构化工程编写",其实就是告诉你,代码的组织方式比代码本身更值得先学。
2. 初学者写程序为什么总是一坨乱麻:"结构化"到底在结构化什么
先说说最常见的乱象。我见过不少初学者拿过来的程序,打开GX Works2的工程,梯形图从头到尾一个主程序块全写完,中间没有FEND,没有子程序调用,几百步全部平铺在一起。启动按钮、报警、手动自动、伺服定位、气缸动作,全部混在一屏一屏的梯形图里。表面上看程序也能跑,但有个致命问题:改任何一个功能,都可能影响别的地方。比如你本来只想调一下气缸延时,结果一改,发现伺服定位的步序也乱了,因为二者的线圈、中间继电器、定时器编号全都交叉使用,没有任何隔离。
结构化做的事情,说白了就是两个字:分块。三菱FX3G这种小型PLC,虽然没有大中型PLC那种独立任务管理,但通过"主程序+子程序CALL调用+步进梯形图STL"完全可以实现清晰的分工。我自己的习惯是,把所有逻辑分成这么几大块:初始化、公共处理、手动模式、自动模式、伺服控制、报警处理、输出刷新。每一块都在梯形图里加上"块头注释",说明这个区块解决什么问题、修改日期、负责修改的人是谁。听起来很简单,但真能执行下去,程序的可读性会有质的提升。
分块只是第一步,更关键的是软元件规划。初学者最容易犯的错就是软元件随便用,M0到M100一路用过去,D0到D20随手就存数据,完全不考虑这个寄存器是干什么的、断电保持属性是什么。结构化工程一般会提前做一张软元件分配表:M100到M199固定放手动相关标志,M200到M299放自动流程标志,M8000到M8000这样的特殊继电器留给系统;D100到D199放参数设定值,D200到D299放设备状态值。这样写出来的程序,看到M210就知道它大概率是自动流程里的某一步,看到D150就知道是某个速度参数。排查问题时效率完全不一样。
另外,GX Works2里还有一个很有用的功能:标签编程。意思是你先给软元件起个名字,比如把M200命名为"自动启动中",程序里全部写"自动启动中"这个标签名,而不是写裸地址M200。编译时软件自动分配地址。这样做的好处有两个:一是程序的可读性大幅提高,看梯形图时满屏都是有意义的名字,不是一堆干巴巴的M和D;二是以后项目复制修改,换个名字重新编译就行,不需要把所有地址从头捋一遍。有些老工程师不爱用标签,觉得不如直接写地址直观,但对于初学者来说,标签编程是培养结构化思维的好工具。
这里还要特别提一下FX3G的寄存器断电保持问题。很多初学者会在程序里直接用D0、D10这种普通寄存器存计数值、存当前步号,结果设备断电再上电,发现数据全清零了,位置参数、配方参数全部要重新输入。更可怕的是反过来,有些数据本来不该保存的,比如某个临时状态标志,结果因为选用了断电保持区域,上电后设备莫名其妙接着上一次的流程继续跑。结构化工程在初始化程序里,要明确地把非保持区清零一遍,把该恢复的保持区参数从掉电存储区读取出来,这个动作必须放在所有逻辑最前面。我在第3节给出的骨架里,会把这一步的写法一起带上。
3. 一个能直接抄的工程骨架:以"自动定位分料台"为例
理论说再多,不如给一个具体的骨架。下面这个例子我经常拿给初学者当模板,是个很典型的"传送带送料+伺服定位分料"的小设备。需求很简单:按启动按钮,传送带运行把料送到位;到位传感器感应到后,伺服电机带动分料机构定位到三个不同工位;定位完成后气缸动作推料;推完自动回到起点等待下一次循环。按停止,当前循环结束后才允许停机。急停按下,所有输出立即切断。
先说主程序的整体排版。FX3G允许我们用FEND指令划分主程序和子程序区,整个程序的逻辑结构可以这样组织:
程序开始 初始化子程序(M8002初始脉冲触发一次) 公共处理段:急停检测、模式选择、运行状态指示 手动/自动切换判断 手动模式子程序(CALL) 自动模式子程序(CALL) 伺服控制子程序(CALL) 报警处理子程序(CALL) FEND 初始化子程序区 手动模式子程序区 自动模式子程序区 伺服控制子程序区 报警处理子程序区 END这种写法的第一个好处是,任何人拿到程序,先看主程序的这个"目录",就大概知道整个工程的流程了。第二个好处是,手动和自动的逻辑可以物理隔离,不会互相干扰。切换判断放在公共处理段里,用一个模式标志M,比如M110.0为ON表示手动,OFF表示自动。手动的子程序里做一些点动操作,自动的子程序里走完整流程。
自动流程是结构化的重头戏,我强烈建议初学者用"步号寄存器+D0步号判断"的方式来设计,而不是靠一堆辅助继电器的自锁互锁来串流程。什么意思呢?流程共分几步,就定义一个数据寄存器D0存当前步号。比如:
第0步:等待启动,传送带停,伺服回原点状态等待 第1步:启动传送带,开始送料 第2步:等待到位传感器X3为ON,说明料到了 第3步:伺服定位到工位1 第4步:气缸动作推料 第5步:气缸退回,计数加1 第6步:判断计数值是否到设定值,没到就跳回第3步去工位2 第7步:全部完成,回原点,D0清零在程序里怎么表达"当前在第几步"呢?就是两条指令的事:
LD = D0, K3 (如果当前步号等于3) SET M200 (说明现在正在做伺服定位这个动作)每次要切换步号,就写MOV Kx到D0。不要去搞一大堆置位复位的辅助继电器,那样程序越长越乱。用步号寄存器以后,你想知道设备现在卡在哪一步,直接监控D0的数值就知道了。这个思路是结构化工程里非常核心的套路,我给了两个学生用这个方式写,他们说第一次觉得自动流程"清醒"了。
初始化程序里,除了前面说的对应保持区清零,还要做一件事:把所有输出强制关闭。记住,PLC上电的一瞬间,如果程序刷出来之前输出点保持的是上一次的状态,设备可能会乱动。标准做法是在初始化里先把Y全部复位,再执行其他逻辑。此外还要把D0步号清零或恢复到设备断电前的位置,具体看设备安全要求。如果设备中途断电,直接把D0清零让设备回原点比较安全。
主程序框架里,伺服控制子程序通常是独立出来的。主流程只负责告诉伺服"现在要去哪个位置",真正发脉冲的指令全部集中在伺服子程序里。这样做的好处是,整台设备所有用到伺服定位的地方,都只有这一个出口,不会出现在十几个位置乱发定位指令的情况。后面专门用一节讲这个子程序怎么写。
4. 伺服控制在结构化工程里的落地:电子齿轮、定位指令和回原点
JE伺服是三菱的经济型伺服,控制方式常见的是脉冲指令控制。FX3G脉冲输出型PLC的Y0口发脉冲串,Y方向信号走Y2,伺服驱动器的使能SON信号接到PLC的输出点,由程序控制伺服什么时候得电。初学者一上来最容易犯的错,是以为接好线、VFD那边参数随便设一下PLC就能直接发脉冲让它转。实际上伺服驱动器这边必须先设好一组基础参数,比如脉冲输入模式是"脉冲+方向"还是"CW/CCW",脉冲输入电子齿轮分子分母,指令倍率,是否接入正负限位,等等。JE伺服调试软件MR Configurator2只是调整手段,参数本身是存在驱动器里面的。第一次调试,先在软件里用试运行功能把伺服电机动起来,确认方向、转速、编码器反馈都正常,再回到PLC这边发脉冲联动。这一步省掉的话,后面出了故障你根本分不清是伺服没调好还是PLC程序写错了。
电子齿轮比是绕不开的坎。简单说,伺服电机转一圈,编码器反馈给驱动器的脉冲数通常是固定的,而PLC发的脉冲数不一定和电机转一圈需要的脉冲数一致,中间就需要电子齿轮把两者匹配起来。举个例子:假设伺服转一圈需要131072个脉冲(编码器分辨率),你希望PLC每发10000个脉冲伺服就走一圈,那电子齿轮比就要设成10000:131072,或者反过来。而这个"一圈对应多少机械行程",取决于电机带的丝杠导程和减速比。假如丝杠导程是10mm,减速比是1:1,那么PLC发10000个脉冲,机械部分走10mm,也就是1mm对应1000个脉冲。要定位到20mm,程序里就是20000个脉冲。我建议初学者把这些换算关系全部写到工程注释里,或者做成一张表格贴在屏旁边,别直接在梯形图里填死一个很大的数字,不然过两个月你自己都看不懂那个481520是怎么来的。在程序里用D寄存器存"目标位置",在触摸屏上设定机械距离,再用PLC内部做一次脉冲数换算,这种做法维护起来最方便。
定位指令在三菱FX3G里常用的有PLSY、DRVI、DRVA。PLSY是连续发脉冲,不发位置控制那种;DRVI是相对位置定位,以当前位置为原点向前向后走多少;DRVA是绝对位置定位,以回原点后的机械原点为基准走到某个绝对坐标。结构化工程里,自动流程基本只和DRVA打交道。要定位到哪个位置,就把这个位置的"绝对坐标值(已经换算成脉冲数)"传给伺服子程序,然后置一个启动标志M。伺服子程序等到M置ON,执行一次DRVA,定位完成后M8029这个特殊继电器会置ON,程序里把它转成"定位完成"标志M,再切到流程下一步。注意,DRVA是一发送完脉冲就完成的,但伺服真正到位要等定位完成信号。好一点的做法是不仅看M8029发脉冲完成,还要看伺服驱动器反馈的到位信号,不过经济型方案里,先靠M8029加一个延时去读取位置接近结果也是可以的。
回原点在JE伺服工程里单独写一个子程序,不要混在自动流程里。物理结构上通常有近点狗DOG和Z相脉冲。三菱FX3G支持DSZR指令做带DOG的Z相回零,PLC在DOG传感器ON之后开始找Z相,机械上能保证每次停在同一个物理位置。初学者容易忽略的是:回原点必须在自动流程之前完成,而且回原点的模式要单独用输入点或者触摸屏按钮触发,不能让自动程序一启动就开始回原点。原点是整个绝对定位坐标系的前提,原点都没找回来,谈坐标等于零。
伺服报警处理也要写进程序。JE伺服的ALM报警输出通常接到PLC的一个输入点,程序里要做报警锁存:一旦ALM为ON,置一个报警标志,并切断所有运动输出,除非操作员按下复位按钮,否则报警标志不复位。这里还有一个坑:有些初学者把伺服报警直接接到PLC的输入点,但忘了在程序里锁存,结果伺服报警闪了一下又恢复,设备已经乱走了。报警锁存这个逻辑,哪怕程序别的地方不写,也必须写。
把伺服相关的所有控制集中在一个子程序里,还有一个附带的好处:伺服的主控标志M201、目标位置寄存器D231、当前位置读取D240这些软元件,全都在这个子程序区域内命名清晰,不会跑到其他功能里被复用。说到复用,正是下一节要重点聊的触摸屏地址问题。
5. GS2110触摸屏不是画画就行:画面背后全是地址规划
GS2110做画面使用的是GT Designer3。很多初学者拿到这套软件第一反应是拖几个按钮、放几个指示灯,画面画出来了,然后发现屏上按钮按了半天PLC没反应。原因是,触摸屏上的每一个按钮、指示灯、数值显示框,背后必须绑定一个PLC的软元件地址。画面画得再漂亮,地址没绑对或者绑冲突了,一切都是白搭。
我在这个组合的项目里通常会先做一张"触摸屏地址规划表",然后再去开GT Designer3。表的格式大概是这样的:
软元件区域 用途 对应画面的功能 M100.0 手动模式启动 手动页启动按钮(置位模式) M100.1 手动模式停止 手动页停止按钮(瞬时模式) M101.0 设备急停中标志 所有页面报警灯显示 D150 自动流程目标工位号 自动页当前工位显示 D160 伺服目标位置(脉冲数) 参数页设定值输入 D170 伺服实际位置(脉冲数) 自动页当前位置显示 M110.0 手动/自动模式切换 主页面模式切换按钮这张表的价值在于,一台设备的PLC程序和触摸屏画面做地址对接时,永远有据可查,不会出现画面里放了10个按钮,其中5个都绑定同一个M地址的情况。有些初学者是在GT Designer3里随手拖一个按钮出来,忘记改地址,两个按钮同时绑定M0,结果按任意一个都会触发同一个功能,折腾半天找不出原因,查地址表立刻就能发现。
画面上具体元件也要注意绑定模式。启动按钮一般用"置位位"模式,按下时M置ON,松开保持;停止按钮用"瞬时"模式,按下瞬间给一个ON信号,程序内部靠它去切断流程;如果画面里用了"交替"模式做启动停止,很容易出现PLC里的状态和屏上按钮显示的状态对不上,初学者尽量别用。指示灯绑定的是PLC输出状态或者运行标志,不要让它直接绑定到按钮地址本身,不然按钮和灯一荣俱荣,看不出真实设备状态。
通信连接上,FX3G本身没有网口,GS2110连PLC最常见的方式是通过编程口串口,用专用连接电缆接好,GT Designer3里新建工程时选择对应的PLC型号(FX3G),连接方式选"直接连接/串口",站号设成PLC通信参数里约定好的值。如果你的项目需要用触摸屏的网口做远程监控,那就要在FX3G上加通信扩展板,或者选用带网络口的FX3U系列,硬件上要提前规划,别等到现场布线完了才发现少了一个口。
还有一个安全层面的重要提醒:急停按钮必须在触摸屏画面上放一个醒目的,但物理安全回路绝不能只靠触摸屏。急停开关要硬接在PLC输入回路上,同时串进伺服使能的继电器回路里,确保急停按下时伺服驱动器直接断电或者停止使能。触摸屏按钮触发的是PLC内部逻辑,走的是软件路径,软件出问题或者屏死机的时候,硬件安全回路才是最后一道防线。这一点在结构化工程里属于"公共处理段"必须优先执行的逻辑,不是画面上好看而已。
画面结构的规划同样建议按功能分页:手动页面、自动页面、参数页面、报警页面、原点页面。每个页面只放该页面负责的内容,手动页面绝不能混入自动流程的启动按钮。报警页面上用报警列表显示PLC里的报警标志,比如伺服报警、缺料报警、气压不足报警,PLC里每产生一个报警就置位一个M,同时把这个M绑定到画面报警列表的报警器地址上,屏上就能按时间顺序显示了。
6. 新手照着模板抄,最容易踩中的五个深坑
框架搭好了,真正动手写的时候还会碰到一堆"看似没问题但设备就是不动"的情况。下面这五个坑我不敢说百分之百的人都会踩,但至少我见过不止一次,而且基本都是初学者项目中重新翻车频率最高的。
第一个坑:输出线圈重复使用。做结构化分工以后容易出现的场景是,手动子程序里为了测试方便写了一个OUT Y3,自动子程序里又有一个OUT Y3。梯形图编译的时候不一定报错,但PLC扫描是顺序执行的,后面执行的输出会覆盖前面的输出,于是设备表现出"手动时输出正常,切到自动就乱来"的诡异现象。排查时顺着程序看,两个线圈看起来都没问题,实际上后执行的那个把先执行的冲掉了。标准解法:所有输出线圈集中到一个"输出刷新"区域,逻辑程序里只操作中间继电器M,最后由输出刷新区统一把M映射到Y上。逻辑里用M,输出锁定Y,这就是很多人说的"远离双线圈"的实用做法。
第二个坑:初始化忘了清场。上一节讲初始化时再三提了软元件清零。实际操作中经常忘掉的是那些断电保持型的D和M。比如设备跑到步号D0=6,突然断电,再上电时如果初始化没有把D0处理掉,自动流程继续执行第6步甚至直接跳回第3步去工位2,人员和设备安全都成问题。我的建议是初始化程序里连续清一排区域:先清输出Y,再清中间继电器M常用区,再清D常用数据区,最后把D0设成起始等待步。哪些要清哪些要保留,依据就是软元件分配表上"断电保持"那一栏的标注,这个标注必须在设计阶段就敲定。
第三个坑:定位指令的完成标志没用对。用DRVA做伺服定位时,启动条件和完成条件必须成对出现。很多初学者写着"SET M201启动定位",然后定位完成M8029为ON以后忘记把它转存成一个独立标志,结果下一次循环时M201还保持着ON状态,定位指令被二次触发,伺服直接报错或者乱跑。正确写法是,每次用M201启动定位,定位完成信号M8029置ON时,先把M201复位,再让流程进入下一步。记住,启动条件一定要和完成标志互锁,这是所有运动控制程序的铁律。
第四个坑:触摸屏地址冲突和密码锁死。前面说地址规划表就是防这个的。我在实际项目里还碰到过一种情况:画面中一个数值输入框绑定D160,然后又有一个配方功能把一组D地址全都写入,结果配方的写入覆盖了运行中的D160,设备定位坐标突然变成几千零几。这类问题在结构化工序里可以在PLC程序加一道"画面参数写入校验",比如参数页设定了一个D100,PLC主循环里总是把它读出来判断范围是不是太离谱,超范围就给报警,而不是直接用。画面做修改时也要注意软件自带的"注释同步"功能,防止地址和注释错位。
第五个坑:程序版本混乱。这个不是技术上写代码时踩的坑,但初学者最容易被坑。GX Works2的工程文件随便改几下,不加注释不存版本,过一个星期打开都不知道哪一版是对的。我的习惯是,工程文件夹按日期命名,每次大改动前先拷贝一份存档,改完以后导出一份PDF格式的梯形图放在同目录下,文件名带上日期和版本说明,比如"v20250115_增加二次定位功能"。没养成这个习惯前我也吃过亏,现场调试到一半发现程序不是最新版,忙了一晚上结果方向全反了。
这五个坑如果都能绕开,基本上就已经超过大多数初学者的水平了。接下来就是真正上电调试的顺序问题。
7. 现场调试时的动手顺序,以及一个月后你会感激自己的几个习惯
结构化程序的调试,一定要按"先PLC逻辑,再伺服,再整机联调"的顺序来,别一上来就把所有机械都接电。我自己调试这种设备的标准顺序是:第一步,断开伺服和气缸的动力电,只给PLC和触摸屏供电。在GX Works2的监视模式下用强制功能模拟输入信号,把自动流程的每一步走一遍,看D0步号有没有按预期跳,看M标志有没有按预期置位复位,看输出刷新区的Y有没有对应动作。这一步能查出百分之七十的逻辑错误。第二步,只给伺服系统的控制电,在手动页面点动伺服,确认方向正确,然后做一次回原点,确认原点位置和坐标显示都对。第三步,把伺服接入自动流程里,但气缸先不接气,走到气缸动作那一步时观察程序状态变化。第四步,全部动力接上,从单步循环测试开始,最后才跑连续自动。
调试过程中有一个几乎每天都会用到的工具,就是GX Works2的软元件/内存监视窗口。把D0当前步号、M200系列流程标志、M8029定位完成、D170伺服实际位置这几个关键值全部选中放进监视画面,设备走到哪一步,卡在哪一步,一目了然。触摸屏这边如果有条件,可以在GT Designer3里用模拟模式先跑一遍画面,验证按钮属性、地址绑定、页面切换都对得上,再下载到真实的GS2110里,能省很多现场来回刷机的时间。
最后说两个和程序无关但和工程息息相关的小习惯。第一,在梯形图每一大块程序的开头都用注释写清楚这一段的功能、修改日期、修改人。打个比方,"自动流程—伺服定位段(2025-01-15修改,增加等待伺服到位延时)"这种注释,写的时候多花半分钟,一年后你回来看这个工程,会真心感谢当时的自己。第二,把触摸屏地址规划表、伺服电子齿轮参数计算表、软元件分配表三张表放在工程文件夹里,作为项目文档的一部分。程序会更新,参数会调,但表格跟住版本走,整个项目的可维护性就是另外一个量级。
当初我第一版写课题里那种"三菱全家桶"程序时,也是从一坨蜘蛛网式的梯形图开始的,改一次报警逻辑差点把整个设备流程全部搞崩。后来痛定思痛,把程序推倒重来,按现在这套分块思路重新组织,才发现大部分"疑难杂症"其实都是程序结构混乱带来的。FX3G这样的PLC虽然只是小微型控制器,但把它当作一个"结构化工程的练习平台"来用,收获的东西放到以后学任何PLC上都通用。上面这套骨架和避坑清单,你拿去参考也好,直接抄作业也好,先把一个小设备完整跑通一次,比看十篇教程都管用。