Стартовая страница › Форумы › Разработка и интеграция › Передать строку ASCII из Коммуникатора в Сервер
- В этой теме 36 ответов, 3 участника, последнее обновление 7 лет, 3 месяца назад сделано
Mikhail.
-
АвторЗаписи
-
29.06.2018 в 22:34 #9801
manjey73УчастникХранить типы переменных, их длину и так далее в xml будет некрасиво, придется слишком много разных параметров заносить в xml.
Тип переменной надо передать в ConvertTagDataToStr
чтобы не только по сигналу или статусу можно было бы изменить отображение переменной в КП30.06.2018 в 12:57 #9804
MikhailМодераторЗаведите, например, тип
public class TagDescriptor
{
…
}и создайте словарь Dictionary<int, TagDescriptor> myTags;
Где ключ — номер сигнала.Внутри ConvertTagDataToStr обращайтесь к информации о тегах — переменной myTags
20.05.2019 в 09:55 #11746
manjey73УчастникПодниму тему. Как создать словарь myTags и чтобы переменные из словаря увидеть внутри ConvertTagDataToStr ?
20.05.2019 в 12:35 #11752
MikhailМодераторПриведите, пожалуйста, пример что будет приходить от прибора и как это нужно передать на сервер и отобразить с помощью ConvertTagDataToStr?
20.05.2019 в 13:02 #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.
20.05.2019 в 13:51 #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();
}`Почему ошибка ? почему вдруг нет ключа ????
20.05.2019 в 13:58 #11756
manjey73УчастникЕсли тупо сделать проверку на номер сигнала, который на данный момент получился, то нормально выводит время.
Почему он не может к словарю обратиться я не понимаю…20.05.2019 в 14:13 #11757
manjey73УчастникТормоз. myTagId[тут блин индекс], а так как в словарь занес всего одно значение, то индекс всего лишь 0 а я туда номер сигнала ввожу.
Хотелось бы пример с комментариями для TagDescriptor и как с этим правильно работать в примере с ConvertTagDataToStr
20.05.2019 в 14:30 #11758Romiros
Участникmanjey73, посмотрите реализацию KpDbImport, как там определяется тип тега.
20.05.2019 в 14:52 #11759
manjey73УчастникПосмотрел, там через индекс, потому что в словарь заносится полностью все.
Наверное удобно для статических списков переменных, не знаю. Надо будет опробовать как-нибудь. Сейчас уже хочу доделать как есть…А напомните где смотреть код, чтобы Администратор автоматом формировал входные каналы ? а то что-то роюсь на форуме, не могу найти где это было…
20.05.2019 в 16:29 #11760
manjey73УчастникЕще тут уперся между делом.
tagGroup = new TagGroup(«Имя группы»);
Как определить уже было создано такое имя группы или нет ?
при попытке var indlist = tagGroups.IndexOf(«Имя группы»);
получаю ошибку
Ошибка CS1503 Аргумент 1: не удается преобразовать из «string» в «Scada.Comm.Devices.KPLogic.TagGroup».20.05.2019 в 16:30 #11761Romiros
УчастникПо созданию каналов
В KpView
public override KPCnlPrototypes DefaultCnls-
Ответ изменён 7 лет, 3 месяца назад пользователем
Romiros.
20.05.2019 в 16:39 #11763Romiros
УчастникtagGroups.IndexOf(«Имя группы»);
У меня студии под рукой нет, но по-моему так нельзя.
IndexOf(array, object), т.е. IndexOf(tagGroups, tagGroup).
Или перебор всех групп и проверка на имя или использовать linq, тут что больше нравится.20.05.2019 в 17:11 #11764
manjey73УчастникНиче не понял 🙂 ладно, ждемс Михаила, может он что-то простое предложит, как определить что имя группы уже было и не надо снова делать
tagGroup = new TagGroup(«Имя группы 1»);
Проблема заключена в том, что первый раз надо создать эту чертову группу с Именем. А второй и последующий раз не создавать группу, а просто добавлять в нее теги.
Уж не знаю, будет ли это возможным если имена групп будут перемежаться между собой…-
Ответ изменён 7 лет, 3 месяца назад пользователем
manjey73.
20.05.2019 в 17:52 #11767
MikhailМодераторМожно вместо TagDescriptor для начала создать простой массив, что-то вроде
int[] typeCodes
Индекс в массиве — это индекс тега КП, он равен signal — 1
Записывайте в массив число, в зависимости от того, какой тип для тега по соответствующему индексу.В методе ConvertTagDataToStr нужно залезть в массив и в зависимости от того, какое число будет в нужно ячейке массива, форматировать отображаемое значение.
Массив typeCodes нужно проинициализовать после того, как Вы определите количество теги КП:
typeCodes = new int[KPTags.Length];
Идея TagDescriptor та же самая, просто более навороченная. -
Ответ изменён 7 лет, 3 месяца назад пользователем
-
АвторЗаписи
- Для ответа в этой теме необходимо авторизоваться.