Время выполнение скриптов на C

Avatar
  • обновлен
Доброго времени суток. Есть 28 дискретных входов на модулях МВ110-16Д "ОВЕН", OPC-сервер LectusOPC и SimpLight. Нужно организовать систему, которая при срабатывании любого из входов, выводила сообщение на экран и включала сирену со светосигнальной колоной. Сирена включается посредством модуля вывода МУ110-16Р. Решил собрать тестовый стенда с двумя дискретными входами и обкатать все это дело, так сказать. Все сделал на скриптах с++ и выяснился один неприятный момент - сообщения на экран выводятся сразу же после срабатывания входа, а вот включение сирены и светового сигнала происходит с задержкой около 10 сек, что не очень хорошо для данного проекта, поскольку если только при двух переменных задержка 10с, то что будет в реальной системе, которая с учетом этих дискретных входов имеет 64 канала. Скорость опроса переменных менял - не помогло. Что можете посоветовать по увеличении быстродействия данного проекта? Как распределяется время выполнения и скриптов, и каналов в программе, и как можно этим временем управлять?

/*Скрипт вывода сообщений */
{
Double L1=ReadValue("In"),Virt1=ReadValue("Virt1"), X=1, L2=ReadValue("In2"),Virt2=ReadValue("Virt2");

/*In,In2 - дискретны входы 1,2; Virt1,2 - флаги(виртуальные переменные) для того,
что бы сообщение не выскакивало постоянно при включенном входе, а выводилось только один раз. */

if ((L1==1)&&(Virt1==0)) {ShowMessageBox("Уход сукна","Сушка 1 привод 2 этаж",1); WriteValue("Virt1",X);};

/*Сработал первый вход - вывести сообщение срабатывания и записать флаг */

if ((L2==1)&&(Virt2==0)) {ShowMessageBox("Уход сукна","Сушка 2 привод 2 этаж",1); WriteValue("Virt2",X);};

/*Аналогично */
}




/*Скрипт обнуления флага */
{
Double X=0,In=ReadValue("In"),In2=ReadValue("In2");

/* In,In2 - дискретные входа */

if (In==0) WriteValue("Virt1",X);

/* Если вход выключился, обнулить флаг, что бы в скрипте вывода сообщений все работало при следующем срабатывании датчика */

if (In2==0) WriteValue("Virt2",X);

/* Аналогично, только для второго канала */
}




/* Скрипт включения сирены */
{
Double X1=ReadValue("Virt1"),X2=ReadValue("Virt2"),X=1,X0=0;

/* Virt1, Virt2 - флаги срабатывания входов */

if ((X1==1)||(X2==1)) WriteValue("MU110_16P.Out",X);
/* MU110_16P.Out - выходная булевая переменная для включения сирены.

Если хотя бы один концевик сработал - включить сигнализацию */

if ((X1==0)&&(X2==0)) WriteValue("MU110_16P.Out",X0);

/*Если все концевики выключились - выключить сигнализацию */

}
Avatar
SIMP Tech (Сергей)
Добрый вечер.

Доброго времени суток. Есть 28 дискретных входов на модулях МВ110-16Д "ОВЕН", OPC-сервер LectusOPC и SimpLight. Нужно организовать систему, которая при срабатывании любого из входов, выводила сообщение на экран и включала сирену со светосигнальной колоной. Сирена включается посредством модуля вывода МУ110-16Р. Решил собрать тестовый стенда с двумя дискретными входами и обкатать все это дело, так сказать. Все сделал на скриптах с++ и выяснился один неприятный момент - сообщения на экран выводятся сразу же после срабатывания входа, а вот включение сирены и светового сигнала происходит с задержкой около 10 сек, что не очень хорошо для данного проекта, поскольку если только при двух переменных задержка 10с, то что будет в реальной системе, которая с учетом этих дискретных входов имеет 64 канала. Скорость опроса переменных менял - не помогло. Что можете посоветовать по увеличении быстродействия данного проекта? Как распределяется время выполнения и скриптов, и каналов в программе, и как можно этим временем управлять?

Для начала я бы проверил цепочку SIMP - ОРС сервер - прибор. Создайте мнемосхему, на ней кнопку, кнопка будет записывать данные в канал управления дискретным выходом. Необходимо проверить насколько быстро отработает запись в канал, и прибор среагирует на изменение данных. Можно так же для теста воспользоваться сторонним ОРС клиентом, и с него произвести запись в канал. Тем самым выясним, что вносит задержку при записи.
Avatar
Юрий
Спасибо за ответ.
Проблема от части решилась. В коде скрипта вывода сообщений поставил на первое место запись флага, а потом вывод сообщения:

"if ((L1==1)&&(Virt1==0)) {WriteValue("Virt1",X); ShowMessageBox("Уход сукна","Сушка 1 привод 2 этаж",1); };".

Теперь сигнал включается с задержкой около 2 сек, что аналогично кнопке включения выхода на мнемосхеме без скрипта.