
做设备调试这些年昆仑通态触摸屏是绕不开的一个选择尤其是国产设备项目里几乎每天都在打交道。很多人一上来就找现成驱动Modbus RTU、西门子、三菱都有官方驱动双击设备窗口就能用。但真到现场就会发现总有那么一台变频器或者仪表协议手册写得不清不楚标准驱动根本扒不上数据。这时候昆仑通态的“自由串口通讯”就是救命的东西。这篇文章不打算复读手册就按我自己在项目里踩过的坑把自由口通讯从原理、配置到实际做一个监视变频器输出电压的画面再到把配方数据写给PLC整个流程捋一遍。适合正在玩昆仑通态、被串口通讯折腾得睡不着觉的电气工程师和调试人员。1. 先搞清楚自由口通讯到底是什么1.1 自由口通讯和标准Modbus的本质区别标准的Modbus RTU协议规定了帧头、功能码、寄存器地址、数据长度、CRC校验触摸屏厂家已经把它封装成现成驱动你只要填站号、寄存器地址、数据类型数据就能读上来。自由口通讯则完全是另一套玩法它不预置任何协议格式你想发什么字节就发什么字节想怎么解析就怎么解析。用一句话概括Modbus驱动是“你到超市买套餐”自由口是“你自己买菜做饭”。为什么现场需要自由口因为现实中总有协议不在标准框架内的设备。我遇到过一台国产仪表它的通讯协议是ASCII码帧头是#命令帧带异或校验返回帧里用逗号分隔数据还遇到过一些老款变频器厂家手册只给了几个常用寄存器具体的速度百分比和输出电压地址必须自己试。这些设备昆仑通态内置驱动里根本没有就算有它的品牌型号地址映射也对不上。自由口通讯的价值就是只要设备底层是串口收发数据不管它是什么私有协议理论上都能通过昆仑通态接进来。1.2 自由口通讯的适用场景和局限从实际项目看自由口通讯最常用的场景有三类非标仪表、传感器比如温控表、流量计、液位计很多走RS485但协议五花八门。厂商私有协议的变频器、伺服驱动器尤其是一些国产中低端变频器Modbus地址定义不公开只给一份私有报文示例。单片机设备、自制控制板比如给老设备做数据采集改造对方只提供串口字节流协议没有现成从上位机解析的工具。但自由口不是万能的。串口带宽有限一般9600波特率下一秒钟也就传几百字节不适合高频大数据交换。另外自由口需要自己处理收发时序、校验、帧同步一次发送之后还要等待响应不能用主站轮询那样“一呼百应”。所以如果设备本身支持标准Modbus我通常还是优先用标准Modbus驱动只有标准驱动接不上、或者需要实现私有功能码的时候才动自由口。1.3 理解昆仑通态的数据流动要从底层理解自由口先得看昆仑通态MCGS的数据流动方式。触摸屏里有变量变量有数值型和字符型设备窗口负责把物理设备的数据映射到变量用户窗口负责显示和操作运行策略则负责定时执行脚本。自由口通讯就是在设备窗口或者运行策略里建立一个“收发字节”的通道。具体来说昆仑通态底层会打开一个串口句柄你可以把一组字节通过串口发出去同时把串口接收缓冲区里的字节读出来。这个过程和Modbus驱动最大的不同是昆仑通态不会替你做“发送请求帧—等待—解析应答帧”这套完整逻辑最多提供一个收/发函数或者一个简单的协议模板。真正怎么组帧、怎么等响应、怎么校验、怎么从返回字节里取数据都要你自己在脚本或者驱动配置里完成。这就像是给了你一把螺丝刀但拧哪颗螺丝、拧多紧得你自己判断。2. 昆仑通态实现自由串口通讯的两种主流方式2.1 方式一设备窗口的自定义协议驱动昆仑通态的不同版本对自由口的支持方式不完全一样。以常见的MCGS嵌入版组态环境为例在设备窗口里添加设备时先加一个“通用串口父设备”然后在父设备的子设备列表里选择类似“自由协议”“自定协议”或者“串口通讯子设备”的驱动。这个驱动的好处是它直接替你管理了串口的打开、关闭和定时收发不需要在循环策略里写代码。配置的时候需要设置几个关键项通讯参数串口号、波特率、数据位、校验位、停止位必须和目标设备一致。刷新周期一般是100ms到1000ms决定了触摸屏多久发起一次通讯。收发报文模板把要发送的帧按字节填写进去支持十六进制输入。变量映射把返回帧中的某一个字节或某一段字节映射到指定的数值变量。这种方式的优点是稳定周期轮询由驱动统一管理不会出现脚本和画面抢系统资源的问题。缺点是不灵活比如要用脚本临时拼一帧特殊指令或者要根据当前数据动态改变发送内容驱动模板就不好处理了。我的经验是如果现场设备只要固定轮询几个数据比如电压、电流、频率、温度优先用驱动模板写起来省事出问题的概率低。2.2 方式二用户窗口脚本加收发达函数当驱动模板搞不定动态组帧时就要用昆仑通态脚本中的串口收发函数了。我实测下来嵌入版里常用的是!SendData和!ReceiveData一个发送一个接收。它们的参数大致是串口号、字节数、数据起始位置。注意不同版本的函数名和参数顺序会有差异写代码前先看帮助文档确认当前版本的语法。一个典型的发送流程是 拼好帧 发送帧 组合好的报文 发送到串口1共10个字节 !SendData(1, 10, 发送帧)接收的时候 从串口1读取最多12个字节存入接收帧变量 接收长度 !ReceiveData(1, 12, 接收帧)这里有一个容易踩坑的地方发送帧和接收帧必须是字符型变量而且要保证字节数正确。如果拼帧时用到Chr(0)也就是发送真正的0x00字节在部分版本里会导致字符串截断后续字节发不出去。解决方法是尽量用ASCII协议、文本协议避免发送大量0x00如果必须用二进制带0x00的帧就得确认你使用的昆仑通态驱动是否支持原始字节发送或者换用设备窗口的自定义驱动。脚本方式的优点是非常灵活可以结合配方、按钮事件、条件判断来动态组帧适合实现私有协议的非周期命令。缺点是需要自己管理收发时序。触摸屏的循环策略一般周期执行比如100ms一次你需要在这100ms里完成发送、等待、接收、解析、赋值。如果设备响应慢就得加“等待计数”状态机不然上一次响应还没回来下一次请求就又发出去了。2.3 选型建议我做自由口项目的习惯是固定轮询数据例如监视运行电压、运行频率、电流、温度优先用设备窗口驱动模板。需要事件触发命令例如配方下发、启动停止设备、参数修改优先用脚本方式。如果设备响应速度很慢或者同一串口上挂了多个协议设备也优先用脚本状态机因为脚本可以精确控制当前在发哪条命令不会和无头苍蝇一样乱发。说白了驱动模板适合“闭着眼睛周期读”脚本方式适合“睁开眼睛看时机”。3. 实战用自由口做一个监视变频器输出电压的画面3.1 拿到设备协议先做链路验证这里我用一台现场遇到的麦矽变频器来举例。这台变频器本身支持Modbus RTU但它的寄存器地址和标准不完全一样而且它有一个频率派生参数需要通过私有报文读取。我们正好用自由口把报文整包发送然后解析返回数据。调试前先说硬件接线昆仑通态触摸屏COM口如果是RS485A端接变频器的A或B端接变频器的B或-屏蔽层单端接地。千万注意AB不要接反。很多第一次做通讯的人接线正确但就是不通最后发现是设备两端的地电位差或者屏蔽层没接。然后不要直接在触摸屏上开搞先把触摸屏的串口通过USB转485线连到电脑用串口调试助手模拟触摸屏向变频器发指令。比如读输出电压的请求帧功能区字节内容说明帧头68固定帧头功能码04读寄存器寄存器地址高00电压寄存器地址高位寄存器地址低02电压寄存器地址低位数据长度高00读1个字数据长度低01读1个字校验异或前面所有字节异或结果在串口助手里发送68 04 00 02 00 01 6F看看能不能收到返回帧。麦矽的返回帧大概长这样68 04 02 0D AC 6D其中0D AC就是输出电压原始值转换成十进制是3500除以100就是35.00V。这一步一定要在电脑上先验证既验证协议格式也验证接线。如果电脑上收到的报文都不对那说明是变频器参数或者接线问题先解决掉再碰触摸屏。3.2 在触摸屏上建立变量和画面昆仑通态工程里先建变量变量名类型作用变频器通讯正常数值型1表示通讯正常0表示通讯中断输出电压原始值数值型帧解析出来的原始值输出电压数值型除以系数的实际电压运行频率数值型另一个寄存器的解析结果发送帧字符型待发送的报文字符串接收帧字符型接收到的报文字符串新建用户窗口放两个数值显示框和一个状态指示灯。数值显示框关联“输出电压”和“运行频率”状态指示灯关联“变频器通讯正常”。画面本身没什么难度昆仑通态的画图逻辑和大多数组态软件一样调好几何位置、颜色、动画连接就行。真正难的是让数值从报文里“跑”出来。3.3 组帧、发送、接收、解析脚本我最终采用的是脚本方式因为这台变频器还需要读两个不同的寄存器并且会根据运行状态切换请求。脚本写在运行策略的循环策略里循环周期设置200ms这样一帧请求可以等待200ms的响应时间。循环策略脚本的核心逻辑是 组合读输出电压报文 68 04 00 02 00 01 校验 校验值 H68 Xor H04 Xor H00 Xor H02 Xor H00 Xor H01 发送帧 Chr(H68) Chr(H04) Chr(H00) Chr(H02) Chr(H00) Chr(H01) Chr(校验值) !SendData(1, 7, 发送帧) 延时等待响应留100ms给变频器执行 !Delay(100) 接收返回帧 接收长度 !ReceiveData(1, 9, 接收帧) If 接收长度 7 Then 返回帧的第三个字节是数据高字节第四字节是数据低字节 输出电压原始值 Asc(Mid(接收帧, 3, 1)) * 256 Asc(Mid(接收帧, 4, 1)) 输出电压 输出电压原始值 / 10.0 变频器通讯正常 1 Else 变频器通讯正常 0 EndIf这里有几个细节要注意一是Chr(H68)这种写法在昆仑通态脚本里是可以用十六进制数表示的H68等于104Chr函数会把104转换成ASCII字符。二是Mid(接收帧, 3, 1)取出来的是一个字符Asc再把它转换成ASCII码这样就能拿到字节值。三是异或校验我这里用的是固定字面量求异或因为这一帧数据是固定的完全可以预先算好一个常量填进去省得每次运行时计算。如果后续要改寄存器地址那就需要把异或校验这段改成循环计算。四是最容易被忽略的!Delay(100)这个延时函数在部分昆仑通态版本中可能叫!Sleep或者建议改成循环周期状态机。因为循环策略是周期执行的如果在一次执行里直接延时会影响画面刷新和触摸响应。更稳妥的做法是设一个“发送标志位”第一次循环发送请求第二次循环检查并接收第三次循环再发送下一帧。简单来说就是“发一帧等一拍读一帧”而不是在同一个循环里又等又读。我实际项目里遇到响应较慢的变频器通常把循环周期设为300ms发送请求和接收解析分开在两个周期完成这样触摸屏的UI操作不会卡顿。3.4 电压画面就这样调通了把工程下载到触摸屏连上变频器通电运行后画面里的输出电压显示35.00V频率显示50.00Hz状态指示灯变绿。如果数值不动优先用串口调试助手确认报文是否正常。如果串口助手能读到数据而屏上数据不动再检查串口参数和变量连接通常都是变量通道地址写错或者波特率不一致。这台设备用同样的方式还能监视电流、母线电压、累计运行时间只要把寄存器地址替换掉再把返回字节的解析位置改一下一张画面上同时显示所有运行参数。这样你就可以在触摸屏上做一个简洁的“变频器监视页面”当作设备的仪表盘用。4. 配方数据怎么给到PLC4.1 配方数据下发的常规思路昆仑通态触摸屏本身内置配方功能可以在组态环境里定义配方集配方集包含若干变量比如一组速度值、一组温度设定值、一组时间参数。运行的时候操作员在配方窗口选择配方号触摸屏会把配方数据临时存放到组态环境定义的“配方缓冲区”变量里。这时候要把数据给到PLC首先要看触摸屏和PLC之间的通讯方式。如果PLC支持标准Modbus最省事的办法是直接用昆仑通态内置的Modbus驱动把配方缓冲区变量映射到PLC保持寄存器地址配方数据选择了就直接能写进去。操作员点一下“写入PLC”按钮脚本里做一次赋值设备窗口的Modbus驱动会自动把变量变更传给PLC。但如果是自由口通讯场景比如PLC是一块单片机控制板或者用的老式PLC只支持自定义串口协议那就得自己拼frame把配方数据按照PLC的协议格式发给它。这个场景在设备改造里特别多因为触摸屏和PLC可能是不同厂家的产品都没有互相匹配的驱动而PLC侧的程序又不能改只留了一个RS485自定义协议口。4.2 自由口下发配方的实操步骤这里我举个例子假设PLC协议要求接收一帧“写配方”命令格式是字节位置内容说明1帧头0x7E2站号0x013功能码0x06 表示写配方4-5配方号高字节、低字节6-7参数个数N高字节、低字节8开始数据区每个参数两个字节高低字节排列最后1字节异或校验前面所有字节的异或在昆仑通态用户窗口上放一个“配方号”输入框、一个“参数1”“参数2”输入框还有一个“下发配方”按钮。按钮的脚本这样写 配方号赋给变量 配方号 数值输入框的值 参数1、参数2的值从画面变量取 参数1值 配方参数1 参数2值 配方参数2 拼接帧每个数值拆成高字节和低字节 高字节1 Int(参数1值 / 256) And HFF 低字节1 参数1值 Mod 256 高字节2 Int(参数2值 / 256) And HFF 低字节2 参数2值 Mod 256 计算异或校验先算出除了校验位之前的全部 校验值 H7E Xor H01 Xor H06 Xor 高字节1 Xor 低字节1 Xor 高字节2 Xor 低字节2 组帧发送 发送帧 Chr(H7E) Chr(H01) Chr(H06) Chr(高字节1) Chr(低字节1) Chr(高字节2) Chr(低字节2) Chr(校验值) !SendData(1, 9, 发送帧)这些代码在昆仑通态里很容易写成注意变量类型。画面里的“数值输入框”默认是数值型脚本里可以直接引用。Int(参数1值 / 256)得到的是商的整数部分再用And HFF把超过255的高位截掉防止溢出。Mod 256取余数得到低字节。最终发送9个字节和协议一致。4.3 配方下发的易错点我见过很多人在这一步栽跟头主要集中在几个地方一是高低字节顺序不同PLC定义不一样有的是低字节在前高字节在后组帧前一定看清楚协议手册。二是校验算法有的协议用累加和有的用异或有的用CRC16如果校验不对PLC会直接丢弃帧画面看着数据发完了实际没生效。三是在一个按钮脚本里如果既拼帧又发送又清标志可能会因为脚本太长导致发送动作延迟建议把组帧逻辑放在独立策略里按钮只负责置一个“允许发送”标志。另外还有一个实用技巧配方数据在触摸屏掉电后不会丢失但PLC侧可能因为通讯延迟没来得及收到完整帧。可以在按钮按下后加一个“等待确认”的变量让PLC发送收到确认帧后再提示操作员“下发成功”。如果PLC协议设计时没有确认帧就在脚本里延迟200ms后再次检查PLC侧读取回来的值是否等于配方设定值用回读校验来判断是否真正写入成功。5. 常见问题与排查技巧实录5.1 串口通讯不上先别急着怀疑触摸屏这是自由口调试里最高频的问题。通讯不上时我一般按这个顺序排查先检查触摸屏串口的参数是否和目标设备完全一致包括波特率、数据位、校验位、停止位一个都不能差。然后检查通讯协议中的站号很多设备默认站号是1但触摸屏里可能配置成0导致设备不响应。还要检查发送帧长度是否正确比如我要求发送7个字节实际脚本里拼出来只有6个变频器自然没反应。如果这些都没问题再用电脑串口助手直接连接触摸屏的串口在触摸屏上手动触发一次发送看串口助手能不能收到触摸屏发出来的原始报文。能收到说明触摸屏硬件和发送链路都通问题在设备端收不到说明触摸屏脚本或驱动配置有问题。这种二分法能迅速缩小问题范围避免在一条线上反复试。5.2 数据刷新慢或者不刷新自由口通讯经常会遇到“第一次能显示数据第二次就不动”的现象。这通常是因为接收缓冲区没有清空或者上一帧数据还没被读取完下一帧请求就发出去了。在昆仑通态里每次读取接收帧后建议主动给接收长度变量赋0并且延时一个循环周期再发下一帧。还有一种情况是设备响应时间不稳定有的设备在收到请求后要几十毫秒才返回但触摸屏一会儿快一会儿慢。解决方法是把请求发送和响应读取改成两个状态发送状态、等待状态、读取状态。用计数器变量记录状态每次循环只执行一个状态。这样时序就完全握在自己手里了不会因为设备偶尔延迟导致通讯假死。5.3 配方数据明明发出去了PLC不执行这种情况多半是校验错误或者帧长度不对。我在调试中习惯在触摸屏上临时加一个“显示发送帧”的文本框把发送帧按Hex显示出来和协议手册逐个字节对照。对照就会发现比如某个字节的Chr(H00)实际发出去后显示成了空字符导致后面所有字节整体前移PLC自然看不懂。如果遇到必须发送0x00的情况建议改用设备窗口的自定义驱动模板避免脚本字符串处理二进制数据时的兼容性问题。5.4 屏保画面设置和软件安装的补充再回答两个很多人问过的周边问题。关于昆仑通态屏保画面设置其实很简单在用户窗口那一栏新建一个“屏保窗口”然后在运行策略里建一个“循环策略”脚本定时判断当前时间和最后一次触摸操作时间差超过设定值就切换到屏保窗口。具体的时间差可以用系统变量!Time来记录一旦检测到有触摸事件就把标志清零否则累加超过比如5分钟就执行窗口切换。这个方法在嵌入版和网络版都适用。关于昆仑通态编程软件安装包建议直接去昆仑通态官网下载对应型号的组态软件注意区分嵌入版和网络版因为它们的工程文件格式不同不能混用。安装时最好关闭杀毒软件有些版本有驱动组件会被误报装完再恢复。软件本身不用太高配置Win7/Win10都可以关键是选择与触摸屏固件版本匹配的版本老屏幕用新软件有时会出现下装失败。5.5 常见问题快速对照表现象可能原因排查方向完全收不到数据接线A/B接反串口参数不一致站号错误电脑串口助手直接测试链路数据偶尔刷新偶尔停滞没有清接收缓冲区请求发送太快增加状态机发送和读取分开循环数值不对偏差很大字节高低位顺序反了返回帧解析位置不对对照协议手册核对取字节的下标脚本能发设备无动作校验错误帧长度错误0x00被截断在画面上显示发送帧Hex逐字节核对下载工程后触摸屏黑屏版本不匹配组态软件和被触摸屏固件不一致换对应版本软件重做工程下装最后再说两句自由口通讯说穿了就是一条“裸串口”昆仑通态只是提供了收发字节的通道真正难的是你理解设备协议再把协议翻译成脚本或者驱动配置。我个人的调试习惯是所有自由口项目先在电脑上用串口助手把报文和返回数据全部验证一遍再去做触摸屏工程。这样做能省掉至少一半的现场调试时间。另一个经验是把发送帧和接收帧用文本显示框临时放在画面上通讯调稳后再隐藏看起来别扭但排查问题的时候非常直观。自由口通讯做多了就会发现它并没有想象中那么神秘只要你掌握了组帧、发送、接收、解析这四个步骤大部分串口设备都能“收编”到昆仑通态里。