Your comments

ок, опишу конкретную задачу: надо с определенными интервалами вызывать процедуру

//есть массив
var Valves =[ //перечень каналов управления вентилями
{name: "ВВ1", fullName:HDL16chRelay+"BB1", TimeOut:1},
{name: "ВВ2", fullName:HDL16chRelay+"BB2", TimeOut:RotateTime*2.5},
{name: "ВВ3+ВВ4", fullName:HDL16chRelay+"BB3_BB4", TimeOut:RotateTime*4.5},
{name: "ВВ5+ВВ6", fullName:HDL16chRelay+"BB5_BB6", TimeOut:RotateTime*6.5},
{name: "ВВ7+ВВ8", fullName:HDL16chRelay+"BB7_BB8", TimeOut:RotateTime*8.5},
];
//как бы вы оптимизировали следующий код?
IR.SetTimeout(Valves[0].TimeOut*1000, function(){_RotateValveChanel(Valves[0]);});
IR.SetTimeout(Valves[1].TimeOut*1000, function(){_RotateValveChanel(Valves[1]);});
IR.SetTimeout(Valves[2].TimeOut*1000, function(){_RotateValveChanel(Valves[2]);});
IR.SetTimeout(Valves[3].TimeOut*1000, function(){_RotateValveChanel(Valves[3]);});
IR.SetTimeout(Valves[4].TimeOut*1000, function(){_RotateValveChanel(Valves[4]);});
//=================================

я хотел сделать циклом:
for(i=0; i<Valves.length; i++){
IR.SetTimeout(Valves[i].TimeOut*1000, _RotateValveChanel(Valves[i]));
}
function _RotateValveChanel(Valve){
debug("=====> Обслуживание вентиля(ей) "+Valve.name);
HDLdeviceON(Valve.fullName); //закрываем вентиль
}

но в логе увидел что все пять процедур вызываются одна за другой с интервалом пару мс
Если бы была возможность передать в анонимную функцию параметр, то код в цикле работал

for(i=0; i<Valves.length; i++){
IR.SetTimeout(Valves[i].TimeOut*1000, function(idx){_RotateValveChanel(Valves[idx]);}, i); //как то так...

}

Без использования сервера все действительно корректно работает. Ниже я прикрепил пример проекта на основе вашего проекта

Я описывал связь свойства Enable с серверным тегом через Relations


Пример проекта в котором управляемый элемент не меняет состояние при нажатии на него:

Enable.irpz

Enable_Server.sirpz

или более наглядно код в JS


var hello = "Hello World";

setTimeout(function(param){

alert(param);

}, 1000, hello);

Пока использую такой метод:


SetInterval(3600000, function(){

if(IR.GetVariable("System.Date.Day") == ServiceDay && IR.GetVariable("System.Time.Hour") == ServiceHour){

_ServiceCheck(); //запускаем сервисное обслуживание

}});


т.е. один раз в час проверяем тот ли это день и час для запуска обслуживания. Соотв. погрешность +/-59мин

и не очень рациональное использование ресурсов

эту же идею неплохо бы применить к логу виртуального сервера

Уточнение: навигация при помощи Ctrl и выделение слов двойным кликом не работают только в комментариях написанных кириллицей. С латиницей все ок.

Непонятно только почему у фидбеков драйверов на сервере есть параметр Persist? Это вводит в заблуждение что состояние фидбеков можно сохранить.

Методом научного тыка установил что после перезапуска сервера в БД сохраняются только виртуальные тэги сервера (надо выставить для них Persist=true). Для тегов созданных драйверов этот параметр не работает.

Баг или фича?