PDA

Просмотр полной версии : Проблема с счетчиком



kuguar
24.02.2011, 17:55
Здравствуйте!
Уважаемые программисты, подскажите, пожалуйста, почему происходит такой казус:
Во входном действии программы, на SFC поставил инкремент счетчика «nCall»,
В вызываемой программе – счетчик количества проходов «Counter».
При работе оказывается, что счетчик вызовов за один проход добавляет по 1 дважды.
Таким образом nCall = 2* Counter, хотя, по логике они должны равняться.
Вопрос: как заставить счетчик работать как положено – за один проход увеличиваться на 1.

код программы: (http://www.owen.ru/forum/attachment.php?attachmentid=3496&stc=1&d=1298559186)

Gans
24.02.2011, 18:24
Таким образом nCall = 2* Counter, хотя, по логике они должны равняться.
Здравствуйте.
Равняться у Вас nCall=Counter не смогут, так как что бы пройти шаг "Wait" (в POU_Sample) как минимум необходимо два раза вызвать программу "POU_Sample". Первый раз программа решит, что можно идти дальше, а второй раз пойдет дальше и быстрее ни как в SFC :-) А в это время переменная POU_Sample.Ok:=True, а также Start:=True!!! Таким образом программа PLC_PRG успевает пару раз про суммировать переменную "nCall". К тому же во время переходов подпрограмма POU_Sample не вызывается.
P. S. Так писать программы нельзя, надо что-то менять радикально.

kuguar
24.02.2011, 18:42
Спасибо за ответ!
Я исходил из того, что входное действие должно выполняться однократно при вхождении в блок (так же как и выходное), а вот в блоке оно зациклено до получения TRUE на условии выхода.
Но из Ваших слов я понял, что мягко говоря заблуждался,
а значит подобный вариант многократного вызова исполняемого блока с изменяемыми, в зависимости от номера шага, входными параметрами таким образом организовать неудастся. :(

Как же тогда можно организовать "адекватный" счетчик, который при каждом проходе увеличивался на 1.

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

Gans
24.02.2011, 18:48
Обе программы постоянно вызывайте из третей :-)

kuguar
24.02.2011, 18:50
Спасибо!
Не совсем понятно, но поробую реализовать.

Gans
24.02.2011, 18:59
На самом деле по хорошему в принципе надо всё переделывать, так получается слишком не однозначно.
P. S. Посмотрите CASE и IF..Then...Else и конечно не забываем про SFC

kuguar
24.02.2011, 19:07
Программа управляет включением / выключением ТЭНов.
Какие ТЭНы включены и на какой период описанно в массиве структур.
Поэтому было принято решение перебирать записи массива и в соответствии с значениями управлять ключами.
Всплыла проблема с счетчиком.
Как ее обойти через выбор или условные переходы пока не представляю.
впрочем, как и заставить счетчик работать как положенно.
Будем эксперементтровать. :D

Gans
24.02.2011, 19:16
Так надо создать еще и "массив выходов" вкл/выкл тэнов, а далее For .... To ... , а из "массива выходов" постоянно значения переносить в ПЛК-конфигурацию (на физические выхода). Вроде подводных валунов нет :-)

kuguar
24.02.2011, 19:21
именно этим и занимаюсь,
но нужен счетчик, который будет позиционировать указатель в массиве.
а с ним, как Вы поняли, у меня не заладилось.

Gans
24.02.2011, 19:55
Взгляни, что я накидал может чем поможет :-) и а5-таки не могу найти где загвозка, может прогу на форум скинуть, тогда народ поможет :-)

kuguar
24.02.2011, 20:29
Большое спасибо за участие,
но суть проблемы не в включении ТЭНов.
шаг 1: 1-5, 40-44 - включил
таймер на 2минуты
шаг 2: все выключил, 10 - 20, 30 - 40 включил
таймер на минуту 30 сек.
и так далее.

в зависимости от того, какое стекло маллируется, шагов может быть 5, а может 25.
поэтому было принято решение загнать "карту включения ТЭНов" в массив и получая от туда данные, вызывать НУЖНОЕ количество раз рабочее тело с конкретными входными данными.
что бы знать КАКУЮ строку из массива нужно считать нужен СЧЕТЧИК проходов.
не зависимо от того, стоит ли инкримент в блоке, вызывающем рабочую программу, либо в входном / выходном действии пустого блока с TRUE на условии выхода, инкремент происходит :eek: дважды:eek: .
Вот и получается: то ли я дурак, то ли одно из двух :rolleyes:
Суть вопроса была : получить увеличение переменной на ЕДИНИЦУ при прохождении через блок программы SFC.

Gans
24.02.2011, 20:52
FOR wdCounter:=0 TO 5 DO (*Выключим тены с 1 по 6*)
arrTen[wdCounter].blnTenON:=FALSE;
END_FOR;

тут развязываем таймерами можно и свойствами шагов в SFC

FOR wdCounter:=2 TO 10 DO (*Включим с 3 по 11 тены*)
arrTen[wdCounter].blnTenON:=True;
END_FOR;

и тд. а в шаге "stpSetOutPut" эти расчетные значения переносим на физические выхода. Так же можно по условию вызывать разные подпрограммы prgWork1, prgWork2, prgWork3 и тд. ведь количество программ ограничено?

можно еще добавить в свойство тенов переменные что бы в цикле разбираться должен быть включен или нет.
например:
arrTen[0].prg1:='972347'; (*означает, что в первой программе этот тен 9 минут включен, затем 7 минут выключен, далее 2 минуты включен и тд.*)
arrTen[1].prg1:='06549'; (*означает, что в первой программе этот тен 6 минут выключен, пять минут включен, 4 минуты выключен, и 9 минут включен до конца программы*)
аналогично для
arrTen[0].prg2:= ....
можно конечно и по два и более символа резервировать на шаг и в хексах и байтах :-)

Gans
24.02.2011, 21:01
принято решение загнать "карту включения ТЭНов" в массив и получая от туда данные, вызывать НУЖНОЕ количество раз рабочее тело с конкретными входными данными.
а можно взглянуть в каком виде эта "карта включения ТЭНов"?

kuguar
24.02.2011, 21:05
а можно взглянуть в каком виде эта "карта включения ТЭНов"?
массив стуктур:
STRUCT
T: ARRAY [1..44] OF BOOL; (* массив управления ТЭН - ами *)
Sh: ARRAY [1..44] OF REAL; (* массив управления ШИМ - ами *)
Supp: ARRAY [1..8] OF INT; (* массив управления поддержками *)
Tempr: REAL; (* заданная температура *)
Tau: TIME; (* время этапа *)
Prizn: INT; (* признак условия окончания этапа: "0" - по времени; "1 - 8" - по термодатчику 1-8 *)
ManualMode : BOOL; (* признак перехода на ручной режим *)
Bell: INT; (* управление звонком: 0 - нет, 1, 2 ... n режимы звонка *)
END_STRUCT

kuguar
24.02.2011, 21:06
в принципе, получил, что хотел, но не так изящно, скорее коряво, но работает.

Gans
24.02.2011, 21:22
в принципе, получил, что хотел, но не так изящно, скорее коряво, но работает.
Главное результат. К большому сожалению пока не разобрался с заданием, но раз уже как-то работает то не буду мешать. Удачки ;)

kuguar
24.02.2011, 21:25
БОЛЬШОЕ спасибо за помощь, за участие!
как бы там не было подтолкнул, а значит помог!
спасибо!