Страница 1 из 1

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

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

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

Добавлено: 07 мар 2017, 14:49
slavas
покажите что пытаетесь сделать

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

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

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

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 удалить комментарий. Напишу в новый функционал хотелку.

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

Добавлено: 07 мар 2017, 17:16
slavas
А с блоком меню встроенным не прще будет?

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

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

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

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

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

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

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

Добавлено: 08 мар 2017, 14:48
Олег
Не понимаю зачем с ардуины говорить Nextion какую ему страницу открыть, если все это делается внутри Nextion, а в Ардуино отправляется только значение переменной, введенной с клавиатуры в Nextion.

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

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

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

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

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

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

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

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

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

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

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

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

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