На главную страницу RastrWin

Форум «Макро»


Список форумов
Новые темы
Список тем
Поиск по форумам
Помощь
Войти
Регистрация

Сообщения 1 - 25 из 61
Начало | Пред. | 1 2 3 | След. | Конец 

Тема: «Расчет динамики » в форуме: Макро   Просмотров: 53744
 
Алексе Курилкин
Посетитель
 
Всего сообщений: 17
Дата регистрации: 25.11.2013
Создано: 20.04.2015 13:27:24
 
 
Здравствуйте!

Вопрос простой - есть ли возможность запускать расчет переходного процесса и получить информацию об устойчивости машин с помощью макро (по аналогии с rastr.rgm)?

Спасибо!
 
Профиль
Наверх
Евгений Машалов
Администратор

 
Всего сообщений: 1059
Дата регистрации: 23.04.2007
Создано: 20.04.2015 14:17:18
 
 
Есть.
Код
Set spDynamic = Rastr.FWDynamic
Rastr.PrintP spDynamic.Run
Rastr.PrintP spDynamic.SyncLossCause


SyncLossCause возвращает:

Код
SYNC_LOSS_NONE            = 0x0, // нет нарушения
SYNC_LOSS_BRANCHANGLE      = 0x1, // по ветви
SYNC_LOSS_COA            = 0x2, // по генератору
SYNC_LOSS_OVERSPEED         = 0x4  // сработал автомат безопасности
 
Профиль
Наверх
Алексей Курилкин
Посетитель
 
Всего сообщений: 17
Дата регистрации: 25.11.2013
Создано: 20.04.2015 20:43:49
 
 
Спасибо! Это то, что нужно.
 
Профиль
Наверх
Алексей Курилкин
Посетитель
 
Всего сообщений: 17
Дата регистрации: 25.11.2013
Создано: 23.04.2015 19:06:56
 
 
SyncLossCause возвращает 2 при превышении угла генератора на 90 градусов. Можно ли как-нибудь поменять предельный угол?
 
Профиль
Наверх
Евгений Машалов
Администратор

 
Всего сообщений: 1059
Дата регистрации: 23.04.2007
Создано: 23.04.2015 22:02:03
 
 
Нет. При достижении разности модуля механического угла генератора и средневзвешенного угла синхронной зоны 90 градусов причина потери синхронизма ставится SYNC_LOSS_COA. Это простейший критерий. Есть много других, основанных на энергиях/ускорениях/повер­хностях, но для экспресс-анализа выбран этот.
 
Профиль
Наверх
Алексей Курилкин
Посетитель
 
Всего сообщений: 17
Дата регистрации: 25.11.2013
Создано: 30.12.2016 12:13:05
 
 
Здравствуйте! В процессе работы появилось еще несколько вопросов:

1. Есть ли возможность получать значения свойств TimeReached, ResultMessage, SyncLossCause в процессе расчета, а не после завершения (использую метод RunAsync)? Также, обращаю Ваше внимание, что в хелпе на стр. 332 указано свойство TimeComputed, но в интерфейсе FWDynamic его нет, видимо, просто опечатка, имелось в виду TimeReached.
2. Есть ли возможность останавливать расчет подобно кнопке ?Прервать расчет переходного процесса? в Рустабе? Смысл в том, что если в процессе расчета была обнаружена потеря устойчивости, нет нужды продолжать расчет.
3. Есть ли возможность получить результаты ЭМПП в формате csv, не запуская окно осциллограмм в Рустабе, а из программного интерфейса?
 
Профиль
Наверх
Евгений Машалов
Администратор

 
Всего сообщений: 1059
Дата регистрации: 23.04.2007
Создано: 30.12.2016 13:47:35
 
 
Здравствуйте.

1. Значения свойств рассчитываются в процессе моделирования ЭМПП, и по их значениям программа останавливает расчет в EMS-режиме автоматически. Завершить расчет по внешней команде после самостоятельного анализа состояния ЭМПП нельзя.
2. Прерывание расчета возможно в асинхронном режиме, но для этого нужно оперировать объектами синхронизации Windows. Если Ваша среда программирования позволяет это сделать, я могу описать порядок действий подробнее.
3. Для доступа к результатам есть программный интерфейс. Он позволяет доставать бинарные данные из sna-файлов. К сожалению в VBScript им пользоваться почти невозможно, т.к. VBScript не работает с массивами типов, отличных от Variant. Мы записываем данные в double и конвертить их не видим смысла. Экспорт csv/COMTRADE делает именно контрол графиков. В программном интерфейсе такой функции нет.
 
Профиль
Наверх
Алексей Курилкин
Посетитель
 
Всего сообщений: 17
Дата регистрации: 25.11.2013
Создано: 09.01.2017 11:17:28
 
 
Цитата
1. Значения свойств рассчитываются в процессе моделирования ЭМПП, и по их значениям программа останавливает расчет в EMS-режиме автоматически. Завершить расчет по внешней команде после самостоятельного анализа состояния ЭМПП нельзя.


Наверно, что-то делаю неправильно. Вот код:

Код

        Dim d As Long = dyn.RunAsync()
        Dim k As Long = 0
        Do Until False
            k = k + 1
            Dim time As Single = dyn.TimeReached
            Dim msg As String = dyn.ResultMessage
            Dim sync As Integer = dyn.SyncLossCause

            System.Threading.Thread.S­leep(100)          'пауза 100 мс
            Application.DoEvents()
            Console.WriteLine("k:{0} - time:{1} - sync:{2} - msg:{3}", k, time, sync, msg)

            If time >= 25 Then Exit Do
        Loop
        Console.ReadLine()

В результате у меня получается только последняя строка с результатом time = 25, sync=1 и тд, в предыдущих все значения пустые.

Цитата
Прерывание расчета возможно в асинхронном режиме, но для этого нужно оперировать объектами синхронизации Windows. Если Ваша среда программирования позволяет это сделать, я могу описать порядок действий подробнее.

Использую VB.NET и C#.NET в MS Studio, но если необходимо что-то другое, могу подстроиться. Было бы очень интересно про это узнать поподробнее

Цитата
Для доступа к результатам есть программный интерфейс. Он позволяет доставать бинарные данные из sna-файлов.
В хелпе про это информации не нашел, был бы очень признателен, если бы Вы меня подтолкнули в нужное русло, куда смотреть.
Спасибо!
 
Профиль
Наверх
Евгений Машалов
Администратор

 
Всего сообщений: 1059
Дата регистрации: 23.04.2007
Создано: 09.01.2017 12:35:08
 
 
В Вашем коде я что-то не вижу контроля возврата метода. По идее надо бы d трактовать как объект синхронизации.
Вообще для параллельных расчетов лучше использовать простой Run, но в своем потоке. По эффективности вряд ли параллельное исполнение что-то даст, потому что RUSTab сам по себе расчет пытается делать в несколько потоков.

По останову расчета

Код

stopEventHandle = new ManualResetEvent(false);
stopEventHandle.SafeWaitH­andle = new Microsoft.Win32.SafeHandl­es.SafeWaitHandle((IntPtr­)rastrEngine.GetStopHandl­e(), false);

Когда нужно остановить
Код

stopEventHandle.Set();

и ждать завершения

Код

hEvent = FWDynamic.RunAsync(); // это Ваша d
WaitEvent.SafeWaitHandle = new Microsoft.Win32.SafeHandl­es.SafeWaitHandle((IntPtr­)hEvent, true);
WaitEvent.WaitOne();


В хелпе информации по доступу к данным расчета пока нет. Неожиданно много придется там описывать. Если в двух словах то используется метод
Код
[id(131), helpstring("method GetChainedGraphSnapshot")­] HRESULT GetChainedGraphSnapshot(B­STR Table, BSTR Field, long nIndex, long SnapshotFileIndex, [out, retval] VARIANT *pVal);

Получает таблицу, поле, индекс объекта, номер загруженного файла результата, выдает двумерный SAFEARRAY со временем и данными по запрошенному параметру.
 
Профиль
Наверх
Rick_1
Заглянувший
 
Всего сообщений: 1
Дата регистрации: 29.03.2017
Создано: 29.03.2017 17:40:05
 
 
Здравствуйте!

Подскажите пожалуйста, что то не получаеться в С++ (RAD Studio) запустить расчет динамики:

Dynamic = Rastr.OlePropertyGet("FWD­ynamic");
Dynamic.OleProcedure("Run­Async");
 
Профиль
Наверх
Евгений Машалов
Администратор

 
Всего сообщений: 1059
Дата регистрации: 23.04.2007
Создано: 29.03.2017 18:19:42
 
 
В студии и встроенном vbscript все получаетЬся. RAD Studio мы не пользуемся.
Если Вы не готовы обрабатывать события завершения - рекомендую пользоваться Run вместо RunAsync
 
Профиль
Наверх
Игорь Бессонов
Посетитель
 
Всего сообщений: 35
Дата регистрации: 09.10.2013
Создано: 03.04.2017 17:56:02
 
 
Добрый день!
Цитата
Код
[id(131), helpstring("method GetChainedGraphSnapshot")­?] HRESULT GetChainedGraphSnapshot(B­?STR Table, BSTR Field, long nIndex, long SnapshotFileIndex, [out, retval] VARIANT *pVal);

Получает таблицу, поле, индекс объекта, номер загруженного файла результата, выдает двумерный SAFEARRAY со временем и данными по запрошенному параметру.

Напишите, пожалуйста, подробнее.
Как получить значение параметра, рассчитанного в ходе моделирования ЭМПП для опредленного времени (шага интегрирования). Как обращаться к таблице результатов ЭМПП средствами макро программирования. Уже понятно, что VBscript не позволяет получить двумерный массив. Пусть это будет массив результатов одного параметра, например Delta(t) или массив (всех?) параметров для одного (опредленного/запрашиваем­ого) времени/шага интегрирования, например для t=0.01c.
 
Профиль
Наверх
Евгений Машалов
Администратор

 
Всего сообщений: 1059
Дата регистрации: 23.04.2007
Создано: 03.04.2017 18:11:52
 
 
Какова Ваша цель ? Являетесь ли Вы или Ваша организация обладателем лицензии ? Это необходимо знать для определения уровня поддержки.

К таблице результатов ЭМПП средствами макропрограммирования обращаться нельзя, так как во-первых этих таблиц нет, а есть массивы, а во-вторых VBScript не позволяет работать с массивами типов отличных от Variant. Ваше предположение о том что VBScript не позволяет получить двумерный массив - ошибочно.

Надеюсь, пример на C# позволит разобраться как работать с результатами.

 
Профиль
Наверх
Алексей Курилкин
Посетитель
 
Всего сообщений: 17
Дата регистрации: 25.11.2013
Создано: 10.05.2017 17:47:21
 
 
Здравствуйте еще раз. После нескольких неудачных попыток остановить расчет сценария при потере динамической устойчивости снова обращаюсь к Вам. Мой уровень программирования, видимо, пока не дотягивает до решения подобных задач.

Можно ли еще раз (если это возможно, с примером) пояснить способ, при котором было бы возможно остановить расчет сценария при обнаружении потери динамической устойчивости по любому из критериев? Также, очень желательно знать первый, самый показательный, ResultMessage и соответствующий ему TimeReached.

Мне кажется, что решение этой задачи очень бы упростило и ускорило рабочий процесс расчетчиков, имеющих дело с большим объемом расчетов ДУ, таких как поиск предельного времени КЗ, поиск областей устойчивых режимов по условиям ДУ и тд, особенно в "тяжелых" схемах с большим количеством машин.

Пишу на C# в VS2015

Спасибо большое!
 
Профиль
Наверх
Евгений Машалов
Администратор

 
Всего сообщений: 1059
Дата регистрации: 23.04.2007
Создано: 10.05.2017 18:13:58
 
 
Здравствуйте Алексей.
Мы уже обсуждали, что расчет останавливается автоматически при нарушении любого из критериев. Для этого нужно запускать расчет динамики в EMS-режиме. В этом случае доступна причина останова расчета, время, и сообщение из протокола.

Пример на C# в EMS-режиме

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

Мы тоже пишем, иной раз, на C#.

Пожалуйста.
 
Профиль
Наверх
Алексей Курилкин
Посетитель
 
Всего сообщений: 17
Дата регистрации: 25.11.2013
Создано: 10.05.2017 18:43:10
 
 
Цитата
Мы уже обсуждали, что расчет останавливается автоматически при нарушении любого из критериев. Для этого нужно запускать расчет динамики в EMS-режиме. В этом случае доступна причина останова расчета, время, и сообщение из протокола.


Действительно, все работает. Простите, что отнял время
 
Профиль
Наверх
Олег Бельцов
Посетитель
 
Всего сообщений: 34
Дата регистрации: 14.05.2012
Создано: 06.03.2019 17:56:03
 
 
Цитата
В хелпе информации по доступу к данным расчета пока нет. Неожиданно много придется там описывать. Если в двух словах то используется метод


Код

[id(131), helpstring("method GetChainedGraphSnapshot")­?] HRESULT GetChainedGraphSnapshot(B­?STR Table, BSTR Field, long nIndex, long SnapshotFileIndex, [out, retval] VARIANT *pVal);


Получает таблицу, поле, индекс объекта, номер загруженного файла результата, выдает двумерный SAFEARRAY со временем и данными по запрошенному параметру.


Пара вопросов:
1. Когда появится документация?
2. Как узнать какие таблицы и поля попадут в Snapshot, дабы проверить правильность параметров вызова данной функции до запуска скрипта и не обратиться после долгого расчёта к несуществующей таблице или полю?
 
Профиль
Наверх
Евгений Машалов
Администратор

 
Всего сообщений: 1059
Дата регистрации: 23.04.2007
Создано: 06.03.2019 18:12:35
 
 
Вы имеете в виду документацию по доступу к данным ? В данной ветке, кажется, все уже написано. Доступен пример. И даже у кого-то выше был положительный результат.
Но в Руководстве таки появился раздел 20. Там еще более интересный интерфейс для расчета под управлением макроса. То что хочется видеть в качестве результатов можно задать в контролируемых величинах и получать прям в онлайне.
Про то как узнать какие поля и таблицы попадут в снапшот проще посмотреть глазками в специальной форме. И в форме же можно выбрать что надо и что не надо.
Пользователь добавил изображение
Форма описана в разделе 3.5.
В принципе есть вызов IFWDynamic::ModelStructur­e. Возвращает xml с которого строится выше указанная форма. Структура там несложная.

Совершенно необязательно выполнять долгий расчет для того чтобы посмотреть результаты. Можно просто загрузить готовый sna:
Код
Rastr.FWSnapshotFiles.Add­ "c:tmp\009.sna"


 
Профиль
Наверх
Олег Бельцов
Посетитель
 
Всего сообщений: 34
Дата регистрации: 14.05.2012
Создано: 06.03.2019 19:38:18
 
 
Спасибо за ответ.
Я, наверное, не совсем точно выразился.
У меня внешняя программа подключающая Astra.dll и проводящая серию расчётов контролируя задаваемые в интерфейсе величины. Имена таблиц и полей контролируемых величин приходится задавать текстом, если опечататься, то расчёт проходит в пустую, ошибку выдаст только после расчёта динамики. Вот и хотелось бы сделать контроль или даже помощь при вводе имён. Так что "посмотреть глазками" -- не вариант.

Парсить xml не пробовал -- придётся учиться.

Кстати, где храниться данная структура: в интерфейсе или где то в модели? Т.е. как она будет себя вести: будет ли постоянна для приложения или будет меняться при загрузке разных файлов моделей?

Всё написанное Вами относиться к версиям 2.0 и выше?

Что на счёт 1.80? Ну увидел вызова с таким именем. Может плохо смотрел?
 
Профиль
Наверх
Евгений Машалов
Администратор

 
Всего сообщений: 1059
Дата регистрации: 23.04.2007
Создано: 06.03.2019 19:51:07
 
 
Я примерно понимаю use-case. Какой-нибудь очередной "ПК Парус" или как он там С улыбкой Но не представляю, как сделать определение исходных данных не текстом. Никакой иерархии объектов и атрибутов a-la CIM нет (даже в CIM). Есть набор таблиц и полей, при этом он еще и расширяется. По-идее наличие таблицы и поля можно проконтролировать штатными средствами и до и после расчета. Вот пишется ли динамика по этому полю таблицы - можно узнать из xml или из формы. Ну или тупо запросить и либо поймать экспешн, либо получить данные. Вообще не думаю, что набор данных может меняться в широком диапазоне. Идентификаторы - да, но величины - вряд ли. Поэтому можно сделать фиксированный набор таблиц/полей и задавать по каким объектам данные забирать.

Еще раз - почему мы ждем ошибку после расчета динамики ? Мы можем запустить расчет, дождаться его завершения. Потом, на следующий типа день, а то и параллельно со следующим расчетом, взять записанный файл и потрошить его как хотим. Или сразу много файлов, если хотим сравнивать результаты. Данные ведь уже будут записаны в файл и никуда не денутся. Ждать ничего не надо.

Парсить xml уже поздновато учиться. Все прогрессивное человечество ударилось в json. Но парсить его легко - msxml.

То что написано про формы и xml - к 2.0. Про IFWSnapshotFiles - к периоду с 2007 года по сей день.
Код
[id(130), helpstring("Get Framework Result Files")] HRESULT FWSnapshotFiles([out, retval] IFWSnapshotFiles **pVal);


Код
interface IFWSnapshotFiles : IDispatch
   {
      [id(DISPID_VALUE), helpstring("Item")] HRESULT Item([in]VARIANT ItemIndex,[out, retval] VARIANT *pItem);
      [propget, id(1), helpstring("Count")] HRESULT Count([out, retval] long *pVal);
      [id(2), helpstring("Add")] HRESULT Add(BSTR FilePath,[out, retval] IFWSnapshotFile **pVal);
      [id(3), helpstring("Remove")] HRESULT Remove([in] VARIANT ItemIndex);
      [propget, id(4), helpstring("property Find")] HRESULT Find([in]VARIANT ItemIndex, [out, retval] VARIANT *pItem);
      [propget, restricted, id(DISPID_NEWENUM), helpstring("_NewEnum")] HRESULT _NewEnum([out, retval] LPUNKNOWN *pVal);
      [propget, id(5), helpstring("Time Marker")] HRESULT TimeMarker([out, retval] double *pVal);
      [id(6), helpstring("Resync")] HRESULT Resync();
      [id(7), helpstring("RemoveAll")] HRESULT RemoveAll();
      [propget, id(Здорово, helpstring("EnableDBInter­action")] HRESULT EnableDBInteraction([out,­ retval] long *pVal);
      [propput, id(Здорово, helpstring("EnableDBInter­action")] HRESULT EnableDBInteraction([in] long Val);
      [id(9), helpstring("method DFWSetReferenceValue")] HRESULT SetReferenceValue(DFWRefe­renceVariableType eType, BSTR Table, BSTR Field, LONG ObjId);
      [id(10), helpstring("method ShrinkToCount")] HRESULT ShrinkToCount(LONG nCount);

   };


 
Профиль
Наверх
Алексей Курилкин
Посетитель
 
Всего сообщений: 17
Дата регистрации: 25.11.2013
Создано: 07.03.2019 01:31:04
 
 
Олег Бельцов,
Код

using ASTRALib;
using System;
using System.Linq;
using System.Xml.Linq;

namespace HelpOleg
{
    internal class Program
    {
        private static void Main(string[] args)
        {
            var rastr = new Rastr();
            rastr.Load(RG_KOD.RG_REPL­, "", @"C:UsersАлексейDocuments­RastrWin3SHABLONдинамика.­rst");
            var structure = rastr.FWDynamic().ModelSt­ructure;
            var xDocument = XDocument.Parse(structure­);
            if (xDocument.Root != null)
                foreach (var dfwClassElement in xDocument.Root.Elements()­.Where(element => element.Name == @"DFWclass"))
                {
                    var tableName = dfwClassElement.Attribute­(@"name").Value;
                    var tableVerbalName = dfwClassElement.Attribute­(@"verbalName").Value;
                    var variablesElement = dfwClassElement.Element(@­"variables");
                    Console.WriteLine(tableVe­rbalName);
                    foreach (var variableElement in variablesElement.Elements­())
                    {
                        var columnName = variableElement.Attribute­(@"name").Value;
                        Console.WriteLine($@"{tab­leName} - {columnName}");
                    }
                }
            Console.ReadLine();
        }
    }
}


Вот примерно то что вы просили, правда я не знаю на каком ЯП вы пишете. По идее можно еще заморочиться проверкой на пустые ссылки, но лениво. Если будут вопросы, звоните на внутренний СОшный.

Цитата
Я примерно понимаю use-case. Какой-нибудь очередной "ПК Парус" или как он там


Даже если так, то почему нет? Причин осваивать потихоньку программирование у режимщиков хватает.
 
Профиль
Наверх
Евгений Машалов
Администратор

 
Всего сообщений: 1059
Дата регистрации: 23.04.2007
Создано: 07.03.2019 01:45:49
 
 
Не понял что за пустые ссылки с которыми надо заморачиваться.

Цитата
Даже если так, то почему нет? Причин осваивать потихоньку программирование у режимщиков хватает.

Я только за. Не постесняюсь заметить что даже приложил усилия в направлении просвещения. Да и на карьерном росте это, говорят, хорошо сказывается.
 
Профиль
Наверх
Алексей Курилкин
Посетитель
 
Всего сообщений: 17
Дата регистрации: 25.11.2013
Создано: 07.03.2019 10:08:03
 
 
Цитата
Не понял что за пустые ссылки с которыми надо заморачиваться.

Если принять как данность то, что структура xml в строке ModelStructure всегда одинакова, у каждого DWFClass есть атрибуты name и verbalName, а также вложенный тег variables и тд, то все и так будет окей.
Если предположить, что у какого-нибудь DWFClass не окажется variables, то метод Element() вернет null и далее возникнет исключение, обработки его нет, и все, беда.
Но это все детали, не относящиеся к основному вопросу.
 
Профиль
Наверх
Олег Бельцов
Посетитель
 
Всего сообщений: 34
Дата регистрации: 14.05.2012
Создано: 07.03.2019 12:36:07
 
 
Всем спасибо за ответы.
Наверное действительно проще будет ручками забить готовые наборы. Даже есть положительные моменты в плане usability. Так что спасибо за идею.

Не хранить snapshot'ы есть ряд причин:
- во-первых, они могут быть Очень большими;
- во-вторых, работа с нескольким снэпшотами для меня не совсем прозрачна, а принять решение по данными не из того снэпшота -- неприятно, как разберусь -- посмотрю куда их применить.

Ловить исключение после расчёта чтобы определить есть ли данный параметр в снэпшоте -- тоже не вариант, я программно анализирую результаты расчёта динамики и принимаю решение об изменении исходных условий для проведения следующего расчёта и далее по циклу. Узнать через 10-20 минут, что ты ошибся в обозначении параметра для контроля -- тоже как-то неприятно.

Основная польза от программ -- в возможности их повторного использования, поэтому целесообразно дать возможность пользователю влиять на поведение программ. Естественно для этого удобнее использовать GUI. Вот и получаются "Парусы".

Уж если СЭРы пишут программы, значит они кому-то очень нужны.

Про тенденцию к JSON -- немного знаю. Ведь недостатки xml известны уже давно, так что вполне закономерная тенденция. Но xml уже сейчас повсеместно используется для описания структур данных, а значит всё же придётся разбираться. Взять тот же Rastr -- сколько в нем структур описано на JSON, а сколько на xml?
 
Профиль
Наверх
Евгений Машалов
Администратор

 
Всего сообщений: 1059
Дата регистрации: 23.04.2007
Создано: 07.03.2019 13:33:54
 
 
Цитата
Но это все детали, не относящиеся к основному вопросу.

Ok-ok. Я напужался что xml не достаточно хорош.
Цитата
Всем спасибо за ответы.

You're welcome
Я может тут преждевременно начал давать советы всякие, но на самом деле Вам виднее какой тактики придерживаться. Главное чтобы Вы видели все доступные возможности.

Мы не против парусов, даже за. Без ветра же они бесполезны. Нас немного бомбит когда АСДУ начинает топать ногой и жаловаться что у них перестал работать какой-то очередной самодельный ПК после нашего апгрейда. Но если автор пока не достиг Олимпа то что-то там подправляет, чему мы ассистируем.

Наш разговор про xml был в контексте обучения. В RastrWin xml используется широко, но у него и возраст солидный. Но вот и json появился. Вчера. Теперь у нас такая лицензия будет и хранилище для ЭЦП. Пришло время поместить в бочку растра ложку онлайна. Оруэлл оценил бы.


 
Профиль
Наверх


Сообщения 1 - 25 из 61
Начало | Пред. | 1 2 3 | След. | Конец 

Читают тему
гостей: 1, пользователей: 0, из них скрытых: 0


Список форумов
Новые темы
Список тем
Поиск по форумам
Помощь
Войти
Регистрация





Работает на «Битрикс: Управление сайтом» © «Битрикс», 2001-2006