Вверх ↑
Ответов: 1305
Рейтинг: 29
#1: 2007-04-01 19:15:53 ЛС | профиль | цитата
Galkov писал(а):
v258 писал(а):
Да нет, скорее это расширенный Hub, по крайней мере Ex вариант. Мне так кажется

Не согласен.
Может кто-то приведет схему, в которой использование сего Commutator-а дает великие преимущества, по сравнении с IndexToChannel

Galkov, я, вообще-то про этот компонент говорил, nesco про него же сказал, что не использует его по причинам несовместимости точек Пример использования там есть.

Компонент от nesco, эквивалентен такой схеме
Add(Hub,1854827,175,273)
{
InCount=3
OutCount=1
link(onEvent1,14044251:doEvent,[])
}
Add(IndexToChanel,14044251,224,273)
{
Point(Index)
}
если я, конечно, все правильно понимаю

Второй вариант комутатора (см. ссылку выше) полного эквивалента не имеет (если ошибаюсь, поправьте). Вот несколько вариантов:

Если на точки IndexIn и IndexOut поданы значения -1 (или точки вообще не задействованы), то компонент работает точно так же, как и обычный хаб.
Add(Hub,14930359,273,301)
{
InCount=3
OutCount=3
}
т.е. данные с любой входной точки передаются на все выходные потоки

Если на точку IndexIn подано любое значение, отличное от -1, а на точку IndexOut -1 (или точка не задействована), то компонент работает подобно следующей схеме
Add(Hub,11333882,392,133)
{
OutCount=3
}
Add(If_else,15364446,175,133)
{
Op2=Integer(0)
link(onTrue,14266483:doWork2,[(252,139)])
link(Op1,4553993:Var1,[(181,79)])
}
Add(If_else,12453882,210,196)
{
Op2=Integer(1)
link(onTrue,14266483:doWork3,[(256,202)])
link(Op1,4553993:Var2,[])
}
Add(If_else,9823774,266,259)
{
Op2=Integer(2)
link(onTrue,161968:doWork3,[(312,265)])
link(Op1,4553993:Var3,[(272,79)])
}
Add(GetDataEx,4553993,203,70)
{
link(Data,10606623:Var,[])
}
Add(Memory,15509591,343,84)
{
}
Add(DoData,4068866,343,133)
{
link(onEventData,11333882:doEvent1,[])
link(Data,15509591:Value,[])
}
Add(Hub,2077708,119,126)
{
link(onEvent1,14507748:doWork2,[(167,132)(167,90)])
link(onEvent2,15364446:doCompare,[])
}
Add(Hub,6093506,161,189)
{
link(onEvent1,14507748:doWork3,[(284,195)])
link(onEvent2,12453882:doCompare,[])
}
Add(HubEx,14507748,280,77)
{
link(onEvent,5125153:doWork2,[(322,90)])
}
Add(HubEx,14266483,252,126)
{
link(onEvent,161968:doWork2,[(308,139)])
}
Add(Hub,3188911,210,252)
{
link(onEvent1,5125153:doWork3,[(326,258)])
link(onEvent2,9823774:doCompare,[])
}
Add(HubEx,5125153,322,77)
{
link(onEvent,15509591:doValue,[])
}
Add(HubEx,161968,308,126)
{
link(onEvent,4068866:doData,[])
}
Add(PointHint,10606623,121,21)
{
Info=#32:Индекс активного входного потока|
Width=190
}
т.е. данные только с активной входной точки направляются на все выходные потоки. Другие входные точки блокируются. Причем, как все понимают, количество компонентов if_else будет равняться количеству входных потоков.

Наоборот - на точке IndexIn значение -1 (или точка не задействована), на точке IndexOut - любое другое значение
Add(IndexToChanel,6111334,504,217)
{
Count=3
Point(Index)
link(Index,6307682:Var,[])
}
Add(Hub,4047724,448,217)
{
InCount=3
OutCount=1
link(onEvent1,6111334:doEvent,[])
}
Add(PointHint,6307682,408,133)
{
Info=#33:Индекс активного выходного потока|
Width=204
}
т.е данные со всех входных точек направляются только на активный выходной поток

Если и на точке IndexIn, и на точке IndexOut заданы значения, отличные от -1, то имеем следующее
Add(If_else,15364446,175,133)
{
Op2=Integer(0)
link(onTrue,14266483:doWork2,[(252,139)])
link(Op1,4553993:Var1,[(181,79)])
}
Add(If_else,12453882,210,196)
{
Op2=Integer(1)
link(onTrue,14266483:doWork3,[(256,202)])
link(Op1,4553993:Var2,[])
}
Add(If_else,9823774,266,259)
{
Op2=Integer(2)
link(onTrue,161968:doWork3,[(312,265)])
link(Op1,4553993:Var3,[(272,79)])
}
Add(GetDataEx,4553993,203,70)
{
link(Data,10606623:Var,[])
}
Add(Memory,15509591,357,84)
{
}
Add(DoData,4068866,357,133)
{
link(onEventData,6111334:doEvent,[(450,139)(415,139)])
link(Data,15509591:Value,[])
}
Add(Hub,2077708,119,126)
{
link(onEvent1,14507748:doWork2,[(167,132)(167,90)])
link(onEvent2,15364446:doCompare,[])
}
Add(Hub,6093506,161,189)
{
link(onEvent1,14507748:doWork3,[(284,195)])
link(onEvent2,12453882:doCompare,[])
}
Add(HubEx,14507748,280,77)
{
link(onEvent,5125153:doWork2,[(322,90)])
}
Add(HubEx,14266483,252,126)
{
link(onEvent,161968:doWork2,[(308,139)])
}
Add(Hub,3188911,210,252)
{
link(onEvent1,5125153:doWork3,[(326,258)])
link(onEvent2,9823774:doCompare,[])
}
Add(HubEx,5125153,322,77)
{
link(onEvent,15509591:doValue,[])
}
Add(HubEx,161968,308,126)
{
link(onEvent,4068866:doData,[])
}
Add(PointHint,10606623,121,21)
{
Info=#32:Индекс активного входного потока|
Width=190
}
Add(IndexToChanel,6111334,420,133)
{
Count=3
Point(Index)
link(Index,6307682:Var,[])
}
Add(PointHint,6307682,324,42)
{
Info=#33:Индекс активного выходного потока|
Width=204
}
т.е. данные на активный выходной поток выдаются только с активной входной точки, остальные входные точки блокируются

Кроме того, есть возможность полной блокировки передачи данных через компонент - точка OnOff

Может быть эти возможности действительно никому не нужны, а может кому и понадобятся, по крайней мере, расширение функций стандартного хаба никому бы и не помешало, имхо

Тем более, что верхние точки можно сделать скрытыми, чтобы глаза не мозолили
карма: 0

0