Меркурий-130 режим ФР, подключение через DrvMercFR.dll

Раздел для обсуждения программного обеспечения КБ по ККМ Меркурий.
Ответить
Аватара пользователя
Prz777
Сообщения: 9
Зарегистрирован: 08 апр 2011, 17:41

Меркурий-130 режим ФР, подключение через DrvMercFR.dll

Сообщение Prz777 »

Как практически получить наименование модели, производитель и версию ПО через функцию QueryEcrIdent(ModelName :char;Manufacturer :char;FirmvareVersion :char;):integer; В списке функций исходника frole.exe она есть, но не реализована.
Аватара пользователя
Shtirlic
Сообщения: 377
Зарегистрирован: 18 фев 2011, 11:21

Re: Меркурий-130 режим ФР, подключение через DrvMercFR.dll

Сообщение Shtirlic »

Prz777 писал(а):Как практически получить наименование модели, производитель и версию ПО через функцию QueryEcrIdent(ModelName :char;Manufacturer :char;FirmvareVersion :char;):integer; В списке функций исходника frole.exe она есть, но не реализована.
В frole.exe по исходникам немного другое:
TQueryEcrIdent = function(ModelName, Manufacturer, FirmvareVersion: PChar): integer; stdcall;
...
_QueryEcrIdent: TQueryEcrIdent;
...
_QueryEcrIdent := GetProcAddress(DLL, 'QueryEcrIdent');
if not Assigned(_QueryEcrIdent) then raise Exception.Create('Функция QueryEcrIdent не найдена в DLL');

PChar это не char
и как Вы можете понять исходников этой функции в frole.exe и не должно быть.
на счет практического применения, вот код на C++ в котором практически используется эта функция(точнее усовершенствованная версия):
в h файле:
TQueryEcrIdentEx QueryEcrIdentEx;
при инициализации:
QueryEcrIdentEx = (TQueryEcrIdentEx) GetProcAddress(hDLL, "QueryEcrIdentEx");
if(QueryEcrIdentEx)Log->Lines->Add("function 'QueryEcrIdentEx' loaded");
else {Log->Lines->Add("ERROR: function 'QueryEcrIdentEx' NOT LOADED");return;}

непосредственно использование:
char ModelName[50],Manufacturer[50], FirmvareVersion[50],SN[50];
int Res=QueryEcrIdentEx(ModelName,Manufacturer,FirmvareVersion,SN);
if(Res==0)
{
Log->Lines->Add(ModelName);
Log->Lines->Add(Manufacturer);
Log->Lines->Add(FirmvareVersion);
Log->Lines->Add(SN);
ExistError = Res!=0;
}else Log->Lines->Add("QueryEcrIdent:"+IntToStr(Res));


типы описывающие функции в drvmercfr.h (на с++)
все материалы https://forum.incotexkkm.ru/viewtopic.php?f=19&t=20
Аватара пользователя
Prz777
Сообщения: 9
Зарегистрирован: 08 апр 2011, 17:41

Re: Меркурий-130 режим ФР, подключение через DrvMercFR.dll

Сообщение Prz777 »

Невозможность выполнения функции function QueryEcrIdentEx(ModelName, Manufacturer, FirmvareVersion, SN : PChar): integer; stdcall; external 'DrvMercFR.dll'; заключается в самой Delphi при вызове СИ-шных функций с несколькими возвращаемыми параметрами. Из-за этой проблемы не работают функции: GetCurrOper(int *OperNum);,GetTaxNum(int *TaxNum);,GetTaxRate(int TaxIndex, int *TaxVal,char Name[100];,QueryEcrDateTime(char [12] DateTime);.
Все остальные, которые возвращают одно значение выполняются без ошибок, кроме двух:
SynchronazeDateTime(); - ошибка ERR_INTERNAL - внутренняя ошибка драйвера
SendText(PChar(StringForPrinting)); - ошибка ERR_ECR_ERROR - ошибка ККМ.
В чем причина данных ошибок?
И еще. При незакрытой смене свыше 24 часов выдается ошибка о необходимости закрытия смены. При выполнении команды Zreport(); возникает ошибка ERR_ECR_ERROR - ошибка ККМ. Какой выход из этой ситуации?
Аватара пользователя
Shtirlic
Сообщения: 377
Зарегистрирован: 18 фев 2011, 11:21

Re: Меркурий-130 режим ФР, подключение через DrvMercFR.dll

Сообщение Shtirlic »

Невозможность выполнения функции function QueryEcrIdentEx(ModelName, Manufacturer, FirmvareVersion, SN : PChar): integer; stdcall; external 'DrvMercFR.dll'; заключается в самой Delphi при вызове СИ-шных функций с несколькими возвращаемыми параметрами.
Вы наверное шутите, как тогда работает frole.exe написанный на делфи.
выдержки из кода arMaxX.pas:
type
TConnect = function(PortNum: byte; BaudRate: word; Timeout: word; psw: PChar): integer; stdcall;
...
TQueryEcrIdent = function(ModelName, Manufacturer, FirmvareVersion: PChar): integer; stdcall;
далее
...
_QueryEcrIdent: TQueryEcrIdent;
...
далее
procedure TKKMNetDBSrvDataGate.InitFR(const ARMName: String);
var INI: TINI;
r: integer;
begin
if DLL <> 0 then begin
if Assigned(_Disconnect) then _Disconnect;
FreeLibrary(DLL);
DLL := 0;
end;
DLL := LoadLibrary('drvmercfr.dll');
if DLL = 0 then raise Exception.Create('Библиотека drvmercfr.dll не загружена');
_Connect := GetProcAddress(DLL, 'Connect');
if not Assigned(_Connect) then raise Exception.Create('Функция Connect не найдена в DLL');
...
_QueryEcrIdent := GetProcAddress(DLL, 'QueryEcrIdent');
if not Assigned(_QueryEcrIdent) then raise Exception.Create('Функция QueryEcrIdent не найдена в DLL');


И еще. При незакрытой смене свыше 24 часов выдается ошибка о необходимости закрытия смены. При выполнении команды Zreport(); возникает ошибка ERR_ECR_ERROR - ошибка ККМ. Какой выход из этой ситуации?
да вроде должна закрывать может до этого конект или регистрация кассира не проходила, попробуйте закрыть смену с помощью тестовой программы TestDll.exe
Аватара пользователя
Prz777
Сообщения: 9
Зарегистрирован: 08 апр 2011, 17:41

Re: Меркурий-130 режим ФР, подключение через DrvMercFR.dll

Сообщение Prz777 »

Ответ так и не прозвучал. Вы ссылаетесь исходник frole.exe написанный на делфи. В нем эта функция описана, но не реализована. Я уже объяснил, что это проблема Delphi при вызове СИ-шных функций с возвратом нескольких параметров.
У меня вопрос про две функции:
SynchronazeDateTime(); - ошибка ERR_INTERNAL - внутренняя ошибка драйвера
SendText(PChar(StringForPrinting)); - ошибка ERR_ECR_ERROR - ошибка ККМ.
В чем причина данных ошибок? Реализованы ли они в самой прошивке ККМ? Или только объявлены что они есть?
И еще вопрос про незакрытую смену (см.выше). Никакими способами с ПК это не получается, в т.ч. с помощью TestDll. Я так думаю, что прошивку в этом случае нужно подправить.
Аватара пользователя
Shtirlic
Сообщения: 377
Зарегистрирован: 18 фев 2011, 11:21

Re: Меркурий-130 режим ФР, подключение через DrvMercFR.dll

Сообщение Shtirlic »

Вы ссылаетесь исходник frole.exe написанный на делфи. В нем эта функция описана, но не реализована.
в первом моем посте специально вырвал куски кода для подключения функции QueryEcrIdent из DLL, непонятно что Вы подразумеваете под реализацией, её просто не может быть потому, что реализация в DLL. Может Вы подумали, что надо работать через frole.exe, нет, не надо, всего лишь предложил воспользоваться кодом и по аналогии написать.

SynchronazeDateTime(); - ошибка ERR_INTERNAL - внутренняя ошибка драйвера
SendText(PChar(StringForPrinting)); - ошибка ERR_ECR_ERROR - ошибка ККМ.

это зарезервированные функции, которые пока работают как заглушки.
Аватара пользователя
Prz777
Сообщения: 9
Зарегистрирован: 08 апр 2011, 17:41

Re: Меркурий-130 режим ФР, подключение через DrvMercFR.dll

Сообщение Prz777 »

Остался один вопрос. Это невозможность выполнения закрытия смены через драйвер при открытой смене, когда она превысила 24 часа. Какое решение данной проблемы?
Аватара пользователя
Shtirlic
Сообщения: 377
Зарегистрирован: 18 фев 2011, 11:21

Re: Меркурий-130 режим ФР, подключение через DrvMercFR.dll

Сообщение Shtirlic »

а Вы попробовали, что я писал здесь https://forum.incotexkkm.ru/viewtopi ... 2942#p2942 по этому вопросу?
Аватара пользователя
Prz777
Сообщения: 9
Зарегистрирован: 08 апр 2011, 17:41

Re: Меркурий-130 режим ФР, подключение через DrvMercFR.dll

Сообщение Prz777 »

Вы дали ссылку на эту-же страницу (сама на себя).
да вроде должна закрывать может до этого конект или регистрация кассира не проходила, попробуйте закрыть смену с помощью тестовой программы TestDll.exe
И мой ответ: Никакими способами с ПК это не получается, в т.ч. с помощью TestDll.
Аватара пользователя
Shtirlic
Сообщения: 377
Зарегистрирован: 18 фев 2011, 11:21

Re: Меркурий-130 режим ФР, подключение через DrvMercFR.dll

Сообщение Shtirlic »

Вы дали ссылку на эту-же страницу (сама на себя).
Верно, Вы же не ответили до моего поста, что пробовали или не пробовали закрыть смену утилитой TestDll(скорее примером взаимодействия с DLL).

И мой ответ: Никакими способами с ПК это не получается, в т.ч. с помощью TestDll.
это означает, что либо не правильно использовали утилиту, это конечно вряд ли ну все же всякое может быть, на всякий случай порядок действий:
1. Нажимаем кнопку "Загрузить DLL"
2. Устанавливаем параметры соединения(пароль все 0)
3. Нажимаем кнопку "Connect"
4. Нажимаем кнопку "Z отчет"
либо какая то прошивка в ККМ не правильная и надо прошить ККМ последней, желательно в ЦТО

Вы не указали с какой ККМ работаете поэтому проверял на доступной М130 и утилита нормально закрывает смену после 24 часовой блокировки, её исходники доступны для примера и в дальнейшем и из Вашей программы не должно возникать проблем с закрытием смены.
Аватара пользователя
Prz777
Сообщения: 9
Зарегистрирован: 08 апр 2011, 17:41

Re: Меркурий-130 режим ФР, подключение через DrvMercFR.dll

Сообщение Prz777 »

Спасибо за ответ. Алгоритм описанный вами правильный и он выполняется. Но вы меня не поняли. Я рассматриваю вариант, который встречается в практике. Кассир работала и в конце дня забыла закрыть смену. Утром приходит (забыла, что не закрыла смену) и пытается через программу выбить чек. На индикаторе ошибка "ПРОВ ОСГ". Через программу пытается закрыть смену - не получается (ошибка уже возникла). Конечно кассир может пальцем нажать на кнопку сброс или выключить и включить ККМ и успешно закрыть смену программно. Мой вопрос заключался в чисто программном обходе данной ошибки, т.е. при возникновении на индикаторе ошибки "ПРОВ ОСГ" командой ZReport успешно выполнилось закрытие смены.
Насчет обращения в ЦТО тоже спасибо. Сам там работаю уже 13 лет. Кроме того пишу программы на Delphi и на ассемблере для 8051 для работы. Идея моей разработки (драйвер) соединить программу, которая использует только штриховский драйвер работать с недорогими Меркуриями-130 (внедрение ПО в сети аптек). При тестировании исключительных ситуаций возникла описанная выше проблема. И еще недостаток, это не реализованная в прошивке команда печати строки - SendText(PChar(StringForPrinting));, т.к. список продаж при печати чека в товароучетной программе (как и в большинстве других программ) формируется командами печать строки. MS-K в качестве ФР не рассматриваю.
Аватара пользователя
Shtirlic
Сообщения: 377
Зарегистрирован: 18 фев 2011, 11:21

Re: Меркурий-130 режим ФР, подключение через DrvMercFR.dll

Сообщение Shtirlic »

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

Насчет обращения в ЦТО тоже спасибо. Сам там работаю уже 13 лет. Кроме того пишу программы на Delphi и на ассемблере для 8051 для работы.
если что не в обиду было сказано про ЦТО, просто я вижу, что Вы программировании на Delphi немного не уверены, поэтому подстраховался в совете о прошивке.

Утром приходит (забыла, что не закрыла смену) и пытается через программу выбить чек. На индикаторе ошибка "ПРОВ ОСГ". Через программу пытается закрыть смену - не получается (ошибка уже возникла). Конечно кассир может пальцем нажать на кнопку сброс или выключить и включить ККМ и успешно закрыть смену программно. Мой вопрос заключался в чисто программном обходе данной ошибки, т.е. при возникновении на индикаторе ошибки "ПРОВ ОСГ" командой ZReport успешно выполнилось закрытие смены.
В таком изложении проблемы стало понятно про что Вы. Это могло Вам встретится не только при закрытии смены но и на многих других ошибках. В ККМ М115-140 при возникновении ошибки которая выводится на дисплее и требует от оператора нажатия клавиши связь просто не работает, это надо учитывать и обрабатывать.Если что почему так сделано вопрос не ко мне, а скорей сюда https://forum.incotexkkm.ru/viewforum.php?f=7 .

И еще недостаток, это не реализованная в прошивке команда печати строки - SendText(PChar(StringForPrinting));,
https://forum.incotexkkm.ru/viewtopic.php?p=337#p337
Аватара пользователя
Prz777
Сообщения: 9
Зарегистрирован: 08 апр 2011, 17:41

Re: Меркурий-130 режим ФР, подключение через DrvMercFR.dll

Сообщение Prz777 »

https://forum.incotexkkm.ru/viewtopic.php?p=337#p337
Ваш ответ по данной ссылке мне понятен и принят к действию по реализации. Хотя все ФР-ы, в т.ч. и MS-K выполняют такую-же функцию. И ничего страшного тут нет.
Аватара пользователя
Shtirlic
Сообщения: 377
Зарегистрирован: 18 фев 2011, 11:21

Re: Меркурий-130 режим ФР, подключение через DrvMercFR.dll

Сообщение Shtirlic »

Если бы можно было бы просто сделать доступной функцию печати строки, то я думаю это было бы сделано, так как в технологических прошивках вроде даже есть такая функция. На сколько я знаю разработчики ККМ хотели сделать такую функцию и в нормальных прошивках, но при этом содержимое строк еще записывать и в ФП, чтоб в случае мошенничества крайними не оказались разработчики(типа касса обманывает). В некоторых фискальниках вроде так и реализовано, в некоторых забили на безопасность но это как говорится их проблемы, наверное они не боятся проблем с соответствующими органами. В М115-140 полный механизм не удалось реализовать из за недостатка ресурсов железа, оно используется по максимуму.

Я не разработчик этих ККМ поэтому это скорей мое видение почему все именно так.
Аватара пользователя
Prz777
Сообщения: 9
Зарегистрирован: 08 апр 2011, 17:41

Re: Меркурий-130 режим ФР, подключение через DrvMercFR.dll

Сообщение Prz777 »

Смею Вас поправить. Во всех ФР-ах при печати строк никуда ничего не пишется. Просто выводится на печать. Ограничение на печать специальных символов в т.ч. и фискальных реализовано в прошивке. Насчет ресурсов железа, тоже не соглашусь. В ПЗУ Меркурия-130 3035 - свободных байт, а в Меркурии-115 - 7414. Поверьте, в это свободное место можно много чего запихать. Маленький пустяк - отсутствие команды печати строки в ЧПМ Меркурий-115-130 в режиме ФР сводят на нет этот самый режим ФР (так как в большинстве программ список продаж в чеке формируется командами печать строки). А предложенный вариант подключения М-130 к 1С 7.7 никому не нужен. В ЧПМ-ки кассы давно уже все переделали. Все больше предпринимателей хотят автоматизировать торговлю. Какой ФР им предложат в ЦТО?
Аватара пользователя
Shtirlic
Сообщения: 377
Зарегистрирован: 18 фев 2011, 11:21

Re: Меркурий-130 режим ФР, подключение через DrvMercFR.dll

Сообщение Shtirlic »

я высказал то как представляю себе проблему, возможно не все правильно представляю, как бы уже не моя тема поэтому фантазировать(не на пустом месте) перестаю.
Ответить