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

    Попал в руки девайс Мария-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…

    Комментарии 2

      0
      Ну как у всех ФР есть документация как с ними работать, какие команды подавать. ФР то надо подключать куда-то и ему надо связываться с какой нибудь кассовой программой, а она уже говорит что нужно делать.
        0
        Спасибо за стать, мы как раз с ним боремся сейчас. Хотим его к Raspberry Pi подключить и через него печатать. Буду рад пообщаться.

        Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

        Самое читаемое