Имя: Пароль:
IT
1С v8
Весы Тензо-м и свой драйвер для них
0 lEvGl
 
гуру
03.07.18
17:56
Доброго всем

Есть весы Тензо-м ТВ-014
https://www.tenso-m.ru/vesovye-terminaly/dlja-staticheskih-vesov/146/

есть описание протокола
https://www.tenso-m.ru/pdf/re/re_tv_014_5_12.pdf

есть готовая компонента
https://www.tenso-m.ru/programmnoe-obespechenie/integracija-v-sistemy-ucheta-i-asu-tp/95/

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

Помониторил СОМ порт Bus Hound`ом:
на устройство подается
ff 01 c3 e3  ff ff

в ответ приходит
ff ff ff 01 c3 94 01 00 12 24

Протокол описывает, что и где, вроде бы все понятно, но получить эти байты в своей программе (C#) в таком виде не могу

SerialPort mySerialPort = new SerialPort("Com1", 9600, Parity.None, 8, StopBits.One);
byte[] Result = new byte[] { 0xFF, 0x01, 0xC3, 0xE3, 0xFF, 0xFF };
1 lEvGl
 
гуру
03.07.18
17:58
mySerialPort.Open();
mySerialPort.Write(Result, 0, Result.Length);
Thread.Sleep(100);
textBox1.Text = mySerialPort.ReadExisting();

получаю абракадабру
??

как это разобрать и привести к человеческому виду, пожалуйста. ?
2 lEvGl
 
гуру
03.07.18
17:59
абракадабра даже не вставляется, еще раз
??
3 lEvGl
 
гуру
03.07.18
19:52
драйвер использовать хочется в учетной 1сной конфе, просто в тру программировании не силен, постольку поскольку - делал несколько подобных вариантов, но там устройства отдавали строку ascii, а тут лажа какая то
4 lEvGl
 
гуру
04.07.18
08:37
никто не предположит, что может быть не так ?
5 Кирпич
 
04.07.18
09:15
Ну в протоколе же описано, что, какая абракадабра значит. Вот и читай.
6 lEvGl
 
гуру
04.07.18
09:27
ReadExisting() возвращает строку, которая представляет из себя абракадабру, надо брать байт за байтом что ли.. ладно, вопрос видимо ламерский, будем разбираться, спасибо что откликнулся
7 spectre1978
 
04.07.18
09:53
(6) просмотрите абракадабру в виде HEX и, возможно, все станет боль-менее понятно?
8 Кирпич
 
04.07.18
11:22
(6) Ты там задолбаешься разбираться. В принципе, всё в инструкции написано, но там для умных. Я когда то на паскале с такими весами работал, но я тупо из инструкции asm скопировал. Надо там к командам CRC вычеслять и возвращает оно там массив байт. Вес в формате BCD. Всё это тебе придется изучить.
9 Кирпич
 
04.07.18
11:36
вот эта галиматья переводит этот BCD с весов в текст. Может поможет :)

function mBCDToStr(B: pointer): string;
var
  P: PmBCD;
  s: string;
  zn: byte;
begin
  P := B;

  zn := P^.b4 shl 5;
  zn := zn shr 5;

  result := '';

  s := IntToHex(P^.b3, 2);
  if s <> '00' then
  begin
    result := IntToStr(StrToInt(s[1]));
    result := result + IntToStr(StrToInt(s[2]));
  end;
  s := IntToHex(P^.b2, 2);
  if s <> '00' then
  begin
    result := result + IntToStr(StrToInt(s[1]));
    result := result + IntToStr(StrToInt(s[2]));
  end;

  s := IntToHex(P^.b1, 2);
  if s <> '00' then
  begin
    result := result + IntToStr(StrToInt(s[1]));
    result := result + IntToStr(StrToInt(s[2]));
  end;
  s := RightStr(result, zn);

  result := LeftStr(result, Length(result) - zn) + ',' + s;

  if (GetBit(P^.b4, 7) = 1) then result := '-' + result;

end;
10 Кирпич
 
04.07.18
11:38
А эта вычисляет CRC. Как это всё работает я давно забыл.

function MakeCRC(P: PByte; len: integer): byte;
  function CRCMaker(b_input: byte; b_CRC: byte): byte;
  label mod1, mod2;
  begin
    asm
      mov al,b_input
      mov ah,b_CRC
      mov cx,8
mod1: rol al,1
      rcl ah,1
      jnc mod2
      xor ah,69h
mod2: dec cx
      jnz mod1
      mov b_CRC,ah
    end;
    result := b_CRC;
  end;
var
  i: integer;
  b: byte;
begin
  b := CRCMaker(P^, 0);
  inc(P);
  for i := 1 to len do
  begin
    b := CRCMaker(P^, b);
  end;
  result := b;
end;