看到有网友询问如何让一个圆能够沿着一条斜线运动,最近有点时间就做了一个测试项目,求出斜线的斜率后,使用C脚本对X,Y轴坐标值编程,实现了圆的运动轨迹是沿着斜线进行的,发出来供大家交流参考,当然用VBS也是可以实现的,本文主要使用C脚本来讲述。
先看一下最终的效果动态图吧,如下:
wincc画面运行后录屏动态图
通过此动态图可以看到,圆的运行轨迹总体上是平行于AB点之间的斜线的,因为C脚本的执行周期设定的是250ms,所以监控的时候有点顿,但并不影响使用效果。如果,要实现圆是完全沿着斜线运动,只需将圆的坐标设置成和A点的坐标一致即可,当然C脚本中牵扯到的左边参数需要一同修改。
下面来讲一下具体的制作步骤吧:
①绘制一条斜线,并求出其斜率:
斜线2点在wincc中坐标值
任意绘制一条斜线,如图A B点决定的斜线,选中这条斜线后,会出现8个点框处一个矩形区域,查看斜线的属性,因为这是本画面绘制的第一条线,所以图左上角显示为Line1,在其几何属性中可以看到该矩形区域的信息,也就是这条斜线的信息。因Wincc中的左边是基于运行显示时候距离屏幕左上角的距离来确定其XY坐标的(即画布的左上角坐标是X=0,Y=0),因此我在图片中将属性中的数值在图片中的实际表示做了标注,希望大家能看懂,即最终得出的斜线A点的坐标是A(X1=350,Y1=220),B点的坐标是B(X2=760,Y2=380)。然后根据斜率的计算公式即斜率K=Y2-Y1/X2-X2=160/410,此处无需计算到小数点,因为后续的C脚本中,也是直接引用该分数格式。
②绘制一个圆形,确定其最初坐标值:
圆的初始坐标值
如图,该圆是本画面的第一个圆形,因此画面左上角显示为Circle1。为何我要解释这个Circl1呢?因为如上面的Line1一样,这是对象在这个画面上的对象名(ObjectName),对象名在一个画面上是唯一的,我们对属性做动态编程的时候,必须要确定是对哪个对象的哪条属性做编程。
该圆的初始坐标为(X1=310,Y1=230),这个初始坐标就相当于一个新的斜线的起始点,将来圆需要运动到按照AB斜线一样斜率的新的斜线的某点上,这个新的斜线上的某点,就相当于圆的运动轨迹上的新坐标(X2,Y2)。到此想使圆运动,起来就要不断给圆的新坐标(X2,Y2)赋予新的值,用C脚本编程的过程就是使得X2和Y2能不断的变化,但是X2和Y2是有一个斜率关系在里边。
③确定C脚本编程的思路:如果X2和Y2都不知道的话,仅仅有一个斜率K、X1、Y1,要求出X2和Y2是不行的,所以应该使得圆的X1的坐标值能够不断的自己加1,来得到新的X2。(当然,你也可以选择别的方式方法,比如说不断加5来得到新的X2值。)得到新的X2值后,根据斜率K,我们就能够得出新的Y2值,圆就可以按照新的坐标值不断运动了。
④对圆的X坐标值编程,使X轴的值不断变化。
X轴值加1程序
该图片中,我定义了2个变量:一个a值,让其在每一个触发周期(250ms)自动加1;一个b值,值是取自画面上跟随运用/停止那个按钮的状态,是按钮关联到我建立的一个内部Bool变量“mov”。最后返回到a值,就实现了圆的X左边不断变化。“mov”的值为1,按钮上就会显示“跟随运行”且按钮颜色是绿色。“mov”的值为0,按钮上就会显示“停止”且按钮颜色是红色。当按钮处于“跟随运行”时,圆才会移动,当处于“停止”圆不会移动。
⑤对圆的Y坐标值编程,使Y轴的值跟随新的X值不断变化。
Y值跟随X值并得出新值
该图片中,我也定义了2个变量,一个c用来获取圆当前X轴的值,一个d用来根据最新的X轴值求出最新的Y轴值。这段程序执行后Y值就不断的跟随X值的变化而变化,并且斜率是保证的为16/41。
至此,C脚本的编写就完成了,编译保存,运行画面即可以看到圆是平行于AB斜线移动的,还需要说的是文章的第一个动态画面中,我为了监控圆运行时候X,Y的坐标值,设置了连个输出窗口,连接的也是圆的X,Y坐标的当前值,获取坐标的当前值用到的函数是GetPropWord这个函数,因此也切图来讲一下:
获取坐标的当前值
如图,该函数的调用路径在左边树状图中,该函数有3个操作数,分别指向画面的名称,画面里边的对象名称,画面里边对象名的属性。需要注意的是上图中红圈3处就是属性是Left,这个Left就是X坐标的值,前边也说了wincc是从画布边缘的最左边算过来为X值,画布最上边缘算下来是Y值,也就是Top。这也是使用这个函数时候需要特别注意的。
文章结束,本文主要讲C脚本编程的实现方法,如画线、建立变量、选择触发时间等,就没详细说明,望多多包涵。欢迎大家留言讨论转发,如有更好的实现方法,也请多多赐教,谢谢。