Михаил Реутов
Постоянный посетитель
Всего сообщений: 224
Дата регистрации: 21.11.2007
|
Создано:
04.09.2008 12:11:13
|
Здравствуйте. Вопрос такой.
Для того, чтобы получить информацию (например, ток) из определенной ячейки таблицы (например, vetv) можно использовать следующее:
Rastr.Tables("vetv").Cols("ie").Z(n), где n - номер строки, начинающийся с 0.
Как можно по другому извлекать инфорацию из ячеек при помощи ip, pq и np (номера начала и конца, номер паралельной ветви), т.е. зная эти три параметра???
|
|
|
Андрей Крутенёв
Гость
|
Создано:
04.09.2008 13:01:48
|
Через выборку SetSel
А зачем это нужно?
|
|
|
Михаил Реутов
Постоянный посетитель
Всего сообщений: 224
Дата регистрации: 21.11.2007
|
Создано:
04.09.2008 13:35:28
|
Я выполняю серию расчетов режимов, отключая поочередно по одному элементу и контролирую загрузку линий по отношению к допустимому значению. При превышении заданного значения в Excel появляется соответствующее предупреждении о том, что при отключении той или иной линии перезрузятся те или иные линии по отношению к заданному значению.
Для поочередного отключения линий я каждый раз прохожу циклом таблицу vetv и нахожу нужную линию и sel=1. Для того что-бы отключить след. линию, я заново загружаю файл с режимом (как бы востанавливаю расчетный режим).
Все это крайне медленно работает!
|
|
|
Михаил Реутов
Постоянный посетитель
Всего сообщений: 224
Дата регистрации: 21.11.2007
|
Создано:
04.09.2008 13:37:26
|
Цитата |
---|
Андрей Крутенёв пишет:
Через выборку SetSel |
Поясните, пожалуйста, какие входящие параметры у данного метода и что они обозначают?
|
|
|
Андрей Крутенёв
Гость
|
Создано:
04.09.2008 16:53:12
|
например, вот кусок текста макро:
Код |
---|
Set ktr=tvetv.Cols("ktr")
viborka="ip=18543&iq=18337"
tvetv.SetSel viborka
ktr.Calc "1"
viborka="ip=18543&iq=18338"
tvetv.SetSel viborka
ktr.Calc "1" |
Здесь, если ветвь попадает в выборку, то пересчитывается её коэффициент трансформации.
Т.е. в выборке может быть не один элемент...
Например, "na=1" и многое другое.
|
|
|
Михаил Реутов
Постоянный посетитель
Всего сообщений: 224
Дата регистрации: 21.11.2007
|
Создано:
05.09.2008 08:26:14
|
Спасибо за представленный код. Но...
Приведенный Вами пример демонстрирует как можно адресно изменять данные в ячейках. А каким образом можно осуществить чтение из ячейки? Например, мне нужно вывести на экран значение тока (или мощности Р) в начале ветви "ip=18543&iq=1833?7&np=1"...
|
|
|
Владимир Неуймин
Администратор
Всего сообщений: 268
Дата регистрации: 13.03.2007
|
Создано:
05.09.2008 10:20:03
|
Для ускорения работы не нужно использовать конструкции типа
Код |
---|
for i=0 to tvetv.Size-1
a=Rastr.Tables("vetv").Cols?("ie").Z(n)
next | в цикле.
Быстрее будет так
Код |
---|
Set tvetv=Rastr.Tables("vetv")
Set cie=cols.Cols?("ie")
for i=0 to tvetv.Size-1
a=cie.Z(i)
next | Еще лучше сразу сформулировать критерий поиска, например, линий перегруженных по току
Код |
---|
tvetv.SetSel("ib>i_dop") ' Выбираем линии перегруженные по току
j= tvetv.FindNextSel(-1)
while j<>-1
a=cie.Z(j)
j= tvetv.FindNextSel(j)
wend |
|
|
|
Михаил Реутов
Постоянный посетитель
Всего сообщений: 224
Дата регистрации: 21.11.2007
|
Создано:
05.09.2008 11:05:46
|
Спасибо за представленные примеры "кода", но, как я Вас понимаю, чтение из определенной ячейки невозможно без прохождения цикла, находя нужную строку, удовлетворяющую условию поиска...
|
|
|
Михаил Реутов
Постоянный посетитель
Всего сообщений: 224
Дата регистрации: 21.11.2007
|
Создано:
05.09.2008 11:28:35
|
Еще попрос про метод SetSel.
Возвращает ли этот метод какой-нить результат. Если, да, то какой?
|
|
|
Владимир Неуймин
Администратор
Всего сообщений: 268
Дата регистрации: 13.03.2007
|
Создано:
08.09.2008 10:08:55
|
Цитата |
---|
Михаил Реутов пишет:
Спасибо за представленные примеры "кода", но, как я Вас понимаю, чтение из определенной ячейки невозможно без прохождения цикла, находя нужную строку, удовлетворяющую условию поиска... |
Код |
---|
tvetv.SetSel("ip=18543&iq=1833?7&np=1")
j= tvetv.FindNextSel(-1)
if j<>-1 then a=cie.Z(j) |
можно в sub завернуть при желании ....
|
|
|
Владимир Неуймин
Администратор
Всего сообщений: 268
Дата регистрации: 13.03.2007
|
Создано:
08.09.2008 10:10:16
|
Цитата |
---|
Михаил Реутов пишет:
Еще попрос про метод SetSel.
Возвращает ли этот метод какой-нить результат. Если, да, то какой? |
нет ничего не возвращает ...
|
|
|
Михаил Реутов
Постоянный посетитель
Всего сообщений: 224
Дата регистрации: 21.11.2007
|
Создано:
08.09.2008 11:33:59
|
Цитата |
---|
Владимир Неуймин пишет:
Код |
---|
tvetv.SetSel("ip=18543&iq=1833?7&np=1")
j= tvetv.FindNextSel(-1)
if j<>-1 then a=cie.Z(j) |
можно в sub завернуть при желании .... |
Благодарю за еще один способ. Надо будет попробывать. Но я, немного покапавшись в справке к Растру, нашел следующий способ:
Код |
---|
cie=Rastr.Calc("val", "vetv", "ie", "ip=18543&iq=1833?7&np=1") |
Я не могу судить о быстроте данного способа (метода), поскольку я не знаю "что в нем зашито", но, одно точно могу сказать, скорость работы моего макроса меня устраивает...
|
|
|
Евгений Машалов
Администратор
Всего сообщений: 1059
Дата регистрации: 23.04.2007
|
Создано:
08.09.2008 12:24:56
|
Мне сдается что восстанавливать режим путем чтения файла как-то расточительно. Включите то, что было отключено, отключите что-то новое, да и просто пересчитайте. Лучше наверное с плоского старта, а то вдруг после расчета с отключением оно развалится. Насчет чтения, я не очень понял что Вы хотите выбрать. Если перегруженные линии, то без выборки не обойтись. Но я так вижу что Вы конкретные ip;iq;np читатете. В этом случае я просто бы сделал в начале программы вектор (или как он там, "массив") с индексами нужных элементов и использовал бы его на всех итерациях цикла отключения. Сделать этот массив конечно придется SetSelом, но это же только 1 раз.
|
|
|
Михаил Реутов
Постоянный посетитель
Всего сообщений: 224
Дата регистрации: 21.11.2007
|
Создано:
08.09.2008 12:55:41
|
|
Цитата |
---|
Евгений Машалов пишет: ... Лучше наверное с плоского старта, а то вдруг после расчета с отключением оно развалится. ... |
При расчете режима использую вот такое
Цитата |
---|
Евгений Машалов пишет: ...Насчет чтения, я не очень понял что Вы хотите выбрать. Если перегруженные линии, то без выборки не обойтись
... |
Евгений, макросы я пишу не в Растре, а в Excel. Растр я вообще не запускаю.
В Excel у меня забит эквивалент таблицы vetv, кое-что убрано, кое-что добавлено. Мне так удобней. Да и табличный процессор Excel работает быстрее, чем в Растре.
Вот к примеру. Ток по линии может оганичивается не только по ВЛ, но и по оборудованию (ТТ, ВЧЗ), которое навешано по концам ВЛ. Поэтому у меня в Excel имеется два столбца: в одном доп. ток по ВЛ и зависит от температуры, а в другой доп. ток по оборудованию и не зависит от температуры.
Запуская свой макрос в Excel, он просит указать на файл *.rg2. После чего в фоновом режиме происходит расчет режимов, где происходит соответствие токов по линиям с допустимыми токами. Результат формируется тут же, в Excel, в виде загрузки линии по току (в процентах).
Цитата |
---|
...Но я так вижу что Вы конкретные ip;iq;np читатете. В этом случае я просто бы сделал в начале программы вектор (или как он там, "массив") с индексами нужных элементов и использовал бы его на всех итерациях цикла отключения... |
Евгений, я согласен, что такой метод имеет право существовать, но "сколько программистов, столько варианов кодов решения одной и той же задачи". А хотя... надо будет тоже попробывать... Спасибо.
|
|
|
Евгений Машалов
Администратор
Всего сообщений: 1059
Дата регистрации: 23.04.2007
|
Создано:
09.09.2008 11:55:07
|
Ну вот в колонку (невидимую, скажем) Excel и вписать индексы ветвей, и извлекать данные уже по ним, а не по выборке
|
|
|
Михаил Реутов
Постоянный посетитель
Всего сообщений: 224
Дата регистрации: 21.11.2007
|
Создано:
09.09.2008 12:24:53
|
Цитата |
---|
Евгений Машалов пишет:
Ну вот в колонку (невидимую, скажем) Excel и вписать индексы ветвей, и извлекать данные уже по ним, а не по выборке |
У меня в Excel имеется три столбца ip, iq, np. Цикл, проходя их, находит в объете ветвей (Rastr.Tables("vetv")) нужную ветвь и отключает ее, расчитывает режим. Внутри этого цикла другой цикл из каждой ветви извлекает значение тока и ... (читать выше). Потом отключенная линия включается и отключается следующая, расчет режима. И все заново...
Я предлагаю больше не обсуждать что и как у меня там, если Вас интересует я могу выслать код макроса...
|
|
|
Михаил Реутов
Постоянный посетитель
Всего сообщений: 224
Дата регистрации: 21.11.2007
|
Создано:
09.09.2008 15:25:43
|
Цитата |
---|
Евгений Машалов пишет:
Мне сдается что восстанавливать режим путем чтения файла как-то расточительно. |
Если транформатор в Растре задан тремя линиями (трехобмоточный или АТ) и одна линия отключена(например, ВН), на НН "сидит" нагрузка или генератор, связь с сетью по ветки СН. Как в этом случае отключать ветку СН? Ведь Растр вдобавок отключит еще и ветку НН, и узел средней точки. Такой случай может получиться и для транзита, состоящий из нескольких ветвей когда с одной стороны он разомкнут, а с другой отключается линия: Растр весь транзит отключит.
Как вернуться к первоначальной схеме, не загружая заново файл с режимом?
|
|
|
Евгений Машалов
Администратор
Всего сообщений: 1059
Дата регистрации: 23.04.2007
|
Создано:
09.09.2008 16:18:26
|
Простейший способ: делаем колонку StaBase типа bool в узлах и в ветвях (Rastr.Tables("node").Cols.Add("StaBase")). Перед всеми расчетами пишем что-то типа Rastr.Tables("node").Cols("StaBase").Calc("sta") (и для ветвей аналогично). Делаем отключения, расчеты и все такое. Для возврата к исходному режиму пишем Rastr.Tables("node").Cols("StaBase").Calc("StaBase") и т.д. Можно также запомнить напряжения и углы, если не хочется пересчитывать.
Цитата |
---|
Я предлагаю больше не обсуждать что и как у меня там, если Вас интересует я могу выслать код макроса... |
Ну не обсуждать, так не обсуждать. Вроде тему насчет того что медленно работает я не начинал. Код не интересует...
|
|
|
Михаил Реутов
Постоянный посетитель
Всего сообщений: 224
Дата регистрации: 21.11.2007
|
Создано:
09.09.2008 16:52:25
|
Спасибо большое за простейший способ, помогло...
|
|
|
Бекжан Мукатов
Посетитель
Всего сообщений: 17
Дата регистрации: 06.01.2010
|
Создано:
01.09.2010 14:02:11
|
Здравствуйте! Помогите пожалуйста в следующем вопросе:
Мне необходимо извлечь имя узла в цикле.
Конструкция:
Rastr.Tables("vetv").Cols ("ie").Z(n), где n - номер строки,
не подходит, так как я использую не номер строки, а сквозную нумерацию.
Вот часть кода:
For ii=0 to kol2-1
P=Rastr.Calc("val","node","pn","numeraciya="&nomer+ii)
Q=Rastr.Calc("val","node","qn","numeraciya="&nomer+ii)
ny=Rastr.Calc("val","node","ny","numeraciya="&nomer+ii)
If (P<cod Or Q<cod) Then
Rastr.printp "Отриц.нарг. в узле " & ny & ???ИМЯ???
Else
End If
Next
|
|
|
Михаил Реутов
Постоянный посетитель
Всего сообщений: 224
Дата регистрации: 21.11.2007
|
Создано:
01.09.2010 14:44:09
|
Этим способом Rastr.Calc("val","node"?,"name","ny="&X), где Х - номер узла (не строки) можно извлечь название только одного узла, нескольких - только через цикл. Воспользуйтесь лучше нижеприведенным кодом:
Код |
---|
Dim node, row
Set node = Rastr.Tables("node")
node.SetSel "pn<0|qn<0"
row = node.FindNextSel(-1)
While row <>-1
Rastr.printp "Отриц.нарг. в узле " & node.Cols("name").Z(row)
row = node.FindNextSel(row)
Wend
Set node = Nothing
|
|
|
|
Бекжан Мукатов
Посетитель
Всего сообщений: 17
Дата регистрации: 06.01.2010
|
Создано:
01.09.2010 15:54:49
|
Спасибо Михаил! Все работает как надо
|
|
|
Виталий Чумаченко
Посетитель
Всего сообщений: 18
Дата регистрации: 28.04.2011
|
Создано:
11.05.2011 13:53:54
|
Михаил,я заинтересовался Вашим макросом. Дело в том, что я как раз недавно начал разбираться с написанием макросов в растре. Как раз написал макрос последовательного отключения выделенных ветвей и узлов и ввод в таблицу контролируемых параметров результатов расчёта режима. Однако столкнулся с проблемой отключения нескольких элементов одновременно...Не могли бы Вы прислать этот скрипт для ознакомления?...Мне кажется, что расчёт через Excel будет удобнее для решения моей задачи...в Excel ещё не пробовал писать...
|
|
|
Михаил Реутов
Постоянный посетитель
Всего сообщений: 224
Дата регистрации: 21.11.2007
|
Создано:
01.06.2011 08:41:20
|
to Виталий Чумаченко
Дело было давно, и "этот скрипт" как таковой уже не "существует" (нз где он у меня на компе, может удалил его). Но есть другие срипты в Экселе. Что конкретно Вас интересует?
|
|
|