Страница 1 из 1
регистры Indirect
Добавлено:
Ср дек 12, 2012 5:55 pm
Shin
Здравствуйте!
Пытаюсь реализовать следующую программу в Windows Script (выполнение каждые 200 мс):
FOR Y1 = 1 TO 3
TempTagNameR.Name = "C0"+StringFromIntg( Y1, 10 );
LogMessage(StringFromIntg(TempTagNameR.Value ,10));
NEXT;
где
TempTagNameR - indirect _
C01,C02,C03 - регистр, считываемый из контроллера (значения регистров 1,2,3)
Запрашиваю данные через программы: MXOPCServer(mitsubishi) - OPCLink(wonderware).
Когда запускаю рантайм, в программе OPCLink вижу что запрос идет только к одному регистру из OPC сервера. Соответственно в SMC вижу значения:
/view/VIEWSCRIPTDEBUG /Info - SCRIPT DEBUG:"MainAssembly" Window Script, While Showing every 200 msec
/view/WWSCRIPT /Info - Message: 0
/view/WWSCRIPT /Info - Message: 0
/view/WWSCRIPT /Info - Message: 3 .
Если создаю BindList и прописываю в нем все мои регистры, то в программе OPCLink вижу что запрос идет к трем регистром из OPC сервера. Соответственно в SMC вижу значения:
/view/VIEWSCRIPTDEBUG /Info - SCRIPT DEBUG:"MainAssembly" Window Script, While Showing every 200 msec
/view/WWSCRIPT /Info - Message: 1
/view/WWSCRIPT /Info - Message: 2
/view/WWSCRIPT /Info - Message: 3 .
Почему в первом случает InTouch запрашивает только один регистр?
Возможно ли каким то иным способом в скрипте получить данные нескольких регистров, обращаясь только по их именам?
Re: регистры Indirect
Добавлено:
Чт дек 13, 2012 12:06 pm
Генератор зла
Пытаюсь реализовать следующую программу в Windows Script (выполнение каждые 200 мс):
FOR Y1 = 1 TO 3
TempTagNameR.Name = "C0"+StringFromIntg( Y1, 10 );
LogMessage(StringFromIntg(TempTagNameR.Value ,10));
NEXT;
Т.е. Вы хотите опросить 3 переменные за 200 мс? Вряд ли это удастся. Разве что на пустом проекте и именно с 3-5 переменными.
При этом скрипт, выполняемый 5 раз в секунду, отжирает % 50+ ресурсов InTouch-а
Переделайте скрипт по типу:
Windows Script (выполнение каждые 1000 мс):
Y1 = Y1 +1;
If Y1 > 3 then Y1 = 1; EndIf;
TempTagNameR.Name = "C0"+StringFromIntg( Y1, 10 );
LogMessage(StringFromIntg(TempTagNameR.Value ,10));
Y1 = Mem Int, Init Val = 0;
Re: регистры Indirect
Добавлено:
Чт дек 13, 2012 12:36 pm
Shin
Спасибо, но мне такой вариант не подойдет, тк как у меня требования к системе следующие: получаю команду из скады и необходимо ее размножить сразу же на 15 контроллеров, секундная задержка слишком велика ( и так во всем (прежде всего в графике), прописывать все 15 регистров уж как то трудоемко, хотелось бы обойтись скриптом и функцией FOR во избежание опечаток).
К тому же выяснилась очень интересная особенность работы с Bind List.
У меня теги обновляются каждые 100 мс. Проверено было на базе данных.
В Application Script пишу код (код исполняется каждые 200 мс) :
SpNum = 1;
SQLInsert( ConnectionId, "ID1", "S1");
SpNum = 2;
SQLInsert( ConnectionId, "ID1", "S2");
При этом у меня запрашивается и пишется в базу 2000 регистров. В базе контролирую один контрольный регистр, который постоянно меняется (каждый цикл контроллера). И, что меня очень порадовало, получаю из 900 записанных строчек только 20 дублируемых. Т.е. InTouch умеет быстро опрашивать теги (подчеркну что работаю через OPC server митсубиси, он оптимизирует запросы к контроллеру) .
Значит скада умеет обновлять регистры быстро? Почему она не может это сделать через Indirect регистр?
Хотя вопрос скорее в следующем: реализуема ли моя задача через скрипты, или придется напрямую прописывать все регистры, что не хотелось бы, ведь меняется только индекс.
Re: регистры Indirect
Добавлено:
Чт дек 13, 2012 1:10 pm
Генератор зла
InTouch работает с БД через SQL Access (ODBC). Там может быть своя буферизация,...
А с контроллерами он работает через сервера в/в. Тут своя технология.
Не думаю, что корректно сравнивать 2 разные технологии.
Почитайте хелп на ф-цию IOSetAccessName.
Re: регистры Indirect
Добавлено:
Чт дек 13, 2012 2:14 pm
Shin
Все таки немного не понимаю следующего: есть одна и та же функция
FOR Y1 = 1 TO 3
TempTagNameR.Name = "S0"+StringFromIntg( Y1, 10 );
LogMessage(StringFromIntg(TempTagNameR.Value ,10));
NEXT;
Если удаляю Bind List, содержащий эти теги, то получаю результат:
437132 2012/12/13 12:54:24.115/-0:0BA4:0634/view/VIEWSCRIPTDEBUG /Info - SCRIPT DEBUG: Application Script, While Running every 200 msec
437133 2012/12/13 12:54:24.115/-0:0BA4:0634/view/WWSCRIPT /Info - Message: 12542391
437134 2012/12/13 12:54:24.115/-0:0BA4:0634/view/WWSCRIPT /Info - Message: 0
437135 2012/12/13 12:54:24.115/-0:0BA4:0634/view/WWSCRIPT /Info - Message: 0
437136 2012/12/13 12:54:24.115/-0:0BA4:0634/view/WWSCRIPT /Info - Message: 53689
437137 2012/12/13 12:54:24.316/-0:0BA4:0634/view/VIEWSCRIPTDEBUG /Info - SCRIPT DEBUG: Application Script, While Running every 200 msec
437138 2012/12/13 12:54:24.316/-0:0BA4:0634/view/WWSCRIPT /Info - Message: 12542411
437139 2012/12/13 12:54:24.316/-0:0BA4:0634/view/WWSCRIPT /Info - Message: 0
437140 2012/12/13 12:54:24.316/-0:0BA4:0634/view/WWSCRIPT /Info - Message: 0
437141 2012/12/13 12:54:24.316/-0:0BA4:0634/view/WWSCRIPT /Info - Message: 53706
437142 2012/12/13 12:54:24.516/-0:0BA4:0634/view/VIEWSCRIPTDEBUG /Info - SCRIPT DEBUG: Application Script, While Running every 200 msec
437143 2012/12/13 12:54:24.516/-0:0BA4:0634/view/WWSCRIPT /Info - Message: 12542431
437144 2012/12/13 12:54:24.516/-0:0BA4:0634/view/WWSCRIPT /Info - Message: 0
437145 2012/12/13 12:54:24.516/-0:0BA4:0634/view/WWSCRIPT /Info - Message: 0
437146 2012/12/13 12:54:24.516/-0:0BA4:0634/view/WWSCRIPT /Info - Message: 53716
Добавляю Bind List, содержащий эти теги, то получаю результат:
438087 2012/12/13 12:59:08.635/-0:0B58:0C38/view/VIEWSCRIPTDEBUG /Info - SCRIPT DEBUG: Application Script, While Running every 200 msec
438088 2012/12/13 12:59:08.635/-0:0B58:0C38/view/WWSCRIPT /Info - Message: 12590843
438089 2012/12/13 12:59:08.635/-0:0B58:0C38/view/WWSCRIPT /Info - Message: 93650
438090 2012/12/13 12:59:08.635/-0:0B58:0C38/view/WWSCRIPT /Info - Message: 76505
438091 2012/12/13 12:59:08.635/-0:0B58:0C38/view/WWSCRIPT /Info - Message: 73123
438092 2012/12/13 12:59:08.835/-0:0B58:0C38/view/VIEWSCRIPTDEBUG /Info - SCRIPT DEBUG: Application Script, While Running every 200 msec
438093 2012/12/13 12:59:08.835/-0:0B58:0C38/view/WWSCRIPT /Info - Message: 12590863
438094 2012/12/13 12:59:08.835/-0:0B58:0C38/view/WWSCRIPT /Info - Message: 93663
438095 2012/12/13 12:59:08.835/-0:0B58:0C38/view/WWSCRIPT /Info - Message: 76518
438096 2012/12/13 12:59:08.835/-0:0B58:0C38/view/WWSCRIPT /Info - Message: 73136
438097 2012/12/13 12:59:09.035/-0:0B58:0C38/view/VIEWSCRIPTDEBUG /Info - SCRIPT DEBUG: Application Script, While Running every 200 msec
438098 2012/12/13 12:59:09.035/-0:0B58:0C38/view/WWSCRIPT /Info - Message: 12590883
438099 2012/12/13 12:59:09.035/-0:0B58:0C38/view/WWSCRIPT /Info - Message: 93673
438100 2012/12/13 12:59:09.035/-0:0B58:0C38/view/WWSCRIPT /Info - Message: 76528
438101 2012/12/13 12:59:09.035/-0:0B58:0C38/view/WWSCRIPT /Info - Message: 73149
Больше никаких изменений не ввожу. Почему это происходит?
По идее я могу задать Bind List и реализовать свою задачу с помощью Indirect регистров. Но терзает вопрос, почему так?
Re: регистры Indirect
Добавлено:
Чт дек 13, 2012 2:28 pm
Генератор зла
Всё-таки не понимаю, зачем Bind List? Вы пользуетесь SQL Access или рецептами?
Если с листом работает, забейте и пользуйтесь
Re: регистры Indirect
Добавлено:
Чт дек 13, 2012 2:33 pm
Shin
Вы правы, спасибо за помощь