PDA

Просмотр полной версии : Обработка нештатных ситуаций



Smith2007
22.09.2013, 02:56
Прошу совета в выборе оптимального алгоритма с учетом постепенного увеличения контролируемых параметров.

Контроллер (ПЛК110) производит мониторинг ряда критических параметров:
- давление в системе отопления
- температура в контуре отопления
- контроль энергоснабжения
- и ряд других параметров (со временем этих параметров может стать много).


Требуется:
При наступлении любого из вышеперечисленных событий (выход за предельные нормы) необходимо отправить СМС с кратким описанием события. Если в течении определенного времени состояние контролируемого параметра не пришло в норму то следует повторить СМС. Для каждого параметра устанавливается индивидуальный период времени между повторными СМСками.

Sergey666
22.09.2013, 12:25
А вы с "Create boot project" уже разобрались???:rolleyes:

Эта штука по сложности и по объему будет значительно превосходить основной алгоритм . И это нормально и правильно.

Надо написать отдельную программу(Alm) ,которая будет следить за параметрами и формировать тексты СМС и формировать периоды выдачи сигнала отправки сформированных СМС . И отдельная ПРГ , управляющая модемом - отправка , получение и обработка СМС.

Smith2007
22.09.2013, 21:07
Думаю тут нужно создавать массив из структур в которых будут указатели на контролируемые параметры, предельные значения и текст СМС сообщений.
По массиву бежать в цикле.

Можно ли через указатель ссылаться на локальную переменную в ином ФБ?

Если из ФБ я вызову функцию несколько раз (в цикле) с разными параметрами. В функции будет использоваться таймер TON. Как будет работать данная схема? Будет ли отработка TON для каждого вызова своя?

зы. Я все не могу переключится на особенности программирования ПЛК, вот и возникают такие лузерские вопросы :)

Sergey666
22.09.2013, 21:31
Думаю тут нужно создавать массив из структур в которых будут указатели на контролируемые параметры, предельные значения и текст СМС сообщений.
По массиву бежать в цикле.

Можно ли через указатель ссылаться на локальную переменную в ином ФБ?

зы. Я все не могу переключится на особенности программирования ПЛК, вот и возникают такие лузерские вопросы :)

А зачем работать через указатель???
Надо переключится на особенности программирования !? Вы на чем работали ??? Что-ли при написании программы (в чем угодно) надо лезть "внутрь" DLL???
У ФБ есть входные , выходные и внутренние переменные ... , короче книги+описаловка + барабан на пузо иначе никак.
Отображение строки (в панели элемент ASCII индикатор) при наличии аварий - показывает заданное время название аварии по очереди , при отсутствии не показывает ничего .

(*================================================ =========*)
Flag_alm:=Alm1 or Alm2 or Alm3 .....or Alm65535;

if Flag_alm then
if Step_led_alm=0 then Step_led_alm:=1;end_if
end_if
Case Step_led_alm of
0: Str_alm:='None Alarms';
Show_led:=false;
1: if Alm1 then
Tmr_show_alm(In:=true,Pt:=word_to_time (Time_show_alm*100);
Str_alm:='Alarm#1';
Show_led:=true;
else Step_led_alm:=Step_led_alm+1;
end_if
if Tmr_show_alm.Q then Tmr_show_alm(In:=false);Step_led_alm:=Step_led_alm +1;end_if
2: if Alm2 then
Tmr_show_alm(In:=true,Pt:=word_to_time (Time_show_alm*100);
Str_alm:='Alarm#2';
Show_led:=true;
else Step_led_alm:=Step_led_alm+1;
end_if
if Tmr_show_alm.Q then Tmr_show_alm(In:=false);Step_led_alm:=Step_led_alm +1;end_if
.
.
.
65535:if Alm65535 then
Tmr_show_alm(In:=true,Pt:=word_to_time (Time_show_alm*100);
Str_alm:='Alarm#65535';
Show_led:=true;
else Step_led_alm:=0;
end_if
if Tmr_show_alm.Q then Tmr_show_alm(In:=false);Step_led_alm:=0;end_if

End_case

(*================================================ =====================*)

Можно и более изысканно ....но нафига козе баян.

Smith2007
22.09.2013, 21:45
А зачем работать через указатель???
Надо переключится на особенности программирования !? Вы на чем работали ??? Что-ли при написании программы (в чем угодно) надо лезть "внутрь" DLL???
У ФБ есть входные , выходные и внутренние переменные ... , короче книги+описаловка + барабан на пузо иначе никак.
Отображение строки (в панели элемент ASCII индикатор) при наличии аварий - показывает заданное время название аварии по очереди , при отсутствии не показывает ничего .

(*================================================ =========*)
Flag_alm:=Alm1 or Alm2 or Alm3 .....or Alm65535;

if Flag_alm then

Моя работа далека от программирования. Это скорее хобби от случая к случаю.
Я повторю вопросы:
1. Можно ли через указатель ссылаться на локальную переменную в ином ФБ?
2. Если из ФБ я вызову функцию несколько раз (в цикле) с разными параметрами. В функции будет использоваться таймер TON. Как будет работать данная схема? Будет ли отработка TON для каждого вызова своя?
3. Можно ли узнать тип данных по ссылке на указатель?

capzap
22.09.2013, 21:52
1) пациент скорее мертв,чем жив
2) ни в коем случае
3) знает только написавший код

Валенок
23.09.2013, 09:20
1.
Тут в контрах с Sergey666. Cам также работаю с указателями. О-о-о-чень удобно для написания универсального кода для библиотек, куда и не требуется залезать.
ФБ - это record с пристегнутым кодом (типа class). Для чтения доступны все поля. Для записи - только IN. Но через указатель доступно все. Классические локальные переменные - в КДС только в FUNCTION.
2.
Если TON - локальный, конечно же нет. Но TON в фунцию можно передать как VAR_IN_OUT (вбить руками), а он, в свою очередь, может быть в составе той структуры/ФБ.
3.
В КДС нет.Как и везде, где информация о ide типа не содержится внутри структуры. Но инвариант можно сделать самостоятельно. Также нет нормального callback или параметра-функции (хотя кое-что обойти можно)

capzap
23.09.2013, 09:33
1.
Тут в контрах с Sergey666. Cам также работаю с указателями. О-о-о-чень удобно для написания универсального кода для библиотек, куда и не требуется залезать.
ФБ - это record с пристегнутым кодом (типа class). Для чтения доступны все поля. Для записи - только IN. Но через указатель доступно все. Классические локальные переменные - в КДС только в FUNCTION.
2.
Если TON - локальный, конечно же нет. Но TON в фунцию можно передать как VAR_IN_OUT (вбить руками), а он, в свою очередь, может быть в составе той структуры/ФБ.
3.
В КДС нет.Как и везде, где информация о ide типа не содержится внутри структуры. Но инвариант можно сделать самостоятельно. Также нет нормального callback или параметра-функции (хотя кое-что обойти можно)
1) то что Вы описали, реализовано в виде глобальных переменных и Ваш вариант это как масло маслянное
2) тут надо внимательно вникнуть, в цикле несколько раз будут работать таймеры, злая собака быстрее покусает, чем можно будет добиться какого то эфффекта от такой реализации

Валенок
23.09.2013, 09:53
1.Почему в глобальных ? В любом месте (кроме функций). Включая кучу (не освобожденную, конечно же).
2.Именно так я работаю с портом и архиватором. Время цикла - 1-3мс (кроме моментов сбрасывания в файл, до 10мс). Не зачто кусать. Наверно тут недопонимание. Вызывается некоторая функция которая что-то делает с таймером одного фб и выходит. После внешний процесс вызывает эту же функцию с данными другого фб и т.д. Здесь не идет речи о зацикливании.

Только это делаю не функцией, а action'ом самого фб, но это абсолютно не принципиально, т.к. код фб - это и есть вызов фунции/процедуры с неявной передачей указателя на структуру

Именно такой подход позволяет кодить задачу не затачивая ее под например архивацию, а при необходимости, запустить параллельно (как бы) архиватор который работает абсолютно независимо.

Sergey666
23.09.2013, 09:54
Валенок! Тут хлопцы не знают как проект загрузочный делать , а туда же "структуры" , "указатели" , вы уверены что товарищи само понятие "ФБ" трактуют адекватно?
Летчиков сначала на кукурузнике летать учат , а вы сразу на истребитель 5 поколения подсадить хотите.

capzap
23.09.2013, 10:13
Я то как раз понял, что Вы хотели сказать про внешний таймер, подобный метод далек от заданного вопроса, он (вопрос) может быть сделан в комп.языках пока невыполниться весь цикл дальше не идем,в плк такой подход не пройдет
У меня тоже было желание ответить на все вопросы,кроме последнего, утвердительно, но надо сдерживать себя :)

Валенок
23.09.2013, 10:29
Валенок! Тут хлопцы не знают как проект загрузочный делать , а туда же "структуры" , "указатели" , вы уверены что товарищи само понятие "ФБ" трактуют адекватно?
Летчиков сначала на кукурузнике летать учат , а вы сразу на истребитель 5 поколения подсадить хотите.
Ну мне показалось-таки что этот чел - как раз летчик. Только летал на другом самолете, причем сложном, и не знает что в этой модели нужно перед взлетом еще некую кнопу нажать. Снимем шляпы, вспомним ярославский Локомотив (Одна из версий. Извините, если кого задело)

Smith2007
24.09.2013, 00:08
Вот примерно такое, но упаковать все в массив и не делать 100 линейных записей, а пройтись в цикле.
Все параметризовано, а значит можно пустить в цикле.
Не разобрал в примерах как создать массив структур и как к нему обращаться.


TYPE Alarm :
STRUCT
Alert: BOOL := FALSE;
mode: INT :=0;

t_idle: TIME;
CurrentValue: INT;
CriticalMin: INT;
CriticalMax: INT;
MsgMin: STRING :='';
MsgMax: STRING :='';
fTON: TON;
END_STRUCT
END_TYPE

==================


VAR
i1,i2,i3,i4: INT := 0;
T1: Alarm := (t_idle := T#20s, CriticalMin := -20000, CriticalMax := 50, MsgMin := 'Minimum!!', MsgMax := 'Maxi!');
T2: Alarm := (t_idle := T#10s, CriticalMin := 0, CriticalMax := 20000, MsgMin := 'miiiin!', MsgMax := 'maaaaax!');
T3: Alarm := (t_idle := T#30s, CriticalMin := 5, CriticalMax := 25, MsgMin := 'Minimum!', MsgMax := 'Maximum!');
T4: Alarm := (t_idle := T#25s, CriticalMin := -20000, CriticalMax := 1, MsgMin := '!', MsgMax := '!!!!!');
sText : STRING := '';
b : BOOL;
END_VAR

(* Для снижения нагрузки вместо прямого присваивания сделать указатели на контролируемые переменные*)
T1.CurrentValue := i1;
T2.CurrentValue := i2;
T3.CurrentValue := i3;
T4.CurrentValue := i4;

(************* 1- **************)
IF (T1.CurrentValue <= T1.CriticalMin) OR (T1.CurrentValue >= T1.CriticalMax) THEN
T1.Alert := TRUE;
ELSE
T1.Alert := FALSE;
END_IF;

IF T1.Alert THEN
CASE T1.mode OF
0: T1.mode := 1;
IF (T1.CurrentValue<= T1.CriticalMin) THEN sText := CONCAT(sText, T1.MsgMin ); END_IF;
IF T1.CurrentValue >= T1.CriticalMax THEN sText := CONCAT(sText, T1.MsgMax ); END_IF;
T1.fTON(IN := TRUE, PT := T1.t_idle);
1: T1.fTON(IN := TRUE, PT := T1.t_idle);
IF T1.fTON.Q THEN
T1.fTON(IN := FALSE, PT := T1.t_idle);
T1.mode := 0;
END_IF;
END_CASE
ELSE
T1.fTON(IN := FALSE, PT := T1.t_idle);
T1.mode := 0;
END_IF;

(************* 2 **************)
IF (T2.CurrentValue <= T2.CriticalMin) OR (T2.CurrentValue >= T2.CriticalMax) THEN
T2.Alert := TRUE;
ELSE
T2.Alert := FALSE;
END_IF;

IF T2.Alert THEN
CASE T2.mode OF
0: T2.mode := 1;
IF T2.CurrentValue <= T2.CriticalMin THEN sText := CONCAT(sText, T2.MsgMin ); END_IF;
IF T2.CurrentValue >= T2.CriticalMax THEN sText := CONCAT(sText, T2.MsgMax ); END_IF;
T2.fTON(IN := TRUE, PT := T2.t_idle);
1: T2.fTON(IN := TRUE, PT := T2.t_idle);
IF T2.fTON.Q THEN
T2.fTON(IN := FALSE, PT := T2.t_idle);
T2.mode := 0;
END_IF;
END_CASE
ELSE
T2.fTON(IN := FALSE, PT := T2.t_idle);
T2.mode := 0;
END_IF;

(************* 3 **************)

(************* 4 **************)

IF LEN(sText) > 0 THEN
; (* вызов блока отправки смс с текстом sText *)
sText := '';
END_IF;


2 Sergey666:
В Вашем примере не перейдем к контролю Alm2 до тех пор пока не отработает Alm1 и т.д. Если я укажу время таймера пару часов, то все остальные параметры не будут контролироваться данным блоком.

Sergey666
24.09.2013, 09:06
(*
2 Sergey666:
В Вашем примере не перейдем к контролю Alm2 до тех пор пока не отработает Alm1 и т.д. Если я укажу время таймера пару часов, то все остальные параметры не будут контролироваться данным блоком.
*)

Данный пример разработан для поочередной индикации всех активных аварий . Какие еще пара часов!?

"Выхватывание" или фиксация факта аварии необходимо не только для отображения , но и для отработки в процессе АСУ-ТП. Так-вот отображение в данном случае вторично , корректная отработка - первична .

Smith2007
24.09.2013, 13:49
Не могу найти примера. Подскажите как правильно инициализировать массив из структур в секции объявления переменных. Пробую разные способы - ошибка.

Sergey666
24.09.2013, 14:23
Сначала сделать структуру (вкладка Типы данных) и обозвать ее,напр My_struct.
Потом массив объявляете Array_tipa_struct : Array[0..100]of My_struct;

Smith2007
24.09.2013, 14:35
Структуру создал. Массив элементов типа структуры создал. Банально не получается инициализировать массив значениями в секции объявления переменных в программе alert

TYPE Alarm :
STRUCT
Alert: BOOL := FALSE; (* FALSE - параметр в норме, TRUE - критическое значение параметра *)
mode: INT :=0; (* 0 - инициализация таймера задежки, сборка текста СМС сообщения,
1 - ожидание повторной отправки **** сброс mode = 0*)
t_idle: TIME; (* период ожидания *)
CurrentValue: INT; (* Текущее значение *)
CriticalMin: INT; (* Предельное минимальное значение *)
CriticalMax: INT; (* Предельное максимальное значение *)
MsgMin: STRING :=''; (* Строка СМС *)
MsgMax: STRING :=''; (* Строка СМС *)
fTON: TON;
END_STRUCT
END_TYPE

TYPE Control :
STRUCT
aControl: ARRAY [1..4] OF Alarm;
END_STRUCT
END_TYPE

PROGRAM PLC_PRG
VAR
i1,i2,i3,i4: INT := 0;
Param : Control := ((t_idle := T#20s, CriticalMin := -20000, CriticalMax := 50, MsgMin := 'Недостижимо', MsgMax := 'Критическое значение!'));
(*
T1: Alarm := (t_idle := T#20s, CriticalMin := -20000, CriticalMax := 50, MsgMin := 'Недостижимо', MsgMax := 'Критическое значение!'); (* Контролируем только максимум. Минимум заведомо недостижим *)
T2: Alarm := (t_idle := T#10s, CriticalMin := 0, CriticalMax := 20000, MsgMin := 'Критически низкая температура!', MsgMax := 'Критически высокая температура!');
T3: Alarm := (t_idle := T#30s, CriticalMin := 5, CriticalMax := 25, MsgMin := 'Minimum!', MsgMax := 'Maximum!');
T4: Alarm := (t_idle := T#25s, CriticalMin := -20000, CriticalMax := 1, MsgMin := '!', MsgMax := 'Опасно!'); (* Возможно использовать с типами BOOL преобразованным к INT *)
*)
sText : STRING := '';
sVar : STRING[255] := '';
b : BOOL;
count, event1, event2: INT := 0;
END_VAR


Выделил красным попытку инициализировать переменные структуры

Валенок
24.09.2013, 16:15
Param : Control := (aControl := (t_idle := T#20s, CriticalMin := -20000, CriticalMax := 50, MsgMin := 'Недостижимо', MsgMax := 'Критическое значение!'));

Можно
TYPE Control :
STRUCT
aControl: ARRAY [1..4] OF Alarm;
END_STRUCT
END_TYPE

упростить до
TYPE Control :
ARRAY [1..4] OF Alarm;
END_TYPE
Тогда - красным, без лишней пары скоб

Smith2007
24.09.2013, 17:58
Спасибо за подсказку :)

Получил чего хотел. Код маленький и понятный.

TYPE Alarm :
STRUCT
Alert: BOOL;

mode: INT;

t_idle: TIME;

CurrentValue: INT;

CriticalMin: INT;

CriticalMax: INT;

MsgMin: STRING :='';

MsgMax: STRING :='';

fTON: TON;
END_STRUCT
END_TYPE

TYPE Control :
ARRAY [1..4] OF Alarm;
END_TYPE


PROGRAM PLC_PRG
VAR
i1: INT := 49;
i2: INT := 1;
i3: INT := 24;
i4: INT := 0;

sText, sVar : STRING[255] := '';
b : BOOL;
count: INT := 0;
event: ARRAY [1..4] OF INT := 0,0,0,0;
T: Control := (Alert := FALSE, mode :=0, t_idle := T#20s, CriticalMin := -20000, CriticalMax := 50, MsgMin := 'min11111111', MsgMax := 'max111111'),
(Alert := FALSE, mode :=0, t_idle := T#10s, CriticalMin := 0, CriticalMax := 20000, MsgMin := 'min2222222', MsgMax := 'max222222'),

(Alert := FALSE, mode :=0, t_idle := T#05s, CriticalMin := 5, CriticalMax := 25, MsgMin := 'min33333333', MsgMax := 'max3333333'),

(Alert := FALSE, mode :=0, t_idle := T#15s, CriticalMin := -20000, CriticalMax := 1, MsgMin := 'min444444444', MsgMax := 'max4444444');

i : INT;
END_VAR


T[1].CurrentValue := i1;
T[2].CurrentValue := i2;
T[3].CurrentValue := i3;
T[4].CurrentValue := i4;


FOR i := 1 TO 4 DO
(************* i **************)
IF (T[i].CurrentValue <= T[i].CriticalMin) OR (T[i].CurrentValue >= T[i].CriticalMax) THEN
T[i].Alert := TRUE;
ELSE
T[i].Alert := FALSE;
END_IF;

IF T[i].Alert THEN
CASE T[i].mode OF
0: T[i].mode := 1;

IF (T[i].CurrentValue<= T[i].CriticalMin) THEN sText := CONCAT(sText, T[i].MsgMin ); END_IF;

IF T[i].CurrentValue >= T[i].CriticalMax THEN sText := CONCAT(sText, T[i].MsgMax ); END_IF;

T[i].fTON(IN := TRUE, PT := T[i].t_idle);

event[i] := event[i] + 1;



1: T[i].fTON(IN := TRUE, PT := T[i].t_idle);

IF T[i].fTON.Q THEN

T[i].fTON(IN := FALSE, PT := T[i].t_idle);

T[i].mode := 0;

END_IF;
END_CASE
ELSE
T[i].fTON(IN := FALSE, PT := T[i].t_idle);

T[i].mode := 0;
END_IF;
END_FOR;

IF LEN(sText) > 0 THEN
; (* смс sText *)

count := count +1;

sVar := CONCAT( sVar, sText);

sText := '';
END_IF;

(*
T[1].Alert := T[1].Alert;
T[2].Alert := T[2].Alert;
T[3].Alert := T[3].Alert;
T[4].Alert := T[4].Alert;

event[1] := event[1];
event[2] := event[2];
event[3] := event[3];
event[4] := event[4];
*)

Теперь следующий вопрос:
В приведенном примере я анализирую только один тип данных, а именно INT. В процессе может потребоваться контролировать BOOL и REAL.
Есть ли не сложный способ обеспечить это все в одной программе или лучше ввести 3-три разные программы для контроля значений с разными типами?
При этом строку СМС (sText) можно инициализировать как глобальную переменную, составление строки возложить на программы контроля (по типам), а очистку переменной производить в ФБ ответственном за отправку СМС.


зы. или я куда-то не туда "поехал"? :)

capzap
24.09.2013, 18:42
http://www.owen.ru/forum/showthread.php?t=15812&p=119388&viewfull=1#post119388
Здесь посмотрите, как раз про разные типы

Sergey666
25.09.2013, 00:03
Так и понял Smith2007 - Делфушник.
А , что нельзя зафиксить аварии в процессе ( они ведь разные могут быть и на разных устройствах) в глобальные переменные и уже отдельно (вообще в стороне от основной программы) сформировать тексты сообщений и организацию отправки?????
На работе тоже есть хороший делфушный программист - потребовалось много времени , чтобы у него из головы всякую муть выбить ( тоже любитель при случае цикл замутить :D ), теперь нормальный стал.

З.Ы Я , конечно извиняюсь, но то что вы делаете(как вы решаете проблемму) это интеллектуальный ананизм.
Хоть , чисто теоретически , представьте : вы поменяли работу (организацию) , а там нет КДС , нет Овена , а есть что-либо любое другое устройство , а задачи те-же. Какие структуры ? Какие массивы из них?
Хотя , конечно , нормальные герои идут в обход .
Когда завершается то , что хочеш завершить и как шочеш , тоже нормально , но ... нафига козе баян , а зайцу стоп сигнал?
Правильно , нет необходимости.

Валенок
25.09.2013, 01:44
Наверное я бы здесь с Вами согласился.
Если бы мне платили за кол-во строк.

Smith2007
25.09.2013, 06:16
Сергей, я повторюсь...
Моя работа ни коим образом не связана ни с IT ни с АСУТП ни с программированием и поэтому я не особо беспокоюсь о различных устройствах и КДС.
9 месяцев назад достроил дом и въехали. Отопление смонтировали специалисты, но без какой либо автоматики. Включил насос - заработал теплый пол. Выключил - остыл. То же с радиаторами отопления.
Как только приблизилась осень и температура на улице начала скакать, жена мне: "сделай потеплее в ванной". "Что-то жарко в ванной стало". "Холодно в детской", "Жарко в спальне" и т.д. и я как белка ношусь в котельную включаю-выключаю. Посмотрел штатные контроллеры к котлам (у меня пара Baxi 1300in, Baxi 1620 in) и разочаровался их возможностями. Мало того, что стоит баснословных денег так и алгоритм не поменять. Вот в тот момент, а это примерно пара месяцев назад, принял решение автоматизировать процесс. О ПЛК даже не слыхал ни когда. Пошел на соседний завод к асушникам и начал их пытать. Вот они мне ссылочку и дали на этот сайт прокомментировав, что продукция Овен довольно хороша и по цене доступна. Вот я начал с изучения форума и Codesys. Благодаря урокам Кирила я сделал первые шаги в Codesys и это оказалось для меня не сложно. Тогда я заказал ПЛК110-30м. Спустя неделю протянул провода, смонтировал шкафчик и упаковал в него кросс, ПЛК и пр. автоматику.
Почему я начал тему с вопроса об "оптимальном алгоритме" обработки нештатных ситуаций. Да у меня ноль опыта в этом деле :) Стаж общения с живым ПЛК 2 недели :)
Сейчас я научился управлять котлами в зависимости от температуры в бойлере. Следующий этап - ввести термодатчики на бойлер и улицу. Ну а потом добавить контроль ряда критических параметров, такие как давление в магистрали контура отопления, температура в контуре отопления и т.д.
Мало управление написать подумал я, как я узнаю о нештатке? Я же на работе. Появилась следующая задача и т.д.

Правильно ли я делаю создавая структуры, массивы? Я не знаю. Экспериментирую :) И слушаю рекомендации на форуме. Ну еще изучаю примеры. Очень интересно.
Изучая - появляются новые идеи "как упростить жизнь в доме" :)

Вобщем прошу сильно не пинать, я только учусь :)

Smith2007
25.09.2013, 10:23
в продолжении темы....
Модифицировал код. Подумал, что если я буду анализировать много параметров то затрачивать ресурсы ПЛК на постоянные операции присваивания при заполнении массива текущими значениями контролируемых параметров будет не экономно.

Можно в качестве текущего значения использовать ссылку и тогда не нужно в каждом цикле программы производить лишние вычисления.

Вопрос:
Можно ли в секции объявления переменных, при инициализации массива из указателей сразу вычислить сам адрес переменной на которую ссылаемся?

arr: ARRAY [1..4] OF POINTER TO INT := ADR(var_int1), ADR(var_int2), ....

или только в теле программы можно ссылаться на функции?

Sergey666
25.09.2013, 10:57
Вот вы , при обьявлении массива как бы резервируете область памяти для него . Потом вы для обращения к переменной вытаскиваете указатель на ее из массива .
До этого вы структуру организовали - опять резервирование памяти , потом еще и массив структур - еще памяти хапнули. Еще понятно если вы какой-то журнал аварий-событий сделать хотите.
В чем суть вашей оптимизации ??? Обращайтесь напрямую.(по имени) Хотите оптимизировать - запихайте флаги аварий в массив и делайте выборку по индексу , только не увлекайтесь операторами цикла , он и так есть .
Навряд-ли вы напишете код , сильно грузящий ПЛК , поэтому не стоит парится по поводу ресурсов - считайте , что они бесконечны.
Старый мультик был , где орел или стервятник учил летать страуса - типа лучше день потерять , потом за 5 минут долететь.

Smith2007
25.09.2013, 12:01
Возможно Вы правы, но вот опять же... Если запихать флаги в массив то: массив надо все равно и скорее всего как глобальный. Где хранить максимум и минимум при которых alert сработает?

Мне нужно получить:
1. В случае отклонения любого из контролируемых параметров за пределы нормы (нормы надо хранить) зажечь сигнальную лампу. Ожидается около 30 параметров на контроль.
2. Сформировать и отправить СМС с обнаруженными ошибками.
3. Отправить повторные СМС через опред. периоды времени в случае если параметр по прежнему вне диапазона нормы.
4. Протоколирование значений параметров с возможностью изменения уровня детализации (все подряд - оно же отладка, некритичные изменения, критические параметры). Протоколирование необходимо обеспечить в сеть желательно по стандартным протоколам (из предположений - ftp), чтобы не заниматься еще и серверной частью.

Sergey666
25.09.2013, 12:13
Потратить пару-тройку осенних вечеров на изучение фундаментального :rolleyes: описания работы в КДС (для вас пару - там выборочно).
Для хранения есть понятие "Ретэйн" (на любых ПЛК).

Smith2007
25.09.2013, 13:59
Сергей, линканите пожалуйста ссылочку на фундаментальную документацию описания работы в КДС.

Я уже и сам прихожу к выводу, что не с того начал :

Sergey666
25.09.2013, 14:29
http://www.owen.ru/catalog/51162335