А из кода программы возможно менять спецификатор? Что-нибудь в духе %.iF, где i - переменная int
А из кода программы возможно менять спецификатор? Что-нибудь в духе %.iF, где i - переменная int
Связь со мной: telegram: @JuneSmellsLikeBlood | e-mail: e.kislov@owen.ru | личка на форуме - не подходит
Раздел CDS V3.5 на сайте | Основные темы по CDS V3.5 на форуме: Вопросы и ответы | Визуализация | Настройка обмена с другими устройствами
Repository Archive V3.5 SP4 (необходим для СПК207/СПК1хх без Eth/ПЛК3xx)
oscat.ru | Как обратиться в техподдержку? | Как отлаживать ошибки | Отладка проектов в CODESYS V3.5 | Проблема XY | Как правильно задавать вопросы | PRO32 Connect
что касается чисто отображения можно сделать немного по-другому, используя динамические тексты для текстового поля:
создать динамический лист для переменной вида:
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.
Добрый день!
Есть главная визуализация Visualisation, на ней элемент Набор вкладок (3 вкладки, соответственно, на каждой по визуализации: Visu1, Visu2, Visu3). Переменная VisuElems.CURRENTVISU в любом случае, независимо от того, какая вкладка, принимает значение 'Visualisation'.
Существует ли способ из программы узнать, какая вкладка активна? Без использования переменной-переключателя.
Добрый день.
Для начала потребуется получить контекст клиента (pClientData) - см. этот пример:
https://ftp.owen.ru/CoDeSys3/21_Exam...projectarchive
После этого в программе:
Если у вас используется VisuElems.CURRENTVISU - то контексты клиентов должны совпадать, так что достаточно работать с одним из них.Код: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
Последний раз редактировалось Евгений Кислов; 06.07.2021 в 07:18.
Связь со мной: telegram: @JuneSmellsLikeBlood | e-mail: e.kislov@owen.ru | личка на форуме - не подходит
Раздел CDS V3.5 на сайте | Основные темы по CDS V3.5 на форуме: Вопросы и ответы | Визуализация | Настройка обмена с другими устройствами
Repository Archive V3.5 SP4 (необходим для СПК207/СПК1хх без Eth/ПЛК3xx)
oscat.ru | Как обратиться в техподдержку? | Как отлаживать ошибки | Отладка проектов в CODESYS V3.5 | Проблема XY | Как правильно задавать вопросы | PRO32 Connect
Добрый день.
Посмотрите, пожалуйста.
Нужно, что бы на каждом подключаемом 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.
Добрый день.А может, я вообще изобретаю велосипед и есть более простые и правильные способы такой синхронизации интерфейсов?
Еще среда рекомендует использовть более новую библиотеку VU. Но по ней не нашел особо документации и примеров.
Посмотрите это видео: https://youtu.be/_kA9WVtbg3A
Связь со мной: telegram: @JuneSmellsLikeBlood | e-mail: e.kislov@owen.ru | личка на форуме - не подходит
Раздел CDS V3.5 на сайте | Основные темы по CDS V3.5 на форуме: Вопросы и ответы | Визуализация | Настройка обмена с другими устройствами
Repository Archive V3.5 SP4 (необходим для СПК207/СПК1хх без Eth/ПЛК3xx)
oscat.ru | Как обратиться в техподдержку? | Как отлаживать ошибки | Отладка проектов в CODESYS V3.5 | Проблема XY | Как правильно задавать вопросы | PRO32 Connect
Спасибо, посмотрел. Но диалог почему-то не открывается. И ошибок при исполнении вроде не возникает. В среде только начал работать.
Подскажите, я вообще правильно делаю, в главном цикле, может вызываться при каждом подключении: MyOpenDialog(itfClientFilter:=VU.Globals.AllClient s, xExecute:=TRUE, sDialogName:=sVisuName, xModal:=TRUE);
sVisuName на момент вызова имеет правильное имя диалога - 'Visualization_3'
Связь со мной: telegram: @JuneSmellsLikeBlood | e-mail: e.kislov@owen.ru | личка на форуме - не подходит
Раздел CDS V3.5 на сайте | Основные темы по CDS V3.5 на форуме: Вопросы и ответы | Визуализация | Настройка обмена с другими устройствами
Repository Archive V3.5 SP4 (необходим для СПК207/СПК1хх без Eth/ПЛК3xx)
oscat.ru | Как обратиться в техподдержку? | Как отлаживать ошибки | Отладка проектов в CODESYS V3.5 | Проблема XY | Как правильно задавать вопросы | PRO32 Connect