Объявление переменных в KpLogic

Стартовая страница Форумы Разработка и интеграция Объявление переменных в KpLogic

Просмотр 15 сообщений - с 31 по 45 (из 73 всего)
  • Автор
    Записи
  • #9833
    manjey73
    Участник

    Блин, KpMbusLogic сам наследник от KpLogic…..

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

    Получается что весь код необходимо писать в KpMbusLogic.cs и по другому никак ?

    Безусловно лучше разбить на классы.

    Либо я не понимаю как это реализовать ?

    Нужно создавать экземпляры классов с помощью new MyClass()

    Делать static классы для вспомогательных вычислений можно, но при этом нежелательно в них хранить данные, то есть в них делать только методы и константы, по аналогии с ScadaUtils

    #9844
    manjey73
    Участник

    Так я создал в KpMbusLogic ‘экземпляр класса
    DevTemplate devTemplate = new DevTemplate();
    Считал в него xml

    Теперь как в другом классе, например KpMbusOpros использовать переменные из devTempate ? бьюсь уже третий день.
    static делать нельзя. Ссылки на класс не прокатывают.
    В другом классе ошибка «Для нестатического метода требуется ссылка на объект»
    Алес капут…

    Вот на одном форуме нашел такое
    «Правильно. т.е. неправильно. Класс это не объект, и в памяти он не размещен еще.
    Однако метод Main объявлен как статический, это значит что в памяти он размещен и доступен для выполнение (читай про static обьявления). В нем ты пытаешся достучаться к полю объекта ( example.a = 5 которого еще не существует (фактически), потому как поле это не static, а значит сначала придется создавать этот объект,а уж потом можно и рулить его полем.»

    • Ответ изменён 8 лет, 2 месяца назад пользователем manjey73.
    • Ответ изменён 8 лет, 2 месяца назад пользователем manjey73.
    #9847
    Romiros
    Участник

    Не тяните вы переменные из KpMbusLogic, а передайте их в экземпляр класса MbusOpros и верните результат назад.

    #9848
    manjey73
    Участник

    Вообще то выполнить действия при добавлении линии связи можно только в KpMbusLogic, соответственно там я десериализую xml файл и получаю в экземпляр класса весь список переменных. Все крутится вокруг этого.
    Когда не было инициализации разбирается телеграмма и создается список переменных, заносится в списки класса и опять сериализация файла с изменением bool переменной в файле.
    На следующем этапе мы прочтем уже xml со всеми параметрами переменных телеграммы.
    «Разбор» зная, что это уже опрос, просто заносит данные в списки переменных класса и KpMbusLogic получив их обратно просто выкидывает в Scada при помощи SetCurData.

    Так что я не могу не использовать KpMbusLogic, к тому же и теги там формируются.

    KpMbusOpros это по сути полноценная программа и ей как то нужно работать с переменными экземпляра класса списка переменных, которые сделает KpMbusLogic.

    Собственно я и не хочу тянуть, мне нужен экземплчяр класса, доступ к которому я смогу иметь и из KpMnusLogic и из KpMbusOpros и вообще из любого класса, который впихну в библиотеку.
    Это я еще до Фиксированного блока данных не дошел и до Алярмов 🙂

    • Ответ изменён 8 лет, 2 месяца назад пользователем manjey73.
    • Ответ изменён 8 лет, 2 месяца назад пользователем manjey73.
    #9851
    Romiros
    Участник

    Ну создайте класс Config, в котором все это будет формироваться и гоняйте его между этими классами. А DevTemplate оставьте для xml

    • Ответ изменён 8 лет, 2 месяца назад пользователем Romiros.
    #9854
    manjey73
    Участник

    Блин, так все просто у вас 🙂 говорю же, 3 дня уже бьюсь и ничего не выходит.
    Какая разница как я обозвал экземпляр класса, Config или devTemplate ?

    Если я сделаю DevTamplate Config = new DevTamplate(); то что-то изменится ?

    Как нет доступа к нему из другого класса, так и не будет.
    Если я правильно понял высказывание из другого форума, то класс, который еще не разместился в памяти доступен только внутри класса, где я создал экземпляр.
    Остальные классы идут в сад с выводом соответствующей ошибки.

    Была еще идея сделать статический экземпляр класса и заниматься копированием данных через него, НО.
    Коммуникатор работает в многопоточном режиме и если на разных линиях связи будет вызов моей библиотеки, то произойдет совпадение времени вызовов рано или поздно…
    Это я уже проходил, когда двумя мастерами Modbus опрашивал одно устройство Modbus RTU поверх TCP. Так что и такой вариант не катит…

    #9855
    manjey73
    Участник
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Xml;
    using System.Xml.Serialization;
    
    namespace Scada.Comm.Devices
    {
            [Serializable]
            public class DevTemplate
            {
                public DevTemplate()
                {
                    SndGroups = new List<SndGroup>();
                    CmdGroups = new List<CmdGroup>();
                    Telegrams = new List<Telegram>();
                }
                [XmlAttribute] public string Name { get; set; }
                [XmlAttribute] public bool Init { get; set; }
                [XmlAttribute] public bool Address { get; set; }
                [XmlAttribute] public bool EFBCD_onprotocol { get; set; }
                [XmlAttribute] public int Bus_Timeout { get; set; }
                public List<SndGroup> SndGroups { get; set; }
                [XmlIgnore]
                public bool SndGroupsSpecified { get { return SndGroups.Count != 0; } }
                public List<CmdGroup> CmdGroups { get; set; }
                [XmlIgnore]
                public bool CmdGroupsSpecified { get { return CmdGroups.Count != 0; } }
                public List<Telegram> Telegrams { get; set; }
                [XmlIgnore]
                public bool TelegramsSpecified { get { return Telegrams.Count != 0; } }
    
                public class SndGroup
                {
                    public SndGroup()
                    {
                    }
    
                    public SndGroup(bool SndActive, int SndCnt, string SndName, string SndType, string SndFrame, string SndCField, string SndAField, string SndCIField)
                    {
                        this.SndActive = SndActive;
                        this.SndCnt = SndCnt;
                        this.SndName = SndName;
                        this.SndType = SndType;
                        this.SndFrame = SndFrame;
                        this.SndCField = SndCField;
                        this.SndAField = SndAField;
                        this.SndCIField = SndCIField;
                    }
                    [XmlAttribute] public bool SndActive { get; set; }
                    [XmlAttribute] public int SndCnt { get; set; }
                    [XmlAttribute] public string SndName { get; set; }
                    [XmlAttribute] public string SndType { get; set; }
                    [XmlAttribute] public string SndFrame { get; set; }
                    [XmlAttribute] public string SndCField { get; set; }
                    [XmlAttribute] public string SndAField { get; set; }
                    [XmlAttribute] public string SndCIField { get; set; }
                }
                public class CmdGroup
                {
                    public CmdGroup()
                    {
                    }
    
                    public CmdGroup(bool CmdActive, int CmdCnt, string CmdName, string CmdType, string CmdFrame, string CmdCField, string CmdAField, string CmdCIField)
                    {
                        this.CmdActive = CmdActive;
                        this.CmdCnt = CmdCnt;
                        this.CmdName = CmdName;
                        this.CmdType = CmdType;
                        this.CmdFrame = CmdFrame;
                        this.CmdCField = CmdCField;
                        this.CmdAField = CmdAField;
                        this.CmdCIField = CmdCIField;
                    }
                    [XmlAttribute] public bool CmdActive { get; set; }
                    [XmlAttribute] public int CmdCnt { get; set; }
                    [XmlAttribute] public string CmdName { get; set; }
                    [XmlAttribute] public string CmdType { get; set; }
                    [XmlAttribute] public string CmdFrame { get; set; }
                    [XmlAttribute] public string CmdCField { get; set; }
                    [XmlAttribute] public string CmdAField { get; set; }
                    [XmlAttribute] public string CmdCIField { get; set; }
                }
    
                public class Telegram
                {
                    public Telegram()
                    {
                    }
                    public Telegram(int TeleCnt, string TeleName, string Rspud, string TeleType)
                    {
                        this.TeleCnt = TeleCnt;
                        this.TeleName = TeleName;
                        this.Rspud = Rspud;
                        this.TeleType = TeleType;
                        Vals = new List<Val>();
                    }
                    [XmlAttribute] public int TeleCnt { get; set; }
                    [XmlAttribute] public string TeleName { get; set; }
                    [XmlAttribute] public string Rspud { get; set; }
                    [XmlAttribute] public string TeleType { get; set; }
                    [XmlElement] public List<Val> Vals { get; set; }
                    public class Val
                    {
                        public Val()
                        {
                        }
                        public Val(int SigCnt, string ValName, string ValType, double Range, double Value)
                        {
                            this.SigCnt = SigCnt;
                            this.ValName = ValName;
                            this.ValType = ValType;
                            this.Range = Range;
                            this.Value = Value;
                        }
                        [XmlAttribute] public int SigCnt { get; set; }
                        [XmlAttribute] public string ValName { get; set; }
                        [XmlAttribute] public string ValType { get; set; }
                        [XmlAttribute] public double Range { get; set; }
                        [XmlAttribute] public double Value { get; set; }
                    }
                }
            }
        }
    

    Вот класс для шаблона, который вы мне помогли сделать. При добавлении линии связи я делаю в KpMbusLogic
    DevTemplate MyClass = new DevTemplate();
    и десериализую в MyClass все данные из xml. Все, теперь с данными MyClass надо работать не только в KpMbusLogic но и из других классов. Но без static из других классов нет к MyClass доступа ни в какую…

    #9856
    Romiros
    Участник

    В MbusOpros создайте метод для приема данных из DevTemplate.
    Просто на вскидку если целиком класс:
    public DevTemplate GetDevTemplate(DevTemplate devTemplate)
    {
    //Здесь можно передать переменные в дальнейшую обработку, изменить devTemplate и вернуть в KpMbusLogic
    return devTemplate
    }
    В упрощённом виде как-то так
    А в KpMbusLogic создаёте и вызываете экземпляр этого класса и метод передавая загруженный из xml DevTemplate:
    MBusOpros opros = new MBusOpros();
    opros.GetDevTemplate(devTemplate)

    #9857
    manjey73
    Участник

    public DevTemplate GetDevTemplate(DevTemplate devTemplate)
    {
    //Тут необходимо писать код обработки ??????
    return devTemplate
    }

    Почему не работает это ?
    «internal: класс и члены класса с подобным модификатором доступны из любого места кода в той же сборке, однако он недоступен для других программ и сборок (как в случае с модификатором public).»
    Ведь указано что и класс должен быть доступен, пробовал объявить экземпляр класса как internal и ничего…..

    • Ответ изменён 8 лет, 2 месяца назад пользователем manjey73.
    #9859
    Romiros
    Участник

    Можно тут. Если обработка сложная, передайте переменные из devTemlate в другие методы вашего класса. Вы в MBusOpros объявляете свой devTemplate. Можете загрузить конфигурации из файла и в данном методе передать KpLogic.
    В общем идея в том что KpLogic главный класс, в нем инициализация и Session, а всякие подробности раскидать по другим классам и создавать их экземпляры по мере необходимости, вызывая нужные методы этих классов. Передавать им переменные из DevTemplate, не обязательно весь класс целиком, можете bool или List, короче то что нужно. Короче KpLogic знает про все cs, а они про него могут вообще ничего не знать.
    Разверните свое представление на оборот, не обращайтесь из cs к KpLogic.
    Я бы сделал так. Не знаю может есть другие способы, но по-моему так правильно.
    Михаил, поправьте если не так.
    P.S. KpLogic я имею ввиду KpMbusLogic конечно. Пр

    • Ответ изменён 8 лет, 2 месяца назад пользователем Romiros.
    #9861
    manjey73
    Участник

    Ну в других cs мне только и необходимо, что несколько bool переменных отдельных знать из KpMbusLogic и полностью данные из xml то есть экземпляр класса на его основе.
    Читать его опять из xml будет глупо, так как это будет выполняться каждый опрос из Session. Поэтому его нужно передавать один раз и возвращать измененные значения, так по крайней мере логичнее.
    Делать две копии опроса для инициализации и для работы тоже как-то смысла нет. Там все одинаково, кроме получения имен переменных и множителя.
    На этапе инициализации имя и множитель берется из описания протокола, а выглядит это примерно так.
    Переменная 1 — Электрическая величина Вольты, множитель 0,01
    2 — Электрическая величина Вольты, множитель 0,01
    3 — Электрическая величина Вольты, множитель 0,01
    4 — Электрическая величина Мощность, множитель 1 (ваты)
    5 — Электрическая величина Мощность, множитель 1 (ваты)
    6 — Электрическая величина Мощность, множитель 1 (ваты)

    А уже согласно документации от производителя руками правим xml например
    1 — Напряжение фаза 1
    2 — Напряжение фаза 2
    3 — Напряжение фаза 3
    4 — Мощность фаза 1, множитель 0,001 (кВт) поменяли на кВт если так сразу лучше в Scada отдавать.
    Ну и так далее… И после инициализации при разборе и выводе в Scada блок опроса просто не меняет часть переменных а берет из считанного xml при добавлении на линию связи.

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

    #9862
    manjey73
    Участник

    Так я вроде не обращаюсь из других cs к Kp_Logic, мне просто нужен блок данных из него и возможность его менять, чтобы Kp_Logic смог отправить эти данные как переменные в Scada.

    #9863
    Romiros
    Участник

    Это и есть обращение. Без static Вам нужен его экземпляр. Вызывайте в KpMbusLogic нужные Вам методы из других классов для обрабатываемых переменных.

    #9864
    manjey73
    Участник

    Спасибо, буду пробовать…

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