Почему opos не может найти мой денежный ящик с помощью обычных средств управления?

Во многом так же, как у этого парня было проблема, у меня похожая проблема...

Мой денежный ящик подключается к компьютеру через RJ11 (я думаю, что это 11 в любом случае...) соединение с моим принтером, который является Partner RP-600 Thermal Printer.

У меня принтер работает хорошо, но я не могу открыть денежный ящик.

Конфигурация денежного ящика opos

В основном я думаю о том, как это должно работать (основываясь на моем ограниченном понимании, это:

  1. Открытый принтер
  2. Претензионный принтер
  3. Включить принтер
  4. Открыть денежный ящик
  5. Претензия к денежному ящику
  6. Включить денежный ящик
  7. Открыть аппаратный ящик

Я пробовал это несколькими способами, и я получаю следующие ошибки:

OPOS_E_CLOSED = 101, но чаще всего
OPOS_E_NOEXIST = 109

Если я установлю его на drawer.Open("rp-600 printer"), я получу OPOS_E_ILLEGAL = 106

Мой код следует:

    using OPOSCONSTANTSLib;
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using OposPOSPrinter_CCO;
    using OposCashDrawer_CCO;

    namespace PosPrinterTest
    {
        public partial class Form1 : Form
        {
        private OPOSPOSPrinterClass printer = null;
        private OPOSCashDrawerClass drawer = null;
        public Form1()
        {
            InitializeComponent();

            printer = new OPOSPOSPrinterClass();
            drawer = new OPOSCashDrawerClass();

            _IOPOSPOSPrinterEvents_StatusUpdateEventEventHandler SUEH =
                new _IOPOSPOSPrinterEvents_StatusUpdateEventEventHandler(
                    PrinterStatusUpdateHandler);
            printer.StatusUpdateEvent += SUEH;

            _IOPOSCashDrawerEvents_StatusUpdateEventEventHandler DSUEH = new _IOPOSCashDrawerEvents_StatusUpdateEventEventHandler(CashDrawerStatusUpdateHandler);
            drawer.StatusUpdateEvent += DSUEH;
        }

        private void AddList(object listline)
        {
            listBox1.Items.Add(listline);
            listBox1.SelectedIndex = listBox1.Items.Count - 1;
        }

        private void OpenCashDrawer()
        {
            AddList("+Open drawer");

            int Result = drawer.Open("rpd");
            AddList(String.Format("  1-Open drawer: RC = {0}", Result));
            Result = drawer.ClaimDevice(1000);
            AddList(String.Format("  2-Claim drawer: RC = {0}", Result));
            drawer.DeviceEnabled = true;
            Result = drawer.ResultCode;
            AddList(String.Format("  3-Enable drawer: RC = {0}", Result));
            Result = drawer.OpenDrawer();
            AddList(String.Format("  4-Open drawer: RC = {0}", Result));

            AddList(String.Format("-Open drawer: {0}", ((Result == (int)OPOS_Constants.OPOS_SUCCESS) ? "Succeeded" : "Failed")));
            AddList(String.Empty);
        }

        private void CloseCashDrawer()
        {
            AddList("+Close drawer");

            int Result = drawer.ReleaseDevice();
            AddList(String.Format("  Release drawer: RC = {0}", Result));
            AddList("-Release drawer: " + ((Result == (int)OPOS_Constants.OPOS_SUCCESS) ? "Succeeded" : "Failed"));

            Result = drawer.Close();
            AddList(String.Format("  Close drawer: RC = {0}", Result));
            AddList("-Close drawer: " + ((Result == (int)OPOS_Constants.OPOS_SUCCESS) ? "Succeeded" : "Failed"));
            AddList(String.Empty);
        }

        private void Print()
        {
            AddList("+Print");

            int Result = printer.PrintNormal(2, "\x1B|cA\x1B|2COPOS POSPrinter\x1B|1C\nvia Microsoft.NET\n\n");

            AddList(String.Format("  Print: BC = {0}", Result));
            AddList(String.Format("-Print: {0}", ((Result == (int)OPOS_Constants.OPOS_SUCCESS) ? "Succeeded" : "Failed")));

            Result = printer.CutPaper(100);
            AddList(String.Format("  Cut: BC = {0}", Result));
            AddList(String.Format("-Cut: {0}", ((Result == (int)OPOS_Constants.OPOS_SUCCESS) ? "Succeeded" : "Failed")));
            AddList(String.Empty);
        }

        private void OpenPrinter()
        {
            AddList("+Open printer");

            int Result = printer.Open("rp-600 printer");
            AddList(String.Format("  Open: RC = {0}", Result));

            if (Result == (int)OPOS_Constants.OPOS_SUCCESS)
            {
                Result = printer.ClaimDevice(1000);
                AddList(String.Format("  Claim printer: RC = {0}", Result));

                if (Result == (int)OPOS_Constants.OPOS_SUCCESS)
                {
                    printer.DeviceEnabled = true;
                    Result = printer.ResultCode;
                    AddList(String.Format("  Enable printer: RC = {0}>", Result));
                }
            }
            AddList(String.Format("-Open: {0}", ((Result == (int)OPOS_Constants.OPOS_SUCCESS) ? "Succeeded" : "Failed")));
            AddList(String.Empty);
        }

        private void ClosePrinter()
        {
            AddList("+Close printer");

            int Result = printer.ReleaseDevice();
            AddList(String.Format("  Release printer: RC = {0}", Result));
            AddList("-Release printer: " + ((Result == (int)OPOS_Constants.OPOS_SUCCESS) ? "Succeeded" : "Failed"));

            Result = printer.Close();
            AddList(String.Format("  Close printer: RC = {0}", Result));
            AddList("-Close printer: " + ((Result == (int)OPOS_Constants.OPOS_SUCCESS) ? "Succeeded" : "Failed"));
            AddList(String.Empty);
        }

        private void PrinterStatusUpdateHandler(int nStatus)
        {
            AddList("  P StatusUpdate: " + nStatus);
        }

        private void CashDrawerStatusUpdateHandler(int nStatus)
        {
            AddList(String.Format("  CD Status Update: {0}", nStatus));
        }

        private void btnTender_Click_1(object sender, EventArgs e)
        {
            //OpenPrinter();
            //Print();
            //ClosePrinter();

            OpenCashDrawer();
            CloseCashDrawer();
        }
    }
}

Как видите, имя устройства, которое я указываю в OpenCashDrawer(), совпадает с именем устройства, которое я задал в opos.

Так что же я делаю не так, что мешает опосу найти денежный ящик?


person Ortund    schedule 07.10.2015    source источник
comment
Ящик и принтер являются отдельными устройствами, вам не нужно открывать/запрашивать принтер, чтобы использовать ящик. Кроме того, если вы еще этого не сделали, попробуйте установить общие объекты управления (расположенные здесь: monroecs.com/oposccos_current.htm ).   -  person Josh Anderson    schedule 08.10.2015
comment
@JoshAnderson, просто для ясности, вы знаете, что денежный ящик подключается не к компьютеру, а к принтеру, верно? Потому что я все еще получаю код ошибки 109   -  person Ortund    schedule 08.10.2015
comment
Я знаю, эти денежные ящики могут быть надоедливыми. Просто увидев ваше последнее редактирование, я подумал, что вы используете POS Microsoft для .Net вместо того, чтобы напрямую использовать общие классы управления. Я менее знаком с ними, но есть ли способ перечислить каждое установленное устройство определенного типа, просто чтобы увидеть, появляется ли оно? Также может случиться так, что метод _drawer.Open() ожидает имя объекта службы, а не имя логического устройства.   -  person Josh Anderson    schedule 08.10.2015
comment
Не похоже, что в OPOSCashDrawerClass есть метод для этого   -  person Ortund    schedule 08.10.2015


Ответы (1)


На скриншоте видно, что LDN денежного ящика — «rp-cashdrawer», но в вашем коде используется «rpd».

drawer.Open("rpd");

Вы должны открывать устройство с настроенным LDN, например:

drawer.Open("rp-cashdrawer");
person zachz    schedule 09.10.2015
comment
Хотя это правильное замечание, причина, по которой денежный ящик не мог открыться, заключалась в том, что мне нужен был специальный драйвер для денежного ящика. Как только я это понял, код заработал (после того, как я нацелился на правильное устройство в методе .Open(). - person Ortund; 11.10.2015