Автоматизация процесса выявления и устранения неисправностей торгового оборудования

Структура программного комплекса и 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

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.