Весы ВТА-60 + MSCOMM

1. batia777 19.09.19 14:52 Сейчас в теме
Всем привет.

Пытаюсь заставить работать весы ВТА-60/15-6-А.

Протокол обмена есть в руководстве (тип протокола 0)

http://www.ppr.com.ua/upload/files/Instr_%20VTA-5-A.pdf

6.2.2. Протокол номер „0”.
Даний протокол використовується для роботи з іншими касовими апаратами та комп’ютером
(ЕОМ) і має наступний склад:
Вигляд байта: ВsВ0В1В2В3В4В5В6В7В8Вс,
де Вs – старт біт;
В0 -В3 – біти цифри;
В4-В7 – незначущі біти;
В8 – біт паритету (парність);
Вс – стоп біт.

Існує три режими обміну між вагами та ЕОМ:
- ЕОМ дає вагам команду тарування.
- ЕОМ передає ціну в ваги;
- ЕОМ приймає значення маси, ціни та вартості товару з ваг.

Перед кожною командою ведучий пристрій повинен передати не менше двох нулів.

Протокол використовує коди цифр 0- $00, 1 - $01, …, 9-$09.

Таблиця 2. Список команд протоколу та їх формат
Назва команди // Код команди (у двійковому коді) // Інформація що приймається (передається)
Взяття маси тари 1(0b00000001) ---
Передача ціни з ЕОМ у ваги 2(0b00000010) (ц1) (ц2) (ц3) (ц4) (ц5) (ц6)
Запит інформації з ваг 3(0b00000011) (м1) ... (м6) (ц1) ... (ц6) (в1) ... (в6)

Де: м1 ... м6 – маса товару;
ц1 ... ц6 – ціна товару;
в1 ... в6 – вартість товару.
м1, ц1, в1 –молодші розряди.
При від'ємній масі або масі рівній нулю вага не передає ніякої інформації. При відсутності заспокоєння команди
1 і 3 ігноруються.



Пишу в обработке:

ComPort = Новый COMОбъект("MsCommLib.MsComm.1");    
    Попытка
        ComPort.CommPort        = 3;
        ComPort.Settings        = "4800,N,8,1";
        ComPort.Handshaking     = 0;
        ComPort.InBufferCount   = 0;
        ComPort.InBufferSize    = 70;
        ComPort.InputLen        = 0;
        ComPort.InputMode       = 0; // 1 данные, 0 Строки
        ComPort.NullDiscard     = 0;
        ComPort.PortOpen        = Истина;
    Исключение
        Сообщить("Не возможно открыть порт!");
        ЭтаФорма.Закрыть();
    КонецПопытки;
    
    Попытка
          ComPort.Output = "00 00 03";  // ??? Вот что тут писать не пойму никак...    
    Исключение
         Сообщить(ОписаниеОшибки());
    КонецПопытки;
Показать


Вопрос что передать в параметр ComPort.Output = ???;

Возможно в этом предложение "зарыта собака": Протокол використовує коди цифр 0- $00, 1 - $01, …, 9-$09.

Заранее благодарю за ответы. Прошу не пинать сильно.
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. batia777 22.09.19 20:24 Сейчас в теме
Или может есть вариант напрямую через tcp отправлять пакеты, а не через программы эмуляторы com-порта?

То есть весы подключены к машине с линуксом на котором поднят ser2net.
3. user804963 24.09.19 16:32 Сейчас в теме
Задать тару $00$00$01
Задать цену на весы (напромер 123,45) $00$00$02$05$04$03$02$01
Прочитать вес $00$00$03
Только четность - mark, а не none
4. batia777 27.09.19 16:32 Сейчас в теме
Спасибо за ответ. Жаль только проверить уже на чем, пришлось пока отдать с вариантом через UniScalesDriver.
5. Prisian 05.01.20 18:03 Сейчас в теме
Привет! Тоже столкнулся с данной проблемой. Вот код для получения веса:
function TMyClass.GetWeight(RetValue: PV8Variant; Params: PV8ParamArray;  const ParamCount: integer; var v8:TV8AddInDefBase): boolean;
var
  str, Stro, weight, PortName, readedstring, resultstring: String;
  i, rl, L:integer;
  cc, dp, by:Byte;
begin

  //if g_isOpen then
  // Raise Exception.Create('Порт уже открыт');

  Property_DeviceID_GetSet(@Params[1], false, v8);

  Str:= '003';
  Stro:= '';

  //MessageBox(0, Pchar(Str), '*Str',0);
  For i:= 1 to length(Str) do
    begin
      Stro:= Stro + Chr(Ord(Str[i]) - Ord('0'));
    end;

  g_cp.WriteString(Stro);

  MessageBox(0, pChar(@Params[1]), '*p_DeviceID',0);

  try
  repeat

  readedstring:= '';
  resultstring:= '';
  // ожидание события

  rl:=g_cp.p_ScalesProt;

  readedstring:=g_cp.ReadString(rl);
  //MessageBox(0, pChar(readedstring), '*readedstring 1 ',0);
  //stringlength := length(readedstring);
  If length(readedstring) <rl then
    readedstring:=readedstring+g_cp.ReadString(rl-length(readedstring));
    //MessageBox(0, pChar(readedstring), '*length(readedstring)<rl',0);
    //MessageBox(0, pChar(stringlength), '*length(readedstring)',0);
    if length(readedstring)=rl then begin
      Case rl of
        18: begin
          For i:=1 to 6 do
            begin
              resultstring:=chr(ord(readedstring[i])+Ord('0'))+resultstring;
              if i=3 then
              resultstring:='.'+resultstring;
            end;
               //evt:= 'weight1';
          end;

        10: begin
          // <N,И6,И5,И4,И3,И2,И1,СС> Протокол 10
          resultstring:=Copy(readedstring,3,6);
          CC:=ord(readedstring[9]);
          //положення крапки с1с0
          dp:=CC mod 4;
          // біт заспокоєння с2
          by:=  (CC mod 8) shr 2;
	        //індикація "0"   с3
	        //Светится0=Цел((СС % 16)/8);
	        //індикація "Т"   с4
	        //СветитсяТ=Цел((СС % 32)/16);
	        //Сообщить(СС);
	        //Сообщить(СветитсяТ);
	        //знак ваги 1= <0 с5
	        //Если Цел((СС % 64)/32)=0 тогда
	        //ЗнакВесов=1
        	//Иначе
	        //  ЗнакВесов=-1
	        //КонецЕсли;
          insert('.',resultstring,6-dp);
          //evt:= 'weight'+inttostr(by);
          end;
        7: begin
          // <,N,И2,И1,И0,СС >  	протокол 7

          end;
        end;

          SetParamDouble(StrToFloat(resultstring), 1, Params);
          //Params[2].VarEnum.dblVal := StrToFloat(resultstring);
          MessageBox(0, pChar(@Params[2]), '*WeightD',0);
      end;
  
      sleep(300);
      result := True;
  until readedstring = '';
  except
			on E:Exception do begin
			  g_ErrorMsg:=E.Message;
        V8.addError(1006, 'Внешняя компонента', pWideChar(g_ErrorMsg), E_FAIL);
        result := False;
      end;

  end;
end;
Показать
6. Prisian 05.01.20 18:06 Сейчас в теме
А вот параметры СОМ порта:
//Выставляем параметры COM-порта

     p_BaudRate:= CBR_4800;
     p_ByteSize:= 8;
     p_Parity:= EVENPARITY;
     p_StopBits:= ONESTOPBIT;


  if not GetCommState(hCom,dcb) //uses Windows
    then RaiseLastOSError;
      dcb.BaudRate:=p_BaudRate;
      dcb.ByteSize:=p_ByteSize;
  if p_scalesprot=18 then
     dcb.Parity:=p_Parity
  else
     dcb.Parity:=NOPARITY;
      dcb.StopBits:=p_StopBits;
    
  if not SetCommState(hCOM,dcb) //uses Windows
    then RaiseLastOSError;

  //Выставляем параметры COM-порта
  if not GetCommTimeOuts(hCom,cto) //uses Windows
    then RaiseLastOSError;

    cto.ReadIntervalTimeout:=1;
    cto.ReadTotalTimeoutMultiplier:=1;
    cto.ReadTotalTimeoutConstant:=10;

    cto.WriteTotalTimeoutMultiplier:=0;
    cto.WriteTotalTimeoutConstant:=0;

  if not SetCommTimeOuts(hCom,cto) //uses Windows
    then RaiseLastOSError;
Показать
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот