拓冰建站拓冰建站
首页 / 资讯中心 / 正文

MCGS组态脚本函数实战:从语法到工程应用全解析

简介面向工业自动化组态开发与维护人员的 MCGS 组态脚本函数参考手册系统讲解 MCGS 组态软件中脚本函数的用法内容聚焦数学函数分支覆盖三角、指数、对数、平方、绝对值、符号判断及按位运算等常用运算可直接用于复杂控制逻辑的编写与调试。整个压缩包仅含 1 个 PDF 文件大小 68KB便于快速下载和查阅。资料目前已有 809 人学习下载适合作为组态脚本入门和日常查漏补缺的实用手册。文档按章编排第一章对 Atn、Arcsin、Arccos、Cos、Sin、Tan、Exp、Log、Sqr、Abs、Sgn、BitAnd 等函数逐个给出功能说明、返回值类型及典型场景如三角形边长角度计算、指数增长过程、掩码与标志位处理等读者可对照示例快速理解参数含义和调用方式提升 MCGS 组态脚本的编写与排错效率。 去年给一个污水处理站做远程监控改造半夜被值班班长一个电话叫醒说上位机画面里的液位数据和现场仪表对不上。连夜查了半天最后发现是一段数据转换脚本少了工程量换算——采集回来的字符型数据没处理就直接显示了。那一刻我特别想感慨MCGS组态里真正拉开项目水平差距的往往不是画面画得多漂亮而是脚本函数的用法到不到位。这篇内容就围绕MCGS组态中的脚本函数来聊。不管你是做PLC配套上位机、设备运维监控还是水处理、产线自动化只要你用MCGS做HMI开发脚本函数基本上是绕不开的。它能帮你处理复杂的逻辑判断、数据格式转换、设备通信、报表统计等工作让你从“会画画面”升级到“真正会写工程”。下文会从基础语法、常用函数、实战案例到排错技巧把脚本函数这块讲透。1. 别绕开脚本MCGS组态里脚本函数到底能干什么1.1 脚本在组态项目中的定位MCGS这类组态软件核心能力是画面可视化、数据采集、报警记录、历史曲线。这些功能大部分可以通过“配置”来完成比如拖一个仪表盘控件、绑定一个数据对象、设置一下报警上下限画面就能跑起来。但是实际工程项目里总有一些需求是纯配置搞不定的。举个例子客户要求把设备运行时间和当班产量拼成一条字符串存到Excel报表里又比如现场有两台水泵要求故障自动切换、每周自动轮换再比如仪表通讯回来的是一串十六进制字符要转换成带两位小数的工程量数值。这些逻辑靠鼠标点配置是点不出来的只能在运行策略里写脚本。打个比方画面配置相当于装修好的毛坯房看着挺完整但水电线路、管道布置这些真正决定好不好用的部分就是脚本干的活。组态软件给了一套可视化开发工具脚本函数才是你在这个平台上表达复杂逻辑的底层语言。1.2 什么场景必须用脚本结合我做过的项目下面这些场景属于“不写脚本根本做不了”的典型数据处理与换算通讯回传的数据是十六进制或字符串需要转换、拼接、单位换算后才能用于显示和存储。多设备联动逻辑多泵轮换、互锁、备自投、故障自动切换这些逻辑如果放在PLC里当然也可以但有些老设备PLC程序不好动或者没有PLC全靠组态脚本来做。报表与数据归档定时把产量、能耗、报警次数等数据统计出来按班次生成文本或写入数据库。界面交互与权限控制不同用户登录后显示不同画面、不同操作权限甚至根据工况自动切换窗口。通信扩展MCGS连接第三方设备或自定义协议时脚本可以作为中间层做数据转发和协议解析。所以判断一个项目要不要写脚本你就看需求和配置之间有没有“缝隙”有缝隙就需要脚本把它填上。2. 打好基础脚本语法、变量与触发方式2.1 软件版本与脚本环境现在市面上的MCGS产品线主要是MCGS通用版嵌入版和MCGSPro两个大类。通用版的历史比较长很多老工程师用的都是TTC组态环境Pro版是新一代平台界面更现代脚本编辑器也更好用支持了更多函数。不同版本的函数名和语法有细微差异但核心的Basic风格语法是一致的——赋值用等号语句用IF/THEN/ENDIF结构注释用单引号。我下面讲的以通用逻辑为基准具体到你的版本建议打开软件按F1查一下帮助文档里的函数列表这是最权威的参考。脚本在哪里写一般在“运行策略”里。MCGS的运行策略包括启动策略、循环策略、事件策略、热键策略、退出策略等。每个策略里可以新建策略行然后进入脚本编辑环境写代码。此外用户窗口本身也有事件脚本比如窗口启动、窗口关闭、按钮按下时触发这些也是常用的脚本挂载点。2.2 变量定义与数据类型MCGS的变量是在“实时数据库”里预先定义好的这一点和高级语言不一样——你不能在脚本里随手定义一个变量所有用到的变量都要先在实时数据库中登记。变量主要分三种类型开关型布尔值0或1对应按钮、指示灯、状态位。数值型32位浮点数对应液位、温度、频率、累积量等模拟量。字符型字符串对应操作记录、报警信息、通讯原始数据等。脚本里直接写变量名就能访问比如你定义了一个叫“液位”的数值变量脚本里写液位 液位 1就能给它赋值。这种设计的好处是变量和画面控件是打通的你在画面上放一个文本框绑定“液位”脚本里改这个变量画面上的显示值跟着变不需要额外写刷新代码。要注意的是变量名尽量不要用中文和数字开头有些版本的脚本引擎对中文变量名支持得不完美编译能过但运行时会莫名出问题。我习惯用“拼音缩写下划线含义”的方式命名比如YW_SW代表液位上限一眼能看懂。2.3 三种触发方式怎么选脚本写好后什么时候执行是由策略决定的。我常用的触发方式有三种循环策略设定一个循环周期比如100ms、1s脚本按周期反复执行。适合做实时监测、软逻辑控制、数据刷新。事件策略当指定的条件成立时触发一次比如液位超过报警值时执行一段脚本。适合做故障处理、联锁动作。窗口事件窗口启动、窗口关闭、按钮动作时触发。适合做界面初始化和手动操作逻辑。实际项目里循环策略用的最多事件策略适合那种“触发一次就好”的逻辑。这里有个小经验循环周期不要设太短50ms以下对老型号触摸屏负担比较大而且脚本内容复杂的话一个周期跑不完下一次触发又来了会导致界面卡顿。一般模拟量监测100ms起步普通逻辑500ms到1s完全够用。2.4 语法基础速览MCGS脚本的基本语法和VBScript很像核心就是条件判断和循环IF 液位 YW_SW THEN 水泵 1 ELSE 水泵 0 ENDIF循环语句有两种常见写法FOR 循环变量 1 TO 10 累计值 累计值 1 NEXTWHILE 运行标志 1 运行次数 运行次数 1 ENDWHILE补充几点语法规则赋值语句用条件判断用等于、不等于、、、、。字符串拼接用号比如合并结果 设备 运行中。注释用单引号开头写到行尾。不区分大小写但建议统一大写小写风格方便维护。3. 高频函数清单按场景拆解常用脚本函数3.1 字符串处理数据拼接与解析的核心字符串函数在MCGS里用的频率极高尤其是做设备通讯和报表的时候。我整理几个最常用的!StrCat(字符串1, 字符串2)字符串拼接。比如把设备号和状态拼起来。!StrLen(字符串, 结果变量)获取字符串长度。!Mid(字符串, 起始位置, 长度, 结果变量)截取子串通讯报文解析利器。!Trim(字符串变量)去掉字符串首尾空格处理串口通讯数据经常用到。!StrToFloat(字符串, 浮点变量)字符串转浮点数。!FloatToStr(浮点变量, 字符串变量, 格式)浮点数转字符串第二个参数是格式字符串比如%.2f表示保留两位小数。这里特别说一下!FloatToStr格式控制很容易被忽略但实际效果影响很大。做报表的时候默认转换出来可能带一堆尾数比如液位0.69999999显示出来很难看。用%.2f强制保留两位小数画面立刻清爽。3.2 数学运算与进制转换数值处理函数主要用于工程量换算和一些特殊运算!Abs(数值)取绝对值。!Sqr(数值)开平方。!Sin(数值)、!Cos(数值)三角函数角度用弧度。!IntToStr(数值, 字符串变量, 格式)整数转字符串。!StrToInt(字符串, 整数变量)字符串转整型。!BCDToInt(数值)、!IntToBCD(数值)BCD码和整数互转接一些老仪表会用到。!HexToInt(字符串, 整数变量)十六进制字符串转整数。工作里最常用的其实是!StrToFloat和!FloatToStr。比如说某台液位计输出的是4-20mA信号进PLCPLC里面存的是0-1000的数字量上位机显示要按比例换算成0-10米的液位这就是一个简单的线性换算液位显示 采集值 * 10 / 1000。换算逻辑写在循环策略里比在PLC里改程序方便多了尤其适合PLC程序不能轻易动的老现场。3.3 时间与系统控制函数!GetTime(时变量, 分变量, 秒变量)获取当前时间。!GetDate(年变量, 月变量, 日变量)获取当前日期。!TimeGap(时间标记)计算时间差配合定时器用。!MessageBox(提示内容)弹窗提示操作确认很好用。!RunApp(程序路径)启动外部程序比如调用第三方工具。!ChangeWindow(窗口名称)切换用户窗口。时间函数在报表场景里很实用。举个例子班次报表要求每个班次结束自动记录当前产量我就在循环策略里判断当前时间是不是等于某个整点一旦匹配就触发数据保存操作同时用!GetTime把当前时刻写入报表的“时间”字段。这里有个坑!MessageBox不要用在循环策略里否则条件一满足会疯狂弹窗直接把触摸屏弹死机。要做操作提示建议用事件策略配合按钮触发。3.4 设备通信与数据交互MCGS和设备通信通常通过“设备窗口”来配置驱动脚本层面主要负责把数据送到需要的方向。常用的是直接从设备变量读写比如你配置了一个设备通道叫“三号泵电流”脚本里直接访问它就行。还有一些函数用于和设备报文交互比如!ReadData(起始地址, 长度, 数据表变量)和!WriteData这类通讯读写函数具体参数不同版本有差异用之前先查帮助。实际项目中我经常用脚本做通讯数据“中转站”。现场有一台老式流量计只支持串口输出字符串MCGS自带的驱动不支持它的私有协议。我就在设备窗口用“通用串口父设备”把原始数据读到字符变量里再用脚本解析出流量值写到另一个变量中供画面显示。这种思路特别实用等于把MCGS脚本当成了一个软协议解析器能省下不少硬件网关的费用。4. 实战案例三泵排水系统的自动控制脚本4.1 工艺需求与I/O规划去年做一个园区雨水泵站项目现场是三台潜水排污泵要求自动排水、自动轮换、故障自动切换。考虑到老PLC程序是厂家加密的不好改我决定用MCGS脚本把这套逻辑跑起来。工艺流程不复杂集水井液位自动监测。液位低时只运行一台泵液位中时运行两台液位高时三台全开。为了避免同一台泵长期运行每次启动顺序自动轮换。运行中的泵故障跳闸自动补投另外一台。I/O规划上三台泵的运行反馈、故障信号、手自动状态接到PLC的数字量输入MCGS通过Modbus RTU读取。液位通过液位计4-20mA信号接入PLC模拟量通道。MCGS里面定义变量液位实测值、三台泵的运行状态、故障状态、控制命令、启动顺序编号等。4.2 泵的轮换与故障切换脚本三泵轮换是这类的核心逻辑。我的思路是定义一个“启动优先级”变量正常情况永远是优先启动1号泵再启动2号、3号。轮换逻辑在循环策略里每分钟判断一次——假如当前只有1号泵在运行而且运行时间超过2小时就自动切到2号泵同时把优先级编号调整为2号、3号、1号。这样三台泵的磨损比较均衡。核心脚本逻辑如下按MCGS语法编写IF 液位 高液位 THEN IF 启动优先级 1 THEN 1号泵控制 1 2号泵控制 1 3号泵控制 1 ELSEIF 启动优先级 2 THEN 2号泵控制 1 3号泵控制 1 1号泵控制 1 ENDIF ELSEIF 液位 中液位 THEN IF 启动优先级 1 THEN 1号泵控制 1 2号泵控制 1 ELSEIF 启动优先级 2 THEN 2号泵控制 1 3号泵控制 1 ELSE 3号泵控制 1 1号泵控制 1 ENDIF ELSEIF 液位 低液位 THEN 1号泵控制 0 2号泵控制 0 3号泵控制 0 ENDIF故障切换逻辑更直接循环策略里不断检测三台泵的故障信号如果正在运行的泵报了故障立刻启动一台“在优先级顺序上排后面的备用泵”。这里要注意一点必须先停故障泵再启备用泵中间加一个小延时避免两泵同时启停造成管网冲击。延时可以用!Timer或者累加计数实现。4.3 手自动切换与安全联锁现场设备必须留手动操作空间所以我在画面里做了一个“手自动切换”选择开关。切换到手动模式时自动脚本里的控制命令全部不生效操作员可以在画面上直接启停每台泵。切换到自动模式时脚本接管控制。安全联锁上有几条红线是写死的液位低于泵体安装下限时任何情况下都禁止启动泵防止空转烧泵。三台泵不能同时停止运行除非手自动开关在手动位。只要检测到任一泵故障禁止自动启动该泵直到人工复位。手工模式下如果液位超过高高报值脚本仍然强制执行“启动所有泵”的指令防止溢流事故。这个“超驰控制”在大排水项目中很重要宁可设备受损也不能让水漫出来。实际调试时联锁逻辑一定要先做仿真测试再连真实设备不然一个逻辑错误就是烧泵或者淹井的代价。4.4 工程仿真与落地调试这个项目我在电脑上用MCGS仿真环境先跑了一遍。先把液位变量通过数值对象手动给值模拟水位上升下降观察泵的启动顺序和故障切换是否正常。跑了两天仿真没发现问题后才到现场联调。现场联调反而暴露了一个我之前没想到的问题通讯不稳定时MCGS读取的液位值偶尔会跳到大值或者负数泵会瞬间启动或者停止。后来我在脚本里加了防跳变处理——当前采集值和上一次值偏差超过0.5米就认为是异常值不参与逻辑判断。这个滤波逻辑虽然简单但在实际项目里非常管用。5. 常见问题与排查技巧实录5.1 编译报错怎么查脚本写完后点编译报错是常事。最常见的三种错误变量名拼写不一致实时数据库里定义叫1号泵控制脚本里写成了1泵控制肯定报变量未定义。字符串缺引号这个很隐蔽有时候中文输入法下输错了引号符号编译直接报语法错误。IF/ENDIF不配对嵌套IF多了以后容易少写一个ENDIF编译报“缺少ENDIF”错误。排查技巧MCGS的脚本编辑器一般会提示错误所在行双击错误信息可以直接跳到对应代码位置。我的习惯是每写完一个逻辑就编译一次不要攒一整个策略写完再编译那样十几处报错一起出来看都看不过来。5.2 脚本不执行和数据不刷新这是最让新手头疼的问题。明明编译通过了运行起来就是不动作。按照优先级排查四步检查策略是否启用运行策略窗口里策略行的前面有没有打勾没打勾的策略是不执行的。检查循环周期循环周期设成了0可能不执行有些版本默认值需要手动填写。检查条件是否成立在画面上临时加一个文本显示关键变量比如把液位值、比较结果直接显示出来肉眼确认逻辑里的条件到底满足没有。检查策略执行顺序MCGS运行策略执行是有先后顺序的假如两个策略修改了同一个变量后执行的会覆盖先执行的结果。有一次客户让我远程排查说泵不自动启动。我远程一看画面上的液位一直停在0.00不动最后发现是设备驱动在通讯异常后自动掉线了变量值不更新。脚本本身没毛病问题是通讯底层的稳定性。这种情况光盯脚本没有用要先恢复通讯看设备窗口的通讯状态寄存器。5.3 数据乱码和显示异常网上搜MCGS相关热词乱码是个高频问题。我遇到的乱码主要有两种设备通讯原始数据乱码仪表返回的字符串编码不对或者字节顺序解析反了。解决办法是把原始数据先MID截出字节再用HexToInt逐个字节转换别直接把整个字符串当数值处理。画面显示乱码文本控件绑定的字符型变量写入编码不兼容的数据后显示乱码。这种情况把写入字符串的格式统一成UTF-8或者干脆用!Trim清洗后再赋值。另外数值型数据显示出很多小数位或者出现NaN、Inf多半是浮点数运算时除数为0。脚本里做除法之前先判断分母是否为0可以避免这类显示异常。还有一个冷门但是很实用的坑MCGS脚本中字符串比较多时记得给字符型变量预留足够的初始空间。实时数据库里有些版本的字符型变量默认长度不够长字符串一赋值就溢出被截断或者直接变乱码。定义字符变量时把长度设置到64甚至128能省很多事。5.4 手动模式和自动模式打架这个坑我再单独拎出来说。很多项目的自动脚本是循环执行的操作员在画面上点一下手动启动按钮按钮事件里置位了启动命令但下一个循环周期自动脚本又把这个命令清零了造成“按了按钮没反应”。解决方案是加一个“手自动模式”全局变量。循环策略最开头做一个判断IF 手自动切换 0 THEN 自动控制逻辑写这里 ELSE 自动逻辑全部跳过手动命令由按钮事件单独控制 ENDIF这样自动脚本和手动操作形成了互斥不会互相覆盖。做这种逻辑的时候建议把手动模式下的按钮事件脚本和自动循环策略分开写各自维护避免一个脚本文件里堆太多代码后期改起来想骂人。写在最后MCGS脚本函数这块说难其实不难无非是变量、语法加函数调用三件事。真正拉开差距的是对业务逻辑的理解——你写的是泵的轮换就得理解泵运行几分钟切换才合理你写的是数据处理就得理解仪表输出的数据格式和精度。我一直觉得组态脚本是一个“愿意花时间调试就能掌握”的领域。我见过很多工程师不愿意碰脚本遇到需要写逻辑的需求宁可加一种奇怪的中间变量或者绕远路的配置方案。结果代码没写多少反而被配置搞晕了。其实胆子大一点先在仿真环境里瞎写一段试试编译报错了就看帮助文档跑起来了就多看一步多折腾几遍就熟了。对了最后再分享一个小技巧写复杂脚本之前先在纸上把逻辑流程画出来条件分支、循环跳转、状态切换都标清楚。拿三泵排水那个项目来说纸上画清楚之后代码只写了一个小时调试却花了一天半。画图永远比直接敲代码省时间这句话在工控圈永远不会过时。本文还有配套的精品资源点击获取
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门