Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Borlan builder C++ 6.0 + библиотека для COM порта + реализация MODBUS RTU для Floboss 103 / 25 сообщений из 26, страница 1 из 2
27.01.2011, 16:22
    #37082370
floboss444
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Borlan builder C++ 6.0 + библиотека для COM порта + реализация MODBUS RTU для Floboss 103
Привет, All.

Предлагаю всем желающим подключиться к моему проекту. Конечной целью проекта
является написание програмки под Windows которая будет отображать на окне
все мгновенные показания с Вычислителя расхода Floboss 103 (Emerson)

Та текущий момент сделана оболочка программы. При старте программы автоконектится
СОМ порт № 3, ну ещё можно отправить пачку данных в порт (неизвестно кому и неизвестно куда :)).

Текущая задача - научиться формировать в памяти запрос и отсылать данные в вычислитель Floboss103
посредством MODBUS RTU команд и научиться принимать ответ с последующей расшифровкой
в десятичном формате с выводом на экран.

Вопросов на данный момент куча: 1) в каком адресном пространстве floboss103 находятся
данные, даже зная через фирменную утилиту (ROCLINK 800) адресса там как-то что-то смешается.
2) как формировать запрос с последующей отсылкой в "СОМ порт" 3) и т.д...
В общем если кто-то занимался подобным - подсобите чем могете.
Если кто-то занимается сейчас чем то подобным присоединяйтесь к моему проекту (одному мне скучновато :)

*вложил проект для Borlan builder C++ 6.0. Проект компилируется без проблем...


Borlan builder C++ 6.0 + библиотека для COM порта + MODBUS RTU для
...
Рейтинг: 0 / 0
27.01.2011, 16:23
    #37082372
floboss444
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Borlan builder C++ 6.0 + библиотека для COM порта + реализация MODBUS RTU для Floboss 103
архив не прикрепился.
исправляю..
...
Рейтинг: 0 / 0
28.01.2011, 00:56
    #37083139
Siemargl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Borlan builder C++ 6.0 + библиотека для COM порта + реализация MODBUS RTU для Floboss 103
floboss444,

Найди описание протокола.
Сниффером посмотри, какик запросы формирует фирменная утилита(или найди доку).

Вообще типовая задача и решается без изобретений велосипедов. Но для себя написать полезно.
...
Рейтинг: 0 / 0
28.01.2011, 12:04
    #37083932
floboss444
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Borlan builder C++ 6.0 + библиотека для COM порта + реализация MODBUS RTU для Floboss 103
Siemargl,

Что такое "сниффер" ?
...
Рейтинг: 0 / 0
28.01.2011, 12:07
    #37083940
floboss444
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Borlan builder C++ 6.0 + библиотека для COM порта + реализация MODBUS RTU для Floboss 103
Siemarglfloboss444,

Найди описание протокола.
Сниффером посмотри, какик запросы формирует фирменная утилита(или найди доку).

-что такое "сниффер" ?

Вообще типовая задача и решается без изобретений велосипедов.

-ты знаешь где можно посмотреть готовое решение этой "типовой" задачи?


Но для себя написать полезно.

- ты писал что-то подобное, я правильно тебя понимаю?
...
Рейтинг: 0 / 0
28.01.2011, 12:41
    #37084025
Siemargl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Borlan builder C++ 6.0 + библиотека для COM порта + реализация MODBUS RTU для Floboss 103
floboss444Siemargl,

Что такое "сниффер" ?
Сниффер, это например /serial-port-monitor

Писал. Написался разных протоколов до полного удовлетворения )
Для разных систем и приборов.
...
Рейтинг: 0 / 0
28.01.2011, 13:14
    #37084116
floboss444
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Borlan builder C++ 6.0 + библиотека для COM порта + реализация MODBUS RTU для Floboss 103
Siemargl,

Поделись кодом, не будь жадиной :) интересуют MODBUS запросы в COM порт.
или что нибудь около того. моё мыло dbfone@mail.ru , или сссылку на архив чиркни.
буду бесконечно тебе благодарен.
...
Рейтинг: 0 / 0
28.01.2011, 13:50
    #37084223
Siemargl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Borlan builder C++ 6.0 + библиотека для COM порта + реализация MODBUS RTU для Floboss 103
floboss444,

Не поделюсь. Такой win32 код у меня старый и некрасивый.
Суть одна - сформировал пакет - записал в порт, считал - разобрал. Чтение/запись типовая ReadFile/WriteFile но нудная.
...
Рейтинг: 0 / 0
31.01.2011, 10:12
    #37087580
floboss444
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Borlan builder C++ 6.0 + библиотека для COM порта + реализация MODBUS RTU для Floboss 103
Siemargl,

1) в коде главное алгоритм а не правильно расставленные символы табуляции. ;)
Если так уж стесняешься мне весь код показать, скопируй хотя-бы сюда фрагмент,
где формируется строка запроса (адрес подчинённого устройства, номер функции, .... и т.д.) и его расшифровка...

2) Предположим, мы составили запрос и отправили в СОМ порт. Вопрос - как скоро ждать широковещательного ответа
подчинённого устройства в сети? Насколько эффективно будет рассчитать задержку исходя из скорости канала и размера пакета (по уму вроде так делают) или всё же сразу после запроса Master-Slave в цикле сделать ожидание ответа (так мне больше нравится и по логике вероятность "прозевать" ответ сводится к нулю...) ?
...
Рейтинг: 0 / 0
31.01.2011, 10:57
    #37087678
Siemargl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Borlan builder C++ 6.0 + библиотека для COM порта + реализация MODBUS RTU для Floboss 103
floboss444,
Вот накопал 1) Это переделанный из модбаса протокол. Все крутилось в отдельном треде. MSVC6/MFC
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
228.
229.
230.
231.
232.
233.
234.
235.
236.
237.
238.
239.
240.
241.
242.
243.
244.
245.
246.
247.
248.
249.
250.
251.
252.
253.
254.
255.
256.
257.
258.
259.
260.
261.
262.
263.
264.
265.
266.
267.
268.
269.
270.
271.
272.
273.
274.
275.
276.
277.
//----------------------------------------------------------------------------
BOOL 
ComProt::WriteProt (LPBYTE pDataBuffer, DWORD dwBytesToWrite, PDWORD pdwBytesWritten)
{
	int OldPriority;
	HANDLE hThread;
	BOOL ok = FALSE;
	COMSTAT ComStat;
	DWORD dwComError;

	if ((pDataBuffer == NULL) || (dwBytesToWrite ==  0 ))
	{
		TRACE("ComProt::WriteProt: ERROR_PARAMETER");
		return FALSE;
	}

	hThread = GetCurrentThread();
	OldPriority = GetThreadPriority(hThread);
	SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_HIGHEST);

	// Sender belegen
	//TRACE("SendModBus: Warten auf Senderfreigabe...\n");
	if (WaitForSingleObject(hSenden, nErrTimeout) != WAIT_OBJECT_0){
		SetThreadPriority(hThread, OldPriority);
		TRACE("ComProt::WriteProt: Com Mutex busy\n");
		//DbgTrace(TRACE_WARNING, "SendModBus: ..Sender NICHT verfьgbar!\n");
		//SetLastError (ERROR_MODBUS_WAIT_SENDER);
		return FALSE;
	}
	//DbgTrace(TRACE_INFO+5, "SendModBus: ..Sender verfьgbar..\n");
 

	// Empfangspuffer-Inhalt lцschen
	PurgeComm(hIdCom, PURGE_RXCLEAR);
	ClearCommError(hIdCom, &dwComError, &ComStat);
	if (dwComError !=  0 )
		TRACE("WriteModBus: ClearCommError returned 0x%08x\n", dwComError);

/*
	// Hack.... Win95 OSR2 loses last 2 byte of packet. Suxx.
	*pDst++ = 0x44;
	*pDst++ = 0x44;
*/

/*	ResetEvent(pCB->hCommRxdByte);*/
	
	// really start to write
//	OVERLAPPED	TxOverlapped;

	if( !EscapeCommFunction(hIdCom, SETRTS) )
	{
		TRACE("ComProt::WriteProt: set RTS failed\n");
	}

	if (bIsRadio)
	{
		Sleep(nTangenTime ); 
	}
/**
	ClearCommError(hIdCom, &dwComError, &ComStat);
	if (dwComError)
		TRACE("WriteComm: Comm-Error %08x\n", dwComError);

	if (ComStat.cbInQue > 1)
	{
		TRACE("WriteComm: %d Bytes in Rx-Queue\n", ComStat.cbInQue);
		//
		// HACK - HACK - HACK
		///
		// Falls (unter Windows95) zwei COM-Ports auf dem gleichen Interrupt arbeiten,
		// wird ein ReadFile-Aufruf nicht mehr beendet, nachdem ein Programm den anderen
		// COM-Port geцffnet hat.
		// Um wenigstens nach dessen SchlieЯen den ReadFile-Aufruf beendet zu bekommen,
		// wird bei jedem Sendeversuch mit PurgeComm die Rx-Queue gelцscht, falls darin 
		// mehr als 1 Zeichen ist:
		PurgeComm(hIdCom, PURGE_RXCLEAR);
	}
 */
	if (!WriteFile (hIdCom, pDataBuffer, dwBytesToWrite, pdwBytesWritten, NULL/*&TxOverlapped*/))
	{
		DWORD dwError = GetLastError();
		if (dwError != ERROR_IO_PENDING)
		{
			DWORD dwComError;
			//???pCB->dwLastError = dwError;
			ClearCommError(hIdCom, &dwComError, &ComStat);
			if (dwComError)
			{
				TRACE("ComProt::WriteProt: Comm-Error %08x\n", dwComError);
				//???pCB->LastError.dwErrorCOM = dwComError;
				//MessageBox (HWND_DESKTOP, "WriteFile Comm-Error!", "", MB_OK | MB_ICONHAND);
			}
		}
		else
		{
			TRACE("WriteComm: WriteFile returns ERROR_IO_PENDING");
		}
	}
	if (*pdwBytesWritten == dwBytesToWrite)
	{
		TRACE("ComProt::WriteProt: Success\n");
		ok = TRUE;
	}
	else
		TRACE("ComProt::WriteProt: ..No Success..\n");

	TRACE("Write > %5.3f\n", (float)clock() / CLOCKS_PER_SEC);

	// wait to end transfer  ??????
	//Sleep(10);
	if (bIsRadio)
	{
		Sleep(nTangenTime ); 
	}

	if( !EscapeCommFunction(hIdCom, CLRRTS) )
	{
		TRACE("WriteComm: reset RTS failed\n");
	}

//	if( !PurgeComm(hIdCom, PURGE_RXCLEAR | PURGE_RXABORT) )
//	{
//		TRACE("WriteComm: Purge input buffer failed\n");
//	}

#ifndef NDEBUG
	// dump data
	CString		msg = "ComProt::WriteProt sent:";

	if( dwBytesToWrite )
	{
		TRACE("ComProt::WriteProt sent:");
		for( int i =  0 ; i < (int)dwBytesToWrite; i++ )
		{
			char buf[ 30 ];
			TRACE("%x ", pDataBuffer[i]);
			msg += itoa(pDataBuffer[i], buf,  16 );
			msg += " ";
		}
		TRACE("\n");
	}
	WriteLog(msg);
#endif
	
	// Sender wieder freigeben
	ReleaseMutex(hSenden); 
	SetThreadPriority(hThread, OldPriority);

	return ok;	
}


//----------------------------------------------------------------------------
BOOL 
ComProt::ReadProt (LPVOID pDataBuffer, DWORD dwBufferSize, PDWORD pdwBytesRead)
{
	BOOL bOk = FALSE;
	DWORD dwEventMask =  0 ;
	DWORD nRead =  0 ;
	BYTE szReadBfr[ 256 ];
	DWORD dwBytesRead;
	DWORD dwComError =  0 ;
	COMSTAT ComStat;
//	OVERLAPPED	RxOverlapped;
	int OldPriority;
	HANDLE hThread;

	if (WaitForSingleObject(hSenden, nErrTimeout) != WAIT_OBJECT_0){
		TRACE("ComProt::ReadProt:  Com Mutex busy\n");
		//DbgTrace(TRACE_WARNING, "SendModBus: ..Sender NICHT verfьgbar!\n");
		//SetLastError (ERROR_MODBUS_WAIT_SENDER);
		return FALSE;
	}


	hThread = GetCurrentThread();
	OldPriority = GetThreadPriority(hThread);
	SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_HIGHEST);

	TRACE("Read > %5.3f\n", (float)clock() / CLOCKS_PER_SEC);

	if (!ReadFile(hIdCom, szReadBfr, sizeof szReadBfr, &dwBytesRead, NULL/*&RxOverlapped*/))
	{
		DWORD dwError = GetLastError();
		TRACE("ReadModBus: ReadFile FAILED %d\n ", dwError);
	}

	ClearCommError(hIdCom, &dwComError, &ComStat);
/**
	// this must work, but with Prot won't. Why???
	if (dwComError != 0){
//			SetLastError(ERROR_MODBUS_COMERROR);//???
		TRACE("ReadModBus: ClearCommError FAILED %d\n", dwComError);
		return FALSE;
	}
 */
/* 1st-order frame check
	// searching DLE, checking size
	LPBYTE	ptr = szReadBfr; 
	BYTE byFrameLen;
	BOOL found = FALSE;
	while (ptr <= szReadBfr + dwBytesRead - FRAME_SZ - 2)
	{
		if (ptr[0] == DLE && ptr[2] == Options.byPuNum) // 1st fast check
		{
			byFrameLen = ptr[1];	// expected position
			if (byFrameLen > FRAME_SZ &&
				ptr + byFrameLen < szReadBfr + dwBytesRead)
			{
				found = TRUE;
				break;
			}
		}
		ptr++;
	}

	if( found )// ein RTU-Telegramm besteht aus mindestens Zeichen, weniger bedeutet Fehler
	{						
		WORD crc16;
		int nByte;
		crc16 = 0;
		for (nByte = 1; nByte <= byFrameLen - 2; nByte++)
		{
			crc16 = crc_byte(ptr[nByte], crc16);
		}
		if (LOBYTE(crc16) == ptr[byFrameLen - 1] &&
			HIBYTE(crc16) == ptr[byFrameLen])
		{
			*pdwBytesRead = byFrameLen - 2;
			memcpy(pDataBuffer, ptr + 1, *pdwBytesRead);
			bOk = TRUE;
		}
		else
			TRACE("ReadModBus: faked CRC\n");
	}
	else
	{
	 	// kleines data oder schlechte blok empfangen !!
		TRACE("ReadModBus: Broken or short frame\n");
	}
*/
	// only translate data 
	LPBYTE	ptr = szReadBfr; 
	*pdwBytesRead = dwBytesRead;
	memcpy(pDataBuffer, ptr, *pdwBytesRead);
	bOk = TRUE;

#ifndef NDEBUG
	// dump data
	CString		msg = "ComProt::ReadProt read:";

	if( dwBytesRead )
	{
		TRACE("ComProt::ReadProt read:");
		for( int i =  0 ; i < (int)dwBytesRead; i++ )
		{
			char buf[ 30 ];
			TRACE("%x ", szReadBfr[i]);
			msg += itoa(szReadBfr[i], buf,  16 );
			msg += " ";
		}
		TRACE("\n");
	}
	WriteLog(msg);
#endif

	if (bIsRadio)
	{
		Sleep(nPilotTime);
	}
	
	SetThreadPriority(hThread, OldPriority);

	ReleaseMutex(hSenden); 

	return bOk;
}


2) Ждать отчета сразу. У меня использовалось асинхронное чтение. Как Ивент сработал, так значит ответ пришел. Таймауты только надо подобрать.

3) Модбас понимают все. Найди бесплатную SCADA и не придется трахаться с написанием.
...
Рейтинг: 0 / 0
31.01.2011, 22:43
    #37089447
bac
bac
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Borlan builder C++ 6.0 + библиотека для COM порта + реализация MODBUS RTU для Floboss 103
...
Рейтинг: 0 / 0
11.02.2011, 11:54
    #37110918
floboss444
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Borlan builder C++ 6.0 + библиотека для COM порта + реализация MODBUS RTU для Floboss 103
спасибо за документацию.
Будем почитать ;)
...
Рейтинг: 0 / 0
11.02.2011, 16:51
    #37111988
nik_x
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Borlan builder C++ 6.0 + библиотека для COM порта + реализация MODBUS RTU для Floboss 103
Странно, что в wiki попасть нелбзя?
http://ru.wikipedia.org/wiki/Modbus
И что-то мне подсказывает, что порт там 485-й, а не 232-й
...
Рейтинг: 0 / 0
11.02.2011, 16:53
    #37111993
nik_x
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Borlan builder C++ 6.0 + библиотека для COM порта + реализация MODBUS RTU для Floboss 103
Да, работать с COM-портами лучше через это: http://moxa.com.ua/product/new_pr/pcomm_pro.htm
Библиотеки из состава маст-дая глючат безбожно.
...
Рейтинг: 0 / 0
11.02.2011, 16:58
    #37112006
nik_x
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Borlan builder C++ 6.0 + библиотека для COM порта + реализация MODBUS RTU для Floboss 103
nik_xДа, работать с COM-портами лучше через это: http://moxa.com.ua/product/new_pr/pcomm_pro.htm
Библиотеки из состава маст-дая глючат безбожно.
Вернее это: http://www.moxa.com/support/download.aspx?d_id=1189
(бесплатно)
...
Рейтинг: 0 / 0
14.02.2011, 08:02
    #37114292
floboss444
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Borlan builder C++ 6.0 + библиотека для COM порта + реализация MODBUS RTU для Floboss 103
Оказывается есть библиотеки "от moxa" для работы с СОМ портом?!
Будем посмотреть. Спасибо.

*в основном использую плату "moxa CP-132". Ни разу не подводила...
...
Рейтинг: 0 / 0
18.02.2011, 17:04
    #37125161
procurator
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Borlan builder C++ 6.0 + библиотека для COM порта + реализация MODBUS RTU для Floboss 103
Siemargl,
сам писал протокол RTU и ASCII работает причем даже почти мультиплатформенно))) использовал во множестве проектов, код получился универсальный, поддерживает всего несколько функций, но из-за универсальности быстро наращивается. Документация по modbus в инете свободная, разжевано все хорошо все времена транзакции. Для участия нужна заинтерисованность.
...
Рейтинг: 0 / 0
20.02.2011, 10:53
    #37126606
floboss444
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Borlan builder C++ 6.0 + библиотека для COM порта + реализация MODBUS RTU для Floboss 103
procurator,

заинтересованность какого рода нужна?
...
Рейтинг: 0 / 0
20.02.2011, 19:36
    #37126969
procurator
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Borlan builder C++ 6.0 + библиотека для COM порта + реализация MODBUS RTU для Floboss 103
floboss444procurator,

заинтересованность какого рода нужна?
смысл учавствовать в проекте?
...
Рейтинг: 0 / 0
21.02.2011, 23:49
    #37129389
floboss444
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Borlan builder C++ 6.0 + библиотека для COM порта + реализация MODBUS RTU для Floboss 103
дело добровольное. всё что мне интересно это исходники и люди которые их написали.
для этого форума это норма.
...
Рейтинг: 0 / 0
03.03.2011, 13:16
    #37146490
procurator
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Borlan builder C++ 6.0 + библиотека для COM порта + реализация MODBUS RTU для Floboss 103
...
Рейтинг: 0 / 0
09.03.2011, 00:57
    #37154430
dasg
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Borlan builder C++ 6.0 + библиотека для COM порта + реализация MODBUS RTU для Floboss 103
Есть билиотека на C, реализующая Modbus через COM порт. Как ей пользоваться есть статья здесь .
...
Рейтинг: 0 / 0
14.03.2011, 13:23
    #37163588
floboss444
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Borlan builder C++ 6.0 + библиотека для COM порта + реализация MODBUS RTU для Floboss 103
dasg,

Спасибо за статью. Прочитал, понравилась. Автор написал что скоро напишет полную версию статьи.
Ждёмс...
...
Рейтинг: 0 / 0
28.03.2011, 08:31
    #37185119
floboss444
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Borlan builder C++ 6.0 + библиотека для COM порта + реализация MODBUS RTU для Floboss 103
procuratorfloboss444procurator,

заинтересованность какого рода нужна?
смысл учавствовать в проекте?

кто-то заставляет ?
...
Рейтинг: 0 / 0
06.05.2011, 12:50
    #37249457
procurator
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Borlan builder C++ 6.0 + библиотека для COM порта + реализация MODBUS RTU для Floboss 103
floboss444procuratorпропущено...

смысл учавствовать в проекте?

кто-то заставляет ?
свои проекты есть, как успехи кстати? может как нибудь сделаю сайт с собственной библиотекой, если время будет.
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Borlan builder C++ 6.0 + библиотека для COM порта + реализация MODBUS RTU для Floboss 103 / 25 сообщений из 26, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]