Просмотр полной версии : Проблема с счетчиком
Здравствуйте!
Уважаемые программисты, подскажите, пожалуйста, почему происходит такой казус:
Во входном действии программы, на SFC поставил инкремент счетчика «nCall»,
В вызываемой программе – счетчик количества проходов «Counter».
При работе оказывается, что счетчик вызовов за один проход добавляет по 1 дважды.
Таким образом nCall = 2* Counter, хотя, по логике они должны равняться.
Вопрос: как заставить счетчик работать как положено – за один проход увеличиваться на 1.
код программы: (http://www.owen.ru/forum/attachment.php?attachmentid=3496&stc=1&d=1298559186)
Таким образом nCall = 2* Counter, хотя, по логике они должны равняться.
Здравствуйте.
Равняться у Вас nCall=Counter не смогут, так как что бы пройти шаг "Wait" (в POU_Sample) как минимум необходимо два раза вызвать программу "POU_Sample". Первый раз программа решит, что можно идти дальше, а второй раз пойдет дальше и быстрее ни как в SFC :-) А в это время переменная POU_Sample.Ok:=True, а также Start:=True!!! Таким образом программа PLC_PRG успевает пару раз про суммировать переменную "nCall". К тому же во время переходов подпрограмма POU_Sample не вызывается.
P. S. Так писать программы нельзя, надо что-то менять радикально.
Спасибо за ответ!
Я исходил из того, что входное действие должно выполняться однократно при вхождении в блок (так же как и выходное), а вот в блоке оно зациклено до получения TRUE на условии выхода.
Но из Ваших слов я понял, что мягко говоря заблуждался,
а значит подобный вариант многократного вызова исполняемого блока с изменяемыми, в зависимости от номера шага, входными параметрами таким образом организовать неудастся. :(
Как же тогда можно организовать "адекватный" счетчик, который при каждом проходе увеличивался на 1.
P.S. sample.pro просто илюстрация проблемы, а проект требует циклического вызова нескольких блоков (количество вызовов и входные данные варируются).
Обе программы постоянно вызывайте из третей :-)
Спасибо!
Не совсем понятно, но поробую реализовать.
На самом деле по хорошему в принципе надо всё переделывать, так получается слишком не однозначно.
P. S. Посмотрите CASE и IF..Then...Else и конечно не забываем про SFC
Программа управляет включением / выключением ТЭНов.
Какие ТЭНы включены и на какой период описанно в массиве структур.
Поэтому было принято решение перебирать записи массива и в соответствии с значениями управлять ключами.
Всплыла проблема с счетчиком.
Как ее обойти через выбор или условные переходы пока не представляю.
впрочем, как и заставить счетчик работать как положенно.
Будем эксперементтровать. :D
Так надо создать еще и "массив выходов" вкл/выкл тэнов, а далее For .... To ... , а из "массива выходов" постоянно значения переносить в ПЛК-конфигурацию (на физические выхода). Вроде подводных валунов нет :-)
именно этим и занимаюсь,
но нужен счетчик, который будет позиционировать указатель в массиве.
а с ним, как Вы поняли, у меня не заладилось.
Взгляни, что я накидал может чем поможет :-) и а5-таки не могу найти где загвозка, может прогу на форум скинуть, тогда народ поможет :-)
Большое спасибо за участие,
но суть проблемы не в включении ТЭНов.
шаг 1: 1-5, 40-44 - включил
таймер на 2минуты
шаг 2: все выключил, 10 - 20, 30 - 40 включил
таймер на минуту 30 сек.
и так далее.
в зависимости от того, какое стекло маллируется, шагов может быть 5, а может 25.
поэтому было принято решение загнать "карту включения ТЭНов" в массив и получая от туда данные, вызывать НУЖНОЕ количество раз рабочее тело с конкретными входными данными.
что бы знать КАКУЮ строку из массива нужно считать нужен СЧЕТЧИК проходов.
не зависимо от того, стоит ли инкримент в блоке, вызывающем рабочую программу, либо в входном / выходном действии пустого блока с TRUE на условии выхода, инкремент происходит :eek: дважды:eek: .
Вот и получается: то ли я дурак, то ли одно из двух :rolleyes:
Суть вопроса была : получить увеличение переменной на ЕДИНИЦУ при прохождении через блок программы SFC.
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:= ....
можно конечно и по два и более символа резервировать на шаг и в хексах и байтах :-)
принято решение загнать "карту включения ТЭНов" в массив и получая от туда данные, вызывать НУЖНОЕ количество раз рабочее тело с конкретными входными данными.
а можно взглянуть в каком виде эта "карта включения ТЭНов"?
а можно взглянуть в каком виде эта "карта включения ТЭНов"?
массив стуктур:
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
в принципе, получил, что хотел, но не так изящно, скорее коряво, но работает.
в принципе, получил, что хотел, но не так изящно, скорее коряво, но работает.
Главное результат. К большому сожалению пока не разобрался с заданием, но раз уже как-то работает то не буду мешать. Удачки ;)
БОЛЬШОЕ спасибо за помощь, за участие!
как бы там не было подтолкнул, а значит помог!
спасибо!
Powered by vBulletin® Version 4.2.3 Copyright © 2024 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot