TIA 15, SCL прибавляет два вместо ожидаемой еденицы

Промышленные Логические Контроллеры SIMATIC S7-200/300/400
Oll Bell
Posts: 118
Joined: Sun Apr 17, 2011 9:49 pm

TIA 15, SCL прибавляет два вместо ожидаемой еденицы

Post by Oll Bell »

на вид обычный код


IMPULS - bool Input
INPUT1 bool Input
INPUT2 bool Input

OUT bool OUT не InputOut
actual - INT static
SET - INT static

NOP1 - INT temp
NOP0- INT Constant

если присутствуют IMPUT1 или IMPUT2 и к ним IMPULS
то увеличиваем actual на еденицу. Как только actual станет равной SET или более SET
то обнуляем actual и инвертируем выход OUT

Code: Select all

#temp := ( #INPUT1 OR  #INPUT2) AND  DB.actual;

CASE BOOL_TO_INT(#temp) OF
    0:
        #NOP1:= #NOP0;
    1:
        DB.actual := DB.actual+ 1;
        IF DB.actual>= #SET THEN
            DB.actual:= 0;
            #OUT:= NOT #OUT;
        END_IF;
END_CASE;

да и так двойку прибавляет

Code: Select all

#temp := ( #INPUT1 OR  #INPUT2) AND  DB.actual;
IF #temp THEN
           DB.actual:= DB.actual+1;
            
        END_IF;


IF DB.actual>= #SET THEN
            DB.actual:= 0;
            #OUT:= NOT #OUT;
        END_IF;

Last edited by Oll Bell on Sat Aug 25, 2018 5:32 pm, edited 1 time in total.
Oll Bell
Posts: 118
Joined: Sun Apr 17, 2011 9:49 pm

Re: TIA 15, SCL прибавляет два вместо ожидаемой еденицы

Post by Oll Bell »

и STL два прибавляет
чтото делаю не так


Code: Select all

AN #INPUT1
AN #INPUT2
ON #IMPULS
JC M001

L DB.actual
L+1
+I
T DB.actual
L #SET
<I
JC m001

L+0
T DB.actual
AN #Out
= #Out

M001: BE

ps
или IMPULS два цикла живет?
счетчик по одному импмульсу считает

как можно посмотреть как долго импульс живет

SRQ - bool static, выход SR триггера
DB.Init_IMPULS_он_же_RESET - bool обычный сигнал "TRUE "инициатор импульса, а инвертированный является сбросом для SR
DB.IMPULS - bool получаемый импульс записываемый в DB


это SR-тригер на вход которого действуетт получамый IMPULS

Code: Select all


DB.IMPULS:= NOT #SRQ AND DB.Init_IMPULS_он_же_RESET;

#SRQ:= (DB.IMPULS OR #SRQ) AND DB.Init_IMPULS_он_же_RESET;
короткое время IMPULS действует на вход триггера, который своим инвертировыным выходом
сбрасывает IMPULS в FALSE, триггер остается взведенным до исчезания RESET

исходил из того,что обычный SR триггер

Code: Select all

SRQ:= (SET OR SRQ)AND NOT RESET;
Last edited by Oll Bell on Sat Aug 25, 2018 5:29 pm, edited 4 times in total.
CoMod
Site Admin
Posts: 3992
Joined: Thu Feb 16, 2006 3:25 pm
Location: Russia

Re: TIA 15, SCL прибавляет два вместо ожидаемой еденицы

Post by CoMod »

чем Си отличается от Паскаля ?
Логикой "Защиты от дурака" = это когда заранее объявляются типы и заранее производится инициализация переменных, которые в дальнейшем используются в качестве исходных операндов.

Code: Select all

#actual := #actual+ 1;
IF #actual>= #SET
 THEN #actual:= 0;
не потом инициализируют,
а ранее

Code: Select all

#actual:= 0; // или #actual:= Входное_Значение функции;
....
#actual := #actual+ 1;
IF #actual>= #SET
 THEN #actual:= 0;
в твоём куске кода выделенная локальной переменной #actual память может содержать всё что угодно (h)
Oll Bell
Posts: 118
Joined: Sun Apr 17, 2011 9:49 pm

Re: TIA 15, SCL прибавляет два вместо ожидаемой еденицы

Post by Oll Bell »

я как бы в интерфейсе первоначальное значение задал, инициализировал, ноль там.
да, наверное не указал, что FB, но полагал из описания понятно

и не верно код привел :shock: я о знаке #ю я не копипасте использовал, а писал.
сокращал непонятные для других названия
это не локальная, в описании я указал
actual - INT static
, что это переменная в DB

так должен быть выглядеть код

Code: Select all

#temp := ( #INPUT1 OR  #INPUT2) AND  #IMPULS;
IF #temp THEN
            DB.actual:= DB.actual +1;
            
        END_IF;


IF DB.actual>= #SET THEN
            DB.actual:= 0;
            #OUT:= NOT #OUT;
        END_IF;
сейчас проверяю создание импулься . мне кажется два цикла живет.
Last edited by Oll Bell on Sat Aug 25, 2018 5:06 pm, edited 1 time in total.
Oll Bell
Posts: 118
Joined: Sun Apr 17, 2011 9:49 pm

Re: TIA 15, SCL прибавляет два вместо ожидаемой еденицы

Post by Oll Bell »

Image
в LOGO работает, я об импульсе, всегда один
ps

создал в FUB, вместо DB для IMPULS использовал меркер, все одно код прибавляет по два.
инетерсно
CoMod
Site Admin
Posts: 3992
Joined: Thu Feb 16, 2006 3:25 pm
Location: Russia

Re: TIA 15, SCL прибавляет два вместо ожидаемой еденицы

Post by CoMod »

в Портале всё работает как положено... прибавляет по 1 ... если правильно рисовать алгоритм
Image
Oll Bell
Posts: 118
Joined: Sun Apr 17, 2011 9:49 pm

Re: TIA 15, SCL прибавляет два вместо ожидаемой еденицы

Post by Oll Bell »

что же у меня не так то? чего не использую? честно не вижу разницы. может по утру осенит
алгоритм с древнего PLC взят, который еще вчера в работе был. говорят мне дали актуальную версию программы.
я так полагаю STL то тот же остался.

Испульс проверил, один дается.

счетчик и у меня один импульс фиксирует, а код два прибавляет

psps
все таки два цикла отрабатывается код. так как следующий код считает только до 1

Code: Select all

#temp := ( #INPUT1 OR  #INPUT2) AND  #IMPULS;
IF #temp THEN
           DB.actual:= DB.actual+1;
           DB.actual:=ROUND_INT (DB.actual / 2);
            
        END_IF;


IF DB.actual>= #SET THEN
            DB.actual:= 0;
            #OUT:= NOT #OUT;
        END_IF;
DB.actual:= DB.actual+1; здесь после 0 на всегда 1 остается
DB.actual:=ROUND_INT (DB.actual / 2); - а здесь 0 и не меняется

надеюсь что симулятор так отрабатывает
Last edited by Oll Bell on Sat Aug 25, 2018 9:07 pm, edited 1 time in total.
Oll Bell
Posts: 118
Joined: Sun Apr 17, 2011 9:49 pm

Re: TIA 15, SCL прибавляет два вместо ожидаемой еденицы

Post by Oll Bell »

все-таки ошибка в коде была.
изменил немного код, добавив static переменную
#IMPULS_old

Code: Select all

IF  ( #INPUT1 OR  #INPUT2) AND (#IMPULS AND NOT #IMPULS_old) THEN
DB.actual:= DB.actual+1;
END_IF;
#IMPULS_old:=#IMPULS

IF DB.actual>= #SET THEN
            DB.actual:= 0;
            #OUT:= NOT #OUT;
        END_IF;

странно, я использовал в "эксперементах" внешние определители переднего фронта перед входом FB , проблема не исчезала.

и все одно не понятно, temp переменная живет один цикл, пробовал ее инициализировать вначале и и в конце блока

отчего двойной счет?

ps
двойной и должен быть, переменная живет цикл да, а условие, в которм IMPULS, два.
Тоесть внешние определители фронта не смогут помочь

Code: Select all

DB.IMPULS:= NOT #SRQ AND DB.Init_IMPULS_он_же_RESET;

#SRQ:= (DB.IMPULS OR #SRQ) AND DB.Init_IMPULS_он_же_RESET;
в первом цикле DB.Init_IMPULS_он_же_RESET взводит "через" DB.IMPULS SR триггер
а во втором цикле #SRQ запирает, скидывает DB.IMPULS в ноль