Имя: Пароль:
IT
 
Работа с Com-портом
0 Jeronimo
 
10.01.06
18:07
Есть устройство (крановые весы), которое нужно стыковать с 1С. Оборудование нестандартное, драйверов нет.
Весы имеют выход - ком-порт. Хочется посмотреть формат пакета. Какое ПО существует для просмотра/логирования ком-порта? Помогите пожалуйста
1 smaharbA
 
10.01.06
18:09
7 строк
2 Jeronimo
 
10.01.06
18:15
(1) не понял
3 Демогоргон
 
10.01.06
18:20
(2) делаешь прогу которая тупо ловит пакеты из ком порта и тупо записывает их в файл.
Крановые весы взвеслили 1 тонну - записал, 2 тонны - записал.
Дедуктическим мептодом определяешь что есть число в этом потоке инфы и юзаешь его.

Как вариант должно прокатить звонок производителям ...
4 smaharbA
 
10.01.06
18:21
set fso=CreateObject("Scripting.FileSystemObject")
set ff=fso.OpenTextFile("com2:",1,false)
set c2f=fso.OpenTextFile("c:\com2file.txt",8,True)
do
a=ff.read(1)
c2f.write a
loop
5 Jeronimo
 
10.01.06
18:23
(3) для облегчения этого процесса я и хотел бы найти программу, которая читает и логит порт.
(4) поясните please
6 Alexor
 
10.01.06
18:23
Могу ошибаться, но стандартный Hyperterminal возможно сможет считать эти параметры.
7 Демогоргон
 
10.01.06
18:25
(5) он написал тебе прогу которая заносит из ком порта текст в файлик текствоый ...
8 smaharbA
 
10.01.06
18:27
(5) Это можешь в VBS вставить а можешь так в 1С
fso=CreateObject("Scripting.FileSystemObject");
ff=fso.OpenTextFile("com2:",1,0);
c2f=fso.OpenTextFile("c:\com2file.txt",8,-1);
Пока 1=1 Цикл
a=ff.read(1);
c2f.write(a);
КонецЦикла;
9 Злобный Фей
 
10.01.06
18:27
Зачем что-то придумывать? Есть такая классная программуля, называется PortMon, бесплатная кстати.
10 Jeronimo
 
10.01.06
18:28
(7) на чем?
11 smaharbA
 
10.01.06
18:29
(9) А что тут придумывать, все работает
Согласен что прога хорошо, но если нет под рукой, то такие методы очч выручают
12 Jeronimo
 
10.01.06
18:31
(11) а настройки порта как задавать (скорость,стоповые биты,четность) ?
13 smaharbA
 
10.01.06
18:32
(12) Ну это от оборудования зависит конечно, а так по умолчанию проходит например возьми мышку подключи но в устройствах ее выруби и увидишь что в файл посыпет
14 Jeronimo
 
10.01.06
19:06
(9) спасибо. это наверно то что нужно. И все же на всякий случай, что еще есть?
15 ado
 
10.01.06
20:46
Посмотри это, мощная вещь для работы с любым нестандартным оборудованием.
http://www.entechtaiwan.com/dev/hw32/index.shtm
16 ТестПопытка
 
11.01.06
06:03
имхо лучше другую прогу использовать, чем 1С для чтения.
например другая прога быстренько читает порт и быстренько валит все в любую базу, какую придумаешь, потом из 1С корректно читаещь базу и заполняешь документы..
по моему проще и надежнее, чем из 1С напрямую..
17 Jeronimo
 
11.01.06
13:02
(17) Есть такой вариант. К примеру прога логит данные порта (к примеру в текстовый файл), а 1С берет последнюю запись.

Вот только что-то не выходит прочесть порт. Пробовал все настройки. Использую программу PortMon.
Какие могут быть подводные камни при работе с оборудованием? Уточню - весы не предназначены для работы с компьютером, к порту подключен специальный принтер, но в документации написано что данные  передаются по протоколу RS232
18 ТестПопытка
 
11.01.06
13:58
(17)влегкую.. у меня тоже весы "типа на принтер" должны выводить..
обычный текстовый поток как Абрахамс написал
Portmon -нафиг, пиши, как (8)
19 ТестПопытка
 
11.01.06
14:05
(18)я только тороплюсь, сейчас некогда, полно литературы, исходников по работе с ком портом и по RS-485.. в инете пошукай если горит, или завтра апни исходники выложу,
20 Jeronimo
 
12.01.06
16:45
(19) выложи, пожалуйста
21 romix
 
модератор
13.01.06
09:01
Выкладываю свою ВК (с исходником) для работы с последовательным портом.
По замечаниям ВК будет улучшаться.
http://x-romix.narod.ru/vk_rs232.rar
22 ТестПопытка
 
13.01.06
09:17
на королевстве делфи выкладывали, нет ссылки сейчас:
unit Weights;

// ************************************************************************* //
// Модуль для работы с весами (ПетВес серия EB4) по последовательному порту  //
// (C) 1999 Максим Игнатьев                                                  //
// ************************************************************************* //

interface

uses Classes;

type
 ComPort = 1..4;

const
 ComPortName : array [ComPort] of string = ('COM1','COM2','COM3','COM4');

type
 TWeightAdapter = class ( TComponent )
 private
   FPort : ComPort;
   FTimeOut : integer;
   function GetWeight: double;
   procedure SetPort(const Value: ComPort);
 public
   constructor Create( AOwner : TComponent );override;
   function AsString: string;
 published
   property Weight : double read GetWeight;
   property Port : ComPort read FPort write SetPort;
   property TimeOut : Integer read FTimeOut write FTimeOut;
   end;

function GetWeight ( Port : integer = 1 ): double;

procedure Register;

implementation uses SysUtils,Windows;

function GetWeight ( Port : integer = 1 ): double;
var
 A : TWeightAdapter;
Begin
 A := TWeightAdapter.Create(nil);
 A.Port := Port;
 Result := A.Weight;
 A.Free;
End;

const
 SIncorrectPort = 'Неверный номер порта';
 SPortNotOpen   = 'Невозможно открыть порт';

{ TWeightAdapter }

function TWeightAdapter.AsString: string;
begin
 result := Format('%f',[weight]);
end;

constructor TWeightAdapter.Create(AOwner: TComponent);
begin
 inherited Create( AOwner );
 FTimeOut := 2;
 FPort := 1;
end;

function TWeightAdapter.GetWeight: double;
var
 S : string;
 hComm,Readed : Cardinal;
 Buffer : byte;
 Mode : TDCB;
 TimeOuts : COMMTIMEOUTS;
 StartTime,Finish : TDateTime;
 Done : boolean;

const
 Numbers = ['0'..'9','.',','];

 Function GetString : string ;
 var
   B,E : integer;
 Begin
   B := 0; E := Length(S);
   While (E>0) and (S[E]<>#13) do Dec(E);
   If E>0 then B := E;
   While (B>0) and (S[B]<>#10) do Dec(B);
   If B>0 then Result := Copy(S,B+1,E-1)
   else Result := '';
 End;

 function ParseString : extended;
 var
   T,S : string;
// 'ST, 102,12kgG'#13#10
 begin
   result := -1;
   S := GetString;
   // Формат : ST.  100.05 kgG
   //  ST/US/OL :  Стабильно / нестабильно  / перегруз
   // Число     : вес
   // KG        : Единица измерения ( других похоже нет )
   // H/G/L     : Верхний предел/норма/нижний предел
   T := UpperCase(Copy(S,1,2));
   If (T='US') or (T='OL') then Exit;
   If (T='ST') or (T='+ ') or (T='- ') then
   Begin
     While ((Length(S)>0) and (not (S[1] in ['0'..'9']))) do Delete(S,1,1);
     T := '';
     While (Length(S)>0) and (S[1] in Numbers) do
     Begin
       If (S[1] = ',') then T := T+'.'
       else T := T+S[1];
       Delete(S,1,1);
     End;
     Val(T,Result,Readed);
     Done := true;
   End;
 end;

begin
 Result := 0; if csDesigning in ComponentState then Exit;
 Finish := FTimeOut / 86400;
 Done := false;
 // Открываем
 HComm := CreateFile(
   PChar(ComPortName[Port]),
   GENERIC_READ,
   0,
   nil,
   OPEN_EXISTING,
   0,
   0);
 if hComm = INVALID_HANDLE_VALUE then raise Exception.Create(SPortNotOpen);
 with Mode do
 Begin
   BaudRate := 9600;
   ByteSize := 8;
   Parity := NOPARITY;
   StopBits := ONESTOPBIT;
   Flags := EV_RXCHAR + EV_EVENT2;
 End;
 SetCommState ( hComm, Mode );
 // Устанавливаем таймауты
 with TimeOuts do
 Begin
   ReadIntervalTimeout := MAXDWORD;
   ReadTotalTimeoutMultiplier := 0;
   ReadTotalTimeoutConstant := 0;
 End;
 SetCommTimeOuts(hComm,TimeOuts);
 // Собираем строку
 StartTime := Now;
 repeat
   ReadFile(hComm,Buffer,1,Readed,nil);
   If Readed>0 then
   Begin
     S := S+Char(Buffer);
     Result := ParseString;
   End;
 until (Now-StartTime>Finish ) or Done;
 // Заметаем следы
 CloseHandle(HComm);     // Закрываем хэндл файла
end;

procedure TWeightAdapter.SetPort(const Value: ComPort);
begin
 If (Value>0) and (Value<5) then FPort := ComPort(Value)
 else raise Exception.Create(SIncorrectPort);
end;

procedure Register;
begin
 RegisterComponents('Samples',[TWeightAdapter]);
end;

end.
23 romix
 
модератор
13.01.06
09:30
(+21) Там кстати тоже есть юнит для работы с ком-портом, который можно заюзать не в ВК, а в другом софте.
24 Jeronimo
 
13.01.06
13:55
(21,22) Спасибо!
25 smaharbA
 
13.01.06
14:08
А что ты (4) непопробуешь, отличие от (22) только тем что параметры порта из системы берутся ;)
26 ТестПопытка
 
13.01.06
14:31
+25 тем более, что печать должна идти на принтер.. стопудово текст, готовый для употребления..
27 Jeronimo
 
15.01.06
17:38
(25) за (4) тоже огромное спасибо!
28 DES
 
15.01.06
17:57
romix
а что Dll делает?
Help-пик бы не помешал.
И зачем пустая база в архиве, да без примера юзания?
Компьютеры — прекрасное средство для решения проблем, которых до их появления не было.