1200 PLC与威纶通触摸屏Modbus通讯及步进控制薄图实现
做自动化项目的人基本都碰过这种局面手头是1200 PLC人机界面却是另一家触摸屏两条线非要拧到一起中间还夹着一台步进电机要控制。很多人第一反应是加网关、买通讯模块结果成本上去了调试周期也跟着拉长。其实在点位不算多、速度要求不苛刻的项目里用Modbus把1200 PLC和威纶通触摸屏连起来再配合步进控制的脉冲输出完全够用而且调试起来反而更直观。这篇我结合自己实测的一套步进控制薄图显示小项目把通讯规划、寄存器映射、脉冲组态到威纶通画面联动整个链路拆开讲透给后面要搭类似系统的朋友一个能直接照做的参考。这套方案适合谁做非标设备、老设备改造、或者纯自学练手的电气工程师都合适。它解决的痛点是不需要Profinet的授权和复杂配置不依赖同一品牌生态只要PLC和触摸屏都有串口或扩展串口就能稳定协作。我的经验是只要寄存器表设计得清楚后面接屏、调参、查故障都顺很多。1. 为什么绕开Profinet选择Modbus做跨品牌联机先说结论1200 PLC本身支持Profinet和S7协议威纶通触摸屏的高端型号也能走Profinet但实际项目中我不太愿意为了跨品牌互联去折腾Profinet理由很现实。Profinet要跑通首先得保证双方的GSD文件、固件版本、网络名称、IP地址段完全对得上任何一个环节不匹配PLC侧报错就是一片红。更麻烦的是一旦甲方现场有其他设备抢占IP或者网络风暴导致IO丢失排查链路会非常痛苦。Modbus不一样它的本质就是主从问答一个主站问一个从站答没有复杂握手没有实时性承诺反而在这种小系统里显得皮实。Modbus的另一个好处是工程量小。1200 PLC这边调用两个现成指令就能当从站威纶通那边新建一个MODBUS RTU设备填好站号和你需要的寄存器区间就能正常读写。整个通讯配置时间熟练的话半小时之内就能完成。试想一下如果这个项目要接老式仪表、变频器、温控器它们绝大多数都只支持Modbus你把这个通讯框架搭好之后以后扩展别的从站设备也只是加寄存器的事。当然Modbus方案不是没有代价。首先它走串口RS485数据刷新率一般只能做到100到300毫秒级别画面上如果要求实时曲线或者高速IO状态刷新会有点吃力。其次Modbus没有握手协议写寄存器的时候必须想清楚写冲突不然主站和PLC同时写一个地址数据就乱套了。但在我这套步进控制场景里HMI主要做参数下发、状态显示、按钮触发刷新率完全够用。这个项目的核心链路是威纶通触摸屏做主站1200 PLC做从站步进电机由PLC的高速脉冲输出控制。触摸屏负责下传目标位置和速度PLC负责执行定位、回原点、处理限位再把实时的当前位置和状态字回传给屏幕显示。薄图就是在威纶通画面上用文本或图片控件关联PLC状态字不同数值切出不同图形和文字提示比如“运行中”“到位”“报警”这样。2. 步进控制的底层准备脉冲、方向与1200轴的组态2.1 步进驱动器的接线逻辑步进电机本身不会自己走必须由PLC给驱动器发脉冲串。常见接法是PUL接脉冲信号、DIR接方向信号、ENA接使能信号公共端正极接24V。1200 PLC的晶体管输出点可以直接驱动大多数驱动器光耦输入但要注意如果是继电器输出的1200是不能发高速脉冲的必须选晶体管输出型或者用信号板扩展。我这边用的是CPU自带高速输出点DQ0.0做脉冲DQ0.1做方向效果很稳。接线上有两点容易踩坑。第一脉冲信号线和方向信号线必须双绞尽量短不要和动力线走同一个线槽。第二驱动器上的细分和电流拨码要提前设好细分设得越高同样一圈需要的脉冲数越多电机运行越平滑但PLC的脉冲频率上限也更吃紧。1200的高速输出一般能到100kHz左右对大多数42步进、57步进来说已经足够。2.2 在TIA Portal里组态轴要让1200发脉冲我习惯用博途里面的运动控制工艺对象。新建一个轴选择“步进”类型把脉冲输出点分配成DQ0.0方向输出点分配成DQ0.1使能输出按需分配。注意博途里组态轴的时候会要求选“测量单位”我一般选mm这样后面所有位置、速度都用mm表达不用在HMI上做脉冲换算。轴组态里还有几个关键参数步进电机的每转脉冲数等于驱动器细分数乘以电机固有步数比如2细分就是40016细分就是3200。丝杠螺距如果直接带动丝杠就是丝杠导程比如5mm/转。速度限制设一个比机械能承受的最大速度略低的数防止调试时手滑写一个超快速度把机械撞坏。组态完成后在PLC程序里调用运动控制块。常用的有MC_Power使能轴MC_MoveAbsolute做绝对定位MC_Home回原点。这里我必须提醒一点MC_MoveAbsolute之前必须先做参考点也就是MC_Home必须执行成功否则轴会报错拒绝运动。我见过很多人在屏幕上一按启动没反应最后查下来不是通讯问题而是轴没有回原点。2.3 加减速参数的工程化处理步进电机最怕突然启动和突然停止尤其带负载的时候加速度设太大容易丢步。1200运动控制块里有动态参数是加速度和减速度单位是(mm/s²)。我的经验是加速度别超过机械能承受的极限从100mm/s²起调电机能平稳启动再往上加。实际调的时候可以做一个速度曲线慢速点到位置或者用MC_MoveVelocity做手动点动在HMI上放“正转点动”“反转点动”按钮把速度设成20mm/s左右既安全又方便对机械行程。这里说一个工程细节HMI上显示的位置是PLC轴的实际位置还是步进脉冲的累计值如果轴回不了原点绝对位置就没意义。所以我给系统设计了“相对坐标系”开机后强制用户先执行回原点把当前位置清零原点开关一碰到轴位置就归零了后面的绝对定位都以这个零点为基准。这样薄图上显示的“当前位置”才是可信的。3. Modbus通讯的落地细节从站配置与寄存器地图设计3.1 1200 PLC当Modbus从站怎么组态1200 PLC本身没有物理串口通常要加一个CM1241 RS485通信模块或者选带RS485的型号。我这边用的是CM1241 RS485模块接到威纶通触摸屏的COM口。接线很简单模块的A接触摸屏的AD模块的B接触摸屏的BD-如果距离超过十来米屏蔽层单端接地。这里注意RS485是差分的A/B反了通讯绝对起不来这是新手最容易踩的坑。通讯参数我建议统一用波特率9600数据位8停止位1无校验。虽然19200更快但在现场环境复杂的时候9600更抗干扰。只要数据量不大9600完全够用。站号设成1这个数字后面威纶通里要填得一模一样。然后在TIA Portal里调用两个现成指令都在“通信-开放式用户通信”里的Modbus库下MB_COMM_LOAD初始化串口模块填入端口号比如1022对应CM1241 RS485、波特率、校验方式、从站地址。MB_SLAVE负责处理主站的读写请求需要指定保持寄存器的起始地址和保持区长度。我的配置大致是这样MB_COMM_LOAD的REQ用首次扫描或一个周期为1秒的脉冲触发MODE填0表示RS485半双工BAUD填9600PARITY填0表示无校验。MB_SLAVE的MB_ADDR就是站号填1MB_HOLD_REG指向DB块里的一段数据比如DB100长度为100个字。3.2 寄存器地图的设计原则调试跨品牌通讯最核心的不是指令怎么调而是寄存器地图。我建设是先画一张表把每个寄存器的用途定死然后再去组态HMI变量。否则两边地址对不上画面上的数据就是乱的。我这里设计的寄存器表大概是这个风格Modbus地址PLC侧地址(字偏移)数据类型含义读写400010INT控制字启动/停止/回原点等只写400021INT目标位置单位mm整数只写400032INT运行速度单位mm/s只写400043INT当前位置只读状态只读400054INT状态字位含义见薄图设计只读400065INT故障码0无故障只读你可能注意到我用的是INT而不是REAL原因很简单当使用Modbus读写时32位浮点数在16位寄存器里需要高低字拼接威纶通那边读出来稍有偏差就会显示成一个看不出意义的数排查很费劲。对于步进控制这种应用位置精确到毫米、速度精确到个位数INT完全够用。真要带小数就统一放大10倍传HMI上再除以10显示这样既保证精度又避免了字节序问题。3.3 保持寄存器与DB块的映射1200侧MB_HOLD_REG指向的是一段保持寄存器区。我用一个独立的DB块来组织DB100里定义好DATA数组从0到99每个字对应一个Modbus地址。程序里只需要对DB100.DBW0、DB100.DBW2这些地址读写威纶通那边访问40001到40006数据就自动同步了。这里有个关键点威纶通的4x地址与PLC保持寄存器的对应关系是40001对应保持区第一个字40002对应第二个字。实际配置时威纶通设备地址的偏移和PLC侧MB_HOLD_REG的起始地址必须严格对齐。我的做法是威纶通里网络地址直接从0开始偏移这样最简单不容易错。千万别在两边同时加偏移量那样地址会差两行查半天都查不出来。4. 威纶通画面里的“薄图”状态显示是怎么做的4.1 薄图到底是什么威纶通触摸屏里所谓薄图我理解就是一类轻量的状态指示元件通过关联PLC变量来切换显示文本、颜色或图片。它不像趋势图、动画那么重只根据数据变化变样子因此很适合做设备状态显示。比如屏幕上放一个长方形色块PLC里面状态字是0就显示灰色“待机”1就显示绿色“运行”2就显示红色“报警”这种效果在威纶通里面用“位状态指示”或“数值状态指示”都能实现。命名“薄图”也可能是因为这类元件本质上是文本或PNG图替换每个状态配一张小图切换迅速系统负担小适合画面上放几十个状态位。我习惯把主状态做成大号文本辅助状态做成小圆点比如“原点到位”亮绿、“限位触发”亮红视觉层次很清晰。4.2 16位状态字的巧妙用法如果每个布尔量都占一个寄存器通讯开销会大而且寄存器也浪费。所以我在PLC内部把一堆位状态拼成一个16位状态字然后整体写到DB100.DBW8对应40005里。威纶通侧采用位读取的方式通过网络地址的位偏移直接拆出每个位。这样一个保持寄存器就能传递16个独立的开关量状态而且对Modbus网络来说只需要一个寄存器读取请求响应速度很快。状态字的位分配大概是这样位序号含义位0原点完成位1运行中位2已到位位3报警位4急停触发位5正向限位触发位6反向限位触发程序里用MOVE或直接BOOL位组合把这几个状态塞进一个字里。威纶通上做位状态指示时读取地址写为40005再在“位”栏里填对应的位号比如位0、位1这样每个状态灯和状态文本都能独立工作。4.3 触摸屏侧的变量刷新频率薄图显示要顺滑但如果刷新频率设太高Modbus主站会不停地发读请求很容易把从站和串口拖垮。我的经验是画面上的自动读状态更新周期设为200到300毫秒按钮和控制字写入才用触发式也就是按下时才写一次。如果系统里有很多数值显示不要全部设成100ms周期那样Modbus报文会挤在一条串口上反而导致画面卡顿。5. 联调阶段最容易翻车的三个场景与排查过程5.1 场景一威纶通显示通讯正常但启动按钮无效这是我最开始遇到的问题。画面上的通讯状态显示正常当前数值也能读到但按下启动按钮后电机纹丝不动。一开始我怀疑是轴没使能程序里查了MC_Power也没问题后来打开威纶通的“资料取样”一看发现命令字根本没写进PLC。问题出在地址映射上威纶通里我用的地址是4x1但同时勾选了“LW双字”之类的格式调整导致写入的寄存器偏移不对。把地址改成直接从0开始偏移、只用16位格式之后按钮立刻生效了。这个事的教训是通讯能读不代表能写能写也不代表写得对。排查时先做一个“回环测试”——在PLC里不加逻辑直接让HMI写某个寄存器然后PLC程序里把这个寄存器原封不动送回另一个寄存器HMI上观察是否一致。不一致就说明地址换算有问题一致了再往上加控制逻辑。5.2 场景二电机走一段就丢步位置越偏越多我的步进项目调试到后面电机偶尔走着走着就停住位置显示和机械实际位置对不上。排查下来是两个原因叠加一是脉冲线经过高频干扰二是加速度设太激进电机启动了但没跟上脉冲串。处理方式也很直接加速度从800降到300同时把脉冲信号线换成屏蔽双绞线再把驱动器的脉冲滤波时间设成最短。这一步调完丢步情况基本消失。顺带说一个判断丢步的技巧在PLC里记录轴实际发出的脉冲累计值如果驱动器和PLC的计数一致但机械位置不对那问题在机械打滑如果脉冲还没发完电机就停了那才是电气干扰和丢步。别一上来就怀疑程序先用排除法切分故障域。5.3 场景三状态薄图偶尔乱闪画面上的状态指示灯偶尔会几百毫秒闪一下颜色切换也不稳定。最初怀疑PLC状态字在跳变但用Modbus调试工具看保持寄存器里的值一直很稳定。后来发现是威纶通画面元件的“闪烁”功能被我不小心勾上了而且状态位读取周期设成了100ms画面刷新和视觉暂留叠加就产生了闪烁感。把刷新时间调到250ms去掉误开的闪烁开关问题解决。很多时候薄图闪烁不是通讯丢包而是画面配置的锅。5.4 场景四掉电重启后PLC连不上还有一次设备断电重启PLC一直停在STOP状态威纶通上显示超时。原因是因为MB_COMM_LOAD的启动初始化请求我用的是周期脉冲但脉冲宽度不够模块还没准备好就触发了。解决办法也很简单用一个上电延迟后保持常ON的BOOL量触发REQ或者用首次扫描周期执行一次MB_COMM_LOAD确保串口模块完全初始化后再开始通讯。6. 最终验收一套可以复用的参数自检表项目调通之后我把所有关键参数整理成一张表每次做完类似项目都会对着表过一遍能省掉不少回头查资料的时间。对想复现这个方案的朋友来说这张表可以直接当验收清单用。检查项参考值说明RS485接线A对AB对B屏蔽层单端接地反接必通讯失败串口参数9600, 8, 1, 无校验触摸屏与PLC必须完全一致PLC从站站号1与威纶通设备站号一致保持寄存器区DB100长度100字起始地址与HMI映射严格对齐轴类型步进电机脉冲方向必须用晶体管输出点加速度300mm/s²左右从低往高升稳定为止位置显示单位mm整数或放大10倍避免浮点高低字问题状态字位分配表内固定位PLC与HMI双侧一致画面刷新周期200~300ms不要全用100ms我个人的习惯是先画好这张表再去写PLC程序、做触摸屏画面。项目开始时花十分钟把寄存器表和位定义写清楚至少能省掉两三个晚上的联调时间。最后再说一个很实用的小技巧如果现场出现“通讯正常但偶尔写不进去”这种怪问题多半是多个画面页面同时往一个命令字写数据或者按钮弹起事件把启动信号覆盖了。解决办法是在触摸屏端把启动按钮改成“切换型”并通过宏指令写入一次不要同时触发多个写入窗口。这套方案我再做三次都会这么提醒自己希望看这篇的朋友也能避开这些暗坑。