Страница 7 из 9 ПерваяПервая ... 56789 ПоследняяПоследняя
Показано с 61 по 70 из 86

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

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

    По умолчанию

    Цитата Сообщение от capzap Посмотреть сообщение
    указатели спасут мир
    Мир - может быть.. Но не меня...

    Я в функцию передаю булевые значени, а получаю INT.
    Попробовал сделать тип ф-ции как POINTER TO INT, теперь не понимаю, как получить значение... =\
    Код:
    ===================================
    PROGRAM PLC_PRG
    VAR
      TT : POINTER TO INT;
      RR : INT;
    END_VAR
    
    TT := QQ(INPUT:=DI1);
    
    RR := ??? что должно быть тут - непонятно пока... :(
    
    ===================================
    FUNCTION QQ : POINTER TO INT
    VAR_INPUT
     INPUT : BOOL;
    END_VAR
    VAR
     II : INT;
    END_VAR
    
    IF INPUT THEN
     QQ^ := 125;
    END_IF
    ===================================
    Цитата Сообщение от capzap Посмотреть сообщение
    Все что надо сохранять в функции делайте указателями или глобальными переменными
    Глобальные переменные в ф-циях вроде как моветон, хотя и допускаются.. Или я не прав?

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

    По умолчанию

    Я не пойму, к чему вот это и подобное надо городить:
    Код:
    ======================================================
    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
    ===================================================
    Зачем там этот массив нужен, ей богу? Почему нельзя так?
    Код:
    PROGRAM PLC_PRG
    VAR
    	PrevScanTimestamp: TIME;
    	Speed_Reg : REAL := 0.08;
    	Limit_Reg : INT := 10;
    END_VAR
    
    AO7 := LIMIT(0, AO7 + REAL_TO_INT(TIME_TO_REAL(TIME() - PrevScanTimestamp) * Speed_Reg * (BOOL_TO_REAL(DI1) - BOOL_TO_REAL(DI2))), Limit_Reg);
    PrevScanTimestamp := TIME();
    М?

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

    По умолчанию

    Цитата Сообщение от capzap Посмотреть сообщение
    весь прикол что если по моему, то в функцию надо передать указатель на инт, а про выход функции вообще забыть, пусть там будет буль
    Все. Мысль остановилась. Это как???

    Я просто хотел этот кусок
    Код:
    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);
    вынести в функицию. Потому, что он мне нужен будет с разными значениями Speed_Reg, Limit_Reg, btn_up, btn_dn. Выход-то все равно один - i, нужный для получения индекса массива.
    И вот это самое i, я хочу периодически сохранять, для чего и затеял функцию.. С ФБ пока не научился...

    Цитата Сообщение от Yegor Посмотреть сообщение
    Я не пойму, к чему вот это и подобное надо городить:Зачем там этот массив нужен, ей богу? Почему нельзя так?
    Это я для примера сюда впихнул кусок...
    Весь цимес - в массиве. Он на самом деле большой и нелинейный -там забиты значения квадратичной ф-ции.. А сделано это для облегчения жизни контроллера - этот массив один раз посчитал, и все. Зачем его каждый раз пересчитывать?

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

    По умолчанию

    Цитата Сообщение от capzap Посмотреть сообщение
    можно же не только входные указатели объявлять но и результирующие
    Вот я и спросил, как получить значение по указателю...
    PROGRAM PLC_PRG
    VAR
    TT : POINTER TO INT;
    RR : INT;
    END_VAR

    TT := QQ(INPUT:=DI1); (*QQ возвращает POINTER TO INT*)

    RR := ??? что должно быть тут - непонятно пока...

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

    По умолчанию

    Весь цимес - в массиве. Он на самом деле большой и нелинейный -там забиты значения квадратичной ф-ции.. А сделано это для облегчения жизни контроллера - этот массив один раз посчитал, и все. Зачем его каждый раз пересчитывать?
    Не та сложность вычислений, чтобы прибегать к таблицам поиска. По-моему, здесь лучше на лету считать.

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

    По умолчанию

    Цитата Сообщение от Yegor Посмотреть сообщение
    По-моему, здесь лучше на лету считать.
    Други! А бывает такое, что в эмуляторе работает, а в контроллере - нет?
    Вот с приложенным проектом такая бодяга случилась... А почему - не пойму...
    Вложения Вложения
    • Тип файла: rar arr.rar (12.8 Кб, Просмотров: 8)

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

    По умолчанию

    Вместо всего этого...
    Код:
    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);
    	AO7 := ARR[i];
    ELSIF (i=0 AND btn_dn) THEN
    	AO7 := ARR[0];
    ELSE
    	AO7 := ARR[i];
    END_IF
    PrevScanTimestamp := TIME();
    Надо писать так:
    Код:
    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);
    AO7 := ARR[i];
    PrevScanTimestamp := TIME();
    Остальной код ничего не делает. Если вы не нажимаете ни одну кнопку, второе слагаемое будет нулём и i будет постоянным. Когда вы упрётесь в Limit_reg или в нуль, i всё равно не выпрыгнет за пределы, т.к. там функция LIMIT. Попробуйте исправленный вариант и сообщите результаты.

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

    По умолчанию

    Цитата Сообщение от Yegor Посмотреть сообщение
    Попробуйте исправленный вариант и сообщите результаты.
    Попробовал, сообщаю - не работает..

    ЗЫ. F5 жму со страшной силой...
    Вложения Вложения
    • Тип файла: rar arr.rar (12.8 Кб, Просмотров: 4)

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

    По умолчанию

    Цитата Сообщение от capzap Посмотреть сообщение
    не хотите уточнить, какой способ Вы сейчас используете, реакция быстрых входов несколько отличается от обычных, если сейчас используется энкодер, то причина нерабоающей программы возможно в этом
    Большое спасибо за пример с таймингами... Только я не понял, зачем
    Код:
    isnan: ARRAY [0..3] OF BYTE:=0,0,128,127;
    - вроде нигде не фигурирует в текстах...

    В данный момент прикрутил следующие костыли:
    Код:
    (* Плавное включение полного света *)
    IF Full THEN
    	IF Count_R < 100 THEN
    		RRR := RRR + 0.2;
    		Count_R := REAL_TO_INT(RRR);
    	ELSE
    		Full := FALSE;
    		RRR := 0;
    	END_IF
    END_IF
    Как поведет себя эта конструкция, если контроллер будет нагружен - вопрос. Сейчас, на одной лампе - работает достаточно плавно...

    Что касается неработающего примера - то там энкодер не использую - просто кнопки. И энкодер прикручен к обычным входах, не быстрым...

    Да, насколько я понял, в тайминге скорость нарастания\ падения регулируется tik(IN:=NOT tik.Q, PT:=T#50ms); Так?

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

    По умолчанию

    Цитата Сообщение от capzap Посмотреть сообщение
    переменная осталась как бонус, она нужна для реалов и то не во всех случаях, тем более в проге их нет.
    По поводу таймера, можно еще связать его период с длительностью удержания кнопок, но это должна быть другая прога без массива
    Может в проге и нет, но без нее не работает... Мистика... Требую пояснений!

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

Похожие темы

  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

Ваши права

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