Указатель на функцию?

На этом форуме Вы можете задать вопросы знатокам программы и автору.
Ответить
igee
Рядовой
Сообщения: 57
Зарегистрирован: 08.06.2016{, 09:15}
Репутация: 0
Откуда: Санкт-Петербург

Указатель на функцию?

#1

Сообщение igee » 07.03.2017{, 13:55}

Всем привет!
Собственно вопрос как? Если объявить указатель во вкладке Declare, то FLProg будет считать этот блок некорректным, если попытаться создать его как функцию - FLProg ругнется, что не тот формат и тоже не даст это сделать.... тупик?

Аватара пользователя
slavas
Лейтенант
Сообщения: 595
Зарегистрирован: 14.09.2015{, 22:29}
Репутация: 1
Откуда: Санкт-Петербург

Указатель на функцию?

#2

Сообщение slavas » 07.03.2017{, 14:49}

покажите что пытаетесь сделать

igee
Рядовой
Сообщения: 57
Зарегистрирован: 08.06.2016{, 09:15}
Репутация: 0
Откуда: Санкт-Петербург

Указатель на функцию?

#3

Сообщение igee » 07.03.2017{, 16:56}

Собственно пытаюсь реализовать нумпад, который бы менял значение переменных в контроллере при вводе их на дисплее. Есть несколько экранов. Переходы между экранами сделаны в виде простеньких функций типа

Код: Выделить всё

void page1()
{
    page1.show();//-->команда дисплею
    delay(100);
    current_screen=1;//переменная с номером экрана
}
Экранов энное количество. На экране №5, есть, например, параметр "температура" в качестве уставки, которую мы задаем с дисплея. То есть есть кнопочка "Температура" и текстовое поле со значением этой температуры. К кнопке "температура" привязана функция перехода, которая перекидывает нас на экран нумпада (и, забегая вперед, к которой хотелось бы привязать указатель), где мы вводим значение, затем нажимаем кнопку "Ввод". Кнопка "ввод", помимо прочего, должна вернуть нас на экран №5. Т.к. на экран нумпада мы переходим не только с экрана №5, но так же и с №6 и №7, то кнопка "ввод" должна понимать куда нас вернуть. Один из вариантов, как ей дать понять куда нас возвращать, это в функцию перехода добавить переменную page, в которую мы поместим номер страницы с которой переходим, а в функцию, привязанную к кнопке "ввод"  вставить, например свич

Код: Выделить всё

switch(page)
    case 1:
       page1();
    break;
    case 2:
        page2();
    break;
    ...
    case n:
        pagen();
    break;
который будем править, каждый раз при изменении количества страниц проекта. Согласитесь, бяка?
Поэтому  было бы хорошо объявить указатель


Код: Выделить всё

void (*pageOpen)(void)
поместить  его в функцию кнопки "температура", которая перекидывает нас на нумпад.

Код: Выделить всё

void setTemp()
{
    pageNumpad.show();//-->команда дисплею
    current_screen=10;//переменная с номером экрана
    pageOpen = page5;// указатель на функцию, которая откроет страницу 5 с температурой
}
и тогда уже в функцию кнопки "ввод", не надо будет втыкать неудобный свич, а достаточно будет указать


Код: Выделить всё

(*pageOpen );
Так вот проблема в том, что в блоке CODE не получается объявить указатель. Как я и писал выше.

Добавлено (07.03.2017, 16:56)
---------------------------------------------
В общем пока что выход: добавить во вкладке Declare закомментированное объявление указателя, а после компиляции в IDE удалить комментарий. Напишу в новый функционал хотелку.
Последний раз редактировалось igee 07.03.2017{, 15:59}, всего редактировалось 1 раз.

Аватара пользователя
slavas
Лейтенант
Сообщения: 595
Зарегистрирован: 14.09.2015{, 22:29}
Репутация: 1
Откуда: Санкт-Петербург

Указатель на функцию?

#4

Сообщение slavas » 07.03.2017{, 17:16}

А с блоком меню встроенным не прще будет?

igee
Рядовой
Сообщения: 57
Зарегистрирован: 08.06.2016{, 09:15}
Репутация: 0
Откуда: Санкт-Петербург

Указатель на функцию?

#5

Сообщение igee » 07.03.2017{, 19:41}

Я с ним особо не разбирался, если честно, но если я правильно понимаю, то он для строковых дисплеев. А у меня Nextion.

Аватара пользователя
Олег
Полковник
Сообщения: 1532
Зарегистрирован: 13.10.2015{, 16:47}
Репутация: 63
Контактная информация:

Указатель на функцию?

#6

Сообщение Олег » 08.03.2017{, 01:23}

А зачем вы функции Nextion хотите передать контроллеру? Или я что-то не так понял? Если так, то у вас контроллер только на дисплей работать будет.

igee
Рядовой
Сообщения: 57
Зарегистрирован: 08.06.2016{, 09:15}
Репутация: 0
Откуда: Санкт-Петербург

Указатель на функцию?

#7

Сообщение igee » 08.03.2017{, 14:39}

Эмм.. видимо что то не так.  Функции Nextion я передаю c Ардуины на Nextion.  pageNumpad.show(); - это библиотечная команда для отображения страницы, которую мы объявили в Declare: NexPage pageNumpad = NexPage (10,0,"pageNumpad")

Аватара пользователя
Олег
Полковник
Сообщения: 1532
Зарегистрирован: 13.10.2015{, 16:47}
Репутация: 63
Контактная информация:

Указатель на функцию?

#8

Сообщение Олег » 08.03.2017{, 14:48}

Не понимаю зачем с ардуины говорить Nextion какую ему страницу открыть, если все это делается внутри Nextion, а в Ардуино отправляется только значение переменной, введенной с клавиатуры в Nextion.

igee
Рядовой
Сообщения: 57
Зарегистрирован: 08.06.2016{, 09:15}
Репутация: 0
Откуда: Санкт-Петербург

Указатель на функцию?

#9

Сообщение igee » 08.03.2017{, 15:06}

В вашей схеме получается, что ардуина слейв. А мне нужно чтобы он был мастером. Ардуина говорит что делать - дисплей только делает.

Аватара пользователя
Олег
Полковник
Сообщения: 1532
Зарегистрирован: 13.10.2015{, 16:47}
Репутация: 63
Контактная информация:

Указатель на функцию?

#10

Сообщение Олег » 08.03.2017{, 15:44}

Ардуино мастер, он опрашивает Nextion на вопрос содержания переменной и получает ответ, а вот изменения переменной лежит на самом Nextion. Просто любопытно какя острая необходимость использовать тощие ресурсы Ардуино, если это можно сделать средствами панели?

Аватара пользователя
Boroda
Капитан
Сообщения: 836
Зарегистрирован: 01.05.2016{, 01:04}
Репутация: 38
Откуда: Коломна
Имя: Станислав
Контактная информация:

Указатель на функцию?

#11

Сообщение Boroda » 08.03.2017{, 15:49}

igee, всегда было и будет: HMI - мастер, Скада - мастер, контроллер - слейв. Потому как система отображения и управления запрашивает у слейва только те регистры, данные о которых сейчас отображаются, может посылать слейву команды записи уставок и т.д, слейв этого не может.

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

igee
Рядовой
Сообщения: 57
Зарегистрирован: 08.06.2016{, 09:15}
Репутация: 0
Откуда: Санкт-Петербург

Указатель на функцию?

#12

Сообщение igee » 08.03.2017{, 17:28}

Может быть я путаю понятия мастер - слейв?) В связке ардуино - дисплей. Пример: на дисплее страница на которой отображается температура. Ардуина видит изменение температуры на датчике, и отправляет на дисплей команду изменить содержание текстового поля со значением температуры. В этом случае она действует же как мастер? Дисплей же не ведет при этом постоянный опрос значения переменной температуры. Другая ситуация, когда мы нажимаем кнопку на дисплее. Тут ардуина "слушает" последовательный порт и уже реагирует на команды, которые там появляются. Тут вроде как ардуина слейв.  Где я ошибаюсь и как это классифицировать?

Аватара пользователя
Олег
Полковник
Сообщения: 1532
Зарегистрирован: 13.10.2015{, 16:47}
Репутация: 63
Контактная информация:

Указатель на функцию?

#13

Сообщение Олег » 08.03.2017{, 18:18}

Boroda писал(а):igee, всегда было и будет: HMI - мастер, Скада - мастер, контроллер - слейв
 Я не большой знаток архитектуры, но мне кажется что при использовании стандартных блоков Nextion в FLProg Ардуино выступает мастером. Все блоки имеют входы Get или Send  и только от ардуино зависит принять-отдать данные в панель, или нет. 
 По идее контроллер всегда должен быть мастером, так-как он делает основную работу, а HMI и Scada это всего лишь вспомогательные функции по установке параметров и отображению информации.
 Хотя это наверно от ревльной реализации зависит.

Аватара пользователя
Boroda
Капитан
Сообщения: 836
Зарегистрирован: 01.05.2016{, 01:04}
Репутация: 38
Откуда: Коломна
Имя: Станислав
Контактная информация:

Указатель на функцию?

#14

Сообщение Boroda » 08.03.2017{, 22:41}

Олег, да, контроллер управляет оборудованием, но все отображатели у контроллера сами запрашиваю информацию, а не контроллер их опрашивает. Так же при изменении уставки на панели, панель отправляет контроллеру эту информацию. При включении питания, переменные в панели нулевые, она заполняет их опросив контроллер. Вообще панели оператора довольно трудно перевести в Слейв режим, а в большинстве случаев это вообще невозможно. Как обстоят дела с Некстион, не знаю, руками ее не щупал.

Ответить

Вернуться в «Спросить у знатоков»