多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

昆仑通态触摸屏自由口通讯实战:从原理到变频器电压监视

昆仑通态触摸屏自由口通讯实战:从原理到变频器电压监视 做设备改造那阵子现场一台老款变频器要接昆仑通态触摸屏翻了一圈内置驱动列表愣是找不到对应品牌。有人说换PLC有人说换触摸屏最后让我解决的其实是个很多人听过但不敢碰的功能——自由串口通讯。搞工控的不会自由口通讯就像电工不会量电压一样早晚要在某个奇奇怪怪的设备上吃瘪。这篇文章就把我用昆仑通态做自由串口通讯的完整思路、报文设计、组态步骤和调试经验一次说透尤其会完整拆解“监视变频器输出电压”这个最常见的需求让手里只有一台触摸屏和一根串口线的你也能照着做出来。1. 自由串口通讯到底是干嘛的先搞懂原理再动手1.1 什么是自由口通讯和内置驱动通讯有什么区别昆仑通态触摸屏的串口通讯有两种玩法。一种是直接用组态软件内置的驱动程序比如标配的Modbus RTU主站、西门子PPI协议、三菱FX系列编程口协议等。这种玩法比较省心你在设备窗口里把对应的驱动拖进来填好波特率、站号、寄存器地址数据就自动上来了不用管里面的报文长什么样。另一种就是自由串口通讯也叫自由协议、自由口、用户自定义协议。它的逻辑很简单触摸屏不再用内置的协议栈去解释数据而是把串口当成一条透明管道你要发什么字节就发什么字节设备返回什么字节触摸屏就原样收进来。至于这些字节代表什么含义、该按什么顺序组帧、要不要校验完全由你自己在工程里定义。什么时候必须用自由口通讯我遇到过的场景大致有三种。第一种就是文章开头说的设备太冷门或者太老触摸屏驱动列表里根本没这个品牌厂家又只提供了一份通讯协议手册。第二种是设备虽然支持Modbus之类的标准协议但某些特殊功能码、特殊寄存器地址被厂家改了或者触摸屏内置驱动和设备的实现细节对不上比如有的设备要求帧头固定是0xAA、0x55标准Modbus驱动根本不给你这种自定义空间。第三种是用串口对接非工控类设备比如串口扫码枪、电子秤仪表、智能电表甚至某些带串口的传感器这些设备各有各的协议内置驱动全都覆盖不了。还有一种很典型的误用场景值得一提有些人用自由口通讯去读变频器的运行频率、输出电压、电流、母线电压等参数其实这些参数大部分变频器都支持Modbus RTU直接用触摸屏内置的Modbus驱动更省事。只有当设备确实不支持Modbus、或者内置驱动连接有问题的时候自由口通讯才是那个兜底方案。1.2 接线与通讯前的准备工作这一步错了一切白搭自由口通讯的软件部分再炫酷硬件底子不行也是白搭。昆仑通态的触摸屏一般带有COM口常见的有RS232和RS485两种电气接口具体要看触摸屏型号。RS232适合短距离点对点RS485适合长距离或者多站挂接。连接变频器、仪表这类工业设备时绝大多数走的是RS485两线制。接线看着简单坑却不少。RS485通常是A、B两个端子有的设备标D、D-有的标485、485-还有的标DATA、DATA-别管名字怎么变本质就是一对差分信号线。触摸屏这边的A接设备的A或者D触摸屏的B接设备的B或者D-。最忌讳的就是把A、B接反接反了的现象很典型触摸屏发送指令设备没反应或者返回的数据全是乱码。接好线之后有一个很多人忽略的细节——共地。RS485是差分信号理论上抗共模干扰能力很强但如果两端设备的地电位差太大轻则通讯不稳定重则烧毁通讯口。现场实测下来触摸屏和变频器之间如果距离比较远建议在通讯线屏蔽层的一端做单点接地不要两头都接否则会形成地环路。另外如果通讯距离超过几十米或者现场干扰严重最好在总线两端各并一个120欧姆的终端电阻模型思路上和CAN总线差不多就是防止信号反射。硬件准备的最后一步强烈建议先用一个USB转RS485的串口调试助手在电脑上把设备协议摸清楚。你可以用调试助手按协议手册给变频器发一帧查询指令看看设备到底回不回数据、回的数据是什么格式。这一步省掉的调试时间比你在触摸屏上瞎猜一整天管用得多。我基本上每个项目都会做这一步哪怕协议手册写得再详细也不如自己亲眼看一帧返回数据来得踏实。2. 报文设计自由口通讯最核心的一步2.1 设备协议手册应该怎么读抓住这几个关键点自由口通讯不是从组态软件开始的而是从读懂设备的通讯协议手册开始的。拿到一份协议手册不要被满篇的十六进制表格吓到抓住这几个关键点就够了。第一个是通讯参数波特率9600、19200还是115200、数据位7还是8、停止位1还是2、校验位无校验、偶校验还是奇校验。这四个参数触摸屏和设备必须完全一致否则根本没法通讯。注意有些设备手册里写的“8E1”就是8数据位、偶校验、1停止位别理解错了。第二个是帧结构。绝大多数串口设备的报文都长这样帧头可能没有 从站地址 功能码 数据区 校验。帧头有的设备有有的没有有的用固定的0xAA、0x55或者ASCII字符作为起始标志从站地址在多机通讯时用来区分不同设备功能码告诉设备你要干什么比如读状态、读参数、写参数数据区里放具体要读写的寄存器地址、数据长度或者实际数据校验一般放在帧尾。第三个是校验算法。最常见的校验有CRC16、累加和、异或校验这几种。CRC16还有不同的多项式、初始值和字节顺序不能乱套。很多设备手册会给出一个或者几个例帧比如“读取输出电压发送 01 03 20 14 00 01 2F 3B返回 01 03 02 0B B8 13 5C”这种。这种样例帧一定要利用起来它是最好的调试起点——你先在串口助手里发一遍手册的样例帧如果设备返回和手册写的一致说明你的串口工具、接线、参数全对了接下来就可以组合自己的报文了。我之前调试过一台国产变频器它的协议长得和Modbus很像但又不完全一样帧头固定是0xAA、0x55两个字节然后才是地址、功能码、数据校验用累加和的低字节。当时我直接用电脑串口工具把协议梳理清楚然后再到触摸屏里组自由报文整个过程非常顺利。反过来如果你连协议手册都懒得读上来就在触摸屏里瞎写报文通讯不上的时候你根本分不清是软件配置问题还是协议理解问题。2.2 自由报文块怎么规划发送区和接收区的概念在昆仑通态McgsPro组态软件里做自由口通讯核心是“自由报文设备”和“报文块”这两个概念。你可以把报文块理解成一组预定义好的收发缓冲区。每个报文块有发送区和接收区发送区里放的是你组织好的查询帧字节接收区里放的是设备返回的原始数据字节。我一般会这样规划报文块每一条完整的读写指令对应一个报文块。比如要监视变频器输出电压那就建一个“读输出电压”的报文块如果还要监视输出电流再建一个“读输出电流”的报文块。如果设备支持一条指令同时读多个参数那也可以合并成一个报文块一次性把电压、电流、频率全读回来这样效率更高占用也更少。每个报文块需要定义发送长度和接收长度。发送长度就是查询帧的字节数比如上面举例的“01 03 20 14 00 01 2F 3B”就是8个字节接收长度是设备正常返回的帧长度比如“01 03 02 0B B8 13 5C”就是7个字节。这两个长度一定要按协议手册来长度错了触摸屏要么收不全数据要么傻等超时。在具体的McgsPro版本里创建自由报文设备的入口可能在“设备窗口”里的“通用串口父设备”下不同版本菜单叫法略有差别但思路一致。父设备负责配置串口参数子设备负责定义报文块和收发数据。建完报文块之后在设备属性里要把报文块的发送区、接收区和工程变量关联起来这样发送区里放的是变量的值接收区收到的数据也能自动存到变量里画面上的控件直接绑定这些变量就行。2.3 字节顺序、数据类型、倍率转换这些必须注意的细节自由口通讯里最阴人的地方不是收发报文本身而是拿到原始字节之后怎么解释它。第一件要注意的事是字节顺序。工业设备返回的数据有的高字节在前有的低字节在前这个叫大端Big-Endian和小端Little-Endian。举个例子设备返回两个字节 0B B8如果按高字节在前解释这个数的值是0x0BB8也就是3000如果按低字节在前解释那就变成0xB80B完全对不上。很多设备手册里有个表格专门说明数据字节顺序没有的话就两种都试一下哪个数值合理用哪个。第二件是数据类型。两个字节可以解释成无符号整数0~65535也可以解释成有符号整数-32768~32767。有些参数会出现负值比如变频器的反向转矩、某些温度值如果你用无符号去解析本来是个-1显示出来却是65535那就有大问题。第三件是倍率转换。监控变频器输出电压时设备返回的数据通常不是直接的电压值而是带倍率的整数。比如某变频器输出电压的倍率是0.1V设备返回0x0BB8十进制是3000真实电压就是300.0V。这个倍率信息也要从协议手册里查或者通过实测推断出来。我见过最坑的倍率是0.01设备返回30000显示的时候如果不除以100直接显示成30000V那画面看起来就像电压爆炸了一样。字节顺序、数据类型、倍率这三个问题如果没处理对你会在画面上看到一个完全违背物理常识的数值比如输出电压显示成-26000V或者频率显示成65535Hz。遇到这种情况先别急着怀疑硬件按这三个方向排查十有八九能定位到问题。3. 触摸屏组态实操做出变频器输出电压监视画面3.1 新建工程、添加串口父设备和自由报文设备明确了硬件和协议接下来就是实打实的组态操作。这里我用McgsPro组态软件为例不同版本的界面可能会有差异但流程基本一致。第一步新建工程选好触摸屏型号。第二步进入“设备窗口”在设备工具箱里找到“通用串口父设备”双击添加到设备窗口里。双击这个父设备配置串口参数串口号要选触摸屏上实际接线的那一个COM口波特率、数据位、停止位、校验位必须和设备完全一致。比如设备手册写9600、8、1、无校验就照填。第三步在“通用串口父设备”下面添加“自由报文”子设备名字可以改成便于识别的比如“变频器通讯”。进入子设备的属性配置页面找到报文块定义新建一个报文块。假定我们要读变频器输出电压查询帧是8个字节返回帧是7个字节那就把发送长度设为8接收长度设为7。接下来把报文块的发送区和接收区映射到变量上。发送区的8个变量依次对应查询帧的8个字节接收区的7个变量依次对应返回帧的7个字节。这里说一个我习惯的做法把这组变量建成数组比如SendBuf[0]到SendBuf[7]代表发送区RecvBuf[0]到RecvBuf[6]代表接收区。数组变量在脚本里处理起来比单个变量方便很多尤其是涉及循环计算校验的时候。3.2 用循环策略定时发送和接收脚本怎么写自由口通讯的收发不能靠触摸屏自动完成必须用脚本控制。我的做法是在“运行策略”里建一个“循环策略”循环周期设为500毫秒或者1秒具体要看设备响应速度和触摸屏的性能。周期太短设备可能响应不过来周期太长画面上的电压值刷新不够实时看着像卡死了一样。循环策略里放一段收发脚本逻辑分四步组帧、发送、等待、接收解析。先看组帧。假设协议查询帧是“地址01 功能码03 起始寄存器地址0x2014 数据长度0x0001 CRC16校验”那么脚本里要把这些字节填到发送缓冲区数组里。CRC16的计算可以用脚本实现下面是一段在McgsPro环境里常见的脚本思路 计算CRC16返回值为两个字节低位在前、高位在后 Function CRC16(ByRef data, ByVal len) Dim i, j, crc crc HFFFF For i 0 To len - 1 crc crc Xor data(i) For j 0 To 7 If (crc And 1) 0 Then crc (crc \ 2) Xor HA001 Else crc crc \ 2 End If Next Next CRC16 crc End Function这里说一句不同版本的McgsPro脚本语法细节可能略有差别这段代码表达的是算法思路你按自己工程的实际环境微调就行。校验算完之后把CRC低字节放到发送帧的倒数第二位CRC高字节放最后一位。组好帧之后调用发送函数把发送缓冲区发出去。调用方式大致是这样的形式!SendData(自由报文设备名, 报文块号, 发送区起始位置, 发送长度)。以我们的报文块为例!SendData(变频器通讯, 1, 0, 8)。发送完不能立刻读接收区设备响应需要时间。虽然协议手册上会写响应时间但现场实际情况很复杂一般发送后延时50到100毫秒再读取比较稳妥。延时可以用脚本的延时函数实现。延时之后用接收函数把设备返回的数据读回来形式类似!RecvData(变频器通讯, 1, 0, 7)。最后就是解析。读回来的RecvBuf数组里假设返回帧是“01 03 02 0B B8 13 5C”那实际数据就在RecvBuf[3]和RecvBuf[4]这两个字节里。要把两个字节拼成一个16位整数重点看字节顺序。假设设备返回高字节在前那么电压原始值的计算就是 VoltageRaw RecvBuf[3] * 256 RecvBuf[4]。再乘上倍率比如0.1V/位最终显示值 VoltageDisplay VoltageRaw * 0.1。为了让画面更友好我还会在脚本里加一个通讯超时判断。如果发送次数超过几个周期接收区依然没有更新就认为通讯异常把画面上的“通讯状态”变量置为故障同时亮一个红灯提示操作员。这个功能看着不起眼现场用起来帮了大忙——操作员不用看数值只看灯就能判断设备是不是在正常通讯。3.3 画面组态把电压值、状态指示灯、报警全做出来脚本跑通之后画面组态就相对轻松了。新建一个用户窗口取名叫“变频器监视”然后在画面里拖入需要的控件。数值显示控件是必须的关联到我们刚刚解析出来的电压工程值变量。为了显示300.0V这种带小数的格式要把数值显示控件的显示格式设为一位小数并加上单位后缀“V”。有的项目里还要显示电流、频率、母线电压等参数那就用同样的方法建对应的报文块和解析变量画面上放几个数值显示控件排成一行一眼看过去整个设备的运行状态清清楚楚。除了数值显示我还会在画面上放一个“通讯状态”指示灯关联通讯状态变量正常显示绿色异常显示红色。如果项目有需求还可以在报警组态里配置电压超限、通讯中断等报警事件这样电压超过设定值的时候触摸屏会主动弹报警比操作员肉眼盯着数值靠谱得多。画面做好之后不要忘了保存工程并模拟运行一次。昆仑通态的组态软件一般支持模拟运行在电脑上就能看到画面的实际效果。模拟运行只能验证逻辑真正验证通讯还是要下载到触摸屏接上变频器实测。4. 调试排错自由口通讯最容易翻车的几个地方4.1 常见问题速查表先对着表查一遍自由口通讯调试过程中遇到的问题翻来覆去就那几类。我整理了一个比较全的速查表大家可以先对着查一遍比自己瞎猜快得多。现象可能原因排查方向完全没反应触摸屏发送了设备不理接线错误检查A、B有没有接反换一对线试试完全没反应串口参数不一致对比设备手册核对波特率、数据位、停止位、校验位完全没反应发送区报文帧错误先用串口调试助手发样例帧验证设备设备有响应但接收区数据全是0接收函数没调用检查脚本里有没有写!RecvData设备有响应但数据乱码校验位或波特率不对核对串口参数尤其是校验位设备有响应数据偶尔对偶尔错地电位差或干扰检查屏蔽层接地、尝试降低波特率数据能收到但数值完全不合理字节顺序或倍率错误翻协议手册确认大端小端确认倍率数据能收到但刷新很慢循环周期太长缩短循环周期但要留足设备响应时间通讯时好时坏跑一会儿就断缺少终端电阻或线缆过长在总线两端并联120欧姆终端电阻这张表覆盖了我调试过程中遇到过的绝大多数问题。如果查完一遍还没解决就往下看具体的排查实战步骤。4.2 现场排查思路与实测技巧排查自由口通讯问题我有一条铁律先软件后硬件先电脑后触摸屏。很多人在触摸屏上反复改参数改来改去通讯还是不通白白浪费几个小时。正确的做法是先用电脑串口调试助手做验证。第一步把触摸屏的通讯线断开用USB转RS485接到设备上。串口调试助手按协议手册发一帧样例指令看设备返回什么。如果这一步通了说明设备没问题、协议理解没问题、电脑这边的串口参数也没问题。如果这一步都不通那就是接线或者协议理解的问题跟触摸屏一点关系都没有在触摸屏上捣鼓再久也没用。第二步把触摸屏接回去但用调试助手的“监听模式”或者串口抓包工具观察触摸屏和设备的通讯过程。这一步能看到触摸屏实际发出的帧到底是什么和你预期的帧是否一致。很多时候问题出在脚本组帧时字节顺序处理错了或者CRC算错了通过抓包一眼就能看出来。第三步如果通讯能通但不太稳定优先检查布线。我曾经遇到过一台变频器触摸屏放在配电柜里变频器在柜子外面通讯线走线槽和动力电缆并排走了三米结果只要变频器一启动触摸屏上的电压值就开始乱跳。后来把通讯线移开界面立马恢复正常。工业现场的强电干扰是自由口通讯最大的隐形杀手走线尽量避开变频器输出线线缆用屏蔽双绞线单端接好屏蔽地都能有效改善。最后再分享一个调试技巧把接收区的原始字节变量放到画面上用十六进制格式显示出来调试用。这样你能直观看到设备返回的每一帧数据解析逻辑对不对一目了然。等项目交付给用户之前再把调试用的原始数据显示藏起来或者删掉避免误导现场操作员。这个习惯我保持了很长时间帮我减少了很多“背锅”的场面。5. 从自由口通讯延伸出去的实用技巧5.1 配方数据怎么通过自由口下发给PLC热搜词里有句“昆仑通态触摸屏上的配方数据怎么给到PLC”这里顺带讲一下。配方数据下发有两条路如果触摸屏内置了PLC的驱动可以直接用驱动提供的写寄存器函数把配方数据写入PLC的寄存器区如果PLC或者第三方设备的协议很特殊不认标准驱动那就用自由口通讯下发。思路也很简单先把配方中的每一项值转成报文要求的数据格式填到发送缓冲区里然后调用发送函数触发一次写入。比如设备要求用“写寄存器”指令每条指令包含地址、功能码、要写入的数据、校验那就在脚本里把配方值组帧、计算校验、发送。本质上和读取输出电压是同一个套路只是报文内容从“读”变成了“写”。这里要提醒一点下发数据的校验一定要算对尤其是涉及工艺参数改写的场景。写错了轻则设备报警重则设备动作异常可能造成安全隐患。我做过的一个项目里配方下发前会在脚本里加一道“数据回读校验”写完寄存器之后立刻读回来比对两次不一致就报警提示操作员重新下发。这个做法虽然让程序复杂了一点但换来了整个生产线上工艺参数的可靠性非常值得。5.2 屏保画面设置和自由口通讯的共存问题还有人问昆仑通态触摸屏的屏保画面怎么设置。屏保和通讯其实不冲突触摸屏就算进入了屏保状态后台的通讯策略依然会继续运行串口数据照常收发只是画面没有显示而已。这一点很多不熟悉触摸屏机制的工程师会担心我证实过很多次放心设置就行。设置入口一般在系统设置或者用户窗口属性里可以指定屏保等待时间、屏保图片或者动画。现场应用中屏保除了好看更实用的价值是防止长时间静态画面导致的屏幕烧屏尤其是液晶屏长时间停在一个界面多多少少会有残影风险。如果现场操作员会长期看同一个画面建议把屏保等待时间设短一些并选一张带变动的图片或者动画做屏保。需要注意的一点是如果现场要求操作员随时能看到实时数据屏保反而会成为干扰。这种情况下可以设置“任意触碰屏幕立即唤醒”同时把唤醒时间调到比较短保证数据可见性和操作体验的平衡。具体菜单项在不同固件版本里叫法不太一样但基本都在系统设置里翻一翻就能找到。5.3 自由口通讯还能用在哪扫码枪、仪表、智能电表自由口通讯的思路一旦打通你会发现它的应用范围远不止变频器。我后来用同样的方法在昆仑通态触摸屏上对接过串口扫码枪、称重仪表、温控器、智能电表原理都是一样的读协议手册、组好报文、循环收发、解析数据、显示到画面。比如扫码枪很多扫码枪支持串口输出一维码数据触摸屏用自由口接收原始ASCII码字节把字符串解析出来就能做生产追溯记录。又比如称重仪表很多老仪表的协议都是厂家自定义的触摸屏用自由口定时读取当前重量画面上做一个电子秤看板比重新买上位机软件便宜得多。如果你过去一直只用内置驱动没碰过自由口通讯我的建议是拿一台手边的变频器或者仪表练练手。第一次跑通之后你会发现自由口通讯就是一层窗户纸捅破了之后触摸屏就不再只是“能连几个大众品牌PLC的屏幕”而是一个真正意义上的自定义串口上位机往大了说相当于你用触摸屏自己写了一个专用的串口调试软件。这个能力在工控现场的价值做过设备维护的人应该都深有体会。最后再回归到实际操作层面我个人做自由口通讯项目最深的体会是三分软件七分硬件。软件上的组帧、解析、脚本逻辑只要花时间总能调通但硬件上的接线、接地、布线、终端电阻一旦有问题就会让调试陷入泥潭。真正的高手并不是靠多高超的脚本技巧而是懂得先把物理链路搞扎实再让软件在稳定的基础上顺畅运行。希望这篇经验能帮你少走点弯路把昆仑通态的自由口通讯用出花来。
返回列表