Страница 129 из 275 ПерваяПервая ... 2979119127128129130131139179229 ... ПоследняяПоследняя
Показано с 1,281 по 1,290 из 3054

Тема: CODESYS V3.5. Визуализация

Комбинированный просмотр

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #1
    Пользователь Аватар для DenisV
    Регистрация
    20.11.2020
    Адрес
    Санкт-Петербург
    Сообщений
    96

    По умолчанию

    А из кода программы возможно менять спецификатор? Что-нибудь в духе %.iF, где i - переменная int

  2. #2
    Супер Модератор Аватар для Евгений Кислов
    Регистрация
    27.01.2015
    Адрес
    Москва
    Сообщений
    14,014

    По умолчанию

    Цитата Сообщение от DenisV Посмотреть сообщение
    А из кода программы возможно менять спецификатор? Что-нибудь в духе %.iF, где i - переменная int
    Нет, но можно в коде строку сформировать по нужным вам правилам и отдавать на визуализацию уже её.

  3. #3
    Пользователь Аватар для DenisV
    Регистрация
    20.11.2020
    Адрес
    Санкт-Петербург
    Сообщений
    96

    По умолчанию

    Цитата Сообщение от Евгений Кислов Посмотреть сообщение
    Нет, но можно в коде строку сформировать по нужным вам правилам и отдавать на визуализацию уже её.
    Хорошо, спасибо!

  4. #4

    По умолчанию

    что касается чисто отображения можно сделать немного по-другому, используя динамические тексты для текстового поля:
    создать динамический лист для переменной вида:
    id текст
    0 - %d //отображение без цифр после запятой
    1 - %.1f // с одним знаком после запятой
    2 - %.2f // 2
    3 - %.3f // 3
    и т.д.

    Только потребуется присвоить для каждого текстового поля переменную с типом отображения и добавить некоторый обработчик в код программы - условия выбора того или иного отображения.

    Что касается появления некоторого 'приращения' у значения, это связано с кодированием типа REAL, также сталкивался с подобным.
    Собс-но с этим же связаны трудности сравнения переменных REAL на равенство, рекомендуется (кажется это было у OSCAT) сравнивать через некотрую дельту, а не в лоб.
    Т.е. код ниже не корректен, т.к. возможны отличия в последних значащих знаках и условие никогда не выполнится (при этом при отладке может казаться что все ок, будет отображаться как будто два одинаковых числа)
    rTmp1 :REAL;
    rTmp2 :REAL;

    IF rTmp1 = rTmp2 <...>

    Соот-но рекомендуется в этом случае сравнивать таким образом

    IF ABS(rTmp1 - rTmp2) < 0000.1 <...> // дельта в зависимости от требуемой точности
    Последний раз редактировалось IgnatTali; 08.07.2021 в 15:54.

  5. #5

    По умолчанию

    Добрый день!

    Есть главная визуализация Visualisation, на ней элемент Набор вкладок (3 вкладки, соответственно, на каждой по визуализации: Visu1, Visu2, Visu3). Переменная VisuElems.CURRENTVISU в любом случае, независимо от того, какая вкладка, принимает значение 'Visualisation'.

    Существует ли способ из программы узнать, какая вкладка активна? Без использования переменной-переключателя.

  6. #6
    Супер Модератор Аватар для Евгений Кислов
    Регистрация
    27.01.2015
    Адрес
    Москва
    Сообщений
    14,014

    По умолчанию

    Цитата Сообщение от GoodLuck Посмотреть сообщение
    Добрый день!

    Есть главная визуализация Visualisation, на ней элемент Набор вкладок (3 вкладки, соответственно, на каждой по визуализации: Visu1, Visu2, Visu3). Переменная VisuElems.CURRENTVISU в любом случае, независимо от того, какая вкладка, принимает значение 'Visualisation'.

    Существует ли способ из программы узнать, какая вкладка активна? Без использования переменной-переключателя.
    Добрый день.
    Для начала потребуется получить контекст клиента (pClientData) - см. этот пример:
    https://ftp.owen.ru/CoDeSys3/21_Exam...projectarchive

    После этого в программе:

    Код:
    VAR
        itfFrameManager: VisuElems.VisuElemBase.IFrameManager;
        aiCurrentFrameIndex: ARRAY [1..VISU_MAX_NUMBER_OF_CLIENTS] OF INT; // индексы текущих экранов фреймов для всех клиентов
    END_VAR
    
    
    
    itfFrameManager := VisuElems.VisuElemBase.g_VisuManager.GetFrameManager(); 
    
    FOR := 1 TO VISU_MAX_NUMBER_OF_CLIENTS DO
    
        aiCurrentFrameIndex[i] := itfFrameManager.GetSelectedVisu('MyVisu.MyFrameName', apClientData[i]);
        // MyVisu - название экрана, на котором расположен фрейм
        // MyFrameName - имя элемента, заданное в параметра фрейма (первый параметр в списке)
        // apClienData - массив с контекстами клиентов
    
    END_FOR
    Если у вас используется VisuElems.CURRENTVISU - то контексты клиентов должны совпадать, так что достаточно работать с одним из них.

  7. #7

    По умолчанию

    Добрый день.
    Посмотрите, пожалуйста.

    Нужно, что бы на каждом подключаемом WEB-клиенте открывались одни и те же страницы и созданные мной диалоги, что и на первом клиенте, на котором могли быть произведены уже какие-либо действия в интерфейсе.
    Погуглив, пришел к такой конструккции:

    VAR pClientData: POINTER TO VisuElems.VisuStructClientData;

    Далее с помощью

    VisuElems.g_ClientManager.BeginIteration();
    pClientData := VisuElems.g_ClientManager.GetNextClient();

    по числу pClientData > 0 определяем, что произошло изменение числа активных клиентов.
    При увеличении числа активных клиентов, для всех клиентов применяем в цикле сначала открытие нужной страницы, а затем и открытие диалога (информация об открытых хранится в паре массивов), причем эту "синхронгизацию" начинам не сразу, а спустя секунду после подключения клиента, что бы уже загрузиласть стартовая страница.

    Диалоги вызываются так:

    VisuElems.g_ClientManager.BeginIteration();
    REPEAT
    pClientData := VisuElems.g_ClientManager.GetNextClient();
    IF pClientData > 0 THEN
    itfDialogManager:=VisuElems.VisuElemBase.g_VisuMan ager.GetDialogManager();
    itfMyDialog := itfDialogManager.GetDialog('имя нужного диалога');
    itfDialogManager.OpenDialog(itfMyDialog, pClientData, TRUE, null);
    END_IF
    UNTIL pClientData = 0
    END_REPEAT;


    Вопрос. Почти работает - но только для двух вкладок в браузере. Попытка третьего подключения приводит с исключению, которое ведет куда-то вглубь библиотеки визуализации. Может, это потому, что я повторно пытаюсь открыть уже открытые диалоги на более ранних двух клиентах (маловероятно) ? А может, я вообще изобретаю велосипед и есть более простые и правильные способы такой синхронизации интерфейсов?
    Да - специфика задачи. У меня все страницы и диалоги открываются программно. В дизайненре форм к кнопкам никакие действия по открытию страниц или диалогов привязать не получится. Еще среда рекомендует использовть более новую библиотеку VU. Но по ней не нашел особо документации и примеров. Да и не в этом дело, наверное...
    Последний раз редактировалось Петр Петрович; 13.07.2021 в 11:57.

  8. #8
    Супер Модератор Аватар для Евгений Кислов
    Регистрация
    27.01.2015
    Адрес
    Москва
    Сообщений
    14,014

    По умолчанию

    А может, я вообще изобретаю велосипед и есть более простые и правильные способы такой синхронизации интерфейсов?
    Еще среда рекомендует использовть более новую библиотеку VU. Но по ней не нашел особо документации и примеров.
    Добрый день.
    Посмотрите это видео: https://youtu.be/_kA9WVtbg3A

  9. #9

    По умолчанию

    Цитата Сообщение от Евгений Кислов Посмотреть сообщение
    Добрый день.
    Посмотрите это видео: https://youtu.be/_kA9WVtbg3A
    Спасибо, посмотрел. Но диалог почему-то не открывается. И ошибок при исполнении вроде не возникает. В среде только начал работать.
    Подскажите, я вообще правильно делаю, в главном цикле, может вызываться при каждом подключении: MyOpenDialog(itfClientFilter:=VU.Globals.AllClient s, xExecute:=TRUE, sDialogName:=sVisuName, xModal:=TRUE);
    sVisuName на момент вызова имеет правильное имя диалога - 'Visualization_3'

  10. #10
    Супер Модератор Аватар для Евгений Кислов
    Регистрация
    27.01.2015
    Адрес
    Москва
    Сообщений
    14,014

    По умолчанию

    Цитата Сообщение от Петр Петрович Посмотреть сообщение
    Спасибо, посмотрел. Но диалог почему-то не открывается. И ошибок при исполнении вроде не возникает. В среде только начал работать.
    Подскажите, я вообще правильно делаю, в главном цикле, может вызываться при каждом подключении: MyOpenDialog(itfClientFilter:=VU.Globals.AllClient s, xExecute:=TRUE, sDialogName:=sVisuName, xModal:=TRUE);
    sVisuName на момент вызова имеет правильное имя диалога - 'Visualization_3'
    Диалог однократно вызывается по переднему фронту на входе xExecute.
    В вашем случае он должен открыться только один раз (и больше открыть его из кода вы не сможете).

Страница 129 из 275 ПерваяПервая ... 2979119127128129130131139179229 ... ПоследняяПоследняя

Похожие темы

  1. Визуализация CoDeSys
    от Newcomer в разделе ПЛК1хх
    Ответов: 4
    Последнее сообщение: 24.04.2018, 15:26
  2. Визуализация в CoDeSys
    от Newcomer в разделе ПЛК1хх
    Ответов: 15
    Последнее сообщение: 10.05.2017, 21:11
  3. Визуализация CodeSys
    от DanJer в разделе ПЛК1хх
    Ответов: 2
    Последнее сообщение: 30.08.2012, 03:53
  4. Визуализация Codesys
    от Slipknot в разделе ПЛК1хх
    Ответов: 9
    Последнее сообщение: 31.10.2008, 11:36
  5. Визуализация в CoDeSys 2.3
    от Slawa в разделе ПЛК1хх
    Ответов: 10
    Последнее сообщение: 29.08.2008, 17:30

Ваши права

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