Стартовая страница › Форумы › Понять, как работает ПО › Поле для написания заметок на схеме
Помечено: Заметки
- В этой теме 25 ответов, 4 участника, последнее обновление 1 год назад сделано
manjey73.
-
АвторСообщения
-
27.05.2025 в 17:59 #38584
manjey73УчастникСудя по всему, действительно команда работает только в 0-м элементе массива, а не в каждом…
Отсюда вероятно невозможность использования ArrIdx или все-таки как-то можно?И вопрос сохранения данных при перезагрузке актуален. Без этого это все фигня.
27.05.2025 в 22:10 #38585
manjey73Участникpublic double WriteString(string cmdString, int len) { double val = double.NaN; for(int a = 0; a < len; a++) { SetData(CnlNum+a, double.NaN, 0); } int ix = 0; for (int i = 0; i < cmdString.Length; i+=4) { val = EncodeUnicode(Substring(cmdString, i, 4)); SetData(CnlNum + ix, val, 1); ix++; } return 1; }Добавил очистку, с указанием длины, которую мы указываем в настройках канала.
Неправильно это, когда формулы работают по разному, входные и выходные.
Не хватает параметра ArrLength для работы с массивами.С сохранением та же ерунда, что и при использовании Val() при рестарте сервера. Учитывая что строку мы получаем из команды, то без изменения чего-нить в ядре «Заметок» не получится.
Похоже только через файлы в скриптах.28.05.2025 в 00:24 #38586
manjey73УчастникПри использовании скриптов Retain можно сделать сохранение.
з.ы. ну когда же нормальные БД со строками появятся ? 🙂
28.05.2025 в 09:57 #38587
manjey73Участник// Указание пути к файлу retain в Windows string pathRet = @"j:\SCADA\retain.txt"; // в Linux // string pathRet = @"/opt/scada/ScadaServer/Config/retain.txt"; protected Dictionary<int, double> DictRet = new Dictionary<int, double>(); // Указание в каналах, которые требуется сохранять public double Retain() { double ret = Val(CnlNum); DictRet[CnlNum] = ret; return ret; } // ----------------------------------------------- // Сохранение Retain // ---------------------------------------------- public double SaveRetain() { string[] RetSave = new string[DictRet.Count]; bool eq = false; for (int i = 0; i < DictRet.Count; i++) { RetSave[i] = Convert.ToString(System.Linq.Enumerable.ElementAt(DictRet, i)); } if (!System.IO.File.Exists(pathRet)) { System.IO.File.WriteAllLines(pathRet, RetSave, Encoding.UTF8); return 0; } else { string[] RetOld = System.IO.File.ReadAllLines(pathRet, Encoding.UTF8); eq = System.Linq.Enumerable.SequenceEqual(RetOld, RetSave); if (!eq) { System.IO.File.WriteAllLines(pathRet, RetSave, Encoding.UTF8); } } return Convert.ToDouble(eq); } // -------------------------------------------- // Загрузка Retain bool initRet = false; public double LoadRetain() { if (!initRet) { if (System.IO.File.Exists(pathRet)) { string[] RetLoad = System.IO.File.ReadAllLines(pathRet, Encoding.UTF8); for (int i = 0; i < RetLoad.Length; i++) { SetVal(Convert.ToInt32(RetLoad[i].Substring(RetLoad[i].IndexOf("[")+1, RetLoad[i].IndexOf(", ")-(RetLoad[i].IndexOf("[")+1)),10),Convert.ToDouble(RetLoad[i].Substring(RetLoad[i].IndexOf(", ")+2,RetLoad[i].IndexOf("]")-(RetLoad[i].IndexOf(", ")+2)))); } initRet = true; } } return Convert.ToDouble(initRet); } // ---------------------------------------------------LoadRetain()— ставим в младшем входном канале, например канал 1
SaveRetain()— ставим в старшем входном канале, после всех в системе.
Можно вот так —EveryMin(() => SaveRetain())с записью каждую минуту.
Retain() — ставим в каналах, требующих сохранение. В случае с массивом строк (Тип данных — UnicodeString, длина данных по выбору — 20 = 80 символов unicode, Формат входной и выходной String)DecodeUnicode(Retain())Другого способа у меня сохранять не получилось.
28.05.2025 в 13:40 #38590
MikhailМодераторКоманда проходит только один раз через один канал. На мой взгляд, удобнее вообще сделать отдельный канал. Нужно в том методе, который вызывается в выходной формуле канала, разложить CmdData по каналам, которые хранят строку. Их номера известны заранее. Можно прямо побайтно копировать, скорее всего.
-
Ответ изменён 1 год назад пользователем
Mikhail.
28.05.2025 в 15:24 #38600
manjey73УчастникCmdData это же байтовый массив, а не строка CmdDataStr.
Заранее каналы неизвестны, по простой причине. Длину мы можем выставить разную для массива.Отсюда и вопрос по поводу отсутствия параметра ArrLength, почему бы его не добавить, чтобы формулы могли узнать, какова длина массива.
Ну и в части пожеланий и доработок. Недавно у кого-то всплывал вопрос, чтобы в окне команд можно было подставлять значение. По части строковых переменных типа «Заметка» было бы актуально это реализовать.
Мало того, вместо вызова окна команды сделать возможность редактирования строки прямо в окне Динамического текста с добавлением кнопок «Сохранить» и «Отмена».
Например если мы дин. текст оставляем на поле, то вызывается окно команды.
Если же мы этот дин. текст открываем в новом окне, то там кнопки, сохранить-отмена.
Такое можно будет реализовать в будущем?28.05.2025 в 17:14 #38602
manjey73Участникhttps://disk.yandex.ru/i/ah62OcAE0sXy5Q
Такая вот шляпа получилась. Не удобно копировать из-за обновления экрана…
Подстановка была бы ой как кстати в окно команды.
А лучше возможность редактирования прямо в поле динамического текста.29.05.2025 в 13:45 #38611
MikhailМодератор> Такое можно будет реализовать в будущем?
Вероятно в виде отдельного модуля с использованием сторонней БД.> вопрос по поводу отсутствия параметра ArrLength, почему бы его не добавить, чтобы формулы могли узнать, какова длина массива
Из формулы есть доступ к свойствам канала.29.05.2025 в 14:03 #38621
manjey73УчастникИз формулы есть доступ к свойствам канала.
а немного подробнее как?
30.05.2025 в 14:17 #38623
MikhailМодератор> а немного подробнее как?
Из формул доступна переменная Channel, имеющая тип Cnl
> Такое можно будет реализовать в будущем?
> Вероятно в виде отдельного модуля с использованием сторонней БД.
Использование сторонней БД потребуется, если речь идёт о хранении полноценных строк.
Если хранить строки в каналах, как реализовано сейчас, то достаточно какой-нибудь компонент для нового редактора сделать.30.05.2025 в 16:01 #38626
manjey73Участникдумаю, что компонента достаточно для мелких задач. Для более глобальных конечно уже хранение строк в БД.
-
Ответ изменён 1 год назад пользователем
-
АвторСообщения
- Для ответа в этой теме необходимо авторизоваться.