名即可,无需在标记名字典中新建变量,所以不占点数。(SERVER:TAGNAME)
4.自动切换功能
CLIENT 通过远程变量观察SERVER 上的$Second 变量,若它在在一段时间内无变化则表明与SERVER 的连接出现问题,这时可通过SetAccessName 函数将CLIENT 上的远程变量切换到另一台SERVER 上。
2.3公用的操作窗口
系统中对于具有相同操作接口设备使用了公用的操作窗口,而不是对应每个设备都创建一个操作窗口,这样大大减少了窗口的数量。实现它需要用到间接变量,可以将间接变量看作一个指针,当对某个设备操作时,利用间接变量指向操作变量,这样,对间接变量的赋值就会作用到操作变量上,操作变量的变化也会反应到间接变量上。
以过滤水泵为例,在过滤水处理系统中,点击3#过滤泵,弹出操作窗口,如下图所示:

3#过滤泵的操作变量为“RUN-3#GLB(启动)”、“STOP-3#GLB(停止)”、“RL-3#GLB(反馈)”、“AUTO-3#GLB(自动)”、“REPAIR-3#GLB(检修)”点击过滤泵时执行语
句:
DL_START.NAME=RUN-3#GLB.NAME;
DL_STOP.NAME=STOP-3#GLB.NAME;
DL_RL.NAME = RL-3#GLB.NAME;
AUTO.NAME = AUTO-3#GLB.NAME;
DL_REPAIR.NAME=REPAIR-3#GLB.NAME;
“DL_XXX”为间接变量。在操作窗口中只需对间接变量赋值即可。例如在“启动”按钮的动作属性中写到:
IF DL_START.Name<>"NULL" AND DL_STOP.Name<>"NULL" THEN
DL_START=1;
DL_STOP=0;
Record=DL_START.Comment;
SQLInsert( ConnectionId, "CortrolLog", "CortrolLog" ); //写操作纪录
ELSE
IF DL_START.Name = = "NULL" THEN
DL_STOP=0;
Record=StringLeft( DL_STOP.Comment, StringLen( DL_STOP.Comment )/2 );
SQLInsert( ConnectionId, "CortrolLog", "CortrolLog" );
ELSE
DL_START=1;
Record=StringLeft( DL_START.Comment, StringLen( DL_START.Comment )/2 );
SQLInsert( ConnectionId, "CortrolLog", "CortrolLog" );
ENDIF;
ENDIF;
因为设备的启停一般有两种:1.启动与停止是一个输出;2.启动与停止是两个输出。为一个输出时我们将输出变量的COMMENT 属性写为“XXX 启动XXX 停止”这样,在写操作记录时需取COMMENT 的左一半或右一半;若为两个输出时,变量的COMMENT 将为“XXX 启动”或“XXX 停止”,写记录时取对应变量的COMMENT即可。
CLIENT 的情况比较特殊,因为CLIENT 需用间接变量指向远程变量,而远程变量的COMMENT 无法赋给间接变量的COMMENT,所以为了在公用窗口中获得远程变量的COMMENT 我们只能利用间接变量的NAME(即远程变量的NAME)在数据库中查找到COMMENT,再写操作记录。语句如下:(写记录的操作参见“数据库的应用”。)
IF DL_START.Name<>"NULL" AND DL_STOP.Name<>"NULL" THEN
DL_START=1;
DL_STOP=0;
Record=StringRight( DL_START.Name ,StringLen( DL_START.Name )-7 );
SQLSelect( ConnectionId, "COMM", "COMMENT", "device_id="+"’"+Record + "’" , "" ); //查找COMMENT
SQLFirst( ConnectionId );
Record=StringTrim( COM, 3 );
SQLEnd( ConnectionId );
SQLInsert( Connection