plcforum.uz.ua

International PLC Forum
It is currently Tue Oct 23, 2018 4:27 am

All times are UTC + 3 hours


Forum rules


Please click here to view the forum rules



Post new topic Reply to topic  [ 8 posts ] 
Author Message
PostPosted: Sat Aug 25, 2018 6:27 pm 

Joined: Mon Apr 18, 2011 12:49 am
Posts: 115
на вид обычный код


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:
#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:
#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 8:32 pm, edited 1 time in total.

Top
 Profile  
 
PostPosted: Sat Aug 25, 2018 6:46 pm 

Joined: Mon Apr 18, 2011 12:49 am
Posts: 115
и STL два прибавляет
чтото делаю не так



Code:
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:

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:
SRQ:= (SET OR SRQ)AND NOT RESET;


Last edited by Oll Bell on Sat Aug 25, 2018 8:29 pm, edited 4 times in total.

Top
 Profile  
 
PostPosted: Sat Aug 25, 2018 7:36 pm 
Site Admin

Joined: Thu Feb 16, 2006 6:25 pm
Posts: 3360
Location: Russia
чем Си отличается от Паскаля ?
Логикой "Защиты от дурака" = это когда заранее объявляются типы и заранее производится инициализация переменных, которые в дальнейшем используются в качестве исходных операндов.
Code:
#actual := #actual+ 1;
IF #actual>= #SET
 THEN #actual:= 0;
не потом инициализируют,
а ранее
Code:
#actual:= 0; // или #actual:= Входное_Значение функции;
....
#actual := #actual+ 1;
IF #actual>= #SET
 THEN #actual:= 0;

в твоём куске кода выделенная локальной переменной #actual память может содержать всё что угодно (h)


Top
 Profile  
 
PostPosted: Sat Aug 25, 2018 7:52 pm 

Joined: Mon Apr 18, 2011 12:49 am
Posts: 115
я как бы в интерфейсе первоначальное значение задал, инициализировал, ноль там.
да, наверное не указал, что FB, но полагал из описания понятно

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

, что это переменная в DB

так должен быть выглядеть код
Code:
#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 8:06 pm, edited 1 time in total.

Top
 Profile  
 
PostPosted: Sat Aug 25, 2018 8:03 pm 

Joined: Mon Apr 18, 2011 12:49 am
Posts: 115
Image
в LOGO работает, я об импульсе, всегда один
ps

создал в FUB, вместо DB для IMPULS использовал меркер, все одно код прибавляет по два.
инетерсно


Top
 Profile  
 
PostPosted: Sat Aug 25, 2018 9:02 pm 
Site Admin

Joined: Thu Feb 16, 2006 6:25 pm
Posts: 3360
Location: Russia
в Портале всё работает как положено... прибавляет по 1 ... если правильно рисовать алгоритм
Image


Top
 Profile  
 
PostPosted: Sat Aug 25, 2018 9:42 pm 

Joined: Mon Apr 18, 2011 12:49 am
Posts: 115
что же у меня не так то? чего не использую? честно не вижу разницы. может по утру осенит
алгоритм с древнего PLC взят, который еще вчера в работе был. говорят мне дали актуальную версию программы.
я так полагаю STL то тот же остался.

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

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

psps
все таки два цикла отрабатывается код. так как следующий код считает только до 1
Code:
#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 Sun Aug 26, 2018 12:07 am, edited 1 time in total.

Top
 Profile  
 
PostPosted: Sun Aug 26, 2018 12:06 am 

Joined: Mon Apr 18, 2011 12:49 am
Posts: 115
все-таки ошибка в коде была.
изменил немного код, добавив static переменную
#IMPULS_old
Code:
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:
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 в ноль


Top
 Profile  
 
Display posts from previous:  Sort by  
Post new topic Reply to topic  [ 8 posts ] 

All times are UTC + 3 hours


Who is online

Users browsing this forum: No registered users and 14 guests


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum

Search for:
Jump to:  
Powered by International PLCforum® Forum Software © PLCforum
Mobile version