Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Помогите с com портом (запрос - ответ) / 25 сообщений из 25, страница 1 из 1
19.10.2017, 15:20:03
    #39538790
mkr
mkr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с com портом (запрос - ответ)
Всем, доброго времени суток.

понадобилось получать вес с весов.
скачал comport411f

соединение красиво проходит.
Запросы на весы шлю (строка Sx1), но ответ словить не получается.

Код: sql
1.
ComPort.Write(Str[1], Length(Str)); // no defined type


в PortMon сразу же вижу
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
35	0.00002738	Project1.exe	IRP_MJ_WRITE	Serial0	SUCCESS	Length 5: Sx1..	
36	0.02828069	Project1.exe	IOCTL_SERIAL_WAIT_ON_MASK	Serial0	SUCCESS		
37	0.00000475	Project1.exe	IOCTL_SERIAL_GET_COMMSTATUS	Serial0	SUCCESS		
38	0.00000363	Project1.exe	IRP_MJ_READ	Serial0	SUCCESS	Length 8:         	
39	0.00000196	Project1.exe	IOCTL_SERIAL_GET_COMMSTATUS	Serial0	SUCCESS		
40	0.00000447	Project1.exe	IOCTL_SERIAL_WAIT_ON_MASK	Serial0	SUCCESS		
41	0.00000223	Project1.exe	IOCTL_SERIAL_GET_COMMSTATUS	Serial0	SUCCESS		
42	0.00803454	Project1.exe	IOCTL_SERIAL_WAIT_ON_MASK	Serial0	SUCCESS		
43	0.00000419	Project1.exe	IOCTL_SERIAL_GET_COMMSTATUS	Serial0	SUCCESS		
44	0.00000363	Project1.exe	IRP_MJ_READ	Serial0	SUCCESS	Length 8:  0 kg ..	


когда хочу прочитать
Код: sql
1.
ComPort.ReadStr(str, 8);


буфер вроде как пуст
Код: sql
1.
2.
49	0.00000531	Project1.exe	IRP_MJ_READ	Serial0	SUCCESS	Length 0: 	
50	0.00000279	Project1.exe	IOCTL_SERIAL_GET_COMMSTATUS	Serial0	SUCCESS	



вроде как задача несложная, но опыта совсем нет в данной сфере
...
Рейтинг: 0 / 0
19.10.2017, 15:30:59
    #39538814
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с com портом (запрос - ответ)
ReadStr наверное ждет перевода коретки. Читай по символу и складывай в строку сам.
...
Рейтинг: 0 / 0
19.10.2017, 15:51:36
    #39538843
mkr
mkr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с com портом (запрос - ответ)
wadman,

Sx1 шлю с CR LF
в ReadStr, как мне кажется, данные в str только пишутся...
...
Рейтинг: 0 / 0
19.10.2017, 16:02:56
    #39538866
Freedoom
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с com портом (запрос - ответ)
mkr, возможно поможет это
...
Рейтинг: 0 / 0
19.10.2017, 16:10:38
    #39538876
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с com портом (запрос - ответ)
mkrв ReadStr, как мне кажется, данные в str только пишутся...
Ничего не понял. Посмотри в код ReadStr. Окончание не просто так Str. Там должно быть ожидание окончания строки и кассовый аппарат об этом не знает.
...
Рейтинг: 0 / 0
19.10.2017, 17:01:30
    #39538950
mkr
mkr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с com портом (запрос - ответ)
Freedoom,

тогда подскажите логику работы с CreateFile...
по примерам - создали и читаем-читаем-читаем, а в какой момент записать запрос и проанализировать ответ?
либо создали, записали запрос, до каких пор читаем?
...
Рейтинг: 0 / 0
19.10.2017, 17:10:41
    #39538961
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с com портом (запрос - ответ)
mkrдо каких пор читаем?

Обычно до конца строки если в спецификациях протокола конкретного девайса не указано иное.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
19.10.2017, 17:33:31
    #39538996
DesWind
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с com портом (запрос - ответ)
mkr,

Чиатем либо до маркера окончания передачи либо до истечения таймаута.
Вот пример синхронного общения "запрос-ответ". Для TComPort/

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
procedure TCommComPort.Exchange(const DevID: WideString; InBuf: PByteArray; InSize: integer;
  OutBuf: PByteArray; var OutSize: integer);
var
  Buf: byte;
  EstSize: integer;

begin
  
  PortSemaphore.Acquire;
  EstSize:=OutSize;
  try
    fPort.ClearBuffer(true, true);
    fPort.Write(InBuf^,InSize);
    OutSize:=0;
    while (fPort.Read(buf,1)>0)do
    begin
      if OutSize<EstSize then
        OutBuf^[OutSize]:=Buf;
      inc(OutSize);
    end;
  finally
   PortSemaphore.Release;
  end;
end;
...
Рейтинг: 0 / 0
19.10.2017, 17:49:20
    #39539025
Freedoom
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с com портом (запрос - ответ)
mkrтогда подскажите логику работы с CreateFile...
Лучше обратиться напрямую к YuRock. От себя могу порекомендовать Тынц и
https://ru.wikibooks.org/wiki/COM-порт_в_Windows_(программирование)
с COM-портом работал очень давно и с очень специфической железкой
Обычно с весами идет документация (ссылка на сайт) где расписан протокол обмена данными с устройством, драйвер и примеры использования
...
Рейтинг: 0 / 0
19.10.2017, 18:43:54
    #39539088
Олег Третьяков
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с com портом (запрос - ответ)
mkrкогда хочу прочитать
Код: sql
1.
ComPort.ReadStr(str, 8);


буфер вроде как пуст
И когда же хочется читать?
Сразу после записи?
В пакете есть TComDataPacket, бери его, линкуй с компонентом порта, настраивай маркер конца строки и линкуй с евентом OnPacket.
Символы маркера конца строки ищи в документашке на весы.
...
Рейтинг: 0 / 0
19.10.2017, 21:04:06
    #39539186
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с com портом (запрос - ответ)
Freedoommkrтогда подскажите логику работы с CreateFile...
Лучше обратиться напрямую к YuRock.
Он автор CreateFile?
...
Рейтинг: 0 / 0
19.10.2017, 21:12:11
    #39539190
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с com портом (запрос - ответ)
wadmanFreedoomпропущено...

Лучше обратиться напрямую к YuRock.
Он автор CreateFile?
Ого, ничё себе меня пиарят))
Нет, ко мне обращаться не надо, я в той теме всё что надо описал в этом сообщении: 20390991
...
Рейтинг: 0 / 0
20.10.2017, 08:45:07
    #39539318
MBo
MBo
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с com портом (запрос - ответ)
mkr, обрабатывай событие OnRXChar и читай из порта внутри обработчика.
...
Рейтинг: 0 / 0
20.10.2017, 16:46:32
    #39539661
mkr
mkr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с com портом (запрос - ответ)
нашлись пару процедурок:
Код: pascal
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.
function OpenCOMPort: Boolean;
var
  DeviceName: array[0..80] of Char;
  ComFile: THandle;
begin
   { First step is to open the communications device for read/write.
     This is achieved using the Win32 'CreateFile' function.
     If it fails, the function returns false.    
   }

  StrPCopy(DeviceName, 'COM1:');

  ComFile := CreateFile(DeviceName,
    GENERIC_READ or GENERIC_WRITE,
    0,
    nil,
    OPEN_EXISTING,
    FILE_ATTRIBUTE_NORMAL,
    0);

  if ComFile = INVALID_HANDLE_VALUE then
    Result := False
  else
    Result := True;
end;


function SetupCOMPort: Boolean;
const
  RxBufferSize = 256;
  TxBufferSize = 256;

var
  DCB: TDCB;
  Config: string;
  CommTimeouts: TCommTimeouts;
begin
   { We assume that the setup to configure the setup works fine.
     Otherwise the function returns false.   
   }

  Result := True;

  if not SetupComm(ComFile, RxBufferSize, TxBufferSize) then
    Result := False;

  if not GetCommState(ComFile, DCB) then
    Result := False;

  // define the baudrate, parity,...

   
  Config := 'baud=9600 parity=n data=8 stop=1';

  if not BuildCommDCB(@Config[1], DCB) then
    Result := False;

  if not SetCommState(ComFile, DCB) then
    Result := False;

  with CommTimeouts do
  begin
    ReadIntervalTimeout         := 0;
    ReadTotalTimeoutMultiplier  := 0;
    ReadTotalTimeoutConstant    := 1000;
    WriteTotalTimeoutMultiplier := 0;
    WriteTotalTimeoutConstant   := 1000;
  end;

  if not SetCommTimeouts(ComFile, CommTimeouts) then
    Result := False;
end;

{
  The following is an example of using the 'WriteFile' function
  to write data to the serial port.
}

procedure SendText(s: string);
var
  BytesWritten: DWORD;
begin
   { Add a word-wrap (#13 + #10) to the string   }

  s := s + #13 + #10;
  WriteFile(ComFile, s[1], Length(s), BytesWritten, nil);
end;

{
  The following is an example of using the 'ReadFile' function to read
  data from the serial port.
}

function ReadText: string;
var
  d: array[1..80] of Char;
  s: string;
  BytesRead, i: cardinal;
begin
  Result := '';
  if not ReadFile(ComFile, d, SizeOf(d), BytesRead, nil) then
  begin
    { Raise an exception }
  end;
  s := '';
  for i := 1 to BytesRead do s := s + d[I];
  Result := s;
end;


procedure CloseCOMPort;
begin
  // finally close the COM Port! 
  CloseHandle(ComFile);
end;



ну а потом

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
procedure TForm1.Button6Click(Sender: TObject);
begin
  OpenCOMPort;
end;

procedure TForm1.Button7Click(Sender: TObject);
begin
  SendText(Edit1.Text)
end;

procedure TForm1.Button8Click(Sender: TObject);
begin
  memo4.Text := ReadText;
end;


и всё чудно работает)
...
Рейтинг: 0 / 0
20.10.2017, 16:51:56
    #39539665
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с com портом (запрос - ответ)
mkr
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
  if not SetupComm(ComFile, RxBufferSize, TxBufferSize) then
    Result := False;

  if not GetCommState(ComFile, DCB) then
    Result := False;

  // define the baudrate, parity,...

   
  Config := 'baud=9600 parity=n data=8 stop=1';

  if not BuildCommDCB(@Config[1], DCB) then
    Result := False;

  if not SetCommState(ComFile, DCB) then
    Result := False;




mkrи всё чудно работает)

Exit'ы не надо, не, в случае Result := False?
...
Рейтинг: 0 / 0
20.10.2017, 16:55:30
    #39539670
mkr
mkr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с com портом (запрос - ответ)
YuRock,
SetupCOMPort пока вообще не понадобилась)
...
Рейтинг: 0 / 0
20.10.2017, 17:02:50
    #39539675
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с com портом (запрос - ответ)
mkrSetupCOMPort пока вообще не понадобилась)
Понятно.

mkr
Код: pascal
1.
2.
3.
4.
  if ComFile = INVALID_HANDLE_VALUE then
    Result := False
  else
    Result := True;


Можно экономить место на диске, если писать вместо такого
Код: pascal
1.
  Result := ComFile <> INVALID_HANDLE_VALUE;
...
Рейтинг: 0 / 0
20.10.2017, 17:27:08
    #39539685
mkr
mkr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с com портом (запрос - ответ)
тогда и в SetupCOMPort:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
begin
  Result := SetupComm(ComFile, RxBufferSize, TxBufferSize) and GetCommState(ComFile, DCB);

  Config := 'baud=9600 parity=n data=8 stop=1';

  Result := Result and (BuildCommDCB(@Config[1], DCB) and SetCommState(ComFile, DCB));

  with CommTimeouts do
  begin
    ReadIntervalTimeout         := 0;
    ReadTotalTimeoutMultiplier  := 0;
    ReadTotalTimeoutConstant    := 1000;
    WriteTotalTimeoutMultiplier := 0;
    WriteTotalTimeoutConstant   := 1000;
  end;

  Result := Result and SetCommTimeouts(ComFile, CommTimeouts);
end;
...
Рейтинг: 0 / 0
21.10.2017, 15:12:59
    #39539883
s62
s62
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с com портом (запрос - ответ)
mkr,

В принципе, работа с COM-портом описана во многих статьях, например на сайте Delphikingdom.ru: http://www.delphikingdom.ru/asp/itemq.asp?Mode=1&ItemID=151
Пара комментов:
1) таймауты можно подстроить под себя, под конкретный протокол и конкретные обстоятельства. У вас, например, если от устройства ничего не придет, то функция будет ждать секунду (1000 мсек), а потом возвратит результат. Если это происходит в основном потоке, то секунду программа будет "висеть", не реагируя на мышку и нажатия клавиш.
2) 'baud=9600 parity=n data=8 stop=1' - это можно выставлять и через запись (структуру) DCB

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
    GetCommState(ComFile, DCB); //тут тоже надо бы проверить результат
    with DCB do
    begin
      BaudRate := 9600;
      ByteSize := 8;
      Parity := NOPARITY;
      StopBits := ONESTOPBIT;
    end;
    if not SetCommState(ComFile, DCB)
    then ...
...
Рейтинг: 0 / 0
23.10.2017, 08:35:21
    #39540230
mkr
mkr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с com портом (запрос - ответ)
s62,
спасибо, пока этот механизм внедрим, дальше купим сканер штрихкодов, будем дальше экспериментировать
...
Рейтинг: 0 / 0
25.10.2017, 10:00:17
    #39541470
mkr
mkr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с com портом (запрос - ответ)
mkr,
настройки порта родной программы:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
45	0.00004386	Komunikacja.exe	IRP_MJ_CREATE	Serial0	SUCCESS	Options: Open 	
46	0.00000251	Komunikacja.exe	IOCTL_SERIAL_SET_QUEUE_SIZE	Serial0	SUCCESS	InSize: 1024 OutSize: 1024	
47	0.00000140	Komunikacja.exe	IOCTL_SERIAL_GET_BAUD_RATE	Serial0	SUCCESS		
48	0.00000140	Komunikacja.exe	IOCTL_SERIAL_GET_LINE_CONTROL	Serial0	SUCCESS		
49	0.00000140	Komunikacja.exe	IOCTL_SERIAL_GET_CHARS	Serial0	SUCCESS		
50	0.00000140	Komunikacja.exe	IOCTL_SERIAL_GET_HANDFLOW	Serial0	SUCCESS		
51	0.00000838	Komunikacja.exe	IOCTL_SERIAL_SET_BAUD_RATE	Serial0	SUCCESS	Rate: 9600	
52	0.00000391	Komunikacja.exe	IOCTL_SERIAL_CLR_RTS	Serial0	SUCCESS		
53	0.00000419	Komunikacja.exe	IOCTL_SERIAL_CLR_DTR	Serial0	SUCCESS		
54	0.00000279	Komunikacja.exe	IOCTL_SERIAL_SET_LINE_CONTROL	Serial0	SUCCESS	StopBits: 1 Parity: NONE WordLength: 8	
55	0.00000140	Komunikacja.exe	IOCTL_SERIAL_SET_CHAR	Serial0	SUCCESS	EOF:88 ERR:0 BRK:0 EVT:0 XON:11 XOFF:13	
56	0.00000307	Komunikacja.exe	IOCTL_SERIAL_SET_HANDFLOW	Serial0	SUCCESS	Shake:0 Replace:0 XonLimit:256 XoffLimit:256	
57	0.00000140	Komunikacja.exe	IOCTL_SERIAL_SET_TIMEOUTS	Serial0	SUCCESS	RI:-1 RM:0 RC:0 WM:100 WC:1000	
58	0.00000363	Komunikacja.exe	IOCTL_SERIAL_SET_WAIT_MASK	Serial0	SUCCESS	Mask: RXCHAR RXFLAG TXEMPTY CTS DSR RLSD BRK ERR RING RX80FULL 



Моя настройка порта:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
21	0.00004833	erp_stock.exe	IRP_MJ_CREATE	Serial0	SUCCESS	Options: Open 	
22	0.00000251	erp_stock.exe	IOCTL_SERIAL_SET_QUEUE_SIZE	Serial0	SUCCESS	InSize: 1024 OutSize: 1024	
23	0.00000196	erp_stock.exe	IOCTL_SERIAL_GET_BAUD_RATE	Serial0	SUCCESS		
24	0.00000140	erp_stock.exe	IOCTL_SERIAL_GET_LINE_CONTROL	Serial0	SUCCESS		
25	0.00000140	erp_stock.exe	IOCTL_SERIAL_GET_CHARS	Serial0	SUCCESS		
26	0.00000140	erp_stock.exe	IOCTL_SERIAL_GET_HANDFLOW	Serial0	SUCCESS		
27	0.00000140	erp_stock.exe	IOCTL_SERIAL_GET_BAUD_RATE	Serial0	SUCCESS		
28	0.00000140	erp_stock.exe	IOCTL_SERIAL_GET_LINE_CONTROL	Serial0	SUCCESS		
29	0.00000140	erp_stock.exe	IOCTL_SERIAL_GET_CHARS	Serial0	SUCCESS		
30	0.00000140	erp_stock.exe	IOCTL_SERIAL_GET_HANDFLOW	Serial0	SUCCESS		
31	0.00000810	erp_stock.exe	IOCTL_SERIAL_SET_BAUD_RATE	Serial0	SUCCESS	Rate: 9600	
32	0.00000391	erp_stock.exe	IOCTL_SERIAL_CLR_RTS	Serial0	SUCCESS		
33	0.00000419	erp_stock.exe	IOCTL_SERIAL_CLR_DTR	Serial0	SUCCESS		
34	0.00000279	erp_stock.exe	IOCTL_SERIAL_SET_LINE_CONTROL	Serial0	SUCCESS	StopBits: 1 Parity: NONE WordLength: 8	
35	0.00000168	erp_stock.exe	IOCTL_SERIAL_SET_CHAR	Serial0	SUCCESS	EOF:88 ERR:0 BRK:0 EVT:0 XON:11 XOFF:13	
36	0.00000307	erp_stock.exe	IOCTL_SERIAL_SET_HANDFLOW	Serial0	SUCCESS	Shake:0 Replace:0 XonLimit:256 XoffLimit:256	
37	0.00000223	erp_stock.exe	IOCTL_SERIAL_SET_WAIT_MASK	Serial0	SUCCESS	Mask: RXCHAR RXFLAG TXEMPTY CTS DSR RLSD BRK ERR RING RX80FULL 	
38	0.00000140	erp_stock.exe	IOCTL_SERIAL_SET_TIMEOUTS	Serial0	SUCCESS	RI:0 RM:0 RC:1000 WM:100 WC:1000




непонятно, как задать RI:-1, если ReadIntervalTimeout: DWORD;
...
Рейтинг: 0 / 0
25.10.2017, 10:05:38
    #39541479
makhaon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с com портом (запрос - ответ)
msdn в помощь:

https://msdn.microsoft.com/ru-ru/library/windows/desktop/aa363190(v=vs.85).aspx

A value of MAXDWORD, combined with zero values for both the ReadTotalTimeoutConstant and ReadTotalTimeoutMultiplier members, specifies that the read operation is to return immediately with the bytes that have already been received, even if no bytes have been received.
...
Рейтинг: 0 / 0
25.10.2017, 12:12:29
    #39541588
s62
s62
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с com портом (запрос - ответ)
mkrmkr,
непонятно, как задать RI:-1, если ReadIntervalTimeout: DWORD;makhaon написал, а вообще вам совсем не обязательно задавать такие же параметры таймаутов, как в оригинальной программе.
...
Рейтинг: 0 / 0
26.10.2017, 18:54:39
    #39542820
VitalijX
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с com портом (запрос - ответ)
mkr,
Описание протокола или название весового терминала укажите.
Вот как в некоторых весах Cas есть посылки #05 или #06 или #11 в весы.
А ответы могут начинаться #01 #02 а заканчиваться байтами #03 #04
...
Рейтинг: 0 / 0
26.10.2017, 19:01:04
    #39542821
Arioch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с com портом (запрос - ответ)
лично я, когда работал с железкой по COM-порту (причём по описанию, к компьютеру к этой железке подключенному меня не допускали) пользовался библиотекой Ararat Synapse

Она мне тогда больше понравилась, чем TComPort
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Помогите с com портом (запрос - ответ) / 25 сообщений из 25, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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