循环调用全局脚本,怎么无法实现,求指导我在做洗衣机的控制面板程序,其中水量键设定水量(通过棒图显示),时间键控制清洗时间(两个LED),按下启动键后,棒图清零,然后实时进水量,LED实时显示剩余时间。我在按下启动键时设定了一个触发,调用全局脚本,进行水量累加和时间递减,这里是水量增加的程序,shuiwei是设定的水量,dianyuan是电源键,cf是全局脚本触发变量。求指导啊
循环调用全局脚本,怎么无法实现,求指导
-------养成好习惯, 程序加注释, 最起码给别人的程序加上注释。
-------根据你的需求, 我按自己的理解如下:
BOOL s_run = GetTagBit("run"); //启动标志
if(s_run)
{
SetTagFloat("Dis_WaterPos", GetTagFloat("Act_WaterPos"));//运行状态, 显示实际水位, Dis //是I棒图连接的变量; }
else
{
SetTagFloat("Dis_WaterPos", GetTagFloat("Set_WaterPos"));//not运行状态, 显示set水位, Dis是I棒图连接的变量; }
//time expires., Action with one second period. int t = GetTagWord("time"); if(t && GetTagBit("run")) // when t is not zero and the system is running, time is expiring.
{
SetTagWord("time", --t);
}
if(!t && GetTagBit("run")) //when t is zero and the system is running, it triggles //time_expired event. {
SetTagWord("Time_Expired", true); // when time expires, set a bool tag.
}
--------你设置脚本的触发变量了吗? 你说的循环是指的你的两个for嵌套吗?
-------Act_WaterPos的值是怎么来的?我主要就是实际水量增加以及时间减少不太会。
我给你解释下我的程序,麻烦你看看: 先定义swz保存设定的水量(shuiwei变量,棒图也是连接这个变量的),按下启动后shuiwei变量值清零,定义h保存实际水量并与swz比较,h<swz时触发全局脚本进行水量增加,cf是全局脚本的触发变量。for循环是用来延时的,不知道对不对、
-----cf是触发变量,for是用来延时的,其他的延时不会。。。。if(h>swz)是进行循环判断的,h是实际水量,swz是设定水量
-------1、你不应该用for循环做延时,这样会造成wincc假死,应该直接把for循环改成有条件的读取wincc内部变量自加,并保存到wincc内部变量中,然后判断自加的结果是否大于设定值。 2、你的脚本应该是用周期触发(比如触发周期为1s),然后脚本中判断cf,满足条件执行你脚本的内容,否则直接结束。
------在按钮的事件里做, 不要在全局脚本里做。
-------我全局脚本里只有累加,在按键脚本里做了循环调用全局脚本,结果没实现。。。。
-------我用for的目的是让每次累加之间有个间隔,这样累加的结果在棒图中显示可以看出是断续变化的,不知道还有什么延时可用,sleep不会用。我把写的程序贴出来,麻烦看看
按键C动作
----------您说用周期触发,意思是全局里触发器既有周期触发,又有变量触发?设定周期触发不是程序运行就开始触发了吗?我也试过,没成功。。。。要是能实现,这肯定很NICE,简单好用,求指导
-------脚本触发用周期触发,然后脚本中判断:
if hmiruntime.tags("cf").read then cf为1需要执行的脚本 end if
----------您这用的是VBS吧,我不会VB。。。。我这样写对吗?为什么定时器里面没东西? shuiwei是水量的变量
------你这是编写的项目程序块,你需要编辑vbs动作,然后调用项目程序块。
--------我的程序中,是按下启动按钮触发这里的,那就是要编辑启动按钮的VBS动作了??这个按钮里有其他的C动作。。。怎么办
-------那就不需要触发变量了呀!直接按钮中调用这个项目程序块就行了,触发是按钮动作触发的。按钮的动作分为按下,抬起,动作。你可以把vbs和c分别写在不同的动作里面。比如vbs写在按下,c写在抬起中。
|