汇川AM600/AC801与威纶通触摸屏Modbus TCP通讯实战指南
前阵子刚结束一个包装线的小项目机柜里装的是汇川AM600当总控、AC801带三根伺服轴客户点名要威纶通的大屏。说实话一开始我心里犯嘀咕汇川自家触摸屏不好吗但客户有客户的理由——库存、售后习惯、工程师手头已有的组态模板。被逼着蹚了一遍这个组合之后我发现它其实比想象中顺滑前提是你把两边的地址映射、数据模型和通讯机制彻底理顺。这篇文章就把这次实战里踩过的坑、验证过的配置和最终沉淀下来的套路写清楚给正在或者打算把汇川AC801、AM400、AM600跟威纶通触摸屏搭在一起的同行做个参考。这套组合的真正价值在于Codesys内核把汇川中大型PLC拉进了一个开放、标准化的编程世界而威纶通在人机交互和组态效率上又有自己的优势。两者通过Modbus TCP一碰既不用被厂商绑定又能拿到稳定、可维护的控制系统。但它绝非“插上网线就能跑”三款控制器的分工、PLC侧的数据字典、触摸屏侧的地址规划、联调时的启动时序和字节顺序每一环都有讲究。1. 选型底盘AM400、AM600、AC801这三兄弟怎么分工1.1 三款控制器的定位差异我在这个项目里同时用到了AM400、AM600和AC801这不是为了炫技而是这三款产品本身就有明确的分工逻辑凑在一起恰好能满足一条产线的真实需求。AM400定位经济型中型控制器IO规模不大不小适合当作单机设备或辅机工位的大脑。AM600是AM400的扩展版本点数、通讯接口、运动控制指令集都更强适合做整线总控挂分布式IO、模拟量、多个从站。AC801则是专业的运动控制器它的强项是伺服轴的实时调度适合承担多轴插补、电子凸轮、电子齿轮这类高实时性任务。表格里看得更清楚型号定位在我项目里的角色主要通讯手段AM400经济型中型PLC辅机工位逻辑控制Modbus TCP从站AM600中型高性能PLC整线总控、IO采集Modbus TCP主/从站、EtherCATAC801运动控制器三根伺服轴的运动控制EtherCAT主站、Modbus TCP这三款都跑在Codesys生态里编程语言、变量语法、调试手段几乎一致意味着一个工程师可以同时维护三台设备不用切换思维。1.2 为什么“Codesys内核”这么关键聊这套组合之前得先把Codesys这三个字的含金量说透。IEC 61131-3定义了PLC编程的五种标准语言Codesys把这套标准做成了跨厂商的IDE汇川、施耐德、博世力士乐、菲尼克斯等一大堆品牌的控制器都基于这个内核做二次开发。对工程师来说Codesys带来的最大好处是学习成本低、生态资源丰富。AM600里写的结构化文本程序换到另一家Codesys平台的控制器上语法习惯基本通用。好不容易调好的轴控功能块也可以在项目之间复制复用。第二好处是诊断手段统一在线监控、强制变量、Trace曲线、断点调试这些在汇川的IDE里都有跟纯正Codesys体验几乎一致。AC801则把Codesys在运动控制上的功力放大了。标准PLCopen运动控制库MC_Power、MC_MoveAbsolute、MC_CamIn之类可以直接调用而且它的实时任务与伺服周期强绑定控制周期能跑到亚毫秒级。这让我这个项目的三轴往复送料机构变得非常简单电子凸轮表一挂从动轴跟着主轴走HMI上只需要改几个凸轮参数不用把曲线写死在程序里。1.3 威纶通凭什么能跟汇川“奇妙组合”威纶通触摸屏在市场上存量极大工程师群体对EasyBuilder Pro的组态方式非常熟悉。它兼容的PLC驱动列表非常庞大很多日系、德系、台系PLC都有成熟驱动。汇川这类基于Codesys的控制器官方没有给威纶通做私有协议接口但Codesys天生就带Modbus TCP从站功能威纶通又有非常成熟的Modbus TCP主站驱动——这两边一碰协议就对齐了。所以这个“奇妙组合”的本质是不依赖厂商私有协议用行业通用的Modbus TCP作为桥梁。Modbus TCP的优势在于简单、可靠、调试工具多PLC侧不需要授权触摸屏侧也不需要写脚本。代价是数据模型要自己管理没有现成的符号表自动同步地址映射全得靠工程师手排。这正是本文后面要花大篇幅讲的东西——不夸张地说这套组合做得顺不顺完全取决于地址映射表做得细不细。2. Codesys工程侧的核心准备从建站到数据字典2.1 三台设备的工程组织方式项目里最忌讳的是每台控制器单独写一套风格完全不同的程序。我的做法是在AM600这台总控上做一个统一的“站编址规范”不管是AM400还是AC801与它通讯时都按同一套寄存器规则来。通讯拓扑是这样的AM600是总控负责整线的逻辑、急停链、IO采集以及和触摸屏的主通讯连接。AC801是运动控制器三根伺服轴挂在它的EtherCAT总线上它只负责运动相关的逻辑。AM400是辅机工位控制器负责称重传感器数据的采集和几个气缸的顺序动作。威纶通触摸屏同时与AM600和AC801建立两条Modbus TCP连接AM400的参数汇总到AM600再由AM600统一上送屏幕。这么设计的好处是屏上只有一个“主数据源”分散的控制状态全部在AM600里先汇总成整齐的数据块然后一次性送出去避免屏上同时盯着三台设备的原始数据而增加联调负担。2.2 Modbus TCP从站的具体配置在AM600和AC801的工程里Modbus TCP从站配置路径大致是设备树里添加Ethernet接口 → 在其下添加Modbus TCP Slave设备 → 配置输入、输出、保持寄存器的映射区域。有两个关键点容易踩坑必须单独拎出来说。第一Modbus TCP从站需要显式定义“映射到%MW的起始地址”。很多新手把从站设备加上之后发现触摸屏读到的数据全是乱的原因就是没有在从站参数里指定数据存放的寄存器地址区间。我会把AM600上的%MW0~199划给HMI状态区%MW200~399划给HMI控制区这两个区段在从站参数里都要明确勾选“映射”。第二输入区与输出区的方向不要搞反。触摸屏读PLC状态用的是Modbus的保持寄存器读功能码对应Codesys侧%MW区里的数据因此状态区的数据必须放到“保持寄存器映射”里。如果错误放在输入寄存器区屏上用4x地址去读永远读不到。2.3 寄存器规划给HMI留一块干净的地址区间我踩过最大的一个坑是早期项目里寄存器规划得乱七八糟触摸屏地址跟PLC内部的中转变量混在一个区间结果程序一优化、变量表一排序屏上的数据就对不上了。这次项目我强制自己遵守一条规则在PLC内部单独划出一段“HMI通讯专用变量块”并且用结构体组织数据。比如在AM600里定义一个全局结构体HMI_DATA成员包括machine_statusINT整机状态字alarm_codeINT当前报警码axis_pos_revREALAC801实际位置回读axis_speed_rpmREAL主轴转速formula_idINT当前配方号op_cmdINT屏下达的命令字然后把结构体变量通过AT声明固定到%MW0的地址上。这样做的好处是程序内部变量随便增删只要这个结构体没有动HMI那边的地址就永远稳定。结构体里的每个成员按顺序连续排列触摸屏按偏移量取数干净利落。2.4 数据类型与地址对齐Codesys里有几个数据类型细节在跟威纶通通讯时影响极大。首先是双字对齐问题。%MW区是按16位字编址的一个REAL类型的32位浮点数要占用两个%MW。我要求所有32位变量在结构体里的起始偏移必须是偶数也就是都落在%MW0、%MW2、%MW4这样的位置上。这样做是为了让触摸屏端的32位读取指令可以“一个字组两个字”地连续读出来不会遇到跨字边界的事情。其次是布尔量的表示。Modbus协议本身没有布尔类型触摸屏上用线圈0x地址或保持寄存器位4x的某一位都能读。我更推荐用保持寄存器位的方式也就是把一个16位状态字的各位定义成不同的状态标志触摸屏用“读取保持寄存器位”的方式来显示。这样一条状态字就能承载十几个开关量通讯量小得多画面上的指示灯响应也快。把以上这些规划完成之后Codesys工程侧的“数据字典”就成型了。我会把结构体成员、Modbus地址、数据类型、含义说明整理成一张Excel表这张表就是后续触摸屏组态和现场调试的唯一依据。3. 威纶通触摸屏侧连接地址对照表才是灵魂3.1 驱动选型Modbus TCP/IP威纶通EasyBuilder Pro里的驱动列表里能看到很多厂商的专用协议。汇川AM600、AC801这类Codesys控制器如果你去找“汇川”专用驱动可能会看到一些适用于汇川另一条产品线的选项但针对AM系列我并不建议依赖专用驱动。理由很简单专用驱动一旦版本不匹配或者PLC固件升级地址偏移行为就可能变化联调期很难排查。我在这几个项目里全部选择“Modbus TCP/IP”驱动然后把PLC站号设成默认1。Modbus TCP的端口号是502触摸屏侧填PLC的IP地址即可。威纶通允许在一个工程里建立多个设备连接所以我把AM600和AC801分别加了两条连接IP分别指向两个控制器。3.2 地址格式与偏移规则威纶通的Modbus地址格式是“类型-区域-偏移量”比如4x-00001、3x-00001、0x-00001。这里必须把地址偏移关系彻底说清楚因为这是我见过最多人搞混的地方。Modbus TCP协议层的数据模型里保持寄存器地址是从0开始的。换句话说协议上地址0、地址1、地址2……对应的是PLC从站侧第1个、第2个、第3个保持寄存器。威纶通的4x地址编号则采用“地址号从1开始”的显示习惯屏上的4x-00001对应协议地址04x-00002对应协议地址1依此类推。而Codesys里的%MW0对应的就是协议地址0。因此得到一条硬性规律屏上的4x-00001 ↔ 协议寄存器0 ↔ 汇川%MW0屏上的4x-00002 ↔ 协议寄存器1 ↔ 汇川%MW1屏上的4x-00010 ↔ 协议寄存器9 ↔ 汇川%MW9很多手册里会写“4x-40001对应Modbus地址40000”那是另一套编号习惯在威纶通里不会这么直接对应。我建议现场调试时先做一个最简单的实验PLC强制%MW012345屏上放一个4x-00001的数值显示能读到12345就说明你的偏移关系是对的再往下排地址就不会错。3.3 读取32位整数与浮点数威纶通读32位数据的方式跟读16位完全不是一个套路。它在地址格式里提供了“32位格式”选项能把连续两个16位寄存器拼成一个32位数据来显示。但如果字节顺序设置不对读出来的数值就会对不上。Modbus协议规定每个16位寄存器内部是高字节在前、低字节在后这没有问题。问题出在32位数据跨两个寄存器时谁在前谁在后不同PLC的实现不一样。Codesys在x86平台上常用的是小端模式也就是低16位字在前、高16位字在后。对应在威纶通上当我读取一个REAL变量时需要把“Word Order”设置成“低字在前Low Word First”再把“Byte Order”保持默认的高字节在前。这样屏上显示出来的浮点数才能与PLC里的变量一致。我把几种常见组合整理成表格数据类型Word Order设置备注16位整数默认直接用4x地址32位整数Low Word First低16位字在前32位浮点REALLow Word First低16位字在前符合Codesys常见存储这里强烈建议在PLC侧把一个浮点变量强制成123.456这样的特殊值屏上对应显示不对再调整字序。现场实测五分钟就能确认比看文档猜要快得多。3.4 批量读取与通讯性能威纶通触摸屏如果页面上放了几百个独立地址它会逐条发起读请求通讯效率很糟。把地址在%MW里做连续布局的优势就在这体现出来了我可以在屏上用“块读取”的方式一次把一个结构体里的20个寄存器连续读上来然后通过索引偏移绑定到画面各个控件上。在EasyBuilder Pro的“对象→索引显示/索引读写”里可以通过未定址的索引寄存器配合偏移量实现“一块数据管一堆控件”。这个做法能显著降低Modbus报文数量画面切换流畅度也会明显变好。此外触摸屏的采集周期不一定要追求最低。Modbus TCP的请求频率过快反而可能给PLC的Modbus从站任务造成额外负担。我一般把常规状态数据的采集周期设在500ms左右只有需要实时反馈的数据比如点动速度、当前位置才单独用更快的周期。画面本身的刷新率用“变化时刷新”而不是定时刷新通讯压力能再降一截。4. 联调排故跳过的两个晚上都损失在这几个坑上这个项目的联调阶段我实打实熬了两个夜问题来来回回就那么几个。单独开一章写出来希望能把后来人从类似的泥潭里捞出来。4.1 通讯时通时断快采模式与看门狗博弈第一天联调触摸屏上大部分数据正常但运行一段时间后AM600的连接状态会在屏右下角闪断再过几秒自动恢复。一开始怀疑网线、交换机换了一轮没解决。最后定位到两个原因。第一个是Codesys侧Modbus TCP从站默认会检测连接状态如果屏侧的采集周期设置得太激进频繁的连接建立、断开、重连会触发从站内部的看门狗复位。第二个是屏上某个页面放了大量独立地址快速翻页时Modbus请求队列非常深导致PLC侧来不及响应从站暂时把连接挂了。解决办法是双管齐下屏侧把采集模式改成“受控刷新”必要时主动拉取PLC侧给Modbus从站进程分配一个独立的更高优先级任务保证通讯任务不被其他逻辑拖累。改完之后连续跑了四小时连接一次都没断。4.2 掉电重启后屏读不到数据启动时序问题第二天早上过来发现一个诡异的现象只要整机断电重启触摸屏大概率首发读不到AM600的数据非要手动把PLC的RUN/STOP开关拨一下才能恢复。原因其实不难理解AM600启动需要初始化硬件、加载程序、建立EtherCAT主站连接这个过程可能要好几秒而威纶通触摸屏上电更快它一上电就立刻尝试连接Modbus从站连接失败后就一直处在“等待重连”的静默状态不会自动恢复。威纶通有连接状态标志位和重连策略设置。我在屏上启用了“通讯异常时自动重连”的选项并把重连间隔设置为3秒。另外在PLC侧加了一个“上电延时”逻辑主程序在启动后先延迟几秒再开放Modbus从站的数据更新跟屏的上电节奏错开。这样每次断电重启屏最多在十几秒内就能自动连上。4.3 浮点数显示成巨数字节序的坑屏上有一个配方温度值PLC里明明写了65.5屏上却显示成类似于1.6845E38的巨数一看就是IEEE754字节顺序被拆错了。这个问题在3.3里已经讲过原理这里再补充一个现场排查的建议不要让屏直接去读一个REAL原始值而是先在PLC里把要上送的浮点数放大10倍或100倍转换成整数再通过4x地址上送屏上显示时再除以10倍。虽然多了一步运算但彻底绕开了字节顺序的兼容问题而且整数在Modbus里永不出错。这个方案看似土实际上在项目交付后维护极其省心——任何人接手这个屏都不用去理解字序、字节序这些概念。我在这个项目里凡是涉及配方温度、长度、速度的显示全部采用“整数缩放系数”方案。4.4 多台控制器站号冲突因为屏上同时连接AM600和AC801两个Modbus TCP设备连接本身没问题但我在初始配置时犯过一个低级错误两个PLC的Modbus从站站号都被设成1。虽然Modbus TCP里站号主要靠IP区分但某些第三方调试工具会混淆两个不同IP下站号相同的从站导致威纶通连接到了错误的设备上。解决办法很简单在PLC侧把AC801的Modbus单元ID改成2AM600保持1屏上对应设备的“Station ID”也填成一致。从此触摸屏、调试狗、上位机看到的设备身份就是唯一的。5. 延伸AC801多轴运动控制与HMI的联动配合5.1 轴状态怎么上送画面AC801负责三根伺服轴HMI上要显示每根轴的位置、速度、状态。一般思路是把PLCopen轴控功能块的输出AxisRef.Status这样的结构体映射到HMI数据区。但在AC801的工程里如果直接让HMI访问EtherCAT总线上的过程数据对象数据更新虽然快但组态麻烦且容易受周期影响。我的做法是在AC801里写一个固定的“状态打包任务”每10ms执行一次把三根轴的使能状态、回原完成标志、当前位置、当前速度整理成一个结构体再映射到%MW通信区。触摸屏只需要以50ms左右的周期读取这块数据即可。这样既保证了数据新鲜度也不干扰EtherCAT周期任务。在屏上我会把轴状态做成一个“状态字数值”的组合显示状态字的每一位对应一个指示灯比如使能位、报警位、回原到位位数值区域显示位置和速度。后续如果客户要看曲线趋势直接在威纶通里新增趋势图控件数据源同样指向这块数据区不用改任何PLC代码。5.2 从HMI下达运动命令的稳妥姿势很多新手习惯在屏上直接用按钮去置位PLC里的运动控制位MC_Power闭合、MC_Home启动。这种做法的风险在于HMI通讯偶尔会抖动按钮按下的瞬间如果通讯闪烁置位信号很可能未达人却以为已经按下去了。我更推荐“命令字确认位”的方式。触摸屏把一个16位命令字写入控制区PLC侧做命令解析命令字含义1全部轴使能2全部轴禁止3轴1回原点4轴1点动正转5轴1点动反转10启动自动运行PLC收到后执行命令完成后再把当前命令的字返回给状态区。触摸屏端根据状态区回显的值决定按钮是否显示“已执行”。一旦通讯中断命令字不会反复生效安全性大大提高。5.3 凸轮参数与配方下发的缓存一致性给AC801下发电子凸轮曲线参数时最容易出现的问题是中途数据不一致。比如客户在屏上修改了一段凸轮的速度比例PLC正在读取过程中屏又刷新了一次那PLC可能拿到的是一半新一半旧的混合数据。这套组合里的稳妥做法是“双缓冲提交”。具体来说触摸屏先把一整组参数写入“待提交缓存区”然后写入一个提交命令字AC801收到命令后一次性从缓存区拷贝整个结构体到运行区同时把命令字清除。整个拷贝过程是原子性的不会出现中间状态。调试下来这个机制从未出过问题推荐沿用。6. 交付验收阶段的经验清单6.1 交付前必测的七个检查点联调结束后我会按下面这张清单逐项过测完才敢说交付序号检查项操作方式预期结果1地址偏移验证PLC强制%MW0为特定值屏上显示一致2浮点显示验证PLC写入特殊浮点值屏上数值无偏差3断电重启测试整机断电再上电屏与PLC自动重连恢复4通讯中断恢复拔掉网线10秒再插回数据自动刷新无需手动复位5按钮误触保护快速连按HMI按钮命令不重复执行状态正常6数据一致性连续修改配方30次并下发PLC运行数据始终完整不混7多页面切换负载快速切换屏画面通讯无闪断数据响应正常这一套测试在项目现场完成一次通常半小时左右。但能省去后面数周的售后电话。6.2 我沉淀下来的维护习惯最后分享几个我这次项目后决定长期固化的习惯。第一每个项目必须维护一张“地址映射总表”。把PLC结构体成员、Modbus地址、屏上控件名称、工程量程、数据类型这五列列全打印出来贴在电柜门内侧。客户电工、第二任调试工程师、我自己半年后回来都能靠这张表快速定位任何数据问题。第二给PLC侧每个HMI控制命令都加上“软互锁”。也就是说即使屏上发了命令PLC判断不在合适的运行条件下也绝不执行。这对“奇妙组合”尤其重要——两个不同品牌设备之间的通讯质量再好也不如PLC自己兜底来得可靠。第三尽量把HMI工程里每页的通讯地址都控制在连续区间内。用索引偏移代替散点地址画面上数据再多通讯报文数量也能稳定在低位。这个经验在AM600带几十个模拟量通道的画面里效果特别明显页面流畅度能差出一大截。按我的习惯每次交付前还会在屏的工程里放一页“通讯诊断”把AM600、AC801两个连接的状态位、寄存器起始地址、站点号都显示出来。客户报修电话打来时让对方先看一眼这个页面很多问题在电话里就解决了根本不用跑现场。这套汇川加威纶通的组合越用越觉得顺畅关键就在于把Protocol层的功课做在前面。