Автоматизация процесса выявления и устранения неисправностей торгового оборудования
Структура программного комплекса и UML–представление программного обеспечения. Анализ статических нагрузок на пользователя при работе за компьютером. Руководство пользователя, программиста и системного администратора. Ошибки фискальных регистраторов.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | дипломная работа |
Язык | русский |
Дата добавления | 02.09.2013 |
Размер файла | 3,4 M |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Рисунок 6.7 - Окно «Данные ККМ»
В открывшемся окне для запроса блоков дампа нужно выбрать устройство считывания информации и нажать «Запрос дампа», ФР на клиенте вернет количество блоков данных выбранного устройства. Затем нужно нажимать кнопку «Получить данные», чтобы последовательно, блок за блоком, ФР возвращал данные на сервер (Рисунок 6.8).
Рисунок 6.8 - Результат запроса данных от ФР
Для отмены последовательной выдачи данных, необходимо нажать кнопку «Прервать выдачу данных». Далее, проверим возможность считывания и редактирования таблиц ФР, для этого вернемся к основному окну программы, выберем клиента и нажмем соответствующую кнопку «Таблицы» (Рисунок 6.9).
Рисунок 6.9 - Окно таблиц ФР
Для просмотра данных таблиц ФР нужно выбрать номер таблицы и нажать кнопку «Получить структуру таблицы». Для просмотра структуры полей нужно выбрать номер поля и нажать кнопку «Получить структуру поля». Для чтения конкретного значения таблицы нужно выбрать номер ряда и нажать кнопку «Прочитать таблицу» (Рисунок 6.10).
Рисунок 6.10 - Результат чтения данных таблиц
Для изменения данных и записи значений в таблицу нужно написать необходимое значение в соответствующей строке и нажать кнопку «Записать таблицу». Для проверки записи данных можно снова нажать кнопку «Прочитать таблицу» (Рисунок 6.11).
Рисунок 6.11 - Результат записи данных в таблицу
Таким образом, дополнительные функции программного обеспечения работают исправно. На основании проведенного анализа, можно сделать вывод, что полученный результат соответствует функциям, которые должна выполнять программа. При вводе определенных входных данных, на выходе мы имеем корректные выходные данные.
6.2 Руководство программиста
Для дальнейшего развития программного обеспечения, возможно добавление дополнительных функций в виде набора команд и запросов с ФР. Весь список команд нижнего уровня доступен в спецификации на оборудование [6], а список методов и их свойств в руководстве программиста [5].
Для связи с оборудованием использовался драйвер предоставляемый поставщиком оборудования. Драйвер подключен в программе в виде OLE-объекта. Метод связи описан в блоке untDriver. Функция поключения к устройству через драйвер описана глобально и доступна из любой части проекта. Таким образом, возможно добавление методов в любой части программы.
Для удаленной связи сервера с клиентом используются «сокеты»(socket). Для упрошения работы с «сокетами» используются компоненты среды TClientSocket для клиентской части приложения и TServerSocket для серверной части. Принцип функционирования данных компонент простой. Серверу достаточно указать рабочий порт в свойстве port и запустить его, присвоив свойству active значение true. Аналогичным образом работает клиентская часть. В ней нужно указать IP адрес сервера свойством address, и порт свойством port. Для связи с сервером необходимо вызвать процедуру open, либо процедуру connect.
Команды для ФР передаются с сервера клиенту в виде символов. На сервере специалист выбирает необходимую ему команду и нажимает кнопку «отправить», на клиенте принимается сообщение от сервера и обрабатывается первый символ сообщения, после чего обрезается от сообщения. Этот символ проходит ряд проверок, и, при успешной проверке, выполняется блок команд под соответствующим оператором условия.
6.3 Руководство системного администратора
Программное обеспечение является системой диагностики торгового оборудования, построенной по клиент-серверной технологии. Программное обеспечение предназначено для специализированных сервисных центров, обслуживающих торговое оборудование. Оно позволяет клиентам подавать заявки на неисправности, а специалистам сервисного центра проводить удаленную диагностику и настройку оборудования. Получение заявки от клиента по удаленной связи позволяет специалистам провести оперативную диагностику оборудования, а также собрать необходимую информацию и настроить параметры оборудования.
Основные системные требования:
процессор - Intel Pentium 4 2,8 ГГц;
объем оперативной памяти - 512 Мбайт;
5 Мб свободного места на жестком диске
сетевой контроллер или модем;
подключение к сети Internet
скорость подключения к Internet не менее 64Кбит/сек
разрешение экрана 1024х768;
операционная система - Microsoft Windows XP или выше;
драйвер ККМ (drvfr.dll)
Установка и запуск программного обеспечения:
Перед началом установки необходимо зарегистрировать библиотеку в реестре windows. Для этого необходимо скопировать файл «drvfr.dll» в папку «windows/system32», запустить командную строку и выполнить команду «regsvr32 drvfr.dll».
Для установки программы необходимо скопировать с компакт диска файл «ClientCTO.exe» на компьютер клиента, а файл «ServerCTO.exe» на компьютер сервисного центра. Для запуска программы необходимо дважды кликнуть на соответствующий значок программы.
7. Научная новизна и практическая значимость проекта
программный обеспечение руководство регистратор
В данном дипломном проекте были рассмотрены вопросы автоматизации диагностики и ремонта торгового оборудования. Для решения данных вопросов были задействованы существующие методы связи с оборудованием, а также технологии удаленной связи через сеть интернет. Сами по себе данные методы и технологии не являются новшеством, но их развитие в данной области актуально. С каждым годом торговые сети расширяются, а процесс автоматизации этих сетей совершенствуется. С ростом торговой аппаратуры, вырастет и потребность в их оперативном ремонте. Системы для удаленной диагностики, подобные той, что рассмотрена в рамках данного дипломного проекта, помогут повысить эффективность работы сервисных центров, а, следовательно, и процесса торговли.
Заключение
В рамках данного дипломного проекта были решены поставленные задачи:
Исследована предметная область.
Собраны и структурированы основные характеристики и особенности предметной области.
Рассмотрены существующие методы решения поставленной задачи.
Выработан наиболее эффективный метод решения задачи.
Разработана математическая модель рассматриваемой системы.
Разработано и отлажено программное обеспечение.
Разработанная математическая модель помогает спрогнозировать характеристики работы связанные с эффективностью обслуживания. Использование данной модели позволит влиять на прибыль и конкурентоспособность компании. Разработанное программное обеспечение позволит повысить эффективность работы сервисного центра за счет возможности удаленной диагностики торгового оборудования.
В исследовательском разделе данного дипломного проекта рассмотрены все аспекты исследуемой предметной области, а также проанализированы существующие программные решения. На основании проделанного анализа были поставлены основные задачи. В специальном разделе более подробно рассмотрена предметная область, разработана математическая модель рассматриваемой системы, расписаны информационные структуры, использованные при разработке программного обеспечения. В технологическом разделе продемонстрирован процесс разработки программного обеспечения, с последующим тестированием и анализом результатов работы. В разделе по безопасности жизнедеятельности проведен анализ длительных статических нагрузок на пользователя при работе на ПЭВМ. Рассмотрены требования по организации рабочего места при работе на ПЭВМ. Проведена экологическая оценка исходных материалов для изготовления компьютерной техники. В организационно-экономическом разделе спланирована разработка программного продукта с построением графика. Рассчитана смета затрат на разработку программного продукта. Проведен расчет технико-экономических показателей и эффективности проекта. В других разделах дипломного проекта написаны руководства пользователя, программиста и системного администратора.
Возможно дальнейшее развитие, как математической модели, так и программного обеспечения. Для удобного восприятия и более гибкого управления характеристиками, существующуюмодель можно написать на языке программирования MATLAB. Для расширения списка поддерживаемого оборудования программным обеспечением, возможно подключение дополнительных библиотек драйверов устройств.
Список использованных источников
1. Закон РФ от 18.06.1993 № 5215-1 "О применении контрольно-кассовых машин при осуществлении денежных расчетов с населением".
2. Вентцель Е. С. - Исследование операций. - М., «Советское радио», 1972, 552 с.
3. Костевич Л.С., Лапко А.А. - Исследование операций. Теория игр. - Минск., «Вышэйшая школа», 2009, 232 с.
4. Олифер В.Г, Олифер Н.А. - Компьютерные сети издание 4., Санкт Петербург, 2010, 943 с.
5. «Штрих-М: Драйвер ФР» Руководство программиста - НТЦ «Штрих-М», 2005, 269 с.
6. Протокол работы ФР. Спецификация - НТЦ «Штрих-М», 2005, 74 с.
7. Гун Г.Е. Компьютер: как сохранить здоровье. Рекомендации для детей и взрослых - М.О.: Olma Media Group, 2003. - 127с.
8. СанПиН 2.2.2./2.4.1340-03. Гигиенические требования к персональным электронно-вычислительным машинам и организации работы.
9. Гетия С.И. Основы безопасности труда: учебное пособие. - М.: МГУПИ, 2008. 110 с.
10. ГОСТ 12.1.003-90 «ССБТ. Шум. Общие требования безопасности».
11. Гетия И.Г., Шумилин В.К., Леонтьева И.Н. и др. Экология компьютерной техники: - Москва: МГАПИ, 1996г.
12. СНиП 2.01.28-85 Полигоны по обезвреживанию и захоронению токсичных промышленных отходов.
13. «Методические указания по выполнению курсовой работы для студентов специальности 22.01.05 на тему «Организация, планирование и управление предприятием машиностроительной промышленности», М., МГАПИ, 2003.
14. Чаплыгин В.А. Организационно-экономический раздел дипломных работ научно-исследовательского характера. М., МГАПИ. 2010.
15. Методические указания по сбору материалов на преддипломной практике и выполнению организационно-экономического раздела дипломных проектов. М., МГАПИ, 2009.
16. Капелюш Г.С., Шестоперов С.Б. Технико-экономическое обоснование дипломных проектов по созданию программных средств вычислительной техники и информатики. Учебное пособие для студентов специальности 22.01. - М., МГАПИ, 2001.
17. «Сетевые графики и планирование», учебное пособие, Н.И. Новицкий, М., Высшая школа, 2004.
18. Прайс-лист Интернет-магазин «НОМУС», 04.12.2012.
19. Прайс-лист Интернет-магазин «Deloks», 04.12.2012.
Приложение А
Листинг программы
Сервер
function StrToHex(const S: string): string;
var
i: Integer;
begin
Result := '';
for i := 1 to Length(S) do
Result := Result + IntToHex(Ord(S[i]), 2) + ' ';
end;
procedure TServerForm.buttons(Value: Boolean);
begin
if Value then
begin
BtnSend.Enabled := True;
BtnStart.Enabled := True;
BtnDiscon.Enabled := True;
TablesForm.btnGetTableStruct.Enabled := True;
TablesForm.btnGetFieldStruct.Enabled := True;
TablesForm.btnReadTable.Enabled := True;
TablesForm.btnWriteTable.Enabled := True;
DumpForm.btnDampRequest.Enabled := True;
DumpForm.btnGetData.Enabled := True;
DumpForm.btnInterruptDataStream.Enabled := True;
DumpForm.btnGetOperationReg.Enabled := True;
DumpForm.btnGetCashReg.Enabled := True;
end
else
begin
BtnSend.Enabled := False;
BtnStart.Enabled := False;
BtnDiscon.Enabled := False;
TablesForm.btnGetTableStruct.Enabled := False;
TablesForm.btnGetFieldStruct.Enabled := False;
TablesForm.btnReadTable.Enabled := False;
TablesForm.btnWriteTable.Enabled := False;
DumpForm.btnDampRequest.Enabled := False;
DumpForm.btnGetData.Enabled := False;
DumpForm.btnInterruptDataStream.Enabled := False;
DumpForm.btnGetOperationReg.Enabled := False;
DumpForm.btnGetCashReg.Enabled := False;
end;
end;
procedure TServerForm.FormCreate(Sender: TObject);
begin
c := 0;
Timer1.Enabled := False;
memo1.Lines.Add('[' + TimeToStr(Now) + ']: Программа запущена');
end;
procedure TServerForm.BtnSendClick(Sender: TObject);
begin
if ListBox1.ItemIndex >= 0 then
begin
if ComboBox2.ItemIndex = 8 then
begin
ServerSocket1.Socket.Connections[ListBox1.ItemIndex].SendText(IntToStr(ComboBox2.ItemIndex) + edit1.Text);
buttons(False);
Exit;
end;
if ComboBox2.ItemIndex = 9 then
begin
ServerSocket1.Socket.Connections[ListBox1.ItemIndex].SendText(IntToStr(ComboBox2.ItemIndex) + edit1.Text);
Exit;
end;
ServerSocket1.Socket.Connections[ListBox1.ItemIndex].SendText(IntToStr(ComboBox2.ItemIndex));
buttons(False);
end
else
ShowMessage('Не выбран клиент');
end;
procedure TServerForm.BtnStartClick(Sender: TObject);
begin
if ServerSocket1.Active = False then
begin
ServerSocket1.Port := StrToInt(SettingsForm.edit3.Text);
ServerSocket1.Active := True;
BtnStart.Caption := 'Стоп';
BtnDiscon.Enabled := True;
memo1.Lines.Add('[' + TimeToStr(Now) + ']: Сервер запущен.');
end
else
begin
ServerSocket1.Active := False;
BtnStart.Caption := 'Старт';
ListBox1.Clear;
BtnDiscon.Enabled := False;
memo1.Lines.Add('[' + TimeToStr(Now) + ']: Сервер остановлен.');
end;
end;
procedure TServerForm.ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var
sMessage: string;
begin
sMessage := Socket.ReceiveText;
f := StrToInt(smessage[1]);
Delete(sMessage, 1, 1);
ADODataSet1.Open;
if f = 1 then
begin
if not VarIsNull(DataSource1.DataSet.Lookup('ip',
ServerSocket1.Socket.Connections[ListBox1.ItemIndex].RemoteAddress, 'nam'))
then
memo1.Lines.Add('[' + TimeToStr(Now) + ']:[' +
DataSource1.DataSet.Lookup('ip',
ServerSocket1.Socket.Connections[ListBox1.ItemIndex].RemoteAddress, 'nam')
+ '] - ' + sMessage)
else
memo1.Lines.Add('[' + TimeToStr(Now) + ']:[' +
ServerSocket1.Socket.Connections[ListBox1.ItemIndex].RemoteAddress + '] - '
+ sMessage);
end;
if f = 2 then
begin
Memo1.Lines.Add(sMessage);
end;
if f = 3 then
begin
DumpForm.edtBlockCount.Text := sMessage;
end;
if f = 4 then
begin
DumpForm.Memo.Clear;
DumpForm.edtBlockNumber.Text := sMessage[1] + sMessage[2] + sMessage[3] +
sMessage[4];
Delete(sMessage, 1, 4);
DumpForm.Memo.Text := sMessage;
end;
if f = 5 then
begin
DumpForm.edtRegContent.Text := sMessage[Length(sMessage)];
Delete(sMessage, Length(sMessage), 1);
DumpForm.edtRegName.Text := sMessage;
end;
if f = 6 then
begin
TablesForm.Memo.Lines.Add(sMessage);
end;
if f = 7 then
begin
TablesForm.Memo.Lines.Add(sMessage);
end;
if f = 8 then
begin
TablesForm.Memo.Lines.Add(sMessage);
TablesForm.edtValue.Text :=
TablesForm.Memo.Lines.Strings[TablesForm.Memo.Lines.count - 1];
TablesForm.Memo.Lines.Delete(TablesForm.Memo.Lines.Count - 1);
end;
if f = 9 then
begin
TablesForm.Memo.Lines.Add(sMessage);
TablesForm.edtValue.Text :=
TablesForm.Memo.Lines.Strings[TablesForm.Memo.Lines.count - 1];
TablesForm.Memo.Lines.Delete(TablesForm.Memo.Lines.Count - 1);
end;
buttons(True);
end;
procedure TServerForm.ServerSocket1ClientError(Sender: TObject;
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
var ErrorCode: Integer);
begin
ShowMessage('Ошибка #' + IntToStr(ErrorCode));
ErrorCode := 0;
end;
procedure TServerForm.listboxupdate;
var
i: Integer;
begin
ListBox1.Clear;
ADODataSet1.Open;
for i := 0 to ServerSocket1.Socket.ActiveConnections - 1 do
begin
if not VarIsNull(DataSource1.DataSet.Lookup('ip',
ServerSocket1.Socket.Connections[i].RemoteAddress, 'nam')) then
ListBox1.Items.Add(IntToStr(i + 1) + ': ' +
DataSource1.DataSet.Lookup('ip',
ServerSocket1.Socket.Connections[i].RemoteAddress, 'nam'))
else
ListBox1.Items.Add(IntToStr(i + 1) + ': ' +
ServerSocket1.Socket.Connections[i].RemoteAddress);
end;
ADODataSet1.Close;
end;
procedure TServerForm.ServerSocket1ClientConnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
ADODataSet1.Open;
if not VarIsNull(DataSource1.DataSet.Lookup('ip', Socket.RemoteHost, 'nam'))
then
memo1.Lines.Add('[' + TimeToStr(Now) + ']: Клиент "' +
DataSource1.DataSet.Lookup('ip', Socket.RemoteHost, 'nam') +
'" присоединился')
else
memo1.Lines.Add('[' + TimeToStr(Now) + ']: Клиент "' + Socket.RemoteHost +
'" присоединился');
ADODataSet1.Close;
listboxupdate;
end;
procedure TServerForm.ServerSocket1ClientDisconnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
ADODataSet1.Open;
if not VarIsNull(DataSource1.DataSet.Lookup('ip', Socket.RemoteHost, 'nam'))
then
memo1.Lines.Add('[' + TimeToStr(Now) + ']: Клиент "' +
DataSource1.DataSet.Lookup('ip', Socket.RemoteHost, 'nam') + '" отключился')
else
memo1.Lines.Add('[' + TimeToStr(Now) + ']: Клиент "' + Socket.RemoteHost +
'" отключился');
ADODataSet1.Close;
Timer1.Enabled := True;
buttons(True);
end;
procedure TServerForm.BtnDisconClick(Sender: TObject);
begin
if ListBox1.ItemIndex > -1 then
begin
ServerSocket1.Socket.Connections[ListBox1.ItemIndex].Close;
end;
end;
procedure TServerForm.ServerSocket1GetSocket(Sender: TObject; Socket: Integer;
var ClientSocket: TServerClientWinSocket);
var
i: integer;
begin
ListBox1.Clear;
end;
procedure TServerForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
ServerSocket1.Close;
BaseForm.ADODataSet1.Close;
end;
procedure TServerForm.N6Click(Sender: TObject);
begin
Application.Terminate;
end;
procedure TServerForm.N2Click(Sender: TObject);
begin
SettingsForm.Show;
end;
procedure TServerForm.BtnClearLogClick(Sender: TObject);
begin
if MessageDlg('Очистить лог?', mtConfirmation, [mbYes, mbNo], 0) = mrYes then
Memo1.Clear;
end;
procedure SaveToFile(str: string; loc: string);
var
f: TextFile;
FileDir: string;
begin
FileDir := loc;
AssignFile(f, FileDir);
if not FileExists(FileDir) then
begin
Rewrite(f);
CloseFile(f);
end;
Append(f);
Writeln(f, str);
Flush(f);
CloseFile(f);
end;
procedure TServerForm.BtnSaveLogClick(Sender: TObject);
var
saveDialog: TSaveDialog;
begin
saveDialog := TSaveDialog.Create(self);
saveDialog.Title := 'Сохранение логов';
saveDialog.InitialDir := GetCurrentDir;
saveDialog.Filter := 'Text file|*.txt|Word file|*.doc';
saveDialog.DefaultExt := 'txt';
saveDialog.FilterIndex := 1;
if saveDialog.Execute then
savetofile(memo1.lines.Text, saveDialog.FileName)
else
ShowMessage('Сохранение отменено');
saveDialog.Free;
end;
procedure TServerForm.N3Click(Sender: TObject);
begin
ADODataSet1.Close;
BaseForm.Show;
end;
procedure TServerForm.FormHide(Sender: TObject);
begin
ADODataSet1.Close;
end;
procedure TServerForm.BtnDumpClick(Sender: TObject);
begin
if ListBox1.ItemIndex >= 0 then
begin
DumpForm.Show;
n := ListBox1.ItemIndex;
end
else
ShowMessage('Не выбран клиент');
end;
procedure TServerForm.Timer1Timer(Sender: TObject);
begin
listboxupdate;
Timer1.Enabled := false;
end;
procedure TServerForm.BtnTablesClick(Sender: TObject);
begin
if ListBox1.ItemIndex >= 0 then
begin
TablesForm.Show;
m := ListBox1.ItemIndex;
end
else
ShowMessage('Не выбран клиент');
end;
procedure TServerForm.N4Click(Sender: TObject);
begin
AboutBox.ShowModal;
end;
procedure TServerForm.FormShow(Sender: TObject);
begin
ComboBox2.ItemIndex := 0;
end;
procedure TServerForm.ComboBox2Change(Sender: TObject);
begin
if (ComboBox2.ItemIndex = 8) or (ComboBox2.ItemIndex = 9) then
Edit1.Enabled := True
else
Edit1.Enabled := False;
end;
end.
procedure TDumpForm.btnDampRequestClick(Sender: TObject);
begin
ServerForm.ServerSocket1.Socket.Connections[n].SendText('a' +
inttostr(cbDeviceCode.ItemIndex + 1));
ServerForm.buttons(False);
end;
procedure TDumpForm.btnInterruptDataStreamClick(Sender: TObject);
begin
ServerForm.ServerSocket1.Socket.Connections[n].SendText('b');
end;
procedure TDumpForm.btnGetDataClick(Sender: TObject);
begin
ServerForm.ServerSocket1.Socket.Connections[n].SendText('c');
ServerForm.buttons(False);
end;
procedure TDumpForm.btnGetOperationRegClick(Sender: TObject);
begin
ServerForm.ServerSocket1.Socket.Connections[n].SendText('d' +
edtRegisterNumber.Text);
ServerForm.buttons(False);
end;
procedure TDumpForm.btnGetCashRegClick(Sender: TObject);
begin
ServerForm.ServerSocket1.Socket.Connections[n].SendText('e' +
edtRegisterNumber.Text);
ServerForm.buttons(False);
end;
procedure TDumpForm.FormShow(Sender: TObject);
begin
cbDeviceCode.ItemIndex := 0;
end;
end.
procedure TTablesForm.btnGetTableStructClick(Sender: TObject);
begin
if Length(SpinEdit1.Text) = 1 then
a := '0' + SpinEdit1.Text;
if Length(SpinEdit1.Text) = 2 then
a := SpinEdit1.Text;
Memo.Clear;
ServerForm.ServerSocket1.Socket.Connections[m].SendText('f' + a);
ServerForm.buttons(False);
end;
procedure TTablesForm.btnGetFieldStructClick(Sender: TObject);
begin
if Length(SpinEdit1.Text) = 1 then
a := '0' + SpinEdit1.Text
else
a := SpinEdit1.Text;
if Length(SpinEdit3.Text) = 1 then
b := '0' + spinedit3.text
else
a := SpinEdit3.Text;
Memo.Clear;
ServerForm.ServerSocket1.Socket.Connections[m].SendText('g' + a + b);
ServerForm.buttons(False);
end;
procedure TTablesForm.btnReadTableClick(Sender: TObject);
begin
if Length(SpinEdit1.Text) = 1 then
a := '0' + SpinEdit1.Text
else
a := SpinEdit1.Text;
if Length(SpinEdit2.Text) = 1 then
b := '0' + SpinEdit2.Text
else
b := SpinEdit2.Text;
if Length(SpinEdit3.Text) = 1 then
c := '0' + spinedit3.text
else
c := SpinEdit3.Text;
Memo.Clear;
ServerForm.ServerSocket1.Socket.Connections[m].SendText('h' + a + b + c);
ServerForm.buttons(False);
end;
procedure TTablesForm.btnWriteTableClick(Sender: TObject);
begin
if Length(SpinEdit1.Text) = 1 then
a := '0' + SpinEdit1.Text
else
a := SpinEdit1.Text;
if Length(SpinEdit2.Text) = 1 then
b := '0' + SpinEdit2.Text
else
b := SpinEdit2.Text;
if Length(SpinEdit3.Text) = 1 then
c := '0' + spinedit3.text
else
c := SpinEdit3.Text;
Memo.Clear;
ServerForm.ServerSocket1.Socket.Connections[m].SendText('i' + a + b + c +
edtValue.Text);
end;
end.
Клиент:
procedure TClientForm.FormCreate(Sender: TObject);
begin
DriverManager.Password := StrToInt(Edit1.Text);
ComboBox1.ItemIndex := Driver.ComNumber - 1;
ComboBox2.ItemIndex := Driver.BaudRate;
Edit2.Text := IntToStr(Driver.Timeout);
Application.onMinimize := OnMinimizeProc;
end;
procedure TClientForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Driver.Disconnect;
end;
function reccom(a: byte): string;
begin
Driver.Password := DriverManager.Password;
Driver.ComNumber := 4;
Driver.BaudRate := 3;
Driver.Timeout := 100;
Driver.Connect;
if a = 1 then
begin
Driver.PrintBarCode;
Result := IntToStr(Driver.Resultcode) + ' : ' + driver.ResultCodeDescription
end
else
Result := 'none';
end;
procedure TClientForm.BtnClaimClick(Sender: TObject);
var
ResultCode, Port: Integer;
begin
Driver.ComNumber := ComboBox1.ItemIndex + 1;
Driver.BaudRate := ComboBox2.ItemIndex;
if Driver.connect <> 0 then
begin
ShowMessage('Нет связи с ФР');
StatusBar1.Panels[0].Text := 'Состояние: Нет связи с ФР'
end;
if TryStrToInt(Edit5.Text, port) then
ClientSocket1.Port := StrToInt(edit5.text)
else
begin
ShowMessage('Номер порта должен быть числом');
Exit;
end;
ClientSocket1.Address := edit4.text;
try
ClientSocket1.Open;
Timer1.Enabled := True;
except
ShowMessage('Сервер не доступен, попробуйте позже');
end;
end;
procedure TClientForm.ClientSocket1Connect(Sender: TObject;
Socket: TCustomWinSocket);
begin
ShowMessage('Заявка отправлена, ожидайте результатов диагностики');
BtnClaim.Enabled := False;
StatusBar1.Panels[1].Text := 'Связь установлена';
end;
procedure TClientForm.ClientSocket1Disconnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
ShowMessage('Связь разорвана');
BtnClaim.Enabled := True;
StatusBar1.Panels[1].Text := 'Связь разорвана';
end;
procedure TClientForm.StartRead;
begin
try
Driver.Password := DriverManager.Password;
Driver.DeviceCode := StrToInt(t[2]);
if Driver.DampRequest = 0 then
begin
FCount := Driver.DataBlockNumber;
FStopFlag := False;
ReadData;
end;
finally
ClientSocket1.Socket.SendText('2' + FDump);
end;
end;
procedure TClientForm.ClientSocket1Read(Sender: TObject;
Socket: TCustomWinSocket);
var
pas: Integer;
b: string;
begin
t := Socket.ReceiveText;
if t[1] = 'a' then
begin
Driver.Password := DriverManager.Password;
Driver.DeviceCode := StrToInt(t[2]);
if Driver.DampRequest = 0 then
ClientSocket1.Socket.SendText('3' + IntToStr(Driver.DataBlockNumber))
else
ClientSocket1.Socket.SendText('1' + IntToStr(Driver.Resultcode) + ' : ' +
driver.ResultCodeDescription);
end;
if t = '0' then
begin
Driver.beep;
ClientSocket1.Socket.SendText('1' + IntToStr(Driver.Resultcode) + ' : ' +
driver.ResultCodeDescription);
end;
if t = '1' then
begin
Driver.Password := DriverManager.Password;
if Driver.GetECRStatus = 0 then
ClientSocket1.Socket.SendText('1' + #13#10 + 'Дата ФР: ' +
DateToStr(Driver.Date) + ' Время ФР: ' + TimeToStr(Driver.Time) + #13#10 +
'Дата ПК: ' + dateToStr(Now) + ' Время ПК: ' + TimeToStr(Now))
else
ClientSocket1.Socket.SendText('1' + IntToStr(Driver.Resultcode) + ' : ' +
driver.ResultCodeDescription);
end;
if t = '2' then
begin
Driver.Password := DriverManager.Password;
if Driver.GetECRStatus = 0 then
ClientSocket1.Socket.SendText('1' + 'Рулон чековой ленты ' +
ECRFlagsToStr(1, Driver))
else
ClientSocket1.Socket.SendText('1' + IntToStr(Driver.Resultcode) + ' : ' +
driver.ResultCodeDescription);
end;
if t = '3' then
begin
Driver.Password := DriverManager.Password;
if Driver.GetECRStatus = 0 then
ClientSocket1.Socket.SendText('1' + 'Режим ФР: ' + IntToStr(Driver.ECRMode)
+ ' ' + Driver.ECRModeDescription)
else
ClientSocket1.Socket.SendText('1' + IntToStr(Driver.Resultcode) + ' : ' +
driver.ResultCodeDescription);
end;
if t = '4' then
begin
Driver.Password := DriverManager.Password;
if Driver.GetShortECRStatus = 0 then
ClientSocket1.Socket.SendText('1' + 'Напряжение батареи: ' +
FloatToStr(Driver.BatteryVoltage))
else
ClientSocket1.Socket.SendText('1' + IntToStr(Driver.Resultcode) + ' : ' +
driver.ResultCodeDescription);
end;
if t = '5' then
begin
Driver.Password := DriverManager.Password;
if Driver.GetShortECRStatus = 0 then
ClientSocket1.Socket.SendText('1' + 'Напряжение ист. питания: ' +
FloatToStr(Driver.PowerSourceVoltage))
else
ClientSocket1.Socket.SendText('1' + IntToStr(Driver.Resultcode) + ' : ' +
driver.ResultCodeDescription);
end;
if t = '6' then
begin
Driver.Password := DriverManager.Password;
if Driver.GetECRStatus = 0 then
ClientSocket1.Socket.SendText('1' + 'ЭКЛЗ почти заполнена ' +
ECRFlagsToStr(14, Driver))
else
ClientSocket1.Socket.SendText('1' + IntToStr(Driver.Resultcode) + ' : ' +
driver.ResultCodeDescription);
end;
if t = '7' then
begin
Driver.Password := DriverManager.Password;
if Driver.GetECRStatus = 0 then
ClientSocket1.Socket.SendText('1' + 'Переполнение ФП ' + FMFlagsToStr(3,
Driver))
else
ClientSocket1.Socket.SendText('1' + IntToStr(Driver.Resultcode) + ' : ' +
driver.ResultCodeDescription);
end;
if t[1] = '8' then
begin
Delete(t, 1, 1);
if TryStrToInt(t, pas) then
begin
DriverManager.Password := StrToInt(t);
Driver.Password := DriverManager.Password;
if Driver.GetECRStatus = 0 then
ClientSocket1.Socket.SendText('1' + IntToStr(Driver.Resultcode) + ' : '
+ driver.ResultCodeDescription)
else
ClientSocket1.Socket.SendText('1' + IntToStr(Driver.Resultcode) + ' : '
+ driver.ResultCodeDescription);
end;
end;
if t[1] = '9' then
begin
Delete(t, 1, 1);
ShowMessage(t);
end;
if t = 'b' then
begin
Driver.Password := DriverManager.Password;
Driver.InterruptDataStream;
end;
if t = 'c' then
begin
Driver.Password := DriverManager.Password;
if Driver.GetData = 0 then
begin
b := IntToStr(Driver.DataBlockNumber);
if Length(b) = 1 then
ClientSocket1.Socket.SendText('4000' + IntToStr(Driver.DataBlockNumber)
+ StrToHex(Driver.DataBlock));
if Length(b) = 2 then
ClientSocket1.Socket.SendText('400' + IntToStr(Driver.DataBlockNumber) +
StrToHex(Driver.DataBlock));
if Length(b) = 3 then
ClientSocket1.Socket.SendText('40' + IntToStr(Driver.DataBlockNumber) +
StrToHex(Driver.DataBlock));
if Length(b) = 4 then
ClientSocket1.Socket.SendText('4' + IntToStr(Driver.DataBlockNumber) +
StrToHex(Driver.DataBlock))
end
else
ClientSocket1.Socket.SendText('1' + IntToStr(Driver.Resultcode) + ' : ' +
driver.ResultCodeDescription);
end;
if t[1] = 'd' then
begin
Driver.Password := DriverManager.Password;
Driver.RegisterNumber := t[2];
if Driver.GetOperationReg = 0 then
ClientSocket1.Socket.SendText('5' + Driver.NameOperationReg +
CurrToStr(Driver.ContentsOfOperationRegister))
else
ClientSocket1.Socket.SendText('1' + IntToStr(Driver.Resultcode) + ' : ' +
driver.ResultCodeDescription);
end;
if t[1] = 'e' then
begin
Driver.Password := DriverManager.Password;
Driver.RegisterNumber := t[2];
if Driver.GetOperationReg = 0 then
ClientSocket1.Socket.SendText('5' + Driver.NameCashReg +
CurrToStr(Driver.ContentsOfCashRegister))
else
ClientSocket1.Socket.SendText('1' + IntToStr(Driver.Resultcode) + ' : ' +
driver.ResultCodeDescription);
end;
if t[1] = 'f' then
begin
Driver.Password := DriverManager.Password;
Driver.TableNumber := StrToInt(t[2] + t[3]);
if Driver.GetTableStruct = 0 then
ClientSocket1.Socket.SendText('6' + 'Название таблицы: ' + Driver.TableName
+ #13#10 + 'Кол-во рядов: ' + IntToStr(Driver.RowNumber) + #13#10 +
'Кол-во полей: ' + IntToStr(Driver.FieldNumber))
else
ClientSocket1.Socket.SendText('1' + IntToStr(Driver.Resultcode) + ' : ' +
driver.ResultCodeDescription);
end;
if t[1] = 'g' then
begin
Driver.Password := DriverManager.Password;
Driver.TableNumber := StrToInt(t[2] + t[3]);
Driver.FieldNumber := StrToInt(t[4] + t[5]);
if Driver.GetFieldStruct = 0 then
begin
if Driver.FieldType then
begin
ClientSocket1.Socket.SendText('7' + 'Название поля: ' + Driver.FieldName
+ #13#10 + 'Тип поля: строка' + #13#10 + 'Размер поля: ' +
IntToStr(Driver.FieldSize));
end;
if not Driver.FieldType then
begin
ClientSocket1.Socket.SendText('7' + 'Название поля: ' + Driver.FieldName
+ #13#10 + 'Тип поля: число' + #13#10 + 'Размер поля: ' +
IntToStr(Driver.FieldSize) + #13#10 + 'Мин. значение: ' +
IntToStr(Driver.MINValueOfField) + #13#10 + 'Макс. значение: ' +
IntToStr(Driver.MaxValueOfField));
end;
end
else
ClientSocket1.Socket.SendText('1' + IntToStr(Driver.Resultcode) + ' : ' +
driver.ResultCodeDescription);
end;
if t[1] = 'h' then
begin
Driver.Password := DriverManager.Password;
Driver.TableNumber := StrToInt(t[2] + t[3]);
Driver.FieldNumber := StrToInt(t[6] + t[7]);
Driver.RowNumber := StrToInt(t[4] + t[5]);
if Driver.ReadTable = 0 then
begin
if Driver.FieldType then
begin
ClientSocket1.Socket.SendText('8' + 'Название поля: ' + Driver.FieldName
+ #13#10 + 'Тип поля: строка' + #13#10 + 'Размер поля: ' +
IntToStr(Driver.FieldSize) + #13#10 + Driver.ValueOfFieldString);
end;
if not Driver.FieldType then
begin
ClientSocket1.Socket.SendText('8' + 'Название поля: ' + Driver.FieldName
+ #13#10 + 'Тип поля: число' + #13#10 + 'Размер поля: ' +
IntToStr(Driver.FieldSize) + #13#10 + 'Мин. значение: ' +
IntToStr(Driver.MINValueOfField) + #13#10 + 'Макс. значение: ' +
IntToStr(Driver.MaxValueOfField) + #13#10 +
IntToStr(Driver.ValueOfFieldInteger));
end;
end
else
ClientSocket1.Socket.SendText('1' + IntToStr(Driver.Resultcode) + ' : ' +
driver.ResultCodeDescription);
end;
if t[1] = 'i' then
begin
Driver.Password := DriverManager.Password;
Driver.TableNumber := StrToInt(t[2] + t[3]);
Driver.FieldNumber := StrToInt(t[6] + t[7]);
Driver.RowNumber := StrToInt(t[4] + t[5]);
Delete(t, 1, 7);
Driver.ValueOfFieldString := t;
if Driver.WriteTable = 0 then
begin
if Driver.FieldType then
begin
ClientSocket1.Socket.SendText('9' + 'Название поля: ' + Driver.FieldName
+ #13#10 + 'Тип поля: строка' + #13#10 + 'Размер поля: ' +
IntToStr(Driver.FieldSize) + #13#10 + Driver.ValueOfFieldString);
end;
if not Driver.FieldType then
begin
ClientSocket1.Socket.SendText('9' + 'Название поля: ' + Driver.FieldName
+ #13#10 + 'Тип поля: число' + #13#10 + 'Размер поля: ' +
IntToStr(Driver.FieldSize) + #13#10 + 'Мин. значение: ' +
IntToStr(Driver.MINValueOfField) + #13#10 + 'Макс. значение: ' +
IntToStr(Driver.MaxValueOfField) + #13#10 +
IntToStr(Driver.ValueOfFieldInteger));
end;
end
else
ClientSocket1.Socket.SendText('1' + IntToStr(Driver.Resultcode) + ' : ' +
driver.ResultCodeDescription);
end;
end;
procedure TClientForm.ReadData;
var
S: string;
i: Integer;
ResultCode: Integer;
ResultCodeDescription: string;
begin
try
FDump := '';
ResultCode := 0;
FStopFlag := False;
for i := 1 to FCount do
begin
if FStopFlag then
Break;
ResultCode := Driver.GetData;
if ResultCode = 0 then
begin
FDump := FDump + Driver.DataBlock;
end
else
begin
ResultCode := Driver.ResultCode;
ResultCodeDescription := Driver.ResultCodeDescription;
S := Format('Ошибка ККМ %d: %s'#13#10'Продолжить?',
[ResultCode, ResultCodeDescription]);
if MessageBox(Handle, PChar(S), PChar(Application.Title),
MB_ICONEXCLAMATION or MB_OKCANCEL) = ID_CANCEL then
Break;
end;
Application.ProcessMessages;
end;
if ResultCode = 0 then
Driver.InterruptDataStream;
except
on E: Exception do
Application.ShowException(E);
end;
end;
procedure TClientForm.ClientSocket1Error(Sender: TObject;
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
var ErrorCode: Integer);
begin
if ErrorCode = 10061 then
ShowMessage('Сервер не доступен, попробуйте позже');
ErrorCode := 0;
StatusBar1.Panels[1].Text := 'Связь с сервером отсутствует';
end;
procedure TClientForm.BtnConClick(Sender: TObject);
var
Result, pas, tim: Integer;
begin
StatusBar1.Panels[0].Text := '';
if TryStrToInt(Edit1.Text, pas) then
DriverManager.Password := pas
else
begin
ShowMessage('Пароль должен быть числом');
Exit;
end;
Driver.ComNumber := ComboBox1.ItemIndex + 1;
Driver.BaudRate := ComboBox2.ItemIndex;
if TryStrToInt(Edit2.Text, tim) then
Driver.Timeout := tim
else
begin
ShowMessage('Таймаут должен быть числом');
Exit;
end;
try
if Driver.Connect <> 0 then
StatusBar1.Panels[0].Text := 'Состояние: Нет связи с ФР'
else
begin
Driver.GetDeviceMetrics;
StatusBar1.Panels[0].Text := 'Состояние: ' + Driver.UDescription;
end;
except
StatusBar1.Panels[0].Text := 'Состояние: Нет связи с ФР';
end;
end;
procedure TClientForm.Ic(n: Integer; Icon: TIcon);
var
Nim: TNotifyIconData;
begin
with Nim do
begin
cbSize := SizeOf(Nim);
Wnd := ClientForm.Handle;
uID := 1;
uFlags := NIF_ICON or NIF_MESSAGE or NIF_TIP;
hicon := Icon.Handle;
uCallbackMessage := wm_user + 1;
szTip := 'Подать заявку на неисправность';
end;
case n of
1: Shell_NotifyIcon(Nim_Add, @Nim);
2: Shell_NotifyIcon(Nim_Delete, @Nim);
3: Shell_NotifyIcon(Nim_Modify, @Nim);
end;
end;
procedure TClientForm.ControlWindow(var Msg: TMessage);
begin
if Msg.WParam = SC_MINIMIZE then
begin
Ic(1, Application.Icon);
ShowWindow(Handle, SW_HIDE);
ShowWindow(Application.Handle, SW_HIDE);
end
else
inherited;
end;
procedure TClientForm.OnMinimizeProc(Sender: TObject);
begin
PostMessage(Handle, WM_SYSCOMMAND, SC_MINIMIZE, 0);
end;
procedure TClientForm.IconMouse(var Msg: TMessage);
var
p: tpoint;
begin
GetCursorPos(p);
case Msg.LParam of
WM_LBUTTONUP, WM_LBUTTONDBLCLK:
begin
Ic(2, Application.Icon);
ShowWindow(Application.Handle, SW_SHOW);
ShowWindow(Handle, SW_SHOW);
end;
WM_RBUTTONUP:
begin
SetForegroundWindow(Handle);
PopupMenu1.Popup(p.X, p.Y);
PostMessage(Handle, WM_NULL, 0, 0);
end;
end;
end;
procedure TClientForm.N3Click(Sender: TObject);
begin
Ic(2, Application.Icon);
ShowWindow(Application.Handle, SW_SHOW);
ShowWindow(Handle, SW_SHOW);
Application.Terminate;
end;
procedure TClientForm.N1Click(Sender: TObject);
begin
Ic(2, Application.Icon);
ShowWindow(Application.Handle, SW_SHOW);
ShowWindow(Handle, SW_SHOW);
end;
procedure TClientForm.BtnExitClick(Sender: TObject);
begin
Application.Terminate;
end;
procedure TClientForm.Timer1Timer(Sender: TObject);
begin
Driver.Password := DriverManager.Password;
Driver.GetDeviceMetrics;
ClientSocket1.Socket.SendText('2' + 'Модель ФР: ' + Driver.UDescription +
#13#10 + edit3.Text);
Timer1.Enabled := False;
end;
procedure TClientForm.CheckBox1Click(Sender: TObject);
begin
if CheckBox1.Checked then
begin
Edit1.Enabled := True;
ComboBox1.Enabled := True;
ComboBox2.Enabled := True;
Edit2.Enabled := True;
Edit4.Enabled := True;
Edit5.Enabled := True;
end
else
begin
Edit1.Enabled := false;
ComboBox1.Enabled := false;
ComboBox2.Enabled := false;
Edit2.Enabled := false;
Edit4.Enabled := false;
Edit5.Enabled := false;
end;
end;
end.
function StrToHex(const S: string): string;
var
i: Integer;
begin
Result := '';
for i := 1 to Length(S) do
Result := Result + IntToHex(Ord(S[i]), 2) + ' ';
end;
function HexToStr(const S: string): string;
function HexStrToChar(const Value: string): Char;
begin
if Length(Value) in [1..2] then
Result := Chr(StrToInt('$' + Value))
else
raise Exception.Create('Недопустимый символ в строке');
end;
var
Data: string;
Digit: string;
Index: Integer;
begin
Data := Trim(S) + ' ';
Result := '';
Index := Pos(' ', Data);
while Index > 0 do
begin
Digit := Copy(Data, 1, Index - 1);
Data := Copy(Data, Index + 1, Length(Data));
Result := Result + HexStrToChar(Digit);
Index := Pos(' ', Data);
end;
end;
function GetINN(const S: string): string;
begin
Result := S;
if Result = '' then
Result := 'не задан'
end;
function GetRNM(const S: string): string;
begin
Result := S;
if Result = '' then
Result := 'не задан'
end;
function GetLicense(const S: string): string;
begin
Result := S;
if Result = '' then
Result := 'не введена'
end;
function GetSerialNumber(const S: string): string;
begin
Result := S;
if Result = '' then
Result := 'не введен'
end;
function ECRFlagsToStr(NBits: Integer; Driver: OleVariant): string;
const
BitStr: array[0..15, False..True] of string = (
('<нет>', '<есть>'),
('<нет>', '<есть>'),
('<нет>', '<есть>'),
('<нет>', '<есть>'),
('<0 знаков>', '<2 знака>'),
('<нет>', '<есть>'),
('<нет>', '<есть>'),
('<нет>', '<есть>'),
('<поднят>', '<опущен>'),
('<поднят>', '<опущен>'),
('<опущена>', '<поднята>'),
('<закрыт>', '<открыт>'),
('<нет>', '<есть>'),
('<нет>', '<есть>'),
('<нет>', '<да>'),
('<6 знаков>', '<3 знака>'));
begin
case NBits of
0: Result := BitStr[0, Boolean(Driver.JournalRibbonIsPresent)];
1: Result := BitStr[1, Boolean(Driver.ReceiptRibbonIsPresent)];
2: Result := BitStr[3, Boolean(Driver.SlipDocumentIsMoving)];
3: Result := BitStr[2, Boolean(Driver.SlipDocumentIsPresent)];
4: Result := BitStr[4, Boolean(Driver.PointPosition)];
5: Result := BitStr[5, Boolean(Driver.EKLZIsPresent)];
6: Result := BitStr[6, Boolean(Driver.JournalRibbonOpticalSensor)];
7: Result := BitStr[7, Boolean(Driver.ReceiptRibbonOpticalSensor)];
8: Result := BitStr[8, Boolean(Driver.JournalRibbonLever)];
9: Result := BitStr[9, Boolean(Driver.ReceiptRibbonLever)];
10: Result := BitStr[10, Boolean(Driver.LidPositionSensor)];
11: Result := BitStr[11, Boolean(Driver.isDrawerOpen)];
12: Result := BitStr[12, Boolean(Driver.isPrinterRightSensorFailure)];
13: Result := BitStr[13, Boolean(Driver.isPrinterLeftSensorFailure)];
14: Result := BitStr[14, Boolean(Driver.IsEKLZOverflow)];
15: Result := BitStr[15, Boolean(Driver.QuantityPointPosition)];
else
Result := 'Неправильный номер бита';
end;
end;
function FMFlagsToStr(NBits: Integer; Driver: OleVariant): string;
const
BitStr: array[0..7, False..True] of string = (
('<нет>', '<есть>'),
('<нет>', '<есть>'),
('<не введена>', '<введена>'),
('<нет>', '<есть>'),
('< <80% >', '< >80% >'),
('<корректна>', '<повреждена>'),
('<закрыта>', '<открыта>'),
('<не кончились>', '<кончились>')
);
begin
case NBits of
0: Result := BitStr[0, Boolean(Driver.FM1IsPresent)];
1: Result := BitStr[1, Boolean(Driver.FM2IsPresent)];
2: Result := BitStr[2, Boolean(Driver.LicenseIsPresent)];
3: Result := BitStr[3, Boolean(Driver.FMOverflow)];
4: Result := BitStr[4, Boolean(Driver.IsBatteryLow)];
5: Result := BitStr[5, Boolean(Driver.IsLastFMRecordCorrupted)];
6: Result := BitStr[6, Boolean(Driver.IsFMSessionOpen)];
7: Result := BitStr[7, Boolean(Driver.IsFM24HoursOver)];
else
Result := 'Неправильный номер бита';
end;
end;
function ConfirmFiscalization(Wnd: THandle): Boolean;
var
S: string;
begin
S := 'Фискализацию аппарата нельзя отменить.'#13#10 +
'Вы хотите продолжить?';
Result := MessageBox(Wnd, PChar(S), 'Внимание!',
MB_ICONEXCLAMATION or MB_YESNO or MB_DEFBUTTON2) = ID_YES;
end;
procedure LoadControlParams(const Path: string; Control: TWinControl; Reg:
TRegistry);
var
i: Integer;
Item: TControl;
ValueName: string;
begin
for i := 0 to Control.ControlCount - 1 do
begin
Item := Control.Controls[i];
if Item is TWinControl then
begin
ValueName := Path + '.' + Item.Name;
LoadControlParams(ValueName, Item as TWinControl, Reg);
if Reg.ValueExists(ValueName) then
begin
if Item is TEdit and (not TEdit(Item).ReadOnly) then
TEdit(Item).Text := Reg.ReadString(ValueName);
if Item is TComboBox then
TComboBox(Item).ItemIndex := Reg.ReadInteger(ValueName);
if Item is TCheckBox then
TCheckBox(Item).Checked := Reg.ReadBool(ValueName);
if Item is TRadioGroup then
TRadioGroup(Item).ItemIndex := Reg.ReadInteger(ValueName);
if Item is TDateTimePicker then
TDateTimePicker(Item).DateTime := Reg.ReadDateTime(ValueName);
end;
end;
end;
end;
procedure SaveControlParams(const Path: string; Control: TWinControl; Reg:
TRegistry);
var
i: Integer;
EditItem: TEdit;
Item: TComponent;
ValueName: string;
begin
for i := 0 to Control.ControlCount - 1 do
begin
Item := Control.Controls[i];
if Item is TWinControl then
begin
ValueName := Path + '.' + Item.Name;
SaveControlParams(ValueName, Item as TWinControl, Reg);
if Item is TEdit then
begin
EditItem := Item as TEdit;
if not EditItem.ReadOnly then
Reg.WriteString(ValueName, EditItem.Text);
end;
if Item is TComboBox then
Reg.WriteInteger(ValueName, TComboBox(Item).ItemIndex);
if Item is TCheckBox then
Reg.WriteBool(ValueName, TCheckBox(Item).Checked);
if Item is TRadioGroup then
Reg.WriteInteger(ValueName, TRadioGroup(Item).ItemIndex);
if Item is TDateTimePicker then
Reg.WriteDateTime(ValueName, TDateTimePicker(Item).DateTime);
end;
end;
end;
end.
procedure TTestManager.DoChange(AChangeType: TChangeType);
begin
if Assigned(FOnChange) then FOnChange(Self, AChangeType);
end;
function TTestManager.GetPassword: Integer;
begin
DoChange(ctGetPassword);
Result := FPassword;
end;
procedure TTestManager.StartTest;
begin
FTickCount := GetTickCount;
end;
procedure TTestManager.StopTest;
begin
DoChange(ctUpdate);
end;
initialization
DriverManager := TTestManager.Create;
finalization
DriverManager.Free;
end.
Приложение Б
Список ошибок фискальных регистраторов
Неисправность |
|
Неисправен накопитель ФП 1, ФП 2 или часы |
|
Отсутствует ФП 1 |
|
Отсутствует ФП 2 |
|
Некорректные параметры в команде обращения к ФП |
|
Нет запрошенных данных |
|
ФП в режиме вывода данных |
|
Некорректные параметры в команде для данной реализации ФП |
|
Команда не поддерживается в данной реализации ФП |
|
Некорректная длина команды |
|
Формат данных не BCD |
|
Неисправна ячейка памяти ФП при записи итога |
|
Не введена лицензия |
|
Заводской номер уже введен |
|
Текущая дата меньше даты последней записи в ФП |
|
Область сменных итогов ФП переполнена |
|
Смена уже открыта |
|
Смена не открыта |
|
Номер первой смены больше номера последней смены |
|
Дата первой смены больше даты последней смены |
|
Нет данных в ФП |
|
Область перерегистраций в ФП переполнена |
|
Заводской номер не введен |
|
В заданном диапазоне есть поврежденная запись |
|
Повреждена последняя запись сменных итогов |
|
Область перерегистраций ФП переполнена |
|
Отсутствует память регистров |
|
Переполнение денежного регистра при добавлении |
|
Вычитаемая сумма больше содержимого денежного регистра |
|
Неверная дата |
|
Нет записи активизации |
|
Область активизаций переполнена |
|
Нет активизации с запрашиваемым номером |
|
Вносимая клиентом сумма меньше суммы чека |
|
Невозможно отменить предыдущую команду |
|
Обнулённая касса (повторное гашение невозможно) |
|
Сумма чека по секции меньше суммы сторно |
|
В ФР нет денег для выплаты |
|
ФР заблокирован, ждет ввода пароля налогового инспектора |
|
Требуется выполнение общего гашения |
|
Некорректные параметры в команде |
|
Нет данных |
|
Некорректный параметр при данных настройках |
|
Некорректные параметры в команде для данной реализации ФР |
|
Команда не поддерживается в данной реализации ФР |
|
Ошибка в ПЗУ |
|
Внутренняя ошибка ПО ФР |
|
Переполнение накопления по надбавкам в смене |
|
Переполнение накопления в смене |
|
Смена открыта - операция невозможна |
|
ЭКЛЗ: неверный регистрационный номер |
|
Смена не открыта - операция невозможна |
|
Переполнение накопления по секциям в смене |
|
Переполнение накопления по скидкам в смене |
|
Переполнение диапазона скидок |
|
Переполнение диапазона оплаты наличными |
|
Переполнение диапазона оплаты типом 2 |
|
Переполнение диапазона оплаты типом 3 |
|
Переполнение диапазона оплаты типом 4 |
|
Cумма всех типов оплаты меньше итога чека |
|
Не хватает наличности в кассе |
|
Переполнение накопления по налогам в смене |
|
Переполнение итога чека |
|
Операция невозможна в открытом чеке данного типа |
|
Открыт чек - операция невозможна |
|
Буфер чека переполнен |
|
Переполнение накопления по обороту налогов в смене |
|
Вносимая безналичной оплатой сумма больше суммы чека |
|
Смена превысила 24 часа |
|
Неверный пароль |
|
Идет печать предыдущей команды |
|
Переполнение накоплений наличными в смене |
|
Переполнение накоплений по типу оплаты 2 в смене |
|
Переполнение накоплений по типу оплаты 3 в смене |
|
Переполнение накоплений по типу оплаты 4 в смене |
|
Чек закрыт - операция невозможна |
|
Нет документа для повтора |
|
ЭКЛЗ: количество закрытых смен не совпадает с ФП |
|
Ожидание команды продолжения печати |
|
Документ открыт другим оператором |
|
Скидка превышает накопления в чеке |
|
Переполнение диапазона надбавок |
|
Понижено напряжение 24В |
|
Таблица не определена |
|
Некорректная операция |
|
Отрицательный итог чека |
|
Переполнение при умножении |
|
Переполнение диапазона цены |
|
Переполнение диапазона количества |
|
Переполнение диапазона отдела |
|
ФП отсутствует |
|
Не хватает денег в секции |
|
Переполнение денег в секции |
|
Ошибка связи с ФП |
|
Не хватает денег по обороту налогов |
|
Переполнение денег по обороту налогов |
|
Ошибка питания в момент ответа по I2C |
|
Нет чековой ленты |
|
Нет контрольной ленты |
|
Не хватает денег по налогу |
|
Переполнение денег по налогу |
|
Переполнение по выплате в смене |
|
Переполнение ФП |
|
Ошибка отрезчика |
|
Команда не поддерживается в данном подрежиме |
|
Команда не поддерживается в данном режиме |
|
Ошибка ОЗУ |
|
Ошибка питания |
|
Ошибка принтера: нет импульсов с тахогенератора |
|
Ошибка принтера: нет сигнала с датчиков |
|
Замена ПО |
|
Замена ФП |
|
Поле не редактируется |
|
Ошибка оборудования |
|
Не совпадает дата |
|
Неверный формат даты |
|
Неверное значение в поле длины |
|
Переполнение диапазона итога чека |
|
Ошибка связи с ФП |
|
Ошибка связи с ФП |
|
Ошибка связи с ФП |
|
Ошибка связи с ФП |
|
Переполнение наличности |
|
Переполнение по продажам в смене |
|
Переполнение по покупкам в смене |
|
Переполнение по возвратам продаж в смене |
|
Переполнение по возвратам покупок в смене |
|
Переполнение по внесению в смене |
|
Переполнение по надбавкам в чеке |
|
Переполнение по скидкам в чеке |
|
Отрицательный итог надбавки в чеке |
|
Отрицательный итог скидки в чеке |
|
Нулевой итог чека |
|
Касса не фискализирована |
|
Поле превышает размер, установленный в настройках |
|
Выход за границу поля печати при данных настройках шрифта |
|
Наложение полей |
|
Восстановление ОЗУ прошло успешно |
|
Исчерпан лимит операций в чеке |
|
Ошибка связи с ЭКЛЗ |
|
ЭКЛЗ отсутствует |
|
ЭКЛЗ: Некорректный формат или параметр команды |
|
Некорректное состояние ЭКЛЗ |
|
Авария ЭКЛЗ |
|
Авария КС в составе ЭКЛЗ |
|
Исчерпан временной ресурс ЭКЛЗ |
|
ЭКЛЗ переполнена |
|
ЭКЛЗ: Неверные дата и время |
|
ЭКЛЗ: Нет запрошенных данных |
|
Переполнение ЭКЛЗ (отрицательный итог документа) |
|
ЭКЛЗ: Переполнение в параметре количество |
|
ЭКЛЗ: Переполнение в параметре сумма |
|
ЭКЛЗ: Уже активизирована |
|
Контроль даты и времени (подтвердите дату и время) |
|
ЭКЛЗ: суточный отчёт с гашением прервать нельзя |
|
Превышение напряжения в блоке питания |
|
Несовпадение итогов чека и ЭКЛЗ |
|
Несовпадение номеров смен |
|
Буфер подкладного документа пуст |
|
Подкладной документ отсутствует |
|
Поле не редактируется в данном режиме |
Приложение В
Таблица методов и свойств драйвера ФР
Название |
Использует |
Модифицирует |
||
Англ. Рус. |
AddLD ДобавитьЛУ |
LDName; LDComNumber; LDBaudrate; LDComputerName; LDTimeout |
LDNumber; LDIndex |
|
Англ. Рус. |
AdminUnlockPort |
ComNumber |
PortLocked |
|
Англ. Рус. |
AdminUnlockPorts |
- |
PortLocked |
|
Англ. Рус. |
Beep Гудок |
Password |
OperatorNumber |
|
Англ. Рус. |
Buy Покупка |
Password; Ouantity; Price; Department; Taxi; Tax2; Tax3; Tax4; StringForPrinting |
OperatorNumber |
|
Англ. Рус. |
BuyEx ПокупкаТочно |
Password; Ouantity; Price; Department; Taxi; Tax2; Tax3; Tax4; StringForPrinting |
OperatorNumber |
|
Англ. Рус. |
CancelCheck АннулироватьЧек |
Password |
OperatorNumber |
|
Англ. Рус. |
Cashlncome Внесение |
Password; Summi |
OperatorNumber; OpenDocumentNumber |
|
Англ. Рус. |
CashOutcome Выплата |
Password; Summi |
OperatorNumber; OpenDocumentNumber |
|
Англ. Рус. |
Charge Надбавка |
Password; Summi; Taxi; Tax2; Tax3; Tax4; StringForPrinting |
OperatorNumber |
|
Англ. Рус. |
ChargeOnSlipDocument ФормированиеНадбавкиНаПД |
Password; StringOuantitylnOperation; TextStringNumber; OperationNameStringNumber; SummStringNumber; TextFont; OperationNameFont; SummFont; TextSymbolNumber; SummSymbolNumber; TextOffSet; OperationNameOffSet; SummOffSet; OperationBlockFirstString; Summi; Taxi; Tax2; Tax3; Tax4; StringForPrinting |
OperatorNumber |
|
Англ. Рус. |
CheckSubTotal ПодытогЧека |
Password |
OperatorNumber; Summi |
|
Англ. Рус. |
ClearSlipDocumentBuffer ОчиститьБу ферПД |
Password |
OperatorNumber |
|
Англ. Рус. |
ClearSlipDocumentBufferString ОчиститьСтрокуБуфераПД |
Password; StringNumber |
OperatorNumber |
|
Англ. Рус. |
CloseCheck ЗакрытьЧек |
Password; Summi; Summ2; Summ3; Summ4; DiscountOnCheck; Taxi; Tax2; Tax3; Tax4; StringForPrinting |
OperatorNumber; Change |
|
Англ. Рус. |
CloseCheckOnSlipDocument ФормированиеЗакрытияЧекаНаПД |
Password; StringOuantitylnOperation; TotalStringNumber; TextStringNumber; SummiStringNumber; Summ2StringNumber; Summ3StringNumber; |
OperatorNumber; Change |
|
Название |
Использует |
Модифицирует |
||
Summ4StringNumbeп ChangeStringNumbeп Tax1TurnoverStringNumber; Tax2TurnoverStringNumber; Tax3TurnoverStringNumber; Tax4TurnoverStringNumber; Tax1SumStringNumber; Tax2SumStringNumber; Tax3SumStringNumber; Tax4SumStringNumber; SubTotalStringNumber; DiscountOnCheckStringNumber; TextFont; TotalFont; TotalSumFont; Summ1NameFont; Summ1Font; Summ2NameFont; Summ2Font; Summ3NameFont; Summ3Font; Summ4NameFont; Summ4Font; ChangeFont; ChangeSumFont; Tax1NameFont; Tax1TurnoverFont; Tax1RateFont; Tax1SumFont; Tax2NameFont; Tax2TurnoverFont; Tax2RateFont; Tax2SumFont; Tax3NameFont; Tax3TurnoverFont; Tax3RateFont; Tax3SumFont; Tax4NameFont; Tax4TurnoverFont; Tax4RateFont; Tax4SumFont; SubTotalFont; SubTotalSumFont; DiscountOnCheckFont; DiscountOnCheckSumFont; TextSymbolNumber; TotalSymbolNumber; Summ1SymbolNumber; Summ2SymbolNumber; Summ3SymbolNumber; Summ4SymbolNumber; ChangeSymbolNumber; Tax1NameSymbolNumber; Tax1TurnoverSymbolNumber; Tax1RateSymbolNumber; Tax1SumSymbolNumber; Tax2NameSymbolNumber; Tax2TurnoverSymbolNumber; Tax2RateSymbolNumber; Tax2SumSymbolNumber; Tax3NameSymbolNumber; Tax3TurnoverSymbolNumber; Tax3RateSymbolNumber; Tax3SumSymbolNumber; Tax4NameSymbolNumber; Tax4TurnoverSymbolNumber; Tax4RateSymbolNumber; Tax4SumSymbolNumber; SubTotalSymbolNumber; DiscountOnCheckSymbolNumber; DiscountOnCheckSumSymbolNum ber; TextOffSet; TotalOffSet; |
||||
TotalSumOffSet; Summ1OffSet; Summ1NameOffSet; Summ2NameOffSet; Summ2OffSet; Summ3NameOffSet; Summ3OffSet; Summ4NameOffSet; Summ4OffSet; ChangeOffSet; ChangeSumOffSet; Tax1NameOffSet; Tax1TurnoverOffSet; Tax1RateOffSet; Tax1SumOffSet; Tax2NameOffSet; Tax2TurnoverOffSet; Tax2RateOffSetTax2SumOffSet; Tax3NameOffSet; Tax3TurnoverOffSet; Tax3RateOffSet; Tax3SumOffSet; Tax4NameOffSet; Tax4TurnoverOffSet; Tax4RateOffSet; Tax4SumOffSet; SubTotalOffSet; SubTotalSumOffSet; DiscountOnCheckOffSet; DiscountOnCheckSumOffSet; OperationBlockFirstString; Summ1; Summ2; Summ3; Summ4; DiscountOnCheck; Tax1; Tax2;Tax3;Tax4; StringForPrinting |
||||
Англ. Рус. |
CloseEKLZArchive ЗакрытьАрхивЭКЛЗ |
Password |
- |
|
Англ. Рус. |
ConfigureGeneralSlipDocument ОбщаяКонфигурацияПД |
Password; SlipDocumentLength; SlipDocumentWidth; PrintingAlignment; SlipEqualStringIntervals |
OperatorNumber |
|
Англ. Рус. |
ConfigureSlipDocument КонфигурироватьПД |
Password; SlipDocumentLength; SlipDocumentWidth; PrintingAlignment; SlipStringIntervals |
OperatorNumber |
|
Англ. Рус. |
ConfigureStandardSlipDocument СтандартнаяКонфигурацияПД |
Password |
OperatorNumber |
|
Англ. Рус. |
ConfirmDate |
Подобные документы
Проектирование структур данных и пользовательского интерфейса. Разработка руководства системного программиста и пользователя. Основные элементы организации работы менеджера по работе с клиентами. Характеристика программного обеспечения ООО "Доминион+".
курсовая работа [1,7 M], добавлен 14.10.2012Автоматизация деятельности по проведению анализа деловой активности предприятия. Реализация предложенной методики в виде программного обеспечения, основные требования к нему. Структура и состав комплекса программных модулей, руководство пользователя.
курсовая работа [634,0 K], добавлен 28.05.2013Особенности алгоритмов, критерии качества. Создание и применение программного продукта на языке Delphi. Тип операционной системы. Внутренняя структура программного продукта. Руководство пользователя и программиста, расчет себестоимости и цены программы.
дипломная работа [1,5 M], добавлен 12.06.2009Порядок контроля и приемки программного продукта, предназначенного для автоматизации процесса анализа эффективности инвестиций и капитальных вложений. Состав входной и выходной информации. Описание функций программного комплекса. Руководство пользователя.
курсовая работа [436,8 K], добавлен 28.05.2013Проектирование программного обеспечения для создания баз данных о работах студентов университета при помощи языка Visual Basic. Разработка интерфейса пользователя. Руководство для системного программиста. Краткое описание алгоритма работы с программой.
курсовая работа [2,6 M], добавлен 19.03.2010Чем отличается программист от системного администратора. Преимущества и выгоды от работы системного администратора. Подготовка и сохранение резервных копий данных, их периодическая проверка и уничтожение. Конфигурирование нового программного обеспечения.
реферат [23,4 K], добавлен 11.03.2014Базы данных для учета и контроля оборудования по производству печатных плат. Требования к системе, анализ предметной области. Информационные потребности пользователя. Логическая структура программы, алгоритм ее работы. Руководство системного программиста.
курсовая работа [786,5 K], добавлен 24.02.2015Анализ существующего программного обеспечения. Этапы создания проекта. Концептуальное, логическое и физическое проектирование базы данных. Структура программного продукта. Руководство программиста и оператора. Тестирование программного продукта.
курсовая работа [586,4 K], добавлен 26.06.2015Классификация служебных программных средств. Файловая структура операционных систем. Основы графического интерфейса пользователя Windows XX. Анализ алгоритмов решения задач. Описание процесса разработки программного обеспечения и результатов работы.
курсовая работа [2,4 M], добавлен 14.11.2016Анализ инструментов используемых в разработке программного обеспечения (ПО). Проектирование пользовательского интерфейса. Тестирование и отладка, внедрение и сопровождение ПО. Руководство по установке ПО, руководство системного администратора ПО.
курсовая работа [770,9 K], добавлен 20.05.2017