Страница 6 из 9 ПерваяПервая ... 45678 ... ПоследняяПоследняя
Показано с 51 по 60 из 86

Тема: Помогите разобраться...

  1. #51
    Пользователь
    Регистрация
    11.01.2009
    Адрес
    Кострома
    Сообщений
    3,144

    По умолчанию

    сопроцессор, это если к примеру на одном ПЛК или ПР выполнять небольшую, критичную ко времени задачу. А на другом соединенном с ним по сети крутить основную программу.
    К примеру при работе с энкодером или управление резкой изделий. Контроллер может иметь время цикла, не обеспечивающее нужную точность позиционирования или размера.

  2. #52
    Пользователь
    Регистрация
    13.08.2012
    Адрес
    Питер
    Сообщений
    127

    По умолчанию

    Цитата Сообщение от lara197a Посмотреть сообщение
    сопроцессор, это если к примеру на одном ПЛК или ПР выполнять небольшую, критичную ко времени задачу. А на другом соединенном с ним по сети крутить основную программу.
    К примеру при работе с энкодером или управление резкой изделий. Контроллер может иметь время цикла, не обеспечивающее нужную точность позиционирования или размера.
    Ага.. Спасибо... Прям кластер получается...

  3. #53
    Пользователь
    Регистрация
    13.08.2012
    Адрес
    Питер
    Сообщений
    127

    По умолчанию

    Цитата Сообщение от capzap Посмотреть сообщение
    я не делал пример под Вас, просто показал работу, что переменная может быть на "верху", т.е. видна всем, а какие то манипуляции с ней могут происходить в функциях, блоках, причем в нутри не надо объявлять ни какие новые переменные, что то им присваивать, делать ошибки, возвращать результат через другую переменную, а конкретно одна переменная отвечает за сохранение результата, если в одном блоке ей что то присвоили, то в других блоках с этой переменной уже будут считатся и по необходимости брать её значение, когда нужно
    Да понятно, что не для меня... Просто начал разбираться - да, если пользовать функцию, все работает. А вот с функциональным блоком получается фигня... Т.е. совсем не получается. Мне нужны ФБ...

    Код:
    ================= Программа ======================
    PROGRAM PLC_PRG
    VAR
    	TTT : INT;
    	RRR : INT;
    	QQQ : INT;
    	WWW : PT;
    END_VAR
    
    TTT := 100;
    RRR := TTT;
    IF DI1 THEN
    	WWW (INP := ADR(TTT));
    	QQQ := WWW.XXX;
    ELSE
    	QQQ := RRR;
    END_IF
    
    ================= ФБ ======================
    FUNCTION_BLOCK PT
    VAR_INPUT
    	INP :POINTER TO INT;
    END_VAR
    VAR_OUTPUT
    	XXX : INT;
    END_VAR
    VAR
    	SSS : INT;
    	I: INT := 0;
    END_VAR
    
    SSS := INP^ +30 ;
    
    IF I < 9 THEN
    	SSS := SSS + 3;
    	I := I+1;
    ELSE
    	XXX := SSS;
    END_IF
    Что-то голова пухнет с непривычки..
    Где-то я написал фигню, а где - не пойму...

  4. #54
    Пользователь
    Регистрация
    13.08.2012
    Адрес
    Питер
    Сообщений
    127

    По умолчанию

    Ладно, оставим указатели в покое. До поры..

    Итак, есть такая программка:
    Код:
    PROGRAM PLC_PRG
    VAR
    	ARR : ARRAY[0..100] OF INT := 
    0, 55, 60, 61, 62, 62, 63, 65, 66, 68, 70, 71, 74, 76,
    79, 81, 84, 87, 91, 94, 98, 102, 106, 110, 115, 119, 124, 
    129, 134, 140, 146, 151, 157, 163, 170, 176, 183, 190, 197, 
    204, 212, 220, 228, 236, 244, 252, 261, 270, 279, 288, 298, 
    307, 317, 327, 337, 347, 358, 369, 380, 391, 402, 413, 425, 
    437, 449, 461, 474, 486, 499, 512, 526, 539, 552, 566, 580,
    594, 609, 623, 638, 653, 668, 683, 699, 714, 730, 746, 763, 
    779, 796, 812, 830, 847, 864, 882, 899, 917, 936, 954, 972, 
    991, 1000;
    	i : INT;
    	TT : WORD;
    END_VAR
    
    IF DI1 THEN
    	IF i <= 100 THEN
    	AO7 := ARR[i];
    	i :=LIMIT(0, i+1, 100);
    	TT := TT+1;
    	END_IF
    ELSE
    	AO7 := ARR[i];
    END_IF
    
    IF DI2  THEN
    	IF i > 0 THEN
    		AO7 := ARR[i];
    		i := i-1;
    	ELSIF i = 0 THEN
    		AO7 := 0;
    	END_IF
    ELSE
    	AO7 := ARR[i];
    END_IF
    В режиме эмуляции работает медленно. На контроллере -мигом. Это понятно. Есть ли какой-нибудь способ сделать вот это
    Код:
    	IF i <= 100 THEN
    	AO7 := ARR[i];
    	i :=LIMIT(0, i+1, 100);
    	TT := TT+1;
    	END_IF
    медленно? Желательно получить регулируемый срок выполнения...

  5. #55
    Пользователь
    Регистрация
    13.10.2011
    Адрес
    Златоуст
    Сообщений
    1,021

    По умолчанию

    Там что, плавное затухание? Жуть какая. Всё укладывается в две строчки:
    Код:
    VAR
    	PrevScanTimestamp: TIME;
    END_VAR
    
    AO1 := LIMIT(0, AO1 + TIME_TO_REAL(TIME() - PrevScanTimestamp) * 0.008 * (BOOL_TO_REAL(DI1) - BOOL_TO_REAL(DI2)), 10);
    PrevScanTimestamp := TIME();
    А если в конфигурацию добавить модуль Statistics и там сделать переменную CycleTime, то можно обойтись одной строкой:
    Код:
    AO1 := LIMIT(0, AO1 + CycleTime * 0.0016 * (BOOL_TO_REAL(DI1) - BOOL_TO_REAL(DI2)), 10);
    Скорость возрастания и затухания регулируется числовой константой. На входе только кнопки DI1/2, на выходе AO1.
    Последний раз редактировалось Yegor; 25.09.2012 в 09:06.

  6. #56
    Пользователь
    Регистрация
    13.08.2012
    Адрес
    Питер
    Сообщений
    127

    По умолчанию

    Цитата Сообщение от Yegor Посмотреть сообщение
    Там что, плавное затухание? Жуть какая. Всё укладывается в две строчки
    Ай, спасибо, Аболит!

    Только не совсем понимаю, как это работает...

  7. #57
    Пользователь
    Регистрация
    13.10.2011
    Адрес
    Златоуст
    Сообщений
    1,021

    По умолчанию

    как это работает
    Я упрощу, чтобы вы поняли:
    Код:
    AO1 := AO1 + 0.001 * (BOOL_TO_REAL(DI1) - BOOL_TO_REAL(DI2));
    Выражение в скобках даёт −1, 0 или +1 в зависимости от того, какие кнопки нажаты. В общем-то, больше объяснять тут и нечего. В полном варианте вводится поправка на длительность цикла чтобы от неё не было зависимости.

    Или вы даже не знаете, что в ПЛК ваша программа крутится в бесконечном цикле с периодичностью около 1-50 мс? Тормозить поток, как это делается в прикладном программировании, на контроллерах не принято. Ну а в симуляторе периодичность исполнения программы гораздо реже.

  8. #58
    Пользователь
    Регистрация
    13.08.2012
    Адрес
    Питер
    Сообщений
    127

    По умолчанию

    Цитата Сообщение от Yegor Посмотреть сообщение
    Я упрощу, чтобы вы поняли:
    Код:
    AO1 := AO1 + 0.001 * (BOOL_TO_REAL(DI1) - BOOL_TO_REAL(DI2));
    Выражение в скобках даёт −1, 0 или +1 в зависимости от того, какие кнопки нажаты. В общем-то, больше объяснять тут и нечего. В полном варианте вводится поправка на длительность цикла чтобы от неё не было зависимости.

    Или вы даже не знаете, что в ПЛК ваша программа крутится в бесконечном цикле с периодичностью около 1-50 мс? Тормозить поток, как это делается в прикладном программировании, на контроллерах не принято. Ну а в симуляторе периодичность исполнения программы гораздо реже.
    Про большой цикл я в курсе... Только пока не совсем освоил, как им пользоваться... Я до этого только всякие shell да perl пользовал по мелочи...
    В этой ветке, малость выше, я пытался научиться просто сохранять значение переменной "в стороне". Пока неудачно...

    Я так понял, что конструкция "TIME_TO_REAL(TIME() - PrevScanTimestamp)" просто вычилсяет время цикла?

  9. #59
    Пользователь
    Регистрация
    13.10.2011
    Адрес
    Златоуст
    Сообщений
    1,021

    По умолчанию

    Я так понял, что конструкция "TIME_TO_REAL(TIME() - PrevScanTimestamp)" просто вычилсяет время цикла?
    Да, в миллисекундах.

  10. #60
    Пользователь
    Регистрация
    13.08.2012
    Адрес
    Питер
    Сообщений
    127

    По умолчанию

    Итак, очередной отвал башки...
    Вот такая программка работает:
    Код:
    ======================================================
    PROGRAM PLC_PRG
    VAR
    	i : INT;
    	ARR : ARRAY[0..10] OF INT := 0,100,200,300,400,500,600,700,800,900,1000;
    	PrevScanTimestamp: TIME;
    	Speed_Reg : REAL := 0.08;
    	Limit_Reg : INT := 10;
    	btn_up: BOOL;
    	btn_dn: BOOL;
    END_VAR
    
    btn_up := DI1;
    btn_dn := DI2;
    IF i <= Limit_Reg THEN
    	i := LIMIT(0, i + REAL_TO_INT(TIME_TO_REAL(TIME() - PrevScanTimestamp) * Speed_Reg * (BOOL_TO_REAL(btn_up) - BOOL_TO_REAL(btn_dn))), Limit_Reg);
    	PrevScanTimestamp := TIME();
    	AO7 := ARR[i];
    ELSIF (i=0 AND btn_dn) THEN
    	AO7 := ARR[0];
    ELSE
    	AO7 := ARR[i];
    END_IF
    ===================================================
    Т.е. при нажатии DI1, АО7 медленно растет до 1000.

    А вот такая - уже не работает:
    Код:
    ===================================================
    PROGRAM PLC_PRG
    VAR
    	ARR : ARRAY[0..10] OF INT := 0,100,200,300,400,500,600,700,800,900,1000;
    	TT : INT;
    END_VAR
    
    TT := dim(btn_up:=DI1,btn_dn:=DI2,Speed_Reg:=0.08,Limit_Reg:=100);
    AO7 := ARR[TT];
    
    
    FUNCTION DIM : INT
    VAR_INPUT
    	btn_up: BOOL;
    	btn_dn: BOOL;
    	Speed_Reg : REAL;
    	Limit_Reg : INT;
    END_VAR
    VAR
    	i : INT;
    	PrevScanTimestamp: TIME;
    END_VAR
    
    IF i <= Limit_Reg THEN
    	i := LIMIT(0, i + REAL_TO_INT(TIME_TO_REAL(TIME() - PrevScanTimestamp) * Speed_Reg * (BOOL_TO_REAL(btn_up) - BOOL_TO_REAL(btn_dn))), Limit_Reg);
    	PrevScanTimestamp := TIME();
    	dim := i;
    ELSIF (i=0 AND btn_dn) THEN
    	dim := 0;
    ELSE
    	dim := i;
    END_IF
    ===================================================
    Т.е. все, что я сделал - это вынес регулировку в функцию...

    Подозреваю, что все дело опять в злосчастном "глобальном цикле" - т.е. при нажатии DI1 функция отрабатывает, только почему-то мгновенно - без плавного возрастания(почему?), а поскольку у ф-ции нет мозгов, то бишь памяти, то при отпускании кнопки, все пропадает...


    З.Ы. Ради интереса попробовал вместо ф-ции использовать ФБ - работает как надо... =\
    Последний раз редактировалось kosmas; 26.09.2012 в 09:17.

Страница 6 из 9 ПерваяПервая ... 45678 ... ПоследняяПоследняя

Похожие темы

  1. помогите разобраться
    от Барон в разделе ПЛК1хх
    Ответов: 16
    Последнее сообщение: 17.11.2010, 08:30
  2. помогите разобраться
    от a_l_e_x в разделе ПЛК1хх
    Ответов: 3
    Последнее сообщение: 02.07.2010, 16:51
  3. Помогите разобраться...
    от xaker_tm в разделе ПЛК1хх
    Ответов: 7
    Последнее сообщение: 08.02.2010, 17:33
  4. ТРМ 12, помогите разобраться.
    от SEREG@ в разделе Эксплуатация
    Ответов: 3
    Последнее сообщение: 12.01.2009, 14:21
  5. Помогите разобраться !!
    от viking в разделе ПЛК1хх
    Ответов: 4
    Последнее сообщение: 21.11.2007, 14:31

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •