Форум программистов, компьютерный форум, киберфорум
Контроллеры PLC
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
0 / 0 / 0
Регистрация: 10.12.2014
Сообщений: 34
1

Обмен с I-87068 (ICP DAS)

20.02.2015, 14:07. Показов 1949. Ответов 15
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте! Помогите пожалуйста!!! Я написал программку с использованием библиотеки CPort, RS-485 как модуль у меня I-87068. Мне надо чтобы оправить сигнал (или код) и получить ответ (см. рис). Я написал программу сигнал отправляется т.е. я на реальных устройствах проверил, но я не получаю ответ от модуля. Ниже приведен код программы. Вопрос такой как мне получить ответ? Начинающий программист не судите строго!). Спасибо заранее!

Файл:
Вложение 492081

Рисунок:
Вложение 492082

Код программы:
Delphi
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
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, CPort, ExtCtrls;
 
type
  TForm1 = class(TForm)
    editCommand: TEdit;
    editAnswer: TEdit;
    buttonOpen: TButton;
    buttonWrite: TButton;
    buttonClose: TButton;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    memoHistory: TMemo;
    ButtonClearHis: TButton;
    buttonsetting: TButton;
    ComPort: TComPort;
    buttonsend: TButton;
    ButtonExit: TButton;
    Label1: TLabel;
    Timer1: TTimer;
    Timer2: TTimer;
    Label2: TLabel;
    procedure ButtonClearHisClick(Sender: TObject);
    procedure buttonsettingClick(Sender: TObject);
    procedure buttonOpenClick(Sender: TObject);
    procedure buttonWriteClick(Sender: TObject);
    procedure buttonCloseClick(Sender: TObject);
    procedure buttonsendClick(Sender: TObject);
    procedure editCommandKeyPress(Sender: TObject; var Key: Char);
    procedure ComPortRxChar(Sender: TObject; Count: Integer);
    procedure ButtonExitClick(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure Timer2Timer(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
// очистка истории выполненных команд
procedure TForm1.ButtonClearHisClick(Sender: TObject);
begin
memoHistory.Lines.Clear; // очистка истории выполненных команд
end;
 
// настройка параметром сом-порта
procedure TForm1.buttonsettingClick(Sender: TObject);
begin
  Comport.ShowSetupDialog;
  buttonOpen.Enabled := True;
end;
 
// открыть сом порт
procedure TForm1.buttonOpenClick(Sender: TObject);
begin
 
   ComPort.Open; // открыть сом порт
  if ComPort.Connected then
  memoHistory.Lines.Add('Порт открыть ('+comport.Port+') '+TimeToStr(Time)+'')
  else
  memoHistory.Lines.Add('Порт не открывается '+TimeToStr(Time)+'');
end;
 
//послать сигнал
procedure TForm1.buttonWriteClick(Sender: TObject);
var
  strWrite: string; // временная переменная ASCII последовательности
  arrBytes: array of Byte; // массив байт команды
  i: Integer;
begin
// проверка подключения сом-порта
  if ComPort.Connected=True then
  begin
//чтение команды из поля "Команда"
//Проверка строки на пустопу
  if (editCommand.Text <> '') then
  begin
     strWrite := editCommand.Text;
//преобразование последовательности ASCII в массив байт
  SetLength(arrBytes, Length(strWrite)+1);
  for i := Low(arrBytes) to High(arrBytes) do
    arrBytes[i] := Ord(strWrite[i + 1]);
  // формирование признака конца команды
  arrBytes[High(arrBytes)]:=$0D;
  // запсиь сформированной команды в СОМ-порт
    ComPort.Write(arrBytes[0],length(arrBytes));
    arrBytes := nil;
    memoHistory.Lines.Add('('+editcommand.Text+') '+TimeToStr(Time)+'');
   end
  else
     memoHistory.Lines.Add('Ошибка ввода: Данные не введены! '+TimeToStr(Time)+'');
  end
  else
  memoHistory.Lines.Add('Порт не открыть '+TimeToStr(Time)+'');
end;
 
// закрыть порт
procedure TForm1.buttonCloseClick(Sender: TObject);
begin
  ComPort.Close;      // закрыть порт
  memoHistory.Lines.Add('Порт закрыт. '+TimeToStr(Time)+'')   // выаодим данное сообщение в memoHistory
end;
 
procedure TForm1.buttonsendClick(Sender: TObject);
begin
// проверка соединения с сом протом
  if ComPort.Connected=True then   // если сом-порт соединен то
  begin
    ComPort.WriteStr(editCommand.Text+#13);
    memoHistory.Lines.Add('('+editcommand.Text+') '+TimeToStr(Time)+'');
  end
  else
  memoHistory.Lines.Add('Порт не открыть '+TimeToStr(Time)+''); // если не соединен выводит это сообщение
end;
 
// проверка поля ввода на допустимые символы
procedure TForm1.editCommandKeyPress(Sender: TObject; var Key: Char);
begin
  case Key of
      '0'..'9': ;                        // цифра
      #8: ;                             // клавиша <Back Space>
      #13: buttonWrite.Click;  // при нажатии <Enter> активируется кнопка "записать в порт" т.е. кликается кнопка
      'a'..'z','A'..'Z', '~', '+', '!', '`', '@', '#', '$', '%', '^', '&', '*', '(', ')', '_', '-', '=', '/', ',', '.', '<', '>', '?', '\', '|', '{', '}', '[', ']', ':', '"', ';': ;             //буквы и символы английского языка
 
   // остальные символы — запрещены
   else
      begin
         Key:=Chr(0); // символ не отображать
         Application.MessageBox(PChar('Данный символ не допустим!'),'Предупреждение!',MB_OK+MB_ICONWARNING);
      end;
   end;
end;
 
// получить ответ
 
procedure TForm1.ComPortRxChar(Sender: TObject; Count: Integer);
 
var
  i: Integer;
  TmpStr: string;
  ReadBytes: array of Byte;
begin
  TmpStr := '';
  i := Low(ReadBytes);
  while (i < High(ReadBytes)) and (ReadBytes[i] <> $0D) do
  begin
    TmpStr := TmpStr + chr(ReadBytes[i]);
    inc(i);
  end;
  editAnswer.Text :=TmpStr;
  memoHistory.Lines.Add(TmpStr + ''+TimeToStr(Time)+'');
end;
 
// выходим из программы
procedure TForm1.ButtonExitClick(Sender: TObject);
begin
  Form1.Close;   // выход
end;
 
// устанавливаем время
procedure TForm1.Timer1Timer(Sender: TObject);
begin
  Label1.Caption:=TimeToStr(Time);
end;
 
//устанавливаем дату
procedure TForm1.Timer2Timer(Sender: TObject);
begin
  Label2.Caption:=DateToStr(Date);
end;
 
end.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.02.2015, 14:07
Ответы с готовыми решениями:

Работа с DCON протоколом (ICP DAS)
Здравствуйте уважаемые программисты. Я начинающий чайник. Начал изучать Delphi. Остановился на...

Работа с ICP DAS i-7043 по протоколу DCON
Дано: устройство i-7043, связано с компьютером по Ethernet через другое устройство ICP DAS...

Бесплатная среда разработки для ICP DAS
Здравствуйте. Мы на производстве используем контроллеры I7188, с подключенными через rs485 модулями...

Работа с модулем ICP DAS I-8831 по Modbus RTU
Доброго времени суток, господа. Прошу Вас подкинуть и указать путь к заголовочным файлам на &quot;C&quot;,...

15
10234 / 6612 / 498
Регистрация: 28.12.2010
Сообщений: 21,154
Записей в блоге: 1
20.02.2015, 16:44 2
Легко проверить. Вы привели скрин с родного ПО модуля I-87068 от ICP DAS. А теперь запустите сниффер portmon и приведите дампы (полные в HEX в экспорте в TXT-файле на форум) с родной утилиты, начиная с подключения и запросов-ответов и вашей. И посмотрим в чем же разница

p.s.: кстати, вам никто не мешал использовать готовый SDK от производителя (nModbus). Даже есть альтернативный путь, OPC сервер производителя и получение данных любым OPC клиентом, как самописным, так и даже Excel.
1
0 / 0 / 0
Регистрация: 10.12.2014
Сообщений: 34
20.02.2015, 17:02  [ТС] 3
Спасибо! Уже сделал!
Delphi
1
2
3
4
5
6
7
8
9
10
// ответ
 
procedure TForm1.ComPortRxChar(Sender: TObject; Count: Integer);
var
  Str: String;
begin
  ComPort.ReadStr(Str, Count);
  memoHistory.Text:= memoHistory.Text + Str;
  editAnswer.Text:=editAnswer.Text + Str;
end;

На счет готовой SDK от производителя (nModbus) - там для моей работы есть некоторые ограничение или я плохо в этом разбираю, поэтому решил свой программку написать. Дальнейшим проект большой будет, а это программка просто для проверки ). Спасибо !
Кстати может какую нибудь литературу посоветуете по SDK ?
0
10234 / 6612 / 498
Регистрация: 28.12.2010
Сообщений: 21,154
Записей в блоге: 1
20.02.2015, 17:11 4
оффсайт.
0
пофигист широкого профиля
4755 / 3190 / 861
Регистрация: 15.07.2013
Сообщений: 18,462
21.02.2015, 01:48 5
Цитата Сообщение от Gaint Посмотреть сообщение
Спасибо! Уже сделал!
procedure TForm1.ComPortRxChar(Sender: TObject; Count: Integer);
var
Str: String;
begin
ComPort.ReadStr(Str, Count);
Какой-то, блин, трансвестициальный способ приема данных из СОМ-порта. С одной стороны используется асинхронная реакция на событие СОМ-порта EV_RXCHAR, а с другой - в обработчике этого события вызывается синхронная процедура ComPort.ReadStr...
0
1978 / 1276 / 131
Регистрация: 04.01.2010
Сообщений: 4,607
22.02.2015, 12:13 6
Цитата Сообщение от raxp Посмотреть сообщение
готовый SDK от производителя (nModbus)
i87068 обмениватся по протоколу DCS, HEX-формат для него не обязателен, т.к. это текстовый формат. Модули, использующие модбас, называются как-то по-другому.

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

ТС, зачем вы в коде перед отправкой копируете из строковой переменной в массив байт, чтобы потом тут же все отправить? Имхо, бесполезная фича, если только ваша строчка на в UTF8, а в простом однобайтном формате.
0
10234 / 6612 / 498
Регистрация: 28.12.2010
Сообщений: 21,154
Записей в блоге: 1
22.02.2015, 12:55 7
Voland_, если я и упоминал HEX, то явно указал про отображение дампа обмена в сниффере . Что до Modbus, то речь о библиотеке nModbus из набора SDK Utility and Software Develop Toolkit for 7000/8000/87000 I/O modules (with DCON protocol) http://www.icpdas.com/download/7000/7000.htm. Среди прочего там же DCON_DLL.

Например:
Delphi
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
unit I87000;
 
interface
 
type PSingle=^Single;
type PWord=^Word;
type PDWord=^LongInt;
 
 
// Digital Input/Output
function DigitalOut_87K(dwBuf:PDWord; fBuf:PSingle; szSend:PChar; szReceive:PChar): Word; StdCall;
function DigitalBitOut_87K( dwBuf:PDWord; fBuf:PSingle; szSend:PChar; szReceive:PChar): Word; StdCall;
function DigitalOutReadBack_87K(dwBuf:PDWord; fBuf:PSingle; szSend:PChar; szReceive:PChar): Word; StdCall;
function DigitalIn_87K(dwBuf:PDWord; fBuf:PSingle; szSend:PChar; szReceive:PChar): Word; StdCall;
function DigitalInLatch_87K(dwBuf:PDWord; fBuf:PSingle; szSend:PChar; szReceive:PChar): Word; StdCall;
function ClearDigitalInLatch_87K(dwBuf:PDWord; fBuf:PSingle; szSend:PChar; szReceive:PChar): Word; StdCall;
 
// Counter
function DigitalInCounterRead_87K(dwBuf:PDWord; fBuf:PSingle; szSend:PChar; szReceive:PChar): Word; StdCall;
function ClearDigitalInCounter_87K(dwBuf:PDWord; fBuf:PSingle; szSend:PChar; szReceive:PChar): Word; StdCall;
 
// Analog Input/Output
function AnalogOut_87K(dwBuf:PDWord; fBuf:PSingle; szSend:PChar; szReceive:PChar): Word; StdCall;
function AnalogOutReadBack_87K(dwBuf:PDWord; fBuf:PSingle; szSend:PChar; szReceive:PChar): Word; StdCall;
 
// configuration
function ReadConfigurationStatus_87K(dwBuf:PDWord; fBuf:PSingle; szSend:PChar; szReceive:PChar): Word; StdCall;
 
 
// **********************************************************
// **********************************************************
implementation
 
 
// Digital Input/Output
function DigitalOut_87K;                external 'I7000.DLL' name 'DigitalOut_87K';
function DigitalBitOut_87K;             external 'I7000.DLL' name 'DigitalBitOut_87K';
function DigitalOutReadBack_87K;        external 'I7000.DLL' name 'DigitalOutReadBack_87K';
function DigitalIn_87K;                 external 'I7000.DLL' name 'DigitalIn_87K';
function DigitalInLatch_87K;            external 'I7000.DLL' name 'DigitalInLatch_87K';
function ClearDigitalInLatch_87K;       external 'I7000.DLL' name 'ClearDigitalInLatch_87K';
 
// Counter
function DigitalInCounterRead_87K;      external 'I7000.DLL' name 'DigitalInCounterRead_87K';
function ClearDigitalInCounter_87K;     external 'I7000.DLL' name 'ClearDigitalInCounter_87K';
 
// Analog Input/Output
function AnalogOut_87K;                 external 'I7000.DLL' name 'AnalogOut_87K';
function AnalogOutReadBack_87K;         external 'I7000.DLL' name 'AnalogOutReadBack_87K';
 
// configuration
function ReadConfigurationStatus_87K;   external 'I7000.DLL' name 'ReadConfigurationStatus_87K';
 
 
end.
 

1
Voland_
22.02.2015, 14:02
  #8

Не по теме:

Цитата Сообщение от raxp Посмотреть сообщение
если я и упоминал HEX, то явно указал про отображение дампа обмена в сниффере . Что до Modbus, то речь о библиотеке nModbus из набора SDK Utility and Software Develop Toolkit for 7000/8000/87000 I/O modules (with DCON protocol)
Понял. Просто раньше это называлось "SDK for i7xxx,87xxx,8xxx modules". Сейчас, очевидно, объединили все в "nModbus SDK".

0
0 / 0 / 0
Регистрация: 10.12.2014
Сообщений: 34
25.02.2015, 10:45  [ТС] 9
Здравствуйте! Как отправить биты в компорт. У меня модуль i-87068 и RS-485. Хочу отправить биты в компорт чтобы управлять по отдельности и независимо от друг друга каналы модуля!??? Вот нашел статью но так как я новичок трудно разобраться без пост. помощи. Работаю с библиотекой ComPort. http://www.delphikingdom.com/a... alogid=838

Спасибо большое заранее!
0
1280 / 1185 / 175
Регистрация: 02.12.2013
Сообщений: 4,883
25.02.2015, 11:21 10
https://www.cyberforum.ru/kip-... 79146.html
1
1978 / 1276 / 131
Регистрация: 04.01.2010
Сообщений: 4,607
25.02.2015, 14:40 11
Gaint, насколько я помню, в дискретных выходах нет побитового управления (возможно, ошибаюсь). Чтобы изменить состояние какого-то одного канала, вы должны иметь предыдущее состояние (например, запросить его у модуля), затем изменить по назначению какой-либо бит и отправить новое состояние в модуль.
"биты в порт" никто не шлет. Вы отправляете команды смены состояния.

ЗЫ: вы нашли описание команд i87068?
1
0 / 0 / 0
Регистрация: 10.12.2014
Сообщений: 34
26.02.2015, 10:27  [ТС] 12
Вот что я хочу сказать. Например есть такая формула #AABBDD для i87068, где АА - адрес модуля а DD- номер каналов. Я сделал программку который отправляет ASCII код. Например если хочу включить первый канал отправляю этот код #400001 а если второй канал то #400002, но отключается первый канал, а если хочу включить первый и второй канал одновременно то надо отправить #400003 а если хочу одновременно включить первый и последний т.е. 8 канал то надо отправить #400081. При отправке #400000 отключает все каналы. Поэтому я хочу сделать по другому. Вот в этой литературе то что я хочу сделать http://www.delphikingdom.com/a... alogid=838 привожу пример кодов.

Проверка бита
Для проверки бита используется операция AND и анализ результата на равенство нулю.
if Value and (1 shl N) <> 0 then ... установлен
if Value and (1 shl N) = 0 then ... не установлен

Переключение бита
function InvertBit(Src: Integer; bit: Integer): Integer;
begin
Result := Src xor (1 shl Bit);
end;
0
1978 / 1276 / 131
Регистрация: 04.01.2010
Сообщений: 4,607
26.02.2015, 10:56 13
Цитата Сообщение от Gaint Посмотреть сообщение
Поэтому я хочу сделать по другому
По какому "другому"? Приведенный Вами код 100% описывает те функции, которые я вам описал словами .
Value - это "предыдущее состояние",
а
Src xor (1 shl Bit) - это "изменить по назначению какой-либо бит".

... вам остается только откуда-то взять начальное состояние выходов модуля (либо установить их жестко при старте программы), и иметь возможность отправлять команды этому модулю при необходимости.

Добавлено через 4 минуты
сделайте вот такой командой формирование строки модулю:
Delphi
1
strout := Format("#%s%s%s"#10#13, [StrToHex(addr,2), StrToHex(cmd,2), StrToHex(value,2)]);
Будет намного удобнее под нее развить кусок функции для управления.
1
0 / 0 / 0
Регистрация: 10.12.2014
Сообщений: 34
26.02.2015, 12:33  [ТС] 14
Если честно я очень плохо в этом разбираюсь поэтому если Вам не трудно скажите пожалуйста с чего мне начать, или какую то литературу для новичков, или какие примеры подскажите. Спасибо большое заранее!!!!

Добавлено через 22 минуты
Вот программа что мне тут добавить или изменить!!)

Delphi
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
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, CPort, ExtCtrls, Menus, Buttons;
 
type
  TForm1 = class(TForm)
    editCommand: TEdit;
    editAnswer: TEdit;
    buttonOpen: TButton;
    buttonWrite: TButton;
    buttonClose: TButton;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    memoHistory: TMemo;
    ButtonClearHis: TButton;
    buttonsetting: TButton;
    ComPort: TComPort;
    buttonsend: TButton;
    ButtonExit: TButton;
    Label1: TLabel;
    Timer1: TTimer;
    Timer2: TTimer;
    Label2: TLabel;
    Button0: TButton;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    Button5: TButton;
    Label6: TLabel;
    Label7: TLabel;
    Label8: TLabel;
    Label9: TLabel;
    Label10: TLabel;
    Label11: TLabel;
    Button6: TButton;
    Button7: TButton;
    Label12: TLabel;
    Label13: TLabel;
    Button8: TButton;
    MainMenu1: TMainMenu;
    N1: TMenuItem;
    N2: TMenuItem;
    N3: TMenuItem;
    N4: TMenuItem;
    N5: TMenuItem;
    N6: TMenuItem;
    Button9: TButton;
    procedure ButtonClearHisClick(Sender: TObject);
    procedure buttonsettingClick(Sender: TObject);
    procedure buttonOpenClick(Sender: TObject);
    procedure buttonWriteClick(Sender: TObject);
    procedure buttonCloseClick(Sender: TObject);
    procedure buttonsendClick(Sender: TObject);
    procedure editCommandKeyPress(Sender: TObject; var Key: Char);
    procedure ComPortRxChar(Sender: TObject; Count: Integer);
    procedure ButtonExitClick(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure Timer2Timer(Sender: TObject);
    procedure Button0Click(Sender: TObject);
    procedure N2Click(Sender: TObject);
    procedure N4Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure Button5Click(Sender: TObject);
    procedure Button6Click(Sender: TObject);
    procedure Button7Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
// очистка истории выполненных команд
procedure TForm1.ButtonClearHisClick(Sender: TObject);
begin
memoHistory.Lines.Clear; // очистка истории выполненных команд
end;
 
// настройка параметром сом-порта
procedure TForm1.buttonsettingClick(Sender: TObject);
begin
  Comport.ShowSetupDialog;
  buttonOpen.Enabled := True;
end;
 
// открыть сом порт
procedure TForm1.buttonOpenClick(Sender: TObject);
begin
 
   ComPort.Open; // открыть сом порт
  if ComPort.Connected then
  memoHistory.Lines.Add('Порт открыть ('+comport.Port+') '+TimeToStr(Time)+'')
  else
  memoHistory.Lines.Add('Порт не открывается '+TimeToStr(Time)+'');
end;
 
//послать сигнал
procedure TForm1.buttonWriteClick(Sender: TObject);
var
  strWrite: string; // временная переменная ASCII последовательности
  arrBytes: array of Byte; // массив байт команды
  i: Integer;
begin
// проверка подключения сом-порта
  if ComPort.Connected=True then
  begin
//чтение команды из поля "Команда"
//Проверка строки на пустопу
  if (editCommand.Text <> '') then
  begin
     strWrite := editCommand.Text;
//преобразование последовательности ASCII в массив байт
  SetLength(arrBytes, Length(strWrite)+1);
  for i := Low(arrBytes) to High(arrBytes) do
    arrBytes[i] := Ord(strWrite[i + 1]);
  // формирование признака конца команды
  arrBytes[High(arrBytes)]:=$0D;
  // запсиь сформированной команды в СОМ-порт
    ComPort.Write(arrBytes[0],length(arrBytes));
    arrBytes := nil;
    memoHistory.Lines.Add('('+editcommand.Text+') '+TimeToStr(Time)+'');
   end
  else
     memoHistory.Lines.Add('Ошибка ввода: Данные не введены! '+TimeToStr(Time)+'');
  end
  else
  memoHistory.Lines.Add('Порт не открыть '+TimeToStr(Time)+'');
end;
 
// закрыть порт
procedure TForm1.buttonCloseClick(Sender: TObject);
begin
  ComPort.Close;      // закрыть порт
  memoHistory.Lines.Add('Порт закрыт. '+TimeToStr(Time)+'')   // выаодим данное сообщение в memoHistory
end;
 
procedure TForm1.buttonsendClick(Sender: TObject);
begin
 
// проверка соединения с сом протом
  if ComPort.Connected=True then   // если сом-порт соединен то
  begin
   ComPort.WriteStr(editCommand.Text+#13);
    memoHistory.Lines.Add('('+editcommand.Text+') '+TimeToStr(Time)+'');
  end
  else
  memoHistory.Lines.Add('Порт не открыть '+TimeToStr(Time)+''); // если не соединен выводит это сообщение
end;
 
// проверка поля ввода на допустимые символы
procedure TForm1.editCommandKeyPress(Sender: TObject; var Key: Char);
begin
  case Key of
      '0'..'9': ;                        // цифра
      #8: ;                             // клавиша <Back Space>
      #13: buttonWrite.Click;  // при нажатии <Enter> активируется кнопка "записать в порт" т.е. кликается кнопка
      'a'..'z','A'..'Z', '~', '+', '!', '`', '@', '#', '$', '%', '^', '&', '*', '(', ')', '_', '-', '=', '/', ',', '.', '<', '>', '?', '\', '|', '{', '}', '[', ']', ':', '"', ';': ;             //буквы и символы английского языка
 
   // остальные символы — запрещены
   else
      begin
         Key:=Chr(0); // символ не отображать
         Application.MessageBox(PChar('Данный символ не допустим!'),'Предупреждение!',MB_OK+MB_ICONWARNING);
      end;
   end;
end;
 
 
 
 
// выходим из программы
procedure TForm1.ButtonExitClick(Sender: TObject);
begin
  Form1.Close;   // выход
end;
 
// устанавливаем время
procedure TForm1.Timer1Timer(Sender: TObject);
begin
  Label1.Caption:=TimeToStr(Time);
end;
 
//устанавливаем дату
procedure TForm1.Timer2Timer(Sender: TObject);
begin
  Label2.Caption:=DateToStr(Date);
end;
 
 
 
// получить ответ
 
procedure TForm1.ComPortRxChar(Sender: TObject; Count: Integer);
var
  Str: String;
  Buf: Char;
begin
  ComPort.ReadStr(Str, Count);
  memoHistory.Text:= memoHistory.Text + Str;
  editAnswer.Text:=editAnswer.Text + Str;
Buf := char($8C);
  ComPort.Write(Buf,1);
end;
 
 
// Кнопка № 0
procedure TForm1.Button0Click(Sender: TObject);
begin
 
  // проверка соединения с сом протом
  if ComPort.Connected=True then   // если сом-порт соединен то
  begin
    if Button0.Caption='Включить' then
    begin
    ComPort.WriteStr('#400001'+#13);
    Button0.Caption:= 'Выключить';
    memoHistory.Lines.Add('Канал № 0 включен  '+TimeToStr(Time)+'');
    end
    else
    begin
    ComPort.WriteStr('#400000'+#13);
    Button0.Caption:= 'Включить';
    memoHistory.Lines.Add('Канал № 0 включен  '+TimeToStr(Time)+'');
    end;
  end
  else
    memoHistory.Lines.Add('Порт не открыть '+TimeToStr(Time)+''); // если не соединен выводит это сообщение
end;
 
procedure TForm1.N2Click(Sender: TObject);
begin
  form1.Close;
end;
 
procedure TForm1.N4Click(Sender: TObject);
begin
  Comport.ShowSetupDialog;
  buttonOpen.Enabled := True;
end;
 
procedure TForm1.Button1Click(Sender: TObject);
begin
// проверка соединения с сом протом
  if ComPort.Connected=True then   // если сом-порт соединен то
  begin
    if Button1.Caption='Включить' then
    begin
    ComPort.WriteStr('#400002'+#13);
    Button1.Caption:= 'Выключить';
    memoHistory.Lines.Add('Канал № 1 включен  '+TimeToStr(Time)+'');
    end
    else
    begin
    ComPort.WriteStr('#400000'+#13);
    Button1.Caption:= 'Включить';
    memoHistory.Lines.Add('Канал № 1 включен  '+TimeToStr(Time)+'');
    end;
  end
  else
    memoHistory.Lines.Add('Порт не открыть '+TimeToStr(Time)+''); // если не соединен выводит это сообщение
end;
 
procedure TForm1.Button2Click(Sender: TObject);
begin
  // проверка соединения с сом протом
  if ComPort.Connected=True then   // если сом-порт соединен то
  begin
    if Button2.Caption='Включить' then
    begin
    ComPort.WriteStr('#400004'+#13);
    Button2.Caption:= 'Выключить';
    memoHistory.Lines.Add('Канал № 1 включен  '+TimeToStr(Time)+'');
    end
    else
    begin
    ComPort.WriteStr('#400000'+#13);
    Button2.Caption:= 'Включить';
    memoHistory.Lines.Add('Канал № 1 включен  '+TimeToStr(Time)+'');
    end;
  end
  else
    memoHistory.Lines.Add('Порт не открыть '+TimeToStr(Time)+''); // если не соединен выводит это сообщение
end;
 
procedure TForm1.Button3Click(Sender: TObject);
begin
  // проверка соединения с сом протом
  if ComPort.Connected=True then   // если сом-порт соединен то
  begin
    if Button3.Caption='Включить' then
    begin
    ComPort.WriteStr('#400008'+#13);
    Button3.Caption:= 'Выключить';
    memoHistory.Lines.Add('Канал № 1 включен  '+TimeToStr(Time)+'');
    end
    else
    begin
    ComPort.WriteStr('#400000'+#13);
    Button3.Caption:= 'Включить';
    memoHistory.Lines.Add('Канал № 1 включен  '+TimeToStr(Time)+'');
    end;
  end
  else
    memoHistory.Lines.Add('Порт не открыть '+TimeToStr(Time)+''); // если не соединен выводит это сообщение
end;
 
procedure TForm1.Button4Click(Sender: TObject);
begin
  // проверка соединения с сом протом
  if ComPort.Connected=True then   // если сом-порт соединен то
  begin
    if Button4.Caption='Включить' then
    begin
    ComPort.WriteStr('#400010'+#13);
    Button4.Caption:= 'Выключить';
    memoHistory.Lines.Add('Канал № 1 включен  '+TimeToStr(Time)+'');
    end
    else
    begin
    ComPort.WriteStr('#400000'+#13);
    Button4.Caption:= 'Включить';
    memoHistory.Lines.Add('Канал № 1 включен  '+TimeToStr(Time)+'');
    end;
  end
  else
    memoHistory.Lines.Add('Порт не открыть '+TimeToStr(Time)+''); // если не соединен выводит это сообщение
end;
 
procedure TForm1.Button5Click(Sender: TObject);
begin
  // проверка соединения с сом протом
  if ComPort.Connected=True then   // если сом-порт соединен то
  begin
    if Button5.Caption='Включить' then
    begin
    ComPort.WriteStr('#4000016'+#13);
    Button5.Caption:= 'Выключить';
    memoHistory.Lines.Add('Канал № 1 включен  '+TimeToStr(Time)+'');
    end
    else
    begin
    ComPort.WriteStr('#400000'+#13);
    Button5.Caption:= 'Включить';
    memoHistory.Lines.Add('Канал № 1 включен  '+TimeToStr(Time)+'');
    end;
  end
  else
    memoHistory.Lines.Add('Порт не открыть '+TimeToStr(Time)+''); // если не соединен выводит это сообщение
end;
 
procedure TForm1.Button6Click(Sender: TObject);
begin
  // проверка соединения с сом протом
  if ComPort.Connected=True then   // если сом-порт соединен то
  begin
    if Button6.Caption='Включить' then
    begin
    ComPort.WriteStr('#4000016'+#13);
    Button6.Caption:= 'Выключить';
    memoHistory.Lines.Add('Канал № 1 включен  '+TimeToStr(Time)+'');
    end
    else
    begin
    ComPort.WriteStr('#400000'+#13);
    Button6.Caption:= 'Включить';
    memoHistory.Lines.Add('Канал № 1 включен  '+TimeToStr(Time)+'');
    end;
  end
  else
    memoHistory.Lines.Add('Порт не открыть '+TimeToStr(Time)+''); // если не соединен выводит это сообщение
end;
 
procedure TForm1.Button7Click(Sender: TObject);
begin
  // проверка соединения с сом протом
  if ComPort.Connected=True then   // если сом-порт соединен то
  begin
    if Button7.Caption='Включить' then
    begin
    ComPort.WriteStr('#4000016'+#13);
    Button7.Caption:= 'Выключить';
    memoHistory.Lines.Add('Канал № 1 включен  '+TimeToStr(Time)+'');
    end
    else
    begin
    ComPort.WriteStr('#400000'+#13);
    Button7.Caption:= 'Включить';
    memoHistory.Lines.Add('Канал № 1 включен  '+TimeToStr(Time)+'');
    end;
  end
  else
    memoHistory.Lines.Add('Порт не открыть '+TimeToStr(Time)+''); // если не соединен выводит это сообщение
end;
 
 
 
 
end.
0
1978 / 1276 / 131
Регистрация: 04.01.2010
Сообщений: 4,607
26.02.2015, 13:07 15
Цитата Сообщение от Gaint Посмотреть сообщение
подскажите. Спасибо большое заранее!!!!
вот еще, в чужих кишках разбираться. За "Спасибо" хлеба не купишь

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

ЗЫ: на будущее - пользуйтесь тегами форматирования текста, и тегами сокрытия "под кат" на форуме. Чтобы не потеряться в "простынях" обширных сообщений.
1
10234 / 6612 / 498
Регистрация: 28.12.2010
Сообщений: 21,154
Записей в блоге: 1
26.02.2015, 15:05 16
http://delphiworld.narod.ru/ba... _bits.html
2
26.02.2015, 15:05
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.02.2015, 15:05
Помогаю со студенческими работами здесь

Сервер на контроллере ICP DAS i-8831-80
Доброго всем времени суток! Есть привод и периферия к нему (датчики давления, перемещения и...

Проблемы с автозагрузкой программы в ICP DAS iPAC-8000E
Программа не работает при включении питания iPAC-8000 (режим &quot;Run&quot;). На терминал выводится строчка...

Ввод/вывод данных через com порт из модуля ICP DAS
Есть модуль аналогового вывода ICP DAS (i7018). Нужно получить с него данные по каналам. Нашел...

НЕ Самовосстанавливающиеся предохранители ICP-Nxx
Коллеги - не нашел нигде время восстановления таких предохранителей. Или почти мгновенно? И какой...

Подать звуковой сигнал через контроллеры ICP CON I7188EA
В общем. суть проблемы в следующем: притаранили нам контроллер ICP CON i-7188ea и сказали. что на...

Das Experiment
Дело было ночером, делать было нефига. Захотелось внезапно (!) импульсного питания, да не для цифры...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru