Поле для написания заметок на схеме

Стартовая страница Форумы Понять, как работает ПО Поле для написания заметок на схеме

Помечено: 

  • В этой теме 25 ответов, 4 участника, последнее обновление 1 год назад сделано manjey73.
Просмотр 11 сообщений - с 16 по 26 (из 26 всего)
  • Автор
    Сообщения
  • #38584
    manjey73
    Участник

    Судя по всему, действительно команда работает только в 0-м элементе массива, а не в каждом…
    Отсюда вероятно невозможность использования ArrIdx или все-таки как-то можно?

    И вопрос сохранения данных при перезагрузке актуален. Без этого это все фигня.

    #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() при рестарте сервера. Учитывая что строку мы получаем из команды, то без изменения чего-нить в ядре «Заметок» не получится.
    Похоже только через файлы в скриптах.

    #38586
    manjey73
    Участник

    При использовании скриптов Retain можно сделать сохранение.

    з.ы. ну когда же нормальные БД со строками появятся ? 🙂

    #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())

    Другого способа у меня сохранять не получилось.

    #38590
    Mikhail
    Модератор

    Команда проходит только один раз через один канал. На мой взгляд, удобнее вообще сделать отдельный канал. Нужно в том методе, который вызывается в выходной формуле канала, разложить CmdData по каналам, которые хранят строку. Их номера известны заранее. Можно прямо побайтно копировать, скорее всего.

    • Ответ изменён 1 год назад пользователем Mikhail.
    #38600
    manjey73
    Участник

    CmdData это же байтовый массив, а не строка CmdDataStr.
    Заранее каналы неизвестны, по простой причине. Длину мы можем выставить разную для массива.

    Отсюда и вопрос по поводу отсутствия параметра ArrLength, почему бы его не добавить, чтобы формулы могли узнать, какова длина массива.

    Ну и в части пожеланий и доработок. Недавно у кого-то всплывал вопрос, чтобы в окне команд можно было подставлять значение. По части строковых переменных типа «Заметка» было бы актуально это реализовать.
    Мало того, вместо вызова окна команды сделать возможность редактирования строки прямо в окне Динамического текста с добавлением кнопок «Сохранить» и «Отмена».
    Например если мы дин. текст оставляем на поле, то вызывается окно команды.
    Если же мы этот дин. текст открываем в новом окне, то там кнопки, сохранить-отмена.
    Такое можно будет реализовать в будущем?

    #38602
    manjey73
    Участник

    https://disk.yandex.ru/i/ah62OcAE0sXy5Q

    Такая вот шляпа получилась. Не удобно копировать из-за обновления экрана…
    Подстановка была бы ой как кстати в окно команды.
    А лучше возможность редактирования прямо в поле динамического текста.

    #38611
    Mikhail
    Модератор

    > Такое можно будет реализовать в будущем?
    Вероятно в виде отдельного модуля с использованием сторонней БД.

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

    #38621
    manjey73
    Участник

    Из формулы есть доступ к свойствам канала.

    а немного подробнее как?

    #38623
    Mikhail
    Модератор

    > а немного подробнее как?

    Из формул доступна переменная Channel, имеющая тип Cnl

    > Такое можно будет реализовать в будущем?
    > Вероятно в виде отдельного модуля с использованием сторонней БД.
    Использование сторонней БД потребуется, если речь идёт о хранении полноценных строк.
    Если хранить строки в каналах, как реализовано сейчас, то достаточно какой-нибудь компонент для нового редактора сделать.

    #38626
    manjey73
    Участник

    думаю, что компонента достаточно для мелких задач. Для более глобальных конечно уже хранение строк в БД.

Просмотр 11 сообщений - с 16 по 26 (из 26 всего)
  • Для ответа в этой теме необходимо авторизоваться.