Pull to refresh

Укрощение Марии-301МТМ

Reading time3 min
Views17K
Попал в руки девайс Мария-301МТМ… Это украинский фискальный регистратор — принтиер кассовых чеков.
image

Протокол сего девайса открыт и любезно предоставлен производителем
Драйвера для работы с девайсом я нашел только платные и довольно старинные. Собственно это и подвигло к написанию статьи.

В наличии: старенький нетбук с COM портом. Первым делом запустил putty и проверил связь. Настройки пота parity: Even; stopbit:2; speed:57600 передаем две буквы «U» и получаем «READY». Протокол работает, порт жив. На нетбуке от предыдущих опытов установлен mscomctl.ocx. Этого набора вполне достаточно чтоб написать сервис консоль для Марии.

Транспортный протокол:
1. команды: <начало><команда_и_параметры><длина><конец>;
2. ответ: <начало><информация><длина><конец>,
где <начало> = chr(253), <конец> = chr(254). Длина команды может быть не больше 255 символов.


На любую команду принтер отвечает «WAIT», «DONE», «READY». «READY» — означает готовность к принятию следующей команды. В ответе могут присутствовать ошибки. Например "'HARDTXD'' если в параметрах соединения указан не тот тип контроля четности, или "'SOFTPROTOC" — ошибка последовательности команд…

В общем виде vbscript для получения конфигурации Марии выглядит так:
dim MSComm1
dim txt

function fillcmd(txtma)
  ret = chr(253) & txtma & chr(len(txtma)+1) & chr(254)  
  fillcmd = ret 
end function
           
function sendCmd(cmdTxt)
  ret = ""
  txt.writeline "cmd="+txtcmd
  MSComm1.Output  = fillcmd(txtcmd)
  WScript.Sleep(100)
  ret = MSComm1.Input
  txt.writeline "answ="+ret
  sendCmd = ret
end function

function initMaria()
  txt.writeline "init"
  MSComm1.Output="U" 
  WScript.Sleep(1)
  MSComm1.Output="U" 
  WScript.Sleep(20)
  rez = MSComm1.Input
  txt.writeline "answ="+rez
  initMaria = rez
end function

function initComm()
  Set MSComm1=CreateObject("MSCOMMLib.MSComm")
  MSComm1.Settings = "57600,e,8,2"
  MSComm1.CommPort = 2
  MSComm1.InBufferCount = 0
  MSComm1.PortOpen = True
  MSComm1.DTREnable = True

  set fso = CreateObject("Scripting.FileSystemObject")
  set txt = fso.CreateTextFile("maria.log")

  initComm = "Ready"
end function

sub closePort()
  MSComm1.DTREnable = False
  MSComm1.PortOpen = False
  Set MSComm1 = Nothing
  txt.close
  Set txt = Nothing
end sub

res = initComm()
res = initMaria()

'get maria configurarion
txtcmd="CONF" 
res = sendCmd(txtcmd) 

closePort()

Полезные функции:
initComm() — открывает порт и лог файл
fillcmd(txtma) — обрамляет текстовую команду спецсимволами протокола

Печать чека:
res = initComm()
res = initMaria()

'user login
txtcmd="UPAS111111111112345" 
res = sendCmd(txtcmd) 

'cancel check
txtcmd="CANC" 
res = sendCmd(txtcmd) 

'open check
txtcmd="PREP0" 
res = sendCmd(txtcmd) 

'add line
txtcmd="FISC"&"арт         "&"000003000"&"000001000"&"00003"&"10"&_
"А02000"&"000000"&"000000"&"000000"&"000000"&"000000"&"000000"&"000000"&"0001" '+"&'"             "&"         "&"доп"
res = sendCmd(txtcmd) 

'close check
txtcmd="COMP"&"0000003000"&"0000000000"&"0000000000"&"0000000000"&"0000000000"&"0000003000"  
res = sendCmd(txtcmd) 

closePort()



Такого кода вполне достаточно чтоб печатать чеки, отчеты из 1С, ACESS, EXCEL
Думаю написать драйвер с использованием nativ-API на замену прежнему OLE32…
Tags:
Hubs:
Total votes 14: ↑10 and ↓4+6
Comments2

Articles