Taming of Mary-301MTM

    The device Maria-301MTM fell into the hands of ... This is the Ukrainian fiscal registrar - the printer of cash receipts.
    image

    The protocol of this device is open and kindly provided by the manufacturer.
    Drivers for working with the device, I found only paid and rather old ones. Actually, this prompted the writing of the article.

    In stock: an old netbook with a COM port. The first thing I did was run putty and check the connection. Sweat settings parity: Even; stopbit: 2; speed: 57600 pass two letters “U” and get “READY”. The protocol works, the port is alive. On the netbook from previous experiments installed mscomctl.ocx . This set is quite enough to write a service console for Mary.

    Transport protocol:
    1. commands: <start> <command and parameters> <length> <end>;
    2. answer: <start> <information> <length> <end>,
    where <start> = chr (253), <end> = chr (254). The length of the command can be no more than 255 characters.


    The printer answers “WAIT”, “DONE”, “READY” to any command. "READY" - means readiness to accept the next team. There may be errors in the response. For example, "'HARDTXD' 'if the connection type specifies the wrong type of parity, or' 'SOFTPROTOC" is a sequence error command ...

    In general, vbscript to get Maria’s configuration looks like this:
    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()
    

    Useful functions:
    initComm () - opens the port and the log file
    fillcmd (txtma) - frames the text command with special protocol characters

    Printing a check:
    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()
    


    This code is quite enough to print checks, reports from 1C, ACESS, EXCEL
    I think to write a driver using the nativ-API to replace the old OLE32 ...

    Also popular now: