ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Mcgs触摸屏串口通信调试实战:从参数配置到乱码排查

Mcgs触摸屏串口通信调试实战:从参数配置到乱码排查 简介面向MCGS组态软件开发者的串口通信资源聚焦串口数据收发与自由口协议应用系统讲解从硬件接线到软件调试的完整流程。内容涵盖串口参数配置波特率、数据位、停止位、校验位等、通信对象建立、发送与接收函数调用、超时重试与异常处理以及接收数据的协议解析方法同时详细说明自由口协议如何自定义起始位、数据区、校验位和结束位以满足非标准协议设备接入需求。适合需要与PLC、仪表、传感器等设备进行自定义数据交换的工业自动化工程师。压缩包共5个文件包含串口驱动文件、帮助文档、说明页面及动态库等类型整体仅142KB便于快速下载部署。已有903人学习使用资源虽小但结构清晰通过示例驱动和帮助文档可快速掌握串口参数设置与自由口协议报文组织技巧对初学者而言是理解MCGS串口通信的实用入门资料对开发者也能提供排查问题的思路参考。 前阵子群里有人发了一段Mcgs触摸屏的串口调试截图画面上的温度值忽大忽小偶尔直接变成乱码。远程看了半天最后发现就是校验位选错了一个选项——设备手册明明写的None组态环境里却选了Even。这种问题做现场的人应该都不陌生Mcgs串口数据收发看着简单无非是参数一填、通道一连但真正到了现场乱码、超时、时好时坏这些毛病一个比一个难缠。这篇文章就把我从设备窗口底层逻辑到现场排查的完整经验梳理一遍内容包括串口通信的工作原理、参数配置方法、组态步骤以及用串口调试助手验证收发的过程适合刚接触Mcgs组态软件的新手也适合被现场通信问题折腾过的调试工程师参考。1. Mcgs串口通信的工作原理设备窗口、设备构件和通道的关系1.1 设备窗口是串口通信的中枢Mcgs工程环境里通常有用户窗口、实时数据库、设备窗口、运行策略和主控窗口几大块很多新手一开始只盯着用户窗口画画面忽略了设备窗口。实际上串口收发数据的源头就在设备窗口里。可以说设备窗口就是Mcgs触摸屏和外部设备之间的通信中枢所有通过串口进出的数据都要经过这个窗口里的设备构件来管理。初次接触的时候我也犯过在用户窗口里找通信配置的错翻了半天菜单一无所获。后来才明白Mcgs的设计逻辑很清晰画面上能看到的是用户窗口的事而外部设备的数据入口是设备窗口的事。设备窗口里可以挂载各种设备构件比如Modbus RTU设备、PLC驱动、仪表驱动等Mcgs会按照设定好的周期主动去访问这些外部设备。理解这个逻辑之后整个通信过程就通了触摸屏作为主站主动发起通信外部仪表、PLC作为从站被动响应设备窗口里的构件负责把外部设备的寄存器数据读回来再转存到实时数据库里最后用户窗口的画面对象通过变量关联把这些数据显示出来。整个链路里设备窗口是起点也是枢纽没有它后面的所有画面和策略都拿不到真实数据。1.2 设备构件与通道从寄存器地址到组态变量的映射真正的配置核心是设备构件和通道。Mcgs常用的做法是添加一个通用串口父设备然后在它下面挂具体的子设备构件比如标准Modbus RTU设备。这种父子结构很实用父设备负责串口参数子设备负责协议参数和寄存器映射一套串口下挂多个子设备时只需改子设备各自的站号即可。每个子设备构件里都有一个通道列表一个通道对应外部设备的一个寄存器或线圈。举个例子Modbus协议里的保持寄存器40001通常对应通道“4x00001”这个通道保存的是从外部设备读回来的原始值。把这个通道和实时数据库里新建的变量关联起来画面上的数据显示框再去关联这个变量数据就一层层传上来了。这个映射关系是整个通信组态里最需要动脑子的地方。不同设备的寄存器定义差别很大有的从0开始编号有的从1开始有的把寄存器地址做成偏移量。如果映射错位读回来的数值可能完全对不上。我自己的习惯是先把设备手册里的寄存器表格整理出来标注好地址、数据类型、读写属性再照着这份表去建通道基本不会出错。1.3 循环扫描机制决定了你的通信效率Mcgs对串口外部设备的访问方式不是事件触发的而是循环扫描的。什么意思呢就是触摸屏会按照你设定的采集周期周期性地把子设备所有通道挨个读一遍有写命令时再插入写操作。这个机制带来的直接后果是通道越多、设备越多一个完整扫描周期就越长。如果你在一条RS485总线上挂了十几台设备每台设备又建了二三十个通道那触摸屏光轮询一遍就需要不短时间画面的数据刷新自然就会变慢。所以做项目时我一般会控制每个从站的通道数量只建立实际需要用到的寄存器通道不要图省事把所有寄存器都加进来。另外一个实用技巧是把采集周期适当调小比如默认的1000毫秒改成500毫秒能明显提升刷新速度但也要注意给通信留出余量设得太快对质量差的线缆反而是负担。2. 动手前的准备接线、驱动和串口调试助手2.1 硬件接线里最常见的三个坑串口通信调试不顺利很多时候问题根本不在软件而在接线。先说说RS232触摸屏的RS232接口用的是TXD、RXD、GND三根线和外部设备连接时TXD要接对方的RXDRXD接对方的TXD也就是信号交叉连接。很多人第一次接线会做成直连结果就是双方都在同一个针脚上发信号自然谁也收不到谁。RS485是另一种常见的现场总线形态两根线分别是A和B接法上A对A、B对B看起来比RS232简单但A/B反接的问题在实际现场非常常见。接反之后的表现通常是通信时好时坏或者完全不通用万用表量一下线序就能确认。还有一个容易忽略的点是屏蔽层的接地对于距离比较长的RS485线路屏蔽层应该选择单端接地两端都接地反而容易形成地环路引入干扰导致通信异常。2.2 USB转串口驱动是调试的第一步用电脑调试串口通信前首先要确保驱动装好。市面上最常见的USB转串口芯片是CH340、FTDI FT232、CP2102和CH341各家驱动不通用。我把USB转串口模块插到电脑后先去设备管理器里看端口COM口有没有正确识别如果出现黄色感叹号多半是驱动没装对。一个容易被忽略的细节是CH340这类芯片的驱动版本太旧时在Win10、Win11系统上可能出现识别不稳定或者打开串口失败的怪毛病。建议直接去芯片原厂官网下载最新驱动不要随便用一个万能驱动工具。装好驱动后记住设备管理器里显示的COM口号比如COM3后面所有串口助手和Mcgs配置里都要填这个号。另外不少现场工程师会把USB转RS232线和USB转TTL模块混为一谈。触摸屏自带的串口如果是RS232电平直接用USB转RS232线就行如果是TTL电平的调试口就要用USB转TTL模块电平不一致会导致通信完全不通甚至可能烧坏接口芯片。2.3 为什么我建议先在电脑上装一个串口调试助手串口调试助手在Mcgs串口收发调试里扮演的角色相当于万用表之于电路维修。Mcgs的触摸屏一侧没有直观的抓包工具你很难直接看到它到底发了什么、收到了什么。串口调试助手可以把串口上的数据原样显示出来既能模拟从站设备主动返回数据也能监听通信过程。实际调试中我最常用的两种方式分别是一用虚拟串口软件在电脑上生成一对互相连通的串口让Mcgs运行在电脑模拟环境下使用其中一个调试助手使用另一个这样就能在不接任何硬件的情况下验证Mcgs的收码逻辑是否正常二在硬件现场用USB转串口线把触摸屏的发送数据引到电脑上监听判断触摸屏是否按照预期发出了请求帧。调试助手的选择上SSCOM和XCOM都是我用着比较顺手的界面简单支持自定义发送和定时发送把仪表的数据帧格式填进去就能模拟从站响应。3. 串口参数配置不是填完就完事的五个参数3.1 五个参数必须和设备端完全一致串口通信里波特率、数据位、校验位、停止位和流控这五个参数是通信双方能不能听懂彼此的前提。Mcgs父设备的串口参数设置窗口里这几个项都会列出来每一项都必须和外部设备的实际设置保持一致否则就会出现乱码、通信超时或者完全无响应。这里有一个最常见的认知误区觉得波特率只要大约差不多就行。实际上串口通信没有大约这回事9600就是960019200就是19200双方的时钟必须严格一致。收发双方波特率不一致时接收方采样的点会逐渐偏离数据位的中心导致一连串的字节错误表现出来就是乱码。数据位一般是8位也有老设备用7位停止位一般是1位也有用2位的流控建议直接关闭工业现场里硬件流控用得很少配置不当反而会卡住通信。3.2 校验位选错是乱码最隐蔽的原因如果把这五个参数按坑人程度排个名校验位绝对排第一。因为校验位错误造成的现象非常具有迷惑性数据好像通了设备也有响应但读回来的数值偶尔对、偶尔错甚至屏幕上显示一堆毫无规律的乱码。这种通了又没完全通的状态让很多人误以为是干扰问题换线、加磁环、调接地折腾一圈下来毫无进展。校验位的工作原理很简单就是在数据位后面附加一个额外的位用来做奇偶校验检查。如果设备端配置的是无校验None而Mcgs这边选了Even或者Odd那么发送方的校验位会被接收方当成数据的一部分来解析整个字节的位序就全乱了。我在项目里吃过几次亏之后养成了一个习惯配置完参数后第一时间去设备手册里核对原始说明书上的通信参数表格而不是凭印象填。尤其是现场接手别人做了一半的工程先把双方的参数截图对比一遍再动手。调试助手验证阶段也可以通过一个简单方法快速判断校验位是否一致用串口助手按当前参数发送一个十六进制字节比如AA观察接收方能否按原样收到。能收到说明参数一致收不到或者变字节数优先怀疑校验位和数据位设置。3.3 Mcgs里具体去哪里填这些参数Mcgs组态环境下的入口并不难找在设备窗口里双击通用串口父设备构件弹出属性设置对话框其中就有COM口、波特率、数据位、校验位、停止位几个下拉框。这里要注意如果工程里没有添加通用串口父设备直接挂子设备会报错因为子设备必须挂在父设备下面才能工作。子设备里也有自己的参数区域主要是从站地址、协议类型、超时时间和采集周期。从站地址必须和实际设备上拨码设定的站号一致我见过一个项目设备站号拨的是3子设备配置里却填了1结果Modbus RTU通信永远超时。超时时间默认值通常是100毫秒到500毫秒之间如果设备响应速度慢可以适当调大否则可能频繁报错。4. 从设备窗口到画面显示一次串口收发通信的完整组态过程4.1 新建工程并添加串口设备构件第一步是在Mcgs组态环境里新建工程进入设备窗口。在设备工具箱里找到通用串口父设备双击或拖拽添加到设备窗口中然后再找到对应的子设备构件添加在父设备下面。如果工具箱里没找到想要的子设备可以通过设备管理功能从设备驱动列表中选装Mcgs自带的驱动库覆盖了常见的PLC、仪表和Modbus协议设备。添加完成后重点配置对象就两个父设备的串口参数和子设备的通信参数。父设备里要确认串口编号和触摸屏实际使用的串口对应比如触摸屏本身有COM1和COM2两个口你要确认接线用的是哪一个。子设备里要填从站地址、协议类型等。配置到这里Mcgs和外部设备之间的通信通道在软件层面就算建立了。4.2 建立变量并完成通道连接通道连接的步骤是在子设备构件的通道列表里根据设备手册添加需要访问的寄存器通道然后在实时数据库里建立对应的数据变量最后把通道和变量一一关联起来。举个例子如果仪表把当前温度放在Modbus保持寄存器40001那就添加一个4x00001通道在实时数据库里建一个名为温度PV的数值型变量再将这个通道的读写属性设置为只读连接到温度PV变量。这里有一个Delphi/C语言背景的人比较容易理解的说法变量是内存地址通道是设备寄存器的映像连接就是把两者绑定在一起。绑定完成后Mcgs每次采集到的新值会自动写入这个变量用户窗口里的显示控件只要关联这个变量数据就会实时刷新。对于需要下发的数据比如设置目标温度可以再建一个可读写的通道把画面上的输入框关联到对应的写变量运行时修改输入框的值就能触发写入。4.3 画面组态让数据可见、可操作用户窗口里的操作相对直观从工具箱拖一个标签或数据显示控件到画面上双击打开属性对话框在输入输出连接里关联刚建好的温度变量运行时这个控件就会显示串口读回来的实时值。如果想让温度值后面带单位可以再叠加一个静态标签写上℃。对于调节参数用一个输入框控件关联写变量操作员就能在触摸屏上直接改目标值。动画效果也可以简单做一下比如热词里提到的风扇旋转动画。这不复杂准备一组角度不同的风扇叶片图片或者用旋转动画功能绑定一个速度变量运行时通过变量值驱动图片切换或旋转角度。动画连接和串口通信关联起来后电机的实际转速通过串口读回来画面上的风扇动画就能实时反映现场状态。这类动效虽然不是功能必须但在做整套设备监控画面时很提升交互感和专业度。4.4 用脚本策略实现主动读写下发设备构件自带的周期性采集能覆盖大多数数据读取场景但有些项目需要在特定时间主动写值或者批量处理数据这时候就要用到运行策略了。在运行策略里新增一个循环脚本或者直接在按钮的脚本属性里写代码通过给变量赋值来触发写操作。比如要把50这个数值写到设备的保持寄存器40002只需要在脚本里把关联变量赋值为50Mcgs检测到变量变化后就会自动通过串口下发写命令。脚本编写上Mcgs的语法接近Basic上手门槛不高。我常做的一个小技巧是在处理报警确认时用一个脚本把确认状态变量先置1延时几百毫秒后再置0以匹配外部设备的脉冲触发要求。注意脚本策略的循环周期不要太短否则频繁的写操作会占用太多串口通信时间。通过这种方式串口数据收发就不只是单向显示而是真正实现了双向交互控制。5. 用串口调试助手模拟设备把Mcgs收发改到明处5.1 先在电脑上搭一套虚拟串口环境没有硬件在手边时我通常会借助虚拟串口软件比如VSPD这类工具在电脑上虚拟出一对互联的串口例如COM5和COM6。这对虚拟串口的特点是一端写入数据另一端就能读到。然后让Mcgs的工程以模拟方式运行串口通信参数指向COM5同时打开串口调试助手占用COM6。这样搭建的好处是触摸屏程序的串口收发逻辑可以在没有硬件的情况下完整跑起来。你可以在调试助手里手动输入Modbus请求帧来模拟从站设备的响应或者观察Mcgs通过COM5发出来的读请求帧。把整个通信过程放到电脑桌面上来调试比在触摸屏和仪表之间反复插拔线缆要高效得多。5.2 用Modbus协议帧模拟设备的返回数据如果子设备配置的是标准Modbus RTU那么通信帧格式是有固定规范的。Mcgs作为主站会发送读保持寄存器的请求帧比如请求地址01的设备读取起始地址0000、数量0001的帧是01 03 00 00 00 01 84 0A。调试助手里收到这个请求后按Modbus RTU协议回复一帧数据01 03 02 02 1B 39 7F其中02 1B就是寄存器值换算成十进制是539代表温度53.9℃。重点在于验证两件事一是Mcgs确实发出了正确的请求二是它能否正确解析返回的数据并在画面上显示。如果模拟返回帧的校验码CRC写错了Mcgs也会把它当成无效数据。所以在调试助手里模拟回复时CRC计算一定要准确我习惯在图方便时用支持自动CRC计算的串口调试工具或者先把帧放到CRC在线计算器里算好再填进去。这一步走通了基本就能确定Mcgs侧的程序配置没有问题。5.3 判断是触摸屏没发还是设备没回在实际现场调试里通信失败时最大的疑问是到底哪边出了问题。用串口调试助手做一个简单的分断测试就能定位把触摸屏的串口发送线接到USB转串口模块的接收端打开串口助手监听观察是否有数据帧发出。有数据帧说明触摸屏在正常工作问题在设备响应或者接线没有数据帧说明Mcgs参数配置有问题或者串口号选错了。反过来如果想验证外部设备是否有响应可以临时断开触摸屏让串口助手直接和设备通信手动发送请求帧。通常设备手册里都有通信示例帧直接用助手发一次能收到设备的正常响应说明设备和线缆都没问题故障范围就缩小到了Mcgs工程配置。这种分断定位的习惯让我在现场省了大量时间不会漫无目的地反复试。6. 现场高频故障的排查链路乱码、超时、时好时坏6.1 乱码先查参数再查干扰乱码是最常见的现象但也是最容易误判的。我的固定排查顺序是第一步核对波特率和校验位这是乱码的最主要原因把Mcgs父设备参数和设备手册放在一起逐项对照。第二步用串口助手直接监听触摸屏发出的数据帧如果助手里显示的数据就是乱的说明触摸屏一侧的串口参数或者硬件有问题如果助手显示正常而触摸屏画面上显示乱码问题反而在设备返回的数据或者变量解析上。参数确认无误后还有乱码才考虑干扰。工业现场的电机的启停、变频器的开关都会产生电磁干扰串口线过长或者没有用屏蔽线时会把这些干扰引入数据线。处理方式是换用屏蔽双绞线、屏蔽层单端接地、把通信线和动力电缆分开走线。还有一点容易被忽略触摸屏和仪表之间如果电源没有共地RS232通信也可能出现杂乱的乱码把两边GND连起来往往立竿见影。6.2 超时和通信失败从站地址、寄存器、时间参数层层排查通信超时的现象通常是画面上的数据长时间不更新设备构件里还能看到采集报错计数。排查思路按可能性排序先看从站地址是否匹配再看寄存器地址和功能码是否在设备支持的范围内然后看超时时间设置是否太短。Modbus RTU还有一个特性请求帧和响应帧之间的间隔时间是有要求的如果设备处理速度慢而Mcgs设置的超时时间过短设备还没来得及回复就被判定为超时了。处理这种问题时我的经验是把采集周期和超时时间都放宽比如采集周期调到1000毫秒超时时间调到800毫秒看通信能否恢复正常。如果能恢复说明是时间参数的问题依然超时再用串口助手分断排查。另外Modbus设备有些寄存器是只读的如果用写功能码去写只读寄存器设备会返回异常码Mcgs侧也会报错。这时候要仔细核对设备手册里的寄存器属性表确认读写权限设置正确。6.3 时好时坏的隐患接触、电源、总线拓扑时好时坏的通信故障最考验耐心因为不是每次都复现。最常见的元凶是接触不良用了劣质DB9接头或者端子排接线不牢固设备震动之后偶尔接通偶尔断开表现出来就是数据偶尔正常偶尔超时。排查方式是重新压接所有连接点检查端子螺丝是否拧紧。我遇到过一台现场设备问题出在一根杜邦线插了一半没插到底愣是排查了一个下午。电源质量也不可忽视。很多仪表和触摸屏共用开关电源当现场有大功率设备启动时电源电压瞬间跌落串口通信芯片工作异常通信就会出错。可以在通信异常的同时观察触摸屏背光是否闪烁如果电源不稳优先给触摸屏和仪表分别供电或者在电源输出端加大容量电解电容。总线路由方面RS485总线要采用手拉手拓扑避免星型接法终端电阻按照设备手册要求决定是否短接这些细节都会导致通信时好时坏。最后再分享一个我自己的习惯每次做完一个Mcgs串口通信项目我都会把设备的寄存器表、通信参数、接线图以及调试过程中遇到的所有异常现象和解决办法整理成一份简短的说明文档放到项目工程目录下。这样过半年之后设备出问题再回现场不用重新翻手册、重新踩坑照着文档就能快速定位问题。串口数据收发这件事做通了不难难的是把所有可能的坑提前填平让设备在现场稳定地跑下去。本文还有配套的精品资源点击获取
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进