Форум обсуждения систем  

Вернуться   Форум обсуждения систем "Умный дом", проектов Ардуино, OpenWRT и других DIY устройств > Форум умного дома > Сделай сам > Открытый проект умного дома

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
Старый 19.12.2012, 18:18   #51
zuriuslev
Junior Member
 
Регистрация: 19.12.2012
Адрес: Марбелья
Сообщений: 18
Вес репутации: 0
zuriuslev has a reputation beyond reputezuriuslev has a reputation beyond reputezuriuslev has a reputation beyond reputezuriuslev has a reputation beyond reputezuriuslev has a reputation beyond reputezuriuslev has a reputation beyond reputezuriuslev has a reputation beyond reputezuriuslev has a reputation beyond reputezuriuslev has a reputation beyond reputezuriuslev has a reputation beyond reputezuriuslev has a reputation beyond repute
Thumbs up Сегодня, успешно завершил тест работы libmodbus

В качестве сервера работал роутер TP-Link TL-MR3220 v1, на котором установлен OpenWrt Attitude Adjustment 12.09-rc1.
libmodbus для роутера можно установить стандартными средствами (opkg install libmodbus)
Тестовая программа (unit-test-client) собиралась стандартными средствами OpenWrt на Ubuntu.

В качестве клиента работал LaunchPad MSP430 ( IDE energia-0101E0009 ),
здесь работал немного модифицированный скетч из четвёрторо поста.
Дело в том, что у LaunchPad есть два встроенных светодиода и датчик температуры.
Вот их-то и задейсвовал.

Slave ID = 1
Декларировано 10 регистров.
Первый (0) и второй (1) регистр управляет включением-выключением светодиодов.
Последний регистр (9) читает температуру процессора с встроенного термодатчика.
В остальные регисры пишутся случайные числа.

Исходник программы на C -
Код:
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <modbus.h>
#include "unit-test.h"

#define SL_ID 1

int main(int argc, char *argv[])
{
    uint16_t tab_reg[64];
    modbus_t *ctx;
    int i, n , rc;

    ctx = modbus_new_rtu("/dev/ttyACM0", 9600, 'N', 8, 1);
    if (ctx == NULL) {
        fprintf(stderr, "Unable to allocate libmodbus context\n");
        return -1;
    }
    modbus_set_debug(ctx, TRUE);
    modbus_set_error_recovery(ctx,
                              MODBUS_ERROR_RECOVERY_LINK |
                              MODBUS_ERROR_RECOVERY_PROTOCOL);

    modbus_set_slave(ctx, SL_ID);

    if (modbus_connect(ctx) == -1) {
        fprintf(stderr, "Connection failed: %s\n",
                modbus_strerror(errno));
        modbus_free(ctx);
        return -1;
    }

    printf("** UNIT TESTING **\n");
    printf("\nTEST WRITE/READ:\n");


    tab_reg[0] = 0;
    tab_reg[1] = 1;

    for ( n=0 ; n<100 ; n++ ) {
        rc = modbus_read_registers(ctx, 0, 10, tab_reg);
	if (rc == -1) {
	    fprintf(stderr, "%s\n", modbus_strerror(errno));
	    return -1;
	}

	for (i=0; i < rc; i++) {
	    printf("reg[%d]=%d (0x%X)\n", i, tab_reg[i], tab_reg[i]);
	}

	if (tab_reg[0] == 1) tab_reg[0]=0; else tab_reg[0]=1;
	if (tab_reg[1] == 1) tab_reg[1]=0; else tab_reg[1]=1;
	tab_reg[2] = rand();
	tab_reg[3] = rand();
	tab_reg[4] = rand();
	tab_reg[5] = rand();
	tab_reg[6] = rand();
	tab_reg[7] = rand();
	tab_reg[8] = rand();

        rc = modbus_write_registers(ctx, 0, 10, tab_reg);
	if (rc == -1) {
	    fprintf(stderr, "%s\n", modbus_strerror(errno));
	    return -1;

	}
        for (i=0; i < rc; i++) {
		printf("reg[%d]=%d (0x%X)\n", i, tab_reg[i], tab_reg[i]);
	}

	sleep(1);
	
    }

    /* Close the connection */
    modbus_close(ctx);
    modbus_free(ctx);

    return 0;
}
Скетч -
Код:
#include <Modbusino.h>

const int ledPin_g =  GREEN_LED;
const int ledPin_r =  RED_LED;
const int RL0 = GREEN_LED;
const int RL1 = RED_LED;
const int RL2 = 12;
const int RL3 = 13;
const int rl_arr[] = { RL0,RL1,RL2,RL3 };
const int regs = 10; // количество регистров
const int ID_slave = 1;

uint16_t tab_reg[regs]; //задаем массив регистров

// Инициализация SLAVE, идентификатор (адрес) в сети ID = 1
ModbusinoSlave modbusino_slave(ID_slave);

// на цифр. выходы сразу записываем значение регистров
// любое значение > 0 это HIGH, 0 - LOW   

void SetRelay() {
  int i;
  for (i = 0; i < 4; i++) {
    digitalWrite(rl_arr[i], tab_reg[i]); 
  }
}

void setup() {
  modbusino_slave.setup(9600);
// установка цифровых вх/вых в режим выхода  
  pinMode(RL0, OUTPUT);
  pinMode(RL1, OUTPUT);
  pinMode(RL2, OUTPUT);
  pinMode(RL3, OUTPUT);
}

void loop() {
  modbusino_slave.loop(tab_reg, regs);
  SetRelay();
  tab_reg[9] = analogRead(TEMPSENSOR); //запись аналогового значения в 9-ый регистр

}
Вывод тестовой программы -
Код:
root@zuriuslev:~# /home/ServoManager/ACM0/unit-test-client
Opening /dev/ttyACM0 at 9600 bauds (N, 8, 1)
** UNIT TESTING **

TEST WRITE/READ:
[01][03][00][00][00][0A][C5][CD]
Waiting for a confirmation...
<01><03><14><00><00><00><01><99><38><E8><E0><CA><79><5C><4D><EA><3D><1A><34><5D><BC><01><3E><40><7D>
reg[0]=0 (0x0)
reg[1]=1 (0x1)
reg[2]=39224 (0x9938)
reg[3]=59616 (0xE8E0)
reg[4]=51833 (0xCA79)
reg[5]=23629 (0x5C4D)
reg[6]=59965 (0xEA3D)
reg[7]=6708 (0x1A34)
reg[8]=23996 (0x5DBC)
reg[9]=318 (0x13E)
[01][10][00][00][00][0A][14][00][01][00][00][45][67][23][C6][98][69][48][73][DC][51][5C][FF][94][4A][01][3E][6A][82]
Waiting for a confirmation...
<01><10><00><00><00><0A><40><0E>
reg[0]=1 (0x1)
reg[1]=0 (0x0)
reg[2]=17767 (0x4567)
reg[3]=9158 (0x23C6)
reg[4]=39017 (0x9869)
reg[5]=18547 (0x4873)
reg[6]=56401 (0xDC51)
reg[7]=23807 (0x5CFF)
reg[8]=37962 (0x944A)
reg[9]=318 (0x13E)
[01][03][00][00][00][0A][C5][CD]
Я ОООчень доволен
Метод отлично работает ! LaunchPad MSP430 весело моргает светодиодами и показывает изменения температуры

Програмка для роутера в аттачменте
Вложения
Тип файла: zip unit-test-client.zip (3.5 Кб, 406 просмотров)
zuriuslev вне форума   Ответить с цитированием
Старый 19.12.2012, 18:43   #52
Admin
Administrator
 
Аватар для Admin
 
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,618
Вес репутации: 9823
Admin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant future
По умолчанию

Программу для роутера не совсем понял как запускать?
Admin вне форума   Ответить с цитированием
Старый 19.12.2012, 22:02   #53
zuriuslev
Junior Member
 
Регистрация: 19.12.2012
Адрес: Марбелья
Сообщений: 18
Вес репутации: 0
zuriuslev has a reputation beyond reputezuriuslev has a reputation beyond reputezuriuslev has a reputation beyond reputezuriuslev has a reputation beyond reputezuriuslev has a reputation beyond reputezuriuslev has a reputation beyond reputezuriuslev has a reputation beyond reputezuriuslev has a reputation beyond reputezuriuslev has a reputation beyond reputezuriuslev has a reputation beyond reputezuriuslev has a reputation beyond repute
Smile Продолжил разборки с modbus.

Хочу управлять шиной при помощи PHP.
НО ! для PHP, нашел вразумительные классы только для ModBus TCP,
для ModBus RTU, ничего нет.

Начал рыться и наткнулся на замечательную программу -
Free MODBUS/TCP to MODBUS/RTU gateway

Действительно !
скомпилировал, запустил на роутере
(mbusd -d -v9 -L- -p/dev/ttyACM0 -s9600 -P502)
и подключился уже с виндозы, через ModbusPoll.
Всё работает !

Даже собрал .ipk для OpenWrt.

Завтра продолжу уже из PHP.
Вложения
Тип файла: zip mbus_0.1.2_ar71xx.zip (10.2 Кб, 459 просмотров)
zuriuslev вне форума   Ответить с цитированием
Старый 19.12.2012, 22:05   #54
zuriuslev
Junior Member
 
Регистрация: 19.12.2012
Адрес: Марбелья
Сообщений: 18
Вес репутации: 0
zuriuslev has a reputation beyond reputezuriuslev has a reputation beyond reputezuriuslev has a reputation beyond reputezuriuslev has a reputation beyond reputezuriuslev has a reputation beyond reputezuriuslev has a reputation beyond reputezuriuslev has a reputation beyond reputezuriuslev has a reputation beyond reputezuriuslev has a reputation beyond reputezuriuslev has a reputation beyond reputezuriuslev has a reputation beyond repute
По умолчанию

Цитата:
Сообщение от Admin Посмотреть сообщение
Программу для роутера не совсем понял как запускать?
Скопировать на роутер. (Например в /usr/bin)
Сделать "chmod 755 /usr/bin/unit-test-client"
и запустить unit-test-client


Немножко доработал прогу, новое название mbtest
Usage: mbtest [-p name] [-s value] [-e value]
-p<name> set serial port device name (default /dev/ttyACM0)
-s<value> set serial port speed (default 9600)
-e<value> set slave id (default 1)

Т.Е можно изменять порт, скорость и номер слейв устройства,
запуск без параметров эквивалентен комманде - mbtest -p ttyACM0 -s 9600 -e 1
список параметров - mbtest -h
комплект прилагается.
Вложения
Тип файла: zip mbtest.zip (6.0 Кб, 375 просмотров)

Последний раз редактировалось zuriuslev; 20.12.2012 в 02:15.
zuriuslev вне форума   Ответить с цитированием
Старый 20.12.2012, 04:53   #55
andr128
Senior Member
 
Аватар для andr128
 
Регистрация: 16.09.2012
Адрес: Irkutsk
Сообщений: 555
Вес репутации: 1605
andr128 has a reputation beyond reputeandr128 has a reputation beyond reputeandr128 has a reputation beyond reputeandr128 has a reputation beyond reputeandr128 has a reputation beyond reputeandr128 has a reputation beyond reputeandr128 has a reputation beyond reputeandr128 has a reputation beyond reputeandr128 has a reputation beyond reputeandr128 has a reputation beyond reputeandr128 has a reputation beyond repute
По умолчанию

Отлично наш человек!
PHP хорошо работает через сокеты.
Вот пример клиента:
PHP код:
<?php
  header
('Content-Type: text/plain; charset=utf-8 '); //Мы будем выводить простой текст
  
set_time_limit(0); //Скрипт должен работать постоянно
  
ob_implicit_flush(); //Все echo должны сразу же выводиться

  
$address 'localhost';
  
$port 3425;

  
$socket socket_create(AF_INETSOCK_STREAMSOL_TCP);
  
$result socket_connect($socket$address$port);

  
$msg "hello server!";

  
socket_write($socket$msgstrlen($msg)); //Сообщение серверу
  
  
$out socket_read($socket1024PHP_BINARY_READ);   //Читаем сообщение от сервера

// echo "Сообщение от сервера: $out\n"; //Выводим сообщение от сервера

//здесь можно задать массив с данными, получив их с сервера.
    
$n = array("id" => 56
           
"val1" => "off",
           
"val2" => "on",
           
"val3" => 129,
           
"val4" => "0",
           
"server" => $out,
           
"time" => date("H:i:s"));
    echo 
json_encode($n);


  
//Останавливаем работу с сокетом
  
if (isset($socket)) {
    
socket_close($socket);
  }
?>
Пример сервера для работы с сокетами:

PHP код:
//gcc serv_select.c -o serv_select 


#include <string.h>
#include <stdlib.h>

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <stdio.h>

#include <unistd.h>    /* UNIX standard function definitions */
#include <fcntl.h>     /* File control definitions */
#include <errno.h>     /* Error number definitions */
#include <termios.h>   /* POSIX terminal control definitions */


int PORT_SERV 3425;
char sendstr[] = "I'm Server port 3425";

char str[10];

int count 0;

int main() {

    
int sock_fd;
    
int list_fd;

    
int selvar;
    
struct sockaddr_in addr;
    
char buf[1024];
    
int bytes_read;

    
list_fd socket(AF_INETSOCK_STREAM0); //создание сокета
    
if (list_fd 0) { perror("socket"); exit(1); }
    
//    fcntl(list_fd, F_SETFL, O_NONBLOCK); //не блокируемый сокет
    
    
addr.sin_family AF_INET;        //тип соединения
    
addr.sin_port htons(PORT_SERV);    //порт
    
addr.sin_addr.s_addr INADDR_ANY;    //принимать соед. с любого адреса 

    //связывание сокета с адресом, портом ..
    
if ( bind(list_fd, (struct sockaddr *)&addrsizeof(addr)) < 0) { perror("bind"); exit(2); }

    
listen(list_fd1); //слушать соединения на сокете, 1 - возможн. кол-во соединений


// главный цикл    
while(1)
{
        
sock_fd accept(list_fdNULLNULL); //
        
if (sock_fd 0) { perror("accept"); close(sock_fd); return -1; }

  while(
1) {
        
// Заполняем множества дискрипторов
        
fd_set readset;            // type
        
FD_ZERO(&readset);        // очистить набор всех дискрипторов
        
FD_SET(sock_fd, &readset);    // включить в набор файловый дискриптор сокета

        // Задаём таймаут
        
struct timeval timeout;
        
timeout.tv_sec =  1;
        
timeout.tv_usec 0;

        
// Ждём события в одном из сокетов
        
selvarselect (sock_fd+1, &readsetNULLNULL, &timeout);
    if (
selvar <= 0) { perror("select"); exit(3); } 
    else {
        if ( 
FD_ISSET(sock_fd, &readset) )
        {
        
bytes_read recv(sock_fdbuf10240); // получаем данные из сокета sizeof(buf)
        
if (bytes_read <= 0) {printf("Bytes: %d\n"bytes_read); close(sock_fd); break; } // Соединение разорвано или ошибка

        
buf[bytes_read]=0//добавить в конец 0
        
printf(" bytes: %d read str: %s\n"bytes_readbuf);


        
count++; if (count 0xFFFEcount=0// просто счетчик
        //itoa(count, str, 10);
        
sprintf(str"%6u"count); //преобразовать число в строку

//        send(sock_fd, sendstr, strlen(sendstr), 0);
        
send(sock_fdstrstrlen(str), 0); //в ответ будем посылать счетчик
        
}
        }
   
printf(" Cycle osn\n");
  } 
//осн. цикл

printf(" Cycle MAIN\n");
//гл. цикл

    
return 0;

Добавьте в этот код работу с модбас и будет у вас свой шлюз.
Код:
Arduino (slave) <---> Modbus RTU (Master) - Sokcet TCP(Server) <---> PHP Socket TCP (Client) -- Web страница
По поводу компиляции под роутер. Мы тут все подсажены на версию trunk r33482. Поэтому скомпилированные вами программы могут не запускаться.
Хотя если использовать библиотеки от нашей версии то...

Последний раз редактировалось andr128; 20.12.2012 в 15:08.
andr128 вне форума   Ответить с цитированием
Старый 20.12.2012, 14:44   #56
andr128
Senior Member
 
Аватар для andr128
 
Регистрация: 16.09.2012
Адрес: Irkutsk
Сообщений: 555
Вес репутации: 1605
andr128 has a reputation beyond reputeandr128 has a reputation beyond reputeandr128 has a reputation beyond reputeandr128 has a reputation beyond reputeandr128 has a reputation beyond reputeandr128 has a reputation beyond reputeandr128 has a reputation beyond reputeandr128 has a reputation beyond reputeandr128 has a reputation beyond reputeandr128 has a reputation beyond reputeandr128 has a reputation beyond repute
По умолчанию

Для тех кто хочет поуправлять ардуиной с Web сервера (без модбас) можно использовать шлюз server serial-tcp: ser2net (есть в репозитории) или suart.

Стучаться к нему соответственно через сокет (пример на PHP выше) указав порт TCP.

Пример html страницы. (Используется JQuery, JSON, AJAX - фоновое обновление параметров):
Код HTML:
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; Charset=UTF-8">  
    <script type="text/javascript" src="jquery.js"></script>
</head>
<body>
<div id="info">Загрузка...</div>

	<script>
		function json_example()
		{
			$.getJSON('client_socket.php', function(data) {
				s = "";
				$.each(data, function(key, val) {
					s= s + key+' = ' + val + '<br/>'
				});
				$("#out").html(s)
			});
		}

		setInterval(json_example, 1000); //вызывать скрипт через 1 с
//		json_example(); //вызвать 1 раз
	</script>

<div id="out"></div>

</body>
</html>

Пример вывода отдельных элементов массива текстовой структуры JSON

Код HTML:
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; Charset=UTF-8">  
    <script type="text/javascript" src="jquery.js"></script>
</head>
<body>

<div id="info"> Данные с сервера php </div>

<script>
	function json_example()
	{
	$.getJSON('client_socket.php', function(data) 
				{
	 			$("#out").html(" ID     : " +data.id+"<br>"+
                       			       " Server : " +data.server+"<br>"+
                       			       " Time   : " +data.time);
				} 
	);
	}

	setInterval(json_example, 1000); //вызывать скрипт через 1000 мс

</script>

<div id="out"></div> <!-- сюда будет выводится страница -->

</body>
</html>

Последний раз редактировалось andr128; 26.01.2013 в 08:21.
andr128 вне форума   Ответить с цитированием
Старый 20.12.2012, 15:03   #57
andr128
Senior Member
 
Аватар для andr128
 
Регистрация: 16.09.2012
Адрес: Irkutsk
Сообщений: 555
Вес репутации: 1605
andr128 has a reputation beyond reputeandr128 has a reputation beyond reputeandr128 has a reputation beyond reputeandr128 has a reputation beyond reputeandr128 has a reputation beyond reputeandr128 has a reputation beyond reputeandr128 has a reputation beyond reputeandr128 has a reputation beyond reputeandr128 has a reputation beyond reputeandr128 has a reputation beyond reputeandr128 has a reputation beyond repute
По умолчанию тестовый код управление ардуиной по Modbus RTU

PHP код:
//gcc mbmaster.c -o mbmaster `pkg-config --libs --cflags libmodbus`

//==========================
//   Modbus RTU Master
//==========================

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <modbus.h>


#define INT_REGS 10 //10 регистров

//============================
int main(int argcchar *argv[])
{

uint16_t tab_reg[INT_REGS];
modbus_t *ctx;
modbus_mapping_t *mb_mapping;
int rc;
int i;
char c;

    
ctx modbus_new_rtu("/dev/ttyUSB0"9600'N'81);
    if (
ctx == NULL) { fprintf(stderr"Unable to create the modbus context\n"); return -1; }

    
modbus_set_slave(ctx1); //id=1

    
if (modbus_connect(ctx) == -1) { 
    
fprintf(stderr"Connection failed: %s\n"modbus_strerror(errno));
    
modbus_free(ctx);
        return -
1;
    }

//основной цикл
for(;;) {
    
rc modbus_read_registers(ctx0INT_REGStab_reg);
    if (
rc == -1) { 
    
fprintf(stderr"Read - %s\n"modbus_strerror(errno));
    
//return -1;
    
}

    if (
rc != -1) { 
    for (
i=0rci++) { printf("reg[%d]=%d (0x%X)\n"itab_reg[i], tab_reg[i]); }
    }

    
scanf ("%c",&c);
    if (
=='a'tab_reg[0] = 1// посылаем ардуине команды с клавиатуры
    
if (=='s'tab_reg[0] = 0
    if (
=='z'tab_reg[1] = 11
    if (
=='q') break; 

    
rc modbus_write_registers(ctx01tab_reg);
    if (
rc == -1) { fprintf(stderr"Write - %s\n"modbus_strerror(errno)); }

    

//for cycle

printf("Quit mbmaster: %s\n"modbus_strerror(errno));
modbus_close(ctx);
modbus_free(ctx);


return 
0;

andr128 вне форума   Ответить с цитированием
Старый 20.12.2012, 15:46   #58
Andreyweb
Member
 
Регистрация: 28.11.2012
Адрес: Липецк
Сообщений: 56
Вес репутации: 0
Andreyweb has much to be proud ofAndreyweb has much to be proud ofAndreyweb has much to be proud ofAndreyweb has much to be proud ofAndreyweb has much to be proud ofAndreyweb has much to be proud ofAndreyweb has much to be proud ofAndreyweb has much to be proud of
Отправить сообщение для Andreyweb с помощью ICQ
По умолчанию

ANDR128 Пример сервера для работы с сокетами:

Скрипт написан на PHP--???
Andreyweb вне форума   Ответить с цитированием
Старый 20.12.2012, 17:04   #59
andr128
Senior Member
 
Аватар для andr128
 
Регистрация: 16.09.2012
Адрес: Irkutsk
Сообщений: 555
Вес репутации: 1605
andr128 has a reputation beyond reputeandr128 has a reputation beyond reputeandr128 has a reputation beyond reputeandr128 has a reputation beyond reputeandr128 has a reputation beyond reputeandr128 has a reputation beyond reputeandr128 has a reputation beyond reputeandr128 has a reputation beyond reputeandr128 has a reputation beyond reputeandr128 has a reputation beyond reputeandr128 has a reputation beyond repute
По умолчанию

Цитата:
Сообщение от Andreyweb Посмотреть сообщение
ANDR128 Пример сервера для работы с сокетами:

Скрипт написан на PHP--???
А сами то не видите по содержимому, что на C. Просто обернут в php тэг для подсветки кода т.к. нет другого тэга для подсветки кода на Си.

Пример клиента написан на PHP.

Для более полного понимания нарисовал картинку
Нажмите на изображение для увеличения
Название: prot.png
Просмотров: 532
Размер:	17.2 Кб
ID:	685

Последний раз редактировалось andr128; 20.12.2012 в 17:50.
andr128 вне форума   Ответить с цитированием
Старый 20.12.2012, 17:12   #60
zuriuslev
Junior Member
 
Регистрация: 19.12.2012
Адрес: Марбелья
Сообщений: 18
Вес репутации: 0
zuriuslev has a reputation beyond reputezuriuslev has a reputation beyond reputezuriuslev has a reputation beyond reputezuriuslev has a reputation beyond reputezuriuslev has a reputation beyond reputezuriuslev has a reputation beyond reputezuriuslev has a reputation beyond reputezuriuslev has a reputation beyond reputezuriuslev has a reputation beyond reputezuriuslev has a reputation beyond reputezuriuslev has a reputation beyond repute
По умолчанию

Цитата:
Сообщение от Andreyweb Посмотреть сообщение
ANDR128 Пример сервера для работы с сокетами:

Скрипт написан на PHP--???
Нет на C
Там даже в начале написано как компилировать ...
//gcc serv_select.c -o serv_select
zuriuslev вне форума   Ответить с цитированием
Ответ


Здесь присутствуют: 6 (пользователей: 0 , гостей: 6)
 

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

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход


Текущее время: 02:51. Часовой пояс GMT +3.


Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Яндекс.Метрика