ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

组态王6.53装卸料小车仿真运行程序设计与实现

组态王6.53装卸料小车仿真运行程序设计与实现 干了几年工控我最大的感受是现场调试最怕遇到流程动作多的设备装卸料小车就是典型。小车要在多个工位之间反复行走、装料、卸料中间还夹着定位、联锁、超时这些逻辑你直接在真机上试错轻则PLC程序反复下载改来改去重则小车冲过限位直接撞上去机械件一坏就是大几千。我手上这套“装卸料小车组态王6.53仿真运行程序”就是在不接实物、不连PLC的条件下用组态王6.53把整套控制逻辑和画面动画全部做出来直接拿电脑模拟运行逻辑验证完了再上真机省心又省钱。这套程序做出来之后除了当调试验证工具平时还能用来给操作员做培训演示让学生或新人在电脑上看到小车一步步自动运行的全过程。它模拟的是一辆小车沿直线轨道往返于4个装料工位和1个卸料工位之间的完整自动循环支持自动和手动两种模式每个动作都有对应的画面反馈。适合自动化专业学生、现场维护人员、做课程设计或毕业设计的同学以及想快速验证控制流程的工程师参考。下面我从工艺设计、变量定义、画面组态到脚本编写的完整过程拆开讲参数和代码都给出来你照着做就能跑起来。1. 先把工艺想清楚装卸料小车在模仿什么1.1 场景设定与工艺流程我做的仿真模型不算复杂但覆盖了现场最常见的动作类型。场景是这样的一条水平轨道在画面上用600像素表现轨道左侧有4个装料工位编号1号到4号轨道右侧末端是一个卸料工位小车初始停在轨道最左侧也就是原位。自动循环的工艺逻辑按照以下顺序执行系统启动后小车先停原位等待自动运行开始小车首先移动到1号装料位到位后停止装料阀门打开装料过程用8秒延时模拟装料完成小车向卸料位移行到位后停止卸料阀门打开卸料过程用5秒延时模拟卸料完成小车依次去2号、3号、4号工位重复第2到第5步四个工位都完成一轮后小车自动从1号工位重新开始下一轮循环同时循环次数加1。如果你在现场接触过多工位小车会发现真实工艺往往比这个复杂比如有的料仓有料位联锁必须满料才往卸料点走有的小车是变频调速带多段速度切换。但作为仿真程序先把基础时序跑通后面再往里加联锁判断其实很轻松无非是多几个条件分支而已。1.2 为什么先做仿真再上真机我主张先仿真后真机理由有三点。第一省调试成本。PLC顺序要是写错了现场小车来回跑几次就可能撞限位、憋电机机械件一坏就得上万元。在组态王里跑仿真逻辑错了顶多画面乱跳一下零成本排查。第二验证工艺合理性。装料8秒到底够不够卸料5秒够不够小车从1号位走到卸料位大概要多久这些时间参数先在仿真里摸个底到了现场设定PLC定时器的时候心里就有数了。第三画面动画先验证。动画连接能不能正确反映位置、按钮能不能触发动作这些不先在仿真里过一遍等真和PLC连上之后再改画面就会非常被动现场所有人都在等你一个人。1.3 控制模型选择状态机比线性流程更清晰很多新手喜欢把动作写成一条直线流程一个步骤接着一个步骤中间用延时一步一步往前推。在小流程里这没问题但装卸料小车有手动/自动切换、有停止复位、有工位循环线性的写法很快变成一团乱麻。我采用的是最简单的状态机模型把控制过程拆成多个离散状态每个扫描周期只根据当前状态执行对应动作再按条件跳转到下一个状态。状态划分如下表状态编号状态含义典型进入条件典型离开条件0空闲/停止系统停止或完成一轮启动信号有效1前往装料位目标工位确定小车到达目标位置2装料中小车到达装料位装料延时结束3前往卸料位装料完成小车到达卸料位置4卸料中小车到达卸料位卸料延时结束状态机的思想说白了就是“当前该干什么就干什么干完就翻到下一页”。这样写代码结构清晰定位问题快手动自动切换只需要在状态判断前面加模式判断非常容易维护。后面的命令语言脚本就是按这套状态编号实现的。2. 组态王6.53环境准备与数据词典设计2.1 版本与运行环境说明组态王6.53虽然已经是多年前的产品但在国内工业现场存量非常大很多老的监控项目至今还在运行。它分为开发系统和运行系统两部分开发系统用来建画面、定义变量、写脚本运行系统用来执行仿真和逻辑。我们这套程序完全在组态王里完成不连接任何真实PLC或板卡所以所有变量都建成内存变量。安装好之后先新建一个工程命名建议用拼音或英文比如“xiec_xiaoche”避免中文路径在运行系统里出现奇怪的读取问题。工程存放路径尽量不要放在C盘根目录我习惯在D盘单独建一个“KingviewProjects”文件夹后面备份工程也方便整个文件夹拷贝走即可不会因为注册表信息丢失导致工程打不开。2.2 数据词典变量设计整套程序的地基组态王的数据词典相当于PLC的变量表和寄存器的大本营。所有画面动画、脚本逻辑都围绕这些变量转变量定义错了后面写多少脚本都是白搭。我用的核心变量如下表变量名类型初始值用途说明小车位置xcwz内存整数0小车当前水平位置0到100驱动动画和位置判断当前状态dqzt内存整数0状态机当前状态编号对应上文状态表目标工位mbfw内存整数1当前要去的工位号1到4卸料时设为5运行标志yxbz内存离散01为自动运行0为停止手动模式sdmk内存离散01为手动模式0为自动模式左移按钮zy内存离散0手动模式下左移按钮触发信号右移按钮yy内存离散0手动模式下右移按钮触发信号装料状态zzbz内存离散01表示正在装料用于画面显示卸料状态xlbz内存离散01表示正在卸料用于画面显示状态计时xtjs内存整数0装料、卸料延时计时循环计数xhjs内存整数0记录已完成的一轮循环次数有两个细节要特别记住。第一小车位置我用了0到100的百分比表示而不是直接填像素值。这么做的原因是把物理逻辑与画面显示解耦以后你把轨道画长画短只需要调整动画连接里对应的移动像素范围脚本逻辑完全不用动。将来接真实PLC时这个变量改成IO变量对应到编码器或变频器的频率值就行。第二按钮类变量用离散型。组态王在按钮“弹起时”执行命令语言里面可以直接给按钮变量置1或复位不需要单独建脉冲变量。当然如果以后程序移植到PLC就得注意PLC里按钮信号通常是脉冲型的这是从仿真到真机的差别之一现在仿真阶段用离散变量先简化处理。2.3 变量命名与工程管理建议数据词典里的变量多了之后最怕命名混乱。我给自己定了几条规矩你可以直接拿去用。变量名前缀区分类型控制类加“ctl_”状态类加“sta_”显示类加“dis_”不过在组态王脚本里写完整路径已经很长中文变量在脚本里敲起来也不如拼音顺手所以我在工程里用的是拼音简写比如“xcwz”代表小车位置、“dqzt”代表当前状态。这只是个人习惯你用有意义的英文缩写也行关键全工程统一。每个变量在定义时把“注释”填写完整组态王的注释会显示在变量列表里顺手填一句话三个月后回头翻工程你会感谢自己当时这个动作。数据词典左侧还可以给变量分组我会分“按钮控制”“状态逻辑”“动画显示”“计时参数”四组查找效率比全部堆一起高很多。3. 画面组态轨道、小车和操作界面怎么搭3.1 画面布局思路画面是整个仿真程序的“脸面”也是动画反馈的核心。我的画面从上到下分四个区域顶部是工艺状态指示行显示“自动运行”“手动模式”“装料中”“卸料中”等文本标签的显隐状态中部是轨道区域画一条带底座的轨道轨道上放小车图元轨道左端依次画4个料仓符号轨道右端画一个卸料斗符号下部是操作区放“自动/手动切换”“启动/停止”“左移”“右移”按钮以及循环次数显示框。组态王6.53的画图工具和普通画图软件差不多直线、矩形、椭圆、文本这些图元完全够用。小车图元我建议用几个矩形拼出来一个扁矩形做底盘一个竖矩形做料斗再画一个小的方形表示料斗里的物料。物料部分做填充颜色连接装料时显示黄色空料时显示白色仿真观感比单纯文字好很多。3.2 小车移动动画连接的关键设置这是画面组态里最关键的一步。选中小车组合图元右键进入“动画连接”找到“水平移动”填参数。我的设置是水平移动对话框里表达式填\\本站点\xcwz最小值为0最大值为100向左移动距离设为0像素向右移动距离设为600像素。也就是说当小车位置变量从0慢慢增加到100画面上的小车图元整体向右平移600像素视觉上就是小车在轨道上从最左跑到了最右。这里有一个容易踩的坑水平移动连接的是图元本身的移动距离不是绝对坐标。如果你画轨道时小车图元没有放在轨道左端起点或者轨道起始位置不在画面最左侧运行时就会发现小车移动的起点偏了。解决办法是画图时先把轨道最左端定好小车图元的初始位置就放在这个起点处再做动画连接。另外一个组合图元做水平移动时要把整个组都选中再进动画连接否则只移动了其中一个矩形。3.3 状态指示灯与文本显隐动画“装料中”“卸料中”“自动运行”这些状态指示我用文本标签加“隐含”连接实现。组态王的动画连接里选“隐含”表达式填\\本站点\zzbz或\\本站点\xlbz显示条件选择“表达式为真时显示”。这样脚本把装料状态变量置1时画面上的“装料中”文本自动显示置0时自动隐藏。如果你想要指示灯效果可以给料斗里的物料矩形做“填充颜色”连接。表达式用装料状态变量真时填充黄色假时填充白色。这两个动画配合起来画面反馈很直观小车到料仓位料斗变黄表示开始装料卸料时料斗变白表示空了。文本标签和颜色变化都不影响脚本逻辑纯粹是给人看的但有了它们仿真运行的过程才真正“看得见”。4. 命令语言脚本把小车的“脑子”写出来4.1 组态王命令语言基础与三条劝告组态王命令语言的语法接近C语言变量赋值要写完整路径比如\\本站点\xcwz 0;判断用if else循环用for while注释支持//和/* */。但有三条劝告必须牢记。第一脚本里不要写死循环。组态王运行系统是事件驱动的如果你在某个命令语言事件里写了无限循环整个界面会直接假死鼠标都动不了只能杀掉进程。所有逻辑循环靠每个执行周期触发一次外部入口来实现不要用for循环做等待。第二时间延时不要依赖Sleep这类函数即使某些版本有类似函数用起来也会阻塞界面响应。正确做法是计时器变量累加配合周期判断。第三变量路径必须写全不要只写变量名。比如写xcwz 0;运行时会提示找不到变量必须写成\\本站点\xcwz 0;。这是组态王新手最容易卡住的地方没有之一。4.2 应用程序命令语言状态机脚本完整框架这套程序的主逻辑放在“应用程序命令语言”里它有启动时、运行时、停止时三个执行时机。我在启动时做变量初始化在运行时做状态机主体。启动时脚本如下\\本站点\xcwz 0; \\本站点\dqzt 0; \\本站点\mbfw 1; \\本站点\yxbz 0; \\本站点\sdmk 0; \\本站点\zzbz 0; \\本站点\xlbz 0; \\本站点\xtjs 0; \\本站点\xhjs 0;运行时脚本是整个状态机的核心按照“先手动后自动、按状态编号分支处理”的思路我给出的核心框架如下。注意语法接近C但这是组态王脚本不能直接拿去C编译器运行。// 手动模式优先 if (\\本站点\sdmk 1) { if (\\本站点\zy 1) { if (\\本站点\xcwz 2) \\本站点\xcwz \\本站点\xcwz - 1; } if (\\本站点\yy 1) { if (\\本站点\xcwz 98) \\本站点\xcwz \\本站点\xcwz 1; } } else if (\\本站点\yxbz 0) { // 自动模式但未启动保持空闲状态 \\本站点\dqzt 0; \\本站点\zzbz 0; \\本站点\xlbz 0; } else if (\\本站点\dqzt 0) { // 空闲状态启动后去1号装料位 \\本站点\dqzt 1; \\本站点\mbfw 1; } else if (\\本站点\dqzt 1) { // 前往目标装料位目标位置 目标工位 x 20 if (\\本站点\xcwz \\本站点\mbfw * 20 - 2) \\本站点\xcwz \\本站点\xcwz 2; else if (\\本站点\xcwz \\本站点\mbfw * 20 2) \\本站点\xcwz \\本站点\xcwz - 2; else { \\本站点\dqzt 2; \\本站点\zzbz 1; \\本站点\xtjs 0; } } else if (\\本站点\dqzt 2) { // 装料延时 \\本站点\xtjs \\本站点\xtjs 1; if (\\本站点\xtjs 80) { \\本站点\zzbz 0; \\本站点\mbfw 5; // 5号代表卸料位 \\本站点\dqzt 3; \\本站点\xtjs 0; } } else if (\\本站点\dqzt 3) { // 前往卸料位卸料位置对应位置值90左右 if (\\本站点\xcwz 88) \\本站点\xcwz \\本站点\xcwz 2; else if (\\本站点\xcwz 92) \\本站点\xcwz \\本站点\xcwz - 2; else { \\本站点\dqzt 4; \\本站点\xlbz 1; \\本站点\xtjs 0; } } else if (\\本站点\dqzt 4) { // 卸料延时 \\本站点\xtjs \\本站点\xtjs 1; if (\\本站点\xtjs 50) { \\本站点\xlbz 0; \\本站点\dqzt 1; if (\\本站点\mbfw 4) \\本站点\mbfw \\本站点\mbfw 1; else { \\本站点\mbfw 1; \\本站点\xhjs \\本站点\xhjs 1; } } }这段逻辑有几个关键点必须展开说。第一工位位置的目标换算。我把整条轨道归一化成0到1004个装料工位分别对应20、40、60、80卸料位对应90。这样脚本里只需要一个mbfw x 20就能算出目标位置非常简洁。以后接真实编码器计数值0到1000四个工位对应200、400、600、800卸料点950改一组数字就行思路完全一致。第二判断到达目标时用了误差带而不是精确相等。因为位置是步进加减的取值是整数如果从某个非整数或不同的步进起点走过去精确等于很可能永远不成立。判断必须写成区间判断xcwz 目标 - 2就继续走xcwz 目标 2就往回走落在误差带里就认为到位。这是所有位移类逻辑的通用经验。第三装料和卸料的延时用xtjs计数。组态王应用程序命令语言的执行周期不是精确的100毫秒具体周期和系统负载有关但大致在几十到一百多毫秒的范围。所以80次计数大约是8秒左右50次大约是5秒左右仿真阶段足够用。如果你想精确计时可以在进入延时状态时记录系统时间再用当前时间做差不过仿真程序没必要这么严苛先跑起来再说。4.3 按钮交互手动、自动、切换与复位按钮的交互逻辑放在各按钮图元的“弹起时”命令语言里。我这里给出一组可以直接使用的核心脚本。启动按钮if (\\本站点\sdmk 1) { // 手动模式下启动按钮无效可配合画面提示文本显示 } else { \\本站点\yxbz 1; \\本站点\dqzt 0; }停止按钮\\本站点\yxbz 0; \\本站点\dqzt 0; \\本站点\zzbz 0; \\本站点\xlbz 0;手动/自动切换按钮if (\\本站点\sdmk 0) { \\本站点\sdmk 1; \\本站点\yxbz 0; } else { \\本站点\sdmk 0; \\本站点\yxbz 0; \\本站点\dqzt 0; }手动左移按钮需要两步配合按钮“按下时”执行\\本站点\zy 1;按钮“弹起时”执行\\本站点\zy 0;。右移按钮同理。因为脚本里手动模式是一直检测按钮变量值的如果按下置1后不释放小车会一直走到撞到画面边界所以弹起后必须复位。模式切换这里我做了互斥处理不管从哪个模式切出来都先把运行标志置0、状态复位。这样做的好处是自动跑到一半切手动时不会出现状态机和按钮操作打架的情况从手动切回自动后等待启动按钮重新触发即可。这个设计看起来简单但能避免很多“车乱跑”的诡异问题。4.4 数据改变命令语言的补充应用组态王还有一种命令语言叫“数据改变命令语言”可以在某个变量值发生变化时触发脚本。我用它做了一件事当小车位置变量变化时自动更新画面上的“当前工位”文本显示。比如if (\\本站点\xcwz 18 \\本站点\xcwz 22) \\本站点\当前工位显示 1; if (\\本站点\xcwz 38 \\本站点\xcwz 42) \\本站点\当前工位显示 2; if (\\本站点\xcwz 58 \\本站点\xcwz 62) \\本站点\当前工位显示 3; if (\\本站点\xcwz 78 \\本站点\xcwz 82) \\本站点\当前工位显示 4;这个功能不是必须的但能让画面信息更丰富。要提醒一点数据改变命令语言触发频繁如果在它的脚本里反过来修改同一个变量就会形成循环触发轻则逻辑错乱重则运行系统卡死。我的经验是数据改变命令语言里只做显示更新和简单判断不在这里做状态机跳转把复杂逻辑留给主状态机。5. 仿真运行与调试实录5.1 启动仿真运行系统的正确姿势画面和脚本都写完以后先别急着点运行。我建议做三件事再启动第一回到数据词典逐个检查脚本中用到的变量是否都存在名字是否完全一致第二保存画面确认画面名称没有特殊字符第三在画面角落临时加几个调试文本框分别连到xcwz、dqzt、mbfw这几个变量。运行时能看到内部状态变化定位问题效率翻倍。然后打开运行系统加载仿真主画面。我第一次跑就踩了个坑画面里小车纹丝不动按钮怎么点都没反应排查后发现运行系统加载的根本不是我做动画的那幅画面。组态王运行系统默认加载的是工程里设为主画面的那幅图必须在工程设置里把仿真主画面设为启动画面或者运行时手动选择加载对应画面。这个不起眼的设置能让第一次运行直接成功。5.2 调试中踩过的三个坑这套程序我前后调了三轮挑几个有代表性的说。第一状态机卡在“前往装料位”不动。原因是目标位置和当前位置的比较用了精确相等但脚本里位置按2步进有些情况初始位置被手动模式改成了非偶数位置永远到不了目标值。改成区间判断加误差带之后彻底解决。以后凡是做位移类判断都用区间判断不要追求精确相等。第二运行系统偶尔假死。排查后发现是脚本里写了一个for循环模拟延时运行系统在这个循环期间完全不响应画面刷新看着就像死机了。换成状态机延时计数器后立即解决。从此我写组态王脚本绝对不用长循环和阻塞等待。第三模式切换时状态错乱。自动运行到一半切手动再切回自动小车位置和目标状态不匹配导致它从错误位置直接跳转到下一个状态。解决办法就是按钮脚本里切换前统一停止并复位让模式切换永远是安全过渡不会出现“跨状态跳变”。5.3 常见问题排查速查表这里整理了一份我实际调试中遇到的高频问题速查表方便你对照排查现象可能原因排查与解决画面小车不动变量名写错或动画连接表达式填错检查动画连接表达式是否带\\本站点\前缀并用调试文本框观察变量值是否变化点按钮没反应按钮没挂命令语言或命令语言内变量未定义检查按钮“弹起时”是否配置先尝试在脚本里加一个简单赋值看变量变化命令语言编译报“未定义变量”变量没有在数据词典中建立回到数据词典确认变量名逐字与脚本一致运行系统加载不出画面主画面设置不对在工程设置中把仿真主画面设为启动画面小车位置跳动不平滑步进值太大或脚本执行周期不稳定把步进值改小或改为百分比逐步累加装料延时不准计数上限与实际执行周期不匹配临时显示计时值实测一个周期耗时再调整上限这些坑基本都是组态王新手高频问题碰到一个记一个后面就越来越顺手。如果运行中还有异常优先看状态机当前状态和坐标位置这两个调试值很多问题一眼就能定位。6. 这套仿真程序还能往哪里扩展6.1 三个实用的扩展方向第一接真实PLC。仿真跑通之后把xcwz、yxbz、dqzt这组变量从内存变量改成IO变量对应到Modbus地址或PLC寄存器画面和逻辑几乎不用改就能直接变成现场上位机监控界面。这是工程里最常用的落地方式仿真验证画面逻辑再无缝切换现场监控。第二加故障模拟模块。在画面上加“传感器故障”“超时报警”开关脚本里一旦这些开关置位状态机进入故障状态并停止动作报警文本闪烁。这个功能对培训操作员特别有用让学员不出门就能见识各种异常工况。第三做参数化配置。把装料延时、卸料延时、行走速度做成画面输入框变量运行时随时修改。我现在做工艺仿真基本都会预留这个接口因为工艺参数在调试阶段几乎一定会反复调整。6.2 关于代码移植到PLC的一点体会最后分享一个我个人的经验。很多朋友觉得组态王脚本和PLC编程是两套完全不同的东西实际上控制思想完全互通。状态机加计时器的组合不仅在组态王脚本里好用用梯形图或ST语言实现时同样成立甚至顺序功能图中的每一步转换条件都可以直接照搬仿真状态表。先把工艺逻辑在仿真里想透后面写PLC程序几乎就是翻译一遍的事。如果你正打算用组态王做类似的动作仿真按这个路子走下去很快就能跑起来而且这套思路会让你在真机调试时少走很多弯路。
返回列表