Зарегистрирован: Dec 22, 2005 Сообщения: 24 Рейтинг: +0/-0 Откуда: Казахстан
Добавлено: Вт 14 Мар, 2006 8:01:22 Заголовок сообщения: Использование VBA в RSView32
Уважаемые знатоки RSView32. Подскажите пожалуйста как решить данную задачу.
На мнемосхеме есть две кнопки Старт и Стоп которые запускают/останавливают заполнение емкости. Свойство Visible кнопок завязано на тег Control_Filling_Tank. Тег дискретный (связан с тегом контроллера) по истинному значению которого начинается заполнение емкости (включается контур упрвления). Но для включения контура управления необходимо чтобы емкость была нагрета, насосы работали и т.д., то есть необходимо выполнять проверку опреде-ленных условий. Если хоть одно из условий не выполняется об этом нужно сообщить операто-ру. Проверку я сделал при помощи VBA следующим образом:
Код:
Sub Start_Fiiling_Tank()
Tank_is_Hot = Application.ActiveProject.TagDb.GetTag("Status\Tank_is_Hot")
Pump_OK = Application.ActiveProject.TagDb.GetTag("Status\Pump_OK")
Dim Temp_Str As Tag
Set Temp_Str = Application.ActiveProject.TagDb("Control\Error_Action")
Dim Command_Control As Tag
Set Command_Control = Application.ActiveProject.TagDb("Control\Supply_water_to_Tank")
If Tank_is_Hot = 0 Then
Temp_Str = "Емкость не нагрета!"
Application.ActiveProject.Command.Execute "Display popup_banan /T Control\Error_Action /cc"
ElseIf Pump_OK = 0 Then
Temp_Str = "Нет готовности насосов"
Application.ActiveProject.Command.Execute "Display popup_banan /T Control\Error_Action /cc"
Else
Command_Control = 1
End If
End Sub
Процедуру написал для примера, реально каждая процедура обрабатывает большее ко-личество условий. Вызывается она при нажатии на кнопку старт.
Все это дело реально выливается в то, что при нажатии на кнопку старт, кнопка не исче-зает сразу как бы хотелось (пока процедура зачитает статусные теги, пока пропишет значение в тег контроллера, пока зачитается новое значение и изменится свойство Visible ). Это дает воз-можность нажать на кнопку еще раза 3-4 что иногда приводит к ошибкам бейсика.
1. Велосипед изобрел?
2. Как бы так извратиться и в обработчике нажатия кнопки написать что-то типа
If Status\Tank_is_Hot = =1 then Control\Supply_water_to_Tank=1 else Display Блаблабла
3. Можно ли как-то асинхронно, что ли, получать значения тегов в процедурах VBA. Уж очень он тормозит, если надо зачитать 5-6 статусных тегов и выдать пару управляющих команд.
Зарегистрирован: May 05, 2005 Сообщения: 2773 Рейтинг: +89/-5
Добавлено: Вт 14 Мар, 2006 8:51:36 Заголовок сообщения:
Чё-то как бы сложно всё
Я бы вот что сделал:
1. На кнопку надето Visibility, связанное с дискретным тэгом в контроллере, имеющим смысл команды: "Начать процесс проверки условий и после их успешной проверки запустить процесс".
2. Как только кнопку нажали, тэг установили (немедленно!) и кнопка исчезла с экрана.
3. Оператор уже ни на что не нажмёт, т.к. кнопки нет, а можно пока что помигать надписью "Подождите, команда выполняется".
4. Процессор спокойно проверяет все условия и в зависимости от результата появляется табличка "Всё в порядке, всё ОК, дорогой товарищ оператор, ванна наполняется тёплой водой" или, если условие/я не соблюдаются, соответственно, надпись "Вот это условие не выполняется". И тогда сбросить тэг команды. Появится кнопка.
5. В контроллере добавить проверку: "Если кнопка была нажата (была команда "Старт") и проверены условия, и процесс ещё не пошёл " - запомнить это событие и запустить процесс. Сброс - по окончании процесса. _________________ Обращайтесь к профессионалам.
Зарегистрирован: Dec 22, 2005 Сообщения: 24 Рейтинг: +0/-0 Откуда: Казахстан
Добавлено: Ср 15 Мар, 2006 6:24:43 Заголовок сообщения:
oldDad Чё-то как бы сложно всё
Да уж. Незнание компенсированное фантазией
Спасибо за советы, рекомендации учту, будет возможность все переделаю к чертям
Подкину еще вопросик? Можно ли каким-либо образом вызывать процедуру VBA которой в качесвте параметра передавать значение тега. Сколько не бьюсь не получается.
Уже как только не изголялся, при вызове процедуры передается только имя тега. Например при выполнении VBAExec SuperPuper tag1,tag2 в процедуру передается "tag1" а не его значение. Кавычки, скобки и т.д. не помогают.
Зарегистрирован: May 05, 2005 Сообщения: 2773 Рейтинг: +89/-5
Добавлено: Ср 15 Мар, 2006 9:29:19 Заголовок сообщения:
Но ведь можно, наверное, прочесть тэг прямо в процедуре, а не передавать его имя в вызове?
Вообще, VBAExec позволяет при вызове указывать параметры, количество и спецификации которых определяются процедурой. _________________ Обращайтесь к профессионалам.
Зарегистрирован: Jan 26, 2006 Сообщения: 25 Рейтинг: +0/-0 Откуда: Донецк
Добавлено: Ср 15 Мар, 2006 10:27:18 Заголовок сообщения:
Уважаемый Павел, а чем Вас не устраивает имя тега :
Код:
В данном примере тегу присваивается среднее значение трех других тегов. Для выполнения сценария и записи среднего трех тегов с именами Scale1, Scale2 и Scale3, в тег с именем AvgWeight, выполните следующую команду: VbaExec Average AvgWeight, Scale1, Scale2, Scale3.
Sub Average(sAvgTag As String, sTag1 As String, sTag2 As String, sTag3 As String)
On Error Resume Next
Dim fAverage As Single
'Вычисление среднего
fAverage = (gTagDb.GetTag(sTag1).Value + gTagDb.GetTag(sTag2).Value + gTagDb.GetTag(sTag3).Value) / 3
'Запись среднего в тег
gTagDb.GetTag(sAvgTag).Value = fAverage
End Sub
Зарегистрирован: Dec 22, 2005 Сообщения: 24 Рейтинг: +0/-0 Откуда: Казахстан
Добавлено: Чт 16 Мар, 2006 13:47:19 Заголовок сообщения:
Еще раз СПАСИБО господа, за участие!
Даниил Уважаемый Павел, а чем Вас не устраивает имя тега
Устраивает в принципе, на данный момент процедуры работают именно таким образом. Просто когда у меня в VBA вылетает ошибка, брекпоинт всегда указвает именно на строку с оператором Tank_is_Hot = Application.ActiveProject.TagDb.GetTag("Status\Tank_is_Hot") вот я и захотел попробовать передавать значение тега. На нет и суда нет. Оставлю все как есть.
oldDad Вообще, VBAExec позволяет при вызове указывать параметры, количество и спецификации которых определяются процедурой.
Целиком и полностью с Вами согласен, проблема в моем случае как раз не с VBA, а с RSView, потому как процедура вызывается из последней.(полагаю RSView женского рода )
Сегодня попробовал сделать управление Visible кнопок отдельным тегом не связанным с тегом контроллера. Все работает "мухой" как и мечталось, но тут появились другие "грабли". "Машин" с которых у меня может выполняться управление процессом несколько, соответственно нужна процедура синхронизации видимости кнопок, которая должна быть завязана на "глобальные" теги. Получилось с чем боролся на то и напоролся.
Зарегистрирован: Jan 26, 2006 Сообщения: 25 Рейтинг: +0/-0 Откуда: Донецк
Добавлено: Чт 16 Мар, 2006 14:22:30 Заголовок сообщения:
KPY писал(а):
Просто когда у меня в VBA вылетает ошибка, брекпоинт всегда указвает именно на строку с оператором Tank_is_Hot = Application.ActiveProject.TagDb.GetTag("Status\Tank_is_Hot") вот я и захотел попробовать передавать значение тега.
А что за ошибка? Может быть для нее можно написать обработчик?!
Зарегистрирован: May 05, 2005 Сообщения: 2773 Рейтинг: +89/-5
Добавлено: Чт 16 Мар, 2006 14:48:35 Заголовок сообщения:
Цитата:
oldDad
Вообще, VBAExec позволяет при вызове указывать параметры, количество и спецификации которых определяются процедурой.
Целиком и полностью с Вами согласен, проблема в моем случае как раз не с VBA, а с RSView, потому как процедура вызывается из последней.(полагаю RSView женского рода Smile
Думаю, женского всё-таки
Командной строке вызова RSView, в принципе, всё равно, что за параметры Вы передаёте в скрипт VBA. Она просто передаёт параметры в процедуру, обеспечивает интерфейс, не разбираясь в семантике. Смысл и формат параметров - это в процедуре VBA.
Цитата:
Сегодня попробовал сделать управление Visible кнопок отдельным тегом не связанным с тегом контроллера. Все работает "мухой" как и мечталось, но тут появились другие "грабли". "Машин" с которых у меня может выполняться управление процессом несколько, соответственно нужна процедура синхронизации видимости кнопок, которая должна быть завязана на "глобальные" теги. Получилось с чем боролся на то и напоролся.
Сейчас разберёмся
Я имел в виду, что тэг видимости кнопки (кнопок) находится не в RSView, а в контроллере, т.е. является как раз глобальным для всех машин
1. Тэг, по которому кнопка видна, находится в контроллере, так?
2. Каждая RSView на каждой машине "смотрит" на этот тэг, так?
3. Если ни на одной из машин кнопки не нажаты, то на всех машинах кнопки видны, так?
4. Если на одной машине нажать на кнопку, то тэг в контроллере перекидыается и все кнопки на всех машинах больше не видны, так?
Правильно? _________________ Обращайтесь к профессионалам.
Зарегистрирован: Dec 22, 2005 Сообщения: 24 Рейтинг: +0/-0 Откуда: Казахстан
Добавлено: Пт 24 Мар, 2006 6:08:12 Заголовок сообщения:
oldDad писал(а):
1. Тэг, по которому кнопка видна, находится в контроллере, так?
2. Каждая RSView на каждой машине "смотрит" на этот тэг, так?
3. Если ни на одной из машин кнопки не нажаты, то на всех машинах кнопки видны, так?
4. Если на одной машине нажать на кнопку, то тэг в контроллере перекидыается и все кнопки на всех машинах больше не видны, так?
4 Да
Извиняюсь я за то, что мозги вам пудрю, похоже у меня проблема не с VBA а с проектом в целом. Отписал в другой ветке, думаю тут связь прямая. Как только обмен по сети наладится, кнопки будут пропадать своевременно.
Даниил писал(а):
А что за ошибка? Может быть для нее можно написать обработчик?!
Ошибка: Run-time error 4170. COM: Unspecifed Error
Если я сейчас еще обработчики начну городить, ужас чё будет
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах
Smart Solutions VDT GmbH | Friedrich-List-Allee 38, D-41844 Wegberg-Wildenrath, Germany Tel.: +49 2432 933 57 83 | e-Mail: office@vdt-solutions.de Все товарные знаки и торговые марки являются собственностью их владельцев.
При использовании материалов сайта ссылка на данный сайт обязательна. Открытие страницы: 0.145 секунды