Страница 1 из 4 123 ... ПоследняяПоследняя
Показано с 1 по 10 из 33

Тема: Создание ActiveX компонента для MasterSCADA.

  1. #1

    Exclamation Создание ActiveX компонента для MasterSCADA.

    Добрый день.
    Я всё глубже и глубже погружаюсь в изучение MasterSCADA.

    Дошёл до создания ActiveX компонентов. Сделал пару простеньких всё отлично не работает.
    Сейчас делаю кое что посложнее. Возникает несколько вопросов. Очень охота получить на них ответы.
    Постараюсь описать ситуацию как можно подробнее.

    Компонент представляет из себя комбоБокс и текстБокс.

    У компонента 4 свойства
    Код:
            [DispId(1),
            DisplayName("Список компонентов")]
            public string Components
            {
                get { return componentsPath; }
                set { componentsPath = value; }
            }
    
            [DispId(2),
            DisplayName("Файл настроек")]
            public string Settings
            {
                get { return settingsPath; }
                set { settingsPath = value; }
            }
    
            [DispId(3),
            DisplayName("Содержимое")]
            public string Contets
            {
                get { return componentsCB.Text; }
                set { componentsCB.Text = value; }
            }
    
            [DispId(4),
            DisplayName("Время выгрузки")]
            public string OpenTime
            {
                get { return openTimeTB.Text; }
                set { openTimeTB.Text = value; }
            }
    1-е свойство - путь к файлу из которого будет загружаться Items комбоБокса

    2-е свойство - путь к файлу в котором храниться конфигурация компонента
    (тут остановимся подробнее. Компонент размещаем на мнемосхеме которая вызывается по умолчанию. На сколько я понял, когда я запускаю СКАДУ в рантайм, компонент создаётся заново. Т.е. он не видит значения своих свойств. Вызывается private void InitializeComponent(). Конструируются все контролы компонента.
    Вызывается событие Load. В нём я читаю файл конфигурации. Т.е. какое значение было выбрано в комбоБоксе, и что написано в текстБоксе.
    При изменении комбоБокса или текстБокса их содержимое сохраняется в файл конфигурации.)

    3-е свойство - выбранный элемент комбоБокса - я хочу использовать ДИНАМИЗАЦИЮ для этого свойства. Хочу видеть в одной из переменных проекта ВЫХОД.

    4-е свойство - содержимое текстБокса - я хочу использовать ДИНАМИЗАЦИЮ для этого свойства. Хочу видеть в одной из переменных проекта ВЫХОД.

    т.е. я хочу использовать первые два свойства только для настройки, а вторые два - только для получения ВЫХОДА с них.

    Как всё происходит на самом деле.
    Я добавляю этот компонент в проект. Заполняю 1-е и 2-е свойства. 3-е и 4-е оставляю пустыми.
    Открываю динамизацию выходов этого компонента. Связываю выход 3-го свойства с переменной Команда3.
    ЗАПУСКАЮ проект.
    По началу в комбоБоксе ничего не выбрано. В переменной Команда3 нет значения.
    Разворачиваю комбоБокс - в нём элементы из файла указанного в 1-м свойстве (всё правильно).
    Я выбираю какой-нибудь из элементов. Переменная Команда3 становится равна этому элементу. При этом в файле из 2-го свойства отражается изменения выбранного элемента. (всё правильно)
    Теперь я ОСТАНАВЛИВАЮ скаду.
    И снова ЗАПУСКАЮ.
    Содержимое комбоБокса грузится из файла 1. Выбранный элемент грузится из файла 2. Т.е. комбоБокс отображается так как я и хочу.
    НО в переменной Команда3 НИЧЕГО НЕТ.
    Если я щелкну по комбоБоксу и выберу какой-нибудь элемент, переменная Команда3 начинает отображать значение.

    Я так понял что переменной присваивается значение при вызове геттора 3-го свойства
    Код:
            [DispId(3),
            DisplayName("Содержимое")]
            public string Contets
            {
                get { return componentsCB.Text; }
                set { componentsCB.Text = value; }
            }
    Хотелось бы его узнать когда он вызывается, и как его можно вызвать насильно?

    Надеюсь кто-нибудь дошёл до конца и ответит мне на мои вопросы.
    Правильно ли я объявил свойства?
    Одинаково ли я должен объявить те свойства для которых я хочу использовать динамизацию и те для которых не хочу?
    Когда первый раз после запуска скады первый раз вызывается геттер свойства моего компонента?
    Могу ли я вызвать этот геттер насильно? или какие мероприятия я ещё могу провести для того чтобы при запуске проекта в переменной Команда3 я видел текст из комбоБокса?

    Спасибо.
    42 is the answer

  2. #2

    По умолчанию

    Вообще судя по описанию, контрол который вы сделали похож на ФБ "Выбор строки" из закладки "Работа с архивов" палитры ФБ. Может быть вам этот фб подойдет и ничего писать не надо?

    По вашему вопросу - может быть вам просто связать команду с входом "Содержимое", и у команды установить "Восстановление при рестарте". Тогда команда будет устанавливать в поле введенное в последний раз значение.
    Спасибо.

  3. #3

    По умолчанию

    SCADAMaster, ты красавчик!
    Спасибо, "восстановление при рестарте" отлично подошло.

    Но как-то это странно. Было бы неплохо, если бы MasterSCADA прочитывала бы все выходы всех блоков при запуске.

    А вопрос про правильность объявления свойств. Могу ли я создать компонент у которого какие-то свойства доступны только из вкладок Динамизация входов, динамизация выходов.

    И ещё, у любого свойства обязательно объявить и геттер и сеттер, или для свойств для которых я не хочу динамизировать вход я могу сеттер не объявлять?
    42 is the answer

  4. #4

    По умолчанию

    Цитата Сообщение от SCADAMaster Посмотреть сообщение
    Вообще судя по описанию, контрол который вы сделали похож на ФБ "Выбор строки" из закладки "Работа с архивов" палитры ФБ.
    Вы имеете ввиду ФБ "Список строк"?

    Мы пробовали его. Не очень понравился. Как-то он не очень удобен в эксплуатации. Приспосабливаться к нему надо.

    К тому же, компонент о котором речь шла в первом работает совместно с текстБоксом. И при выборе чего-то в комбоБоксе запоминает выбор в файл.
    Этот файл в другом месте используется.
    42 is the answer

  5. #5

    По умолчанию

    У меня есть ещё один вопрос. Он немного оффтоп, но спрошу тут.

    У нас есть демоверсия MasterSCADA. Мы разрабатываем проект на ней. Не будет ли у нас трудностей с переносом проекта на MSRT-500?
    42 is the answer

  6. #6

    По умолчанию

    Цитата Сообщение от 42ia Посмотреть сообщение
    А вопрос про правильность объявления свойств. Могу ли я создать компонент у которого какие-то свойства доступны только из вкладок Динамизация входов, динамизация выходов.
    Нет, так нельзя.

    Цитата Сообщение от 42ia Посмотреть сообщение
    И ещё, у любого свойства обязательно объявить и геттер и сеттер, или для свойств для которых я не хочу динамизировать вход я могу сеттер не объявлять?
    Должно быть можно. Можете попробовать.

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

    Цитата Сообщение от 42ia Посмотреть сообщение
    У нас есть демоверсия MasterSCADA. Мы разрабатываем проект на ней. Не будет ли у нас трудностей с переносом проекта на MSRT-500?
    Если не превышено количество точек, и не задействованы не приобретенные модули то нет. Не будет.
    После завершения проекта у системы, на закладке "Общие" нажмите "Сформировать опции для заказа" у убедитесь что MSRt500 вам достаточно.
    Ваши собственные библиотеки нужно будет перенести на этот компьютер и зарегестрировать. Как регистрировать без студии описано в документации по разработке ФБ.
    Последний раз редактировалось SCADAMaster; 26.04.2012 в 14:39.
    Спасибо.

  7. #7

    По умолчанию

    Вот ещё один случай проблемы которую я описал в первом посте.

    Делаю своеобразный аналог кнопки с фиксацией.
    Компонент представляет из себя pictureBox, который обрабатывает событие Click. И при щелчке изменяет отображаемую картинку.

    В классе компонента сделал объявления
    Код:
            private string imageOnPath;  //Путь к изображению которое должно быть показано, если state == true
            private string imageOffPath;  //Путь к изображению которое должно быть показано, если state == false
    
            private bool state; //Если нажата - TRUE; Не нажата - FALSE;
    Код компонента привожу почти полностью
    Код:
            [DispId(1),
            DisplayName("Изображение OFF")]
            public string ImageOFF
            {
                get { return imageOffPath; }
                set { imageOffPath = value; }
            }
    
            [DispId(2),
            DisplayName("Изображение ON")]
            public string ImageON
            {
                get { return imageOnPath; }
                set { imageOnPath = value; }
            }
    
            [DispId(3),
            DisplayName("Кнопка нажата")]
            public bool BtnState
            {
                get { return state; }
                set { state = value; }
            }
    
            //Происходит при щелчке по картинке
            private void pictureBox_Click(object sender, EventArgs e)
            {
                state = !state;
                if (state == false)
                {
                    pictureBox.ImageLocation = imageOffPath;
                }
                else
                {
                    pictureBox.ImageLocation = imageOnPath;
                }
            }
    
            //При загрузке компонента должен считываться state, и загружаться нужное изображение
            private void ButtonExControl_Load(object sender, EventArgs e)
            {
                if (BtnState == false)
                {
                    pictureBox.ImageLocation = ImageOFF;
                }
                else
                {
                    pictureBox.ImageLocation = ImageON;
                }
            }
    В СКАДЕ создал переменную Команда1. Сделал ей "Восстановление при рестарте". Подал её на Выход и на Вход динамизации компонента.

    запускаю СКАДУ, щёлкаю на компонент. меняется картинка. Команда1 становится ИСТИНА.
    Останавливаю СКАДУ. Запускаю СКАДУ. Команда1 ИСТИНА, но компонент отображает картинку которую должен отображать если вход ЛОЖЬ. Т.е. не читает при запуске входа.
    Щёлкаю по кнопке один раз. Картинка не меняется, Команда1 становиться ЛОЖЬ. (всё правильно). Щелкаю второй раз. Команда1 стаёт ИСТИНА, Картинка меняется. При следующих остановах-запусках скады, та же печаль.

    Как быть? Как заставить компонент прочитать входы при запуске?
    42 is the answer

  8. #8

    По умолчанию

    А чем вас не устраивает контрол дискретной команды - кнопка?
    У него тоже можно рисунок назначить на состояние. И фиксацию можно включить.
    Спасибо.

  9. #9

    По умолчанию

    Может быть вот так попробовать:

    Код:
            [DispId(1),
            DisplayName("Изображение OFF")]
            public string ImageOFF
            {
                get { return imageOffPath; }
                set { imageOffPath = value; }
            }
    
            [DispId(2),
            DisplayName("Изображение ON")]
            public string ImageON
            {
                get { return imageOnPath; }
                set { imageOnPath = value; }
            }
    
            [DispId(3),
            DisplayName("Кнопка нажата")]
            public bool BtnState
            {
                get { return state; }
                set { 
    
                      if (value == false)
                          {
                              pictureBox.ImageLocation = ImageOFF;
                          }
                      else
                          {
                              pictureBox.ImageLocation = ImageON;
                          }
                     }
            }
    
            //Происходит при щелчке по картинке
            private void pictureBox_Click(object sender, EventArgs e)
            {
                state = !state;
                if (state == false)
                {
                    pictureBox.ImageLocation = imageOffPath;
                }
                else
                {
                    pictureBox.ImageLocation = imageOnPath;
                }
            }
    
    
            }
    Спасибо.

  10. #10

    По умолчанию

    В компоненте "Кнопка с фиксацией" В качестве изображения можно использовать только файлы в формате .bmp. Нельзя уйти от прямоугольной формы кнопки.

    Мне нужно чтобы у меня была округлая красивая кнопка, с прозрачным фоном.

    Для этого я хочу сделать свой компонент и использовать в нём .png файлы.

    Стандартный компонент "Рисунок" может отображать .png. Можно было бы использовать его, но он не обрабатывает события нажатие.
    42 is the answer

Страница 1 из 4 123 ... ПоследняяПоследняя

Похожие темы

  1. Создание кнопки
    от VanoKing в разделе Master SCADA 3
    Ответов: 1
    Последнее сообщение: 26.08.2011, 15:54
  2. создание ОТЧЁТА
    от evgnik в разделе Master SCADA 3
    Ответов: 4
    Последнее сообщение: 07.07.2011, 14:10
  3. Создание документации
    от АлексPetr в разделе Трёп (Курилка)
    Ответов: 11
    Последнее сообщение: 20.02.2011, 10:32
  4. Создание сети RS-485
    от Kotov666 в разделе Сервисное ПО
    Ответов: 3
    Последнее сообщение: 09.04.2009, 16:52
  5. создание файла PLCFileopen
    от Антон в разделе ПЛК1хх
    Ответов: 16
    Последнее сообщение: 25.03.2008, 10:53

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •