Передать строку ASCII из Коммуникатора в Сервер

Стартовая страница Форумы Разработка и интеграция Передать строку ASCII из Коммуникатора в Сервер

Просмотр 15 сообщений - с 16 по 30 (из 37 всего)
  • Автор
    Записи
  • #9801
    manjey73
    Участник

    Хранить типы переменных, их длину и так далее в xml будет некрасиво, придется слишком много разных параметров заносить в xml.
    Тип переменной надо передать в ConvertTagDataToStr
    чтобы не только по сигналу или статусу можно было бы изменить отображение переменной в КП

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

    Заведите, например, тип
    public class TagDescriptor
    {

    }

    и создайте словарь Dictionary<int, TagDescriptor> myTags;
    Где ключ — номер сигнала.

    Внутри ConvertTagDataToStr обращайтесь к информации о тегах — переменной myTags

    #11746
    manjey73
    Участник

    Подниму тему. Как создать словарь myTags и чтобы переменные из словаря увидеть внутри ConvertTagDataToStr ?

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

    Приведите, пожалуйста, пример что будет приходить от прибора и как это нужно передать на сервер и отобразить с помощью ConvertTagDataToStr?

    #11753
    manjey73
    Участник

    От прибора надо определить тип переменной, которую я задаю в xml файле.
    В данном случае строка «DateTime». Необходимо время вывести в Коммуникатор в текстовом виде.

    Сейчас пока играюсь со статусом
    if (tagData.Stat == 2) // Пока за счет статуса. Может быть можно добавить как-то переменную для дополнительного определения….
    {
    return ScadaUtils.DecodeDateTime(tagData.Val).ToString();
    }

    Это работает, но это не кошерно 🙂 Вы предлагали создать

    Заведите, например, тип
    public class TagDescriptor
    {

    }

    и создайте словарь Dictionary<int, TagDescriptor> myTags;
    Где ключ — номер сигнала.

    Внутри ConvertTagDataToStr обращайтесь к информации о тегах — переменной myTags

    Но что-то у меня лыжи не едут. Как создать класс (что внутри него необходимо прописать ?)
    Как создать правильно словарь ? где именно в драйвере и правильно как описать ?
    Как в этот словарь записывать значения ? значения чего ? С учетом того, что нумерация тегов (сигналов) у меня не сквозная и частично неизвестна

    И главное как потом внутри ConvertTagDataToStr это потом вызвать на проверку ???

    Куда ни суюсь, везде какие-нибудь ошибки…

    • Ответ изменён 7 лет, 3 месяца назад пользователем manjey73.
    #11755
    manjey73
    Участник

    Вот просто со словарем.

    Отправка (10): 00 97 15 90 04 0A 88 7B 63 0B
    Приём (16/140): 00 97 15 90 04 10 13 05 14 0D 2C 25 88 7B D8 47
    False
    True
    33
    OK!
    Отправка (12): 00 97 15 90 0A 0C 05 00 10 F8 B7 2E
    Приём (18/140): 00 97 15 90 0A 12 1B 00 00 00 00 00 00 00 10 F8 87 48
    OK!
    2019-05-20 13:52:52 Ошибка при записи в файл информации о работе КП: Данный ключ отсутствует в словаре.

    При этом в Session код

     ExecWriteToLog(Convert.ToString(myTagId.ContainsKey(sig_active[sig])));
                                                if (!myTagId.ContainsKey(sig_active[sig]))
                                                {
                                                    myTagId.Add(sig_active[sig], "DateTime");
                                                }
                                                ExecWriteToLog(Convert.ToString(myTagId.ContainsKey(sig_active[sig])));
                                                ExecWriteToLog(Convert.ToString(sig_active[sig]));

    То есть в логе вроде как все чисто, нет ключа — False.
    Создан по коду ключ, в Логе Есть ключ — True
    и номер ключа 33 — 33 это номер сигнала для вывода времени.

    Внутри ConvertTagDataToStr
    ` if (myTagId[signal] == «DateTime»)
    {

    return ScadaUtils.DecodeDateTime(tagData.Val).ToString();
    }`

    Почему ошибка ? почему вдруг нет ключа ????

    #11756
    manjey73
    Участник

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

    #11757
    manjey73
    Участник

    Тормоз. myTagId[тут блин индекс], а так как в словарь занес всего одно значение, то индекс всего лишь 0 а я туда номер сигнала ввожу.

    Хотелось бы пример с комментариями для TagDescriptor и как с этим правильно работать в примере с ConvertTagDataToStr

    #11758
    Romiros
    Участник

    manjey73, посмотрите реализацию KpDbImport, как там определяется тип тега.

    #11759
    manjey73
    Участник

    Посмотрел, там через индекс, потому что в словарь заносится полностью все.
    Наверное удобно для статических списков переменных, не знаю. Надо будет опробовать как-нибудь. Сейчас уже хочу доделать как есть…

    А напомните где смотреть код, чтобы Администратор автоматом формировал входные каналы ? а то что-то роюсь на форуме, не могу найти где это было…

    #11760
    manjey73
    Участник

    Еще тут уперся между делом.

    tagGroup = new TagGroup(«Имя группы»);

    Как определить уже было создано такое имя группы или нет ?

    при попытке var indlist = tagGroups.IndexOf(«Имя группы»);
    получаю ошибку
    Ошибка CS1503 Аргумент 1: не удается преобразовать из «string» в «Scada.Comm.Devices.KPLogic.TagGroup».

    #11761
    Romiros
    Участник

    По созданию каналов
    В KpView
    public override KPCnlPrototypes DefaultCnls

    • Ответ изменён 7 лет, 3 месяца назад пользователем Romiros.
    #11763
    Romiros
    Участник

    tagGroups.IndexOf(«Имя группы»);
    У меня студии под рукой нет, но по-моему так нельзя.
    IndexOf(array, object), т.е. IndexOf(tagGroups, tagGroup).
    Или перебор всех групп и проверка на имя или использовать linq, тут что больше нравится.

    #11764
    manjey73
    Участник

    Ниче не понял 🙂 ладно, ждемс Михаила, может он что-то простое предложит, как определить что имя группы уже было и не надо снова делать

    tagGroup = new TagGroup(«Имя группы 1»);

    Проблема заключена в том, что первый раз надо создать эту чертову группу с Именем. А второй и последующий раз не создавать группу, а просто добавлять в нее теги.
    Уж не знаю, будет ли это возможным если имена групп будут перемежаться между собой…

    • Ответ изменён 7 лет, 3 месяца назад пользователем manjey73.
    #11767
    Mikhail
    Модератор

    Можно вместо TagDescriptor для начала создать простой массив, что-то вроде
    int[] typeCodes
    Индекс в массиве — это индекс тега КП, он равен signal — 1
    Записывайте в массив число, в зависимости от того, какой тип для тега по соответствующему индексу.

    В методе ConvertTagDataToStr нужно залезть в массив и в зависимости от того, какое число будет в нужно ячейке массива, форматировать отображаемое значение.

    Массив typeCodes нужно проинициализовать после того, как Вы определите количество теги КП:
    typeCodes = new int[KPTags.Length];
    Идея TagDescriptor та же самая, просто более навороченная.

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