VKP-80II
Home Qt Установка и печать на термопринтере VKP-80II из Qt 5

Установка и печать на термопринтере VKP-80II из Qt 5

by Pavelk
Published: Last Updated on Термопринтер VKP-80II

Прилетела на днях сия  игрушка.
Применений к ней куча — всё зависит от фантазии.

Сейчас расскажу как на нём печатать из Qt.

Первым делом идём на сайт производителя за дровами, да не простыми, а OPOS.

Вставим чековую ленту в принтер, теперь вынимаем питание, зажимаем верхнюю кнопку (Line feed), включаем питание, ждём пока зажужжит и отпускаем кнопку.

Напечатаются настройки и жмём снова верхнюю кнопку (Line feed) что бы принтер выплюнул ленту.

С ленты нас интересует только параметры RS232, они сейчас потребуются.

Запускаем установку дров, указываем способ соединения и параметры скорости (по умолчанию 19200) и прочие, при необходимости.

Для теста, запускаем OPOS POS Printer configurator и настраиваем параметры.

В нём мы настраиваем как связатсья с принтером через OPOS драйвер. Запомните device name — оно нам пригодится.

Потом запускаем OPOS POS Printer test и можно немного поиграться.

Если всё работает, то пора создавать новый Qt проект (тип — на ваш выбор).

Всё общение с термопринтером идёт через ActiveX компонент OPOSPOSPrinter.ocx, поэтому сейчас заодно покажу как работать с ActiveX в Qt.

Для работы нам нужно получить от библиотеки реализацию cpp и h файлов с помощью утилитки, входящую в состав Qt — dumpcpp.

Открываем виндузятную консольку, переходим в каталог, где будем создавать классы, и запускаем dumpcpp:

cd C:\Projects\1CTerminal\1CTerminal\opos
dumpcpp "C:\Program Files (x86)\OLEForRetail\ServiceOPOS\POSPrinter\CustomEngineering\OPOSPOSPrinter.ocx"

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

Т.е. как минимум узнаём пространство имён (OposPOSPrinter_1_9_Lib) и название класса (OPOSPOSPrinter).

В *.pro файле проекта добавляем:

CONFIG += qaxcontainer # Для работы с ActiveX
Добавляем в проект сгенерированные файлы oposposprinter_1_9_lib.cpp и oposposprinter_1_9_lib.h

Заодно добавьте следующий заголовочный файл, в нём собрал все используемые статусные сообщения:

//-- Коды результата
namespace OposPOSPrinter_1_9_Lib {

    #define OPOS_SUCCESS            0
    #define OPOS_E_CLOSED           101
    #define OPOS_E_CLAIMED          102
    #define OPOS_E_NOTCLAIMED       103
    #define OPOS_E_NOSERVICE        104
    #define OPOS_E_DISABLED         105
    #define OPOS_E_ILLEGAL          106
    #define OPOS_E_NOHARDWARE       107
    #define OPOS_E_OFFLINE          108
    #define OPOS_E_NOEXIST          109
    #define OPOS_E_EXISTS           110
    #define OPOS_E_FAILURE          111
    #define OPOS_E_TIMEOUT          112
    #define OPOS_E_BUSY             113
    #define OPOS_E_EXTENDED         114

    #define strOPOS_SUCCESS         "OPOS_SUCCESS"
    #define strOPOS_E_CLOSED        "OPOS_E_CLOSED"
    #define strOPOS_E_CLAIMED       "OPOS_E_CLAIMED"
    #define strOPOS_E_NOTCLAIMED    "OPOS_E_NOTCLAIMED"
    #define strOPOS_E_NOSERVICE     "OPOS_E_NOSERVICE"
    #define strOPOS_E_DISABLED      "OPOS_E_DISABLED"
    #define strOPOS_E_ILLEGAL       "OPOS_E_ILLEGAL"
    #define strOPOS_E_NOHARDWARE    "OPOS_E_NOHARDWARE"
    #define strOPOS_E_OFFLINE       "OPOS_E_OFFLINE"
    #define strOPOS_E_NOEXIST       "OPOS_E_NOEXISTS"
    #define strOPOS_E_EXISTS        "OPOS_E_EXISTS"
    #define strOPOS_E_FAILURE       "OPOS_E_FAILURE"
    #define strOPOS_E_TIMEOUT       "OPOS_E_TIMEOUT"
    #define strOPOS_E_BUSY          "OPOS_E_BUSY"
    #define strOPOS_E_EXTENDED      "OPOS_E_EXTENDED"

    //-- Коды состояний
    #define PTR_S_RECEIPT           2

    //-- Коды параметров
    #define PTR_SUE_COVER_OPEN      11
    #define PTR_SUE_COVER_OK        12

    #define PTR_SUE_JRN_EMPTY       21
    #define PTR_SUE_JRN_NEAREMPTY   22
    #define PTR_SUE_JRN_PAPEROK     23

    #define PTR_SUE_REC_EMPTY       24
    #define PTR_SUE_REC_NEAREMPTY   25
    #define PTR_SUE_REC_PAPEROK     26

    #define PTR_SUE_SLP_EMPTY       27
    #define PTR_SUE_SLP_NEAREMPTY   28
    #define PTR_SUE_SLP_PAPEROK     29

    #define PTR_SUE_JRN_CARTRIDGE_EMPTY         41
    #define PTR_SUE_JRN_CARTRIDGE_NEAREMPTY     42
    #define PTR_SUE_JRN_HEAD_CLEANING           43
    #define PTR_SUE_JRN_CARTRIDGE_OK            44

    #define PTR_SUE_REC_CARTRIDGE_EMPTY         45
    #define PTR_SUE_REC_CARTRIDGE_NEAREMPTY     46
    #define PTR_SUE_REC_HEAD_CLEANING           47
    #define PTR_SUE_REC_CARTRIDGE_OK            48

    #define PTR_SUE_SLP_CARTRIDGE_EMPTY         49
    #define PTR_SUE_SLP_CARTRIDGE_NEAREMPTY     50
    #define PTR_SUE_SLP_HEAD_CLEANING           51
    #define PTR_SUE_SLP_CARTRIDGE_OK            52

    #define PTR_SUE_IDLE                        1001

    #define strPTR_SUE_COVER_OPEN               "PTR_SUE_COVER_OPEN"
    #define strPTR_SUE_COVER_OK                 "PTR_SUE_COVER_OK"
    #define strPTR_SUE_REC_EMPTY                "PTR_SUE_REC_EMPTY"
    #define strPTR_SUE_REC_NEAREMPTY            "PTR_SUE_REC_NEAREMPTY"
    #define strPTR_SUE_REC_PAPEROK              "PTR_SUE_REC_PAPEROK"
    #define strPTR_SUE_IDLE                     "PTR_SUE_IDLE"

    #define PTR_BM_ASIS                         -11
    #define PTR_BM_CENTER                       -2

    #define PTR_BCS_UPCA                        101
    #define PTR_BCS_UPCE                        102
    #define PTR_BCS_EAN128                      120
    #define PTR_BCS_Code128                     110


    #define PTR_BC_TEXT_ABOVE                   -12
    #define PTR_BC_TEXT_BELOW                   -13
    #define PTR_BC_CENTER                       -2

}

#endif // OPOSPRINTER_CONSTS_H




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

Дальше я разбирался с помощью интуиции и примерного проекта (В основном: C:\Program Files (x86)\OLEForRetail\ServiceOPOS\POSPrinter\CustomEngineering\OPOSPOSPrinterTest_Src\FormMainApp.frm).

Printer.h:

#ifndef PRINTER_H
#define PRINTER_H

#include "opos/oposposprinter_1_9_lib.h"
#include "opos/oposprinter_consts.h"
using namespace OposPOSPrinter_1_9_Lib;

class Printer : public QObject
{
   Q_OBJECT
public:
   explicit Printer(QObject *parent = 0);

signals:
public slots:
private:
   IOPOSPOSPrinter * oposPrinter;
};
#endif // PRINTER_H
и 
#include "printer.h"

Printer::Printer(QObject *parent) :
QObject(parent)
{
   oposPrinter = new IOPOSPOSPrinter();
   oposPrinter->setControl("{ccb90152-b81e-11d2-ab74-0040054c3719}");
   int res = oposPrinter->Open("Custom POS Printer");
   qDebug()<<"Open sataus: "<<res;
   oposPrinter->ClaimDevice(100);
   oposPrinter->SetDeviceEnabled(true);
   oposPrinter->PrintImmediate(2, "Hello, QT!, Привет, мир!" );
   oposPrinter->CutPaper(100);
   oposPrinter->Close();
}
Надеюсь, запечатает. На этом всё =)

Архивчик со вспомогательным классом: Printer

В printer.cpp заменить  AppSettings()->value(«com_printer»).toString()  на device name  из OPOS POS Printer configurator.

Навсякий случай дрова OPOS для Custom VKP-80II

1 comment

Олег 29 декабря 2017 - 16:44

Не могли бы вы повторно выложить Printer.zip для ознакомления?

Reply

Leave a Comment

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.

You may also like