有关HMIBuilder软件的问题解答 点击:279 | 回复:0



蓝色时光

    
发表于:2010-11-08 10:35:48
楼主
问题:
在HMIBuilder中, 使用32位整型数表示状态, 我们必须操作bit位,如何处理?



--------------------------------------------------------------------------------

解答:
最佳方案:

set val 【expr {int(【get_analog_value “ sta0 ” “ val0 ” 】)}】;

set c 【expr {$val & (1 << 7)}】; #取val的第7位

set_status_val “ sta0 ” “ status0 ” 【expr {$c ? 1 : 0}】; #设置对应状态量

set val 【expr {$val | (1 << 7)}】; #将val的第7位置位

set val 【expr {$val & (~(1 << 7))}】; #将val第7位复位

其他解决方法:

set bit 1;
set data 16;


set b 【expr { $data ^ int (pow(2,$bit))}】; #data的bit位置1


messagebox "data的bit位置1后为" $b;

set bit 2;
set data 15;


set c 【expr { $data&int(pow(2,$bit))}】; #data的bit位清0


messagebox "data的bit位清0后为" $c;




--------------------------------------------------------------------------------




问题:
在咱们的数据组保存里面数据基本都是5的倍数。但是,客户的要求是数据保存的时间可以自定义,比如咱们的里面数据组保存的时候,循环保存可以设置为 15s 20s 30s,客户要求22s 23s保存一次。有没有什么好的解决方法?



--------------------------------------------------------------------------------

解答:

#1、在HMIBuilder的调度脚本,增加脚本,SCADA系统启动时执行。
set OldSecond 0;
set Second 0;
#2、在HMIBuilder的调度脚本,增加脚本,循环执行,时间为1s。
incr Second;
#3、在HMIBuilder的调度脚本,增加脚本,循环执行,比如设置300ms。
#因为循环周期加快,所以会出现秒会重复。如果重复,不做下面的处理
#首先,在调度脚本启动的地方初始化一个秒的变量: OldSecond, 在这里和Second做比较,如果Second改变则向下执行
if {($Second - $OldSecond)<23} {
return;
} else {
set OldSecond $Second;
}
#如果到了23秒,执行下面操作。。。。。。
save_record "MyInfo"
#程序可以变通,比如通过图元控件,获取系统时间,来进行判断。也可以将2和3合并执行。
问题:
如何在HMIBuilder中获取每天早晨00点的时间值.

--------------------------------------------------------------------------------

解答:
#初始化时间
set t 【get_current_time】; #通过HMIBuilder接口,获取系统当前时间
set tStart 【expr $t - ( $t % (60*60*24)) - 60*60*8 】;# - 60*60*8 就是减去8小时,为了到0点;
set tEnd 【expr $tTime + 60*60*24】; #获取一天的结束时间
messagebox $tStart $tEnd ;
问题:
如何在HMIBuilder中获取系统毫秒值?.



--------------------------------------------------------------------------------


解答:
set secs 【clock seconds】
set ms 【clock clicks -milliseconds】
set base 【expr { $secs * 1000 }】
set fract 【expr { $ms - $base }】
if { $fract >= 1000 } {
set diff 【expr { $fract / 1000 }】
incr secs $diff
incr fract 【expr { -1000 * $diff }】
}
messagebox "秒.毫秒" $secs.【format %03d $fract】
messagebox "系统毫秒" 【format %03d $fract】
Learning,sporting and fighting!

问题:


如何通过脚本实现一个开关量数据的取反?



--------------------------------------------------------------------------------


建立一个变量sta0站的 开关量 status0!

在按钮中,采用下面脚本,实现取反操作:

set a 【get_status_value "sta0" "status0" 】
set a 【expr {!$a }】 #取反操作
set_status_value "sta0" "status0" $a

如何通过TCL脚本,在HMIBuilder中实现,工程转化:



--------------------------------------------------------------------------------


在HMIBuilder中,我们经常通过 Y=kX+b的方式,进行工程转换,也就是线性转化。

但是,在实际工程中,经常通过输入量的最大/最小值和转换量的最大/最小值的关系进行转换。

那么如何通过输入量的最大/最小值(MaxI /MinI )和转换量的最大/最小值(MaxO /MinO )算出 公式Y(转换值)=kX(输入值)+b中的k和b呢?

下面就是程序代码:

set MaxI 【get_edit_text "edit


楼主最近还看过

SSI ļʱ