72406

Повышение эффективности работы гальванической линии завода «ВЗЭП» г. Витебск

Дипломная

Информатика, кибернетика и программирование

Обзор современных решений программ автоматического управления автооператорами гальванической линии; систематизация собранного материала для выполнения дипломного проекта, выбор физической среды реализации; изучение существующего программного обеспечения для проектирования выбранной системы; построение алгоритма управляющей программы. Определение протокола связи с модулями автооператоров, построение диаграммы состояний, вариантов использования...

Русский

2015-01-11

1.51 MB

8 чел.

СОДЕРЖАНИЕ

ВВЕДЕНИЕ 7

1 ОБЗОР СОСТОЯНИЯ ВОПРОСА 10

1.1 Понятие и сущность автоматического управления автооператором 10

1.2 Обзор существующих решений автоматического управления автооператором 11

1.3 Предъявляемые требования к системе автоматического управления автооператором. 12

2 ПОСТАНОВКА ЗАДАЧИ ПРОЕКТИРОВАНИЯ 14

2.1 Основные задачи и цели проектирования 14

2.2 Анализ предметной области 14

3 ЛОГИЧЕСКОЕ ПРОЕКТИРОВАНИЕ 16

3.1 Построение концептуальной модели данных 16

3.2 Разработка диаграмм вариантов использования 18

3.3 Построение диаграмм состояний 20

3.4  Разработка макетов экранных форм 21

4 ФИЗИЧЕСКОЕ МОДЕЛИРОВАНИЕ 25

4.1 Выбор операционной системы, среды разработки и языка программирования 25

4.2 Выбор интерфейса и протокола связи с модулем автооператора 26

4.3 Построение физической модели данных 30

5 РЕАЛИЗАЦИЯ И ТЕСТИРОВАНИЕ ПРОГРАММЫ 32

5.1 Назначение и описание компонентов программы, их исходные тексты 32

5.2 Выбор панельного компьютера 38

5.3 Тестирование программного обеспечения 38

6 РУКОВОДСТВО ПОЛЬЗОВАТЕЛЯ 40

7 ОПРЕДЕЛЕНИЕ ЭКОНОМИЧЕСКОЙ ЭФФЕКТИВНОСТИ РАЗРАБОТКИ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ 43

8 ОХРАНА ТРУДА 55

8.1 Производственная санитария 55

8.1.1 Микроклимат в помещениях вычислительного центра 55

8.1.2  Шум и вибрация в помещениях вычислительного центра 56

8.1.3 Электромагнитные излучения 57

8.1.4 Освещение в вычислительном центре 58

8.1.5 Рабочее место программиста 62

8.2 Техника безопасности 63

8.3 Пожарная безопасность 65

ЗАКЛЮЧЕНИЕ 66

СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ 67

ПРИЛОЖЕНИЕ А. 68

ПРИЛОЖЕНИЕ Б. 69

ПРИЛОЖЕНИЕ В. 85


ВВЕДЕНИЕ

Экономика любой страны основана на производстве каких-либо товаров. Чем качественнее и быстрее изготовлен товар, тем конкурентоспособнее предприятие. Чем известнее и популярнее предприятие, тем выше его доля экспорта в экономике страны. Чем больше товаров экспортирует страна, тем выше ее экономические показатели, а соответственно и уровень жизни населения.

До 19-го века все товары производились исключительно с применением ручного труда. В начале 19-го века произошла своеобразная революция – были изобретены станки и механизмы, позволяющие ускорить и упростить труд людей. Некоторые уверяли, что это неправильно [10], что только человек способен произвести качественный товар. Однако реальность показала, что с помощью станка товар произвести быстрее, дешевле, а главное – качественнее (в условиях массового производства).

До середины 20-го века управляющая станками механика состояла из простейших узлов – двигателей, генераторов, соединяющих их проводов, кнопок и т.п. Для запуска и контроля работы над любым механизмом требовался человек.

После изобретения в 1947 г. транзистора ситуация резко изменилась. Появились интегральные микросхемы, с помощью которых стало возможным задать логику работы автомата без участия человека.

Приблизительно в середине 70-ых годов 20-го века были разработаны первые ПЛК – программируемые логические контроллеры. Это процессоры для применения в промышленных условиях, с защитой от перегрузки входов и выходов, защитой от помех по входам и шинам питания. Одновременно разрабатывались среды программирования ПЛК. Первые ПЛК заменяли собой множество реле, поэтому среда разработки предоставляла средства для рисования схемы внутренних «виртуальных» реле и ее подключение ко входам и выходам. Затем появились таймеры, счетчики, различные последовательные интерфейсы (CAN, ETHERNET, RS485) для связи  нескольких ПЛК в одну систему.

С развитием компьютерной техники в те же годы начали находить применение системы автоматического управления производством. Как правило, они состоят из центрального компьютера с программой на языке высокого уровня, которая контролирует и координирует действия нижестоящих устройств. Эти устройства, как правило, представляют собой ПЛК с подключенными к ним нагрузками – насосами, клапанами и пр.

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

Актуальность дипломного проекта заключается в практической необходимости повышения эффективности работы гальванической линии завода «ВЗЭП» г. Витебск.

Задачи дипломного проекта:

  •  обзор современных решений программ автоматического управления автооператорами гальванической линии;
  •  систематизация собранного материала для выполнения дипломного проекта, выбор физической среды реализации;
  •  изучение существующего программного обеспечения для проектирования выбранной системы;
  •  построение алгоритма управляющей программы. Определение протокола связи с модулями автооператоров, построение диаграммы состояний, вариантов использования;
  •  разработка концептуальной модели данных;
  •  выбор типа программной модели, а также языка программирования;
  •  разработка экранных форм для пользовательских интерфейсов;
  •  написание программы;
  •  тестирование программы;
  •  разработка инструкции;
  •  обоснование экономического эффекта, получаемого при внедрении программы автоматического управления;
  •  рассмотрение вопросов, связанных с охраной труда и техникой безопасности.

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

Первый раздел – «Обзор состояния вопроса» – отражает уровень современных разработок по теме проекта. Анализируются различные системы автоматического управления автооператорами. Обосновывается целесообразность применения компьютера как главного звена.

В разделе «Постановка задачи проектирования» приводится постановка основной задачи и перечень решаемых в работе подзадач.

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

В четвертом разделе – «Физическое моделирование» – представлен материал, связанный с выбором физической модели данных и обоснованием языка и среды программирования для написания программы. Кроме того, в разделе будут представлены ключевые переменные, константы, входные и выходные данные, диаграммы компонентов.

Пятый раздел – «Реализация и тестирование программы», – описывает программные модули, подбор конкретной модели панельного компьютера и тестирование работы программы.

Шестой раздел «Руководство пользователя» – включает в себя руководство по работе с программой. В нем рассказывается о назначении программы, ее возможностях и порядке работы с ней. Кроме того, отображена информация, касающаяся условий нормальной работы программы, перечень действий для успешного запуска циклограмм движения, а также описание действий, которые следует предпринять в аварийной ситуации.

В «Экономическом разделе» проводится расчет затрат на разработку программного продукта и его экономическая эффективность.

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

Завершает пояснительную записку раздел «Заключение», который содержит краткую формулировку задачи и пути ее решения, а также методы и средства, используемые для ее осуществления.

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

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

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

В приложениях представлены концептуальная модель данных и листинг управляющей программы.


1 ОБЗОР СОСТОЯНИЯ ВОПРОСА

  1.  Понятие и сущность автоматического управления автооператором

Для понимания сущности автоматического управления автооператором необходимо дать определение сущности «автоматизированная гальваническая линия» целиком.

Автоматизированная гальваническая линия – это комплекс электротехнического, механического и прочего оборудования, обеспечивающий выполнение поставленной задачи (например, оцинкование металлических деталей) полностью в автоматическом режиме.

Автоматизированная гальваническая линия состоит из нескольких основных частей:

– емкости с различными жидкостями для обеспечения технологического процесса обработки детали;

– пути и другие механические конструкции для перемещения подвижных модулей автооператоров;

– щит управления с разнесенными по емкостям датчиками температуры, уровня и др.;

– модули автооператоров;

– выпрямители тока;

– система автоматического управления и отображения информации с человеко-машинным интерфейсом.

Остановимся более подробно на модулях автооператоров и системе автоматического управления и отображения информации с человеко-машинным интерфейсом.

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

Комплекс индуктивных датчиков, как горизонтального, так и вертикального перемещения, служит для точного позиционирования модуля автооператора при движении. Автоматические выключатели служат для механического разрыва цепей управления двигателями при выходе модуля автооператора за границы нормального движения.

Для движения модуля автооператора по горизонтали, а также перемещения каретки автооператора по вертикали служат два двигателя с мотор-редукторами. Вращающий момент передается на колеса, перемещающие автоматический модуль по путям.

Система автоматического управления и отображения информации с человеко-машинным интерфейсом должна иметь возможность управлять одним или несколькими модулями автооператоров и выводить на экран информацию о их движении. Это включает в себя:

– изображение модулей автооператоров, их кареток и носителей;

– задание автоматической программы движения модулей автооператоров;

– контроль исполнения автоматической программы движения модулей автооператоров.

  1.  Обзор существующих решений автоматического управления автооператором

В настоящее время существует несколько различных типов систем автоматического управления автооператорами. Рассмотрим продукцию двух фирм, «Stergal», г. Девнеж,  Польша и «Полипласт», г. Псков, Россия.

Система автоматического управления фирмы «Stergal» строится на базе промышленного логического контроллера фирмы «Omron» (который параллельно управляет всей линией в целом) и сенсорной панели оператора. На панели изображаются все позиции линии, модули автооператоров, последовательность шагов движения. С помощью панели оператор линии может запустить ту или иную циклограмму движения.

Рассмотрим особенности, достоинства и недостатки данной системы.

Польская система управления построена так, что единственный программируемый логический контроллер управляет всем – движением автооператоров (посредством управления двигателями и считывания состояния датчиков по сети) и работой линии в комплексе (поддержание температуры в ваннах, управление выпрямителями).

Достоинства данной системы:

– высокая надежность. Отсутствие дополнительных контроллеров сводит на нет вероятность их отказа;

– простота перепрограммирования. В случае потребности изменения программы работы какого-либо участка системы требуется подключение и перепрограммирование лишь одного целевого контроллера.

Недостатки данной системы:

– недостаточная гибкость. Панель оператора вкупе с промышленным логическим контроллером не дают возможность строить гибкие циклограммы движения автооператоров (например, учитывать все возможные длительности различных операций). Система всегда находится в довольно жестких рамках, заданных на этапе программирования;

– сосредоточенность органов управления. При аварии центрального промышленного логического контроллера вся линия становится неработоспособной;

– недостаточная визуализация линии. На панели оператора указаны лишь схематические изображения носителей, не указан их тип (барабан либо подвеска). Также не указано, на какой стадии находится текущий носитель,  какой отрезок времени требуется ему для обработки на данной позиции;

– плохая защищенность от аварийных ситуаций. При какой-либо аварии (сработавший конечный выключатель, кратковременное пропадание питания и пр.) цикл движения автооператоров прерывается, и его требуется запускать заново.

Система автоматического управления фирмы «Полипласт» строится на базе микроконтроллера с жидкокристаллическим многострочным индикатором, на котором отображается программа работы. Режим работы задается кнопочным меню.

Рассмотрим достоинства и недостатки данной системы.

Достоинства данной системы те же, что и у польской – высокая надежность и простота перепрограммирования.

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

  1.  Предъявляемые требования к системе автоматического управления автооператором.

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

Циклограмма – это графическое изображение функциональных перемещений автооператора при выполнении им последовательности переноса подвесок (барабанов) по технологическим позициям с соблюдением длительности операций заданного технологического процесса [11]. Она отражает:

– направление перемещения автооператора с обрабатываемыми изделиями и без них;

– начальные и конечные точки его движения;

– время перемещения между позициями;

– подъем и описание обрабатываемых изделий, их выдержку на позиции обработки;

– время опускания на позицию и время подъема;

– начальные и конечные точки времени нахождения изделий на позициях;

– точки синхронизации движения автооператоров.

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

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

– распределенность, т.е. исключение возможности парализации работы системы целиком в результате отказа центрального звена;

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

– возможность работы с разным числом носителей;

– возможность «окончания цикла», когда очередной носитель, пришедший на позицию загрузки, не запускается в очередной цикл, а отправляется на хранение;

– защита от аварийных ситуаций (срабатывание конечных выключателей автооператоров, обрыв связи, отключение питания) и возобновление нормальной работы после их устранения;

– полное архивация ситуаций, произошедших при работы линии, включающая в себя запись всех аварий, последовательность запущенных технологических процессов, и пр.

– отображение на экране схематичного изображения автооператоров, позиций, носителей с номерами каждого элемента, указанием цикла обработки носителя, текущей операции, и указанием интервала времени до ее завершения.

С учетом требований, перечисленных выше, был сделан вывод.

Систему автоматического управления автооператорами следует реализовать на базе промышленного IBM-совместимого компьютера с сенсорным дисплеем и программой на языке высокого уровня с возможностью предусмотреть все ситуации, могущие возникнуть в процессе работы гальванической линии.

  1.  
    ПОСТАНОВКА ЗАДАЧИ ПРОЕКТИРОВАНИЯ

  1.  Основные задачи и цели проектирования

Основными целями создания автоматизированной системы управления являются:

– повышение эффективности производства;

– автоматическое выполнение операций технологических процессов путем управления двумя автооператорами промышленной гальванической линии;

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

Задачи, стоящие на пути создания автоматической системы управления автооператорами:

– разработка алгоритма управления двумя автооператорами по заданному техпроцессу;

– разработка алгоритма связи с модулями автооператоров, обеспечивающей контроль состояния их датчиков и передачу команд управления;

– разработка алгоритма ведения архивирования событий;

– разработка экранных интерфейсов:

– полная визуализация гальванической линии, включающая в себя изображения автооператоров, позиций, носителей с номером каждого элемента;

– экранная клавиатура только с необходимыми для работы клавишами;

– экрана состояния автооператора;

– экрана запуска нового цикла;

– экрана настройки длительности различных операций.

  1.  Анализ предметной области

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

Очевидно, это будут:

– данные о двух автооператорах, такие, например, как номер позиции, на которой они находятся в настоящий момент, первая и последняя позиции диапазона, в пределах которого автооператору разрешено движение, текущее состояние датчиков положения. На основе этих данных можно будет составлять алгоритмы движения автооператоров, с принятием решения, в какой момент времени какому именно автооператору следует двигаться, в каком направлении, с какой скоростью. Для отображения на экране нужно будет создать изображения автооператоров;

– данные о носителях, такие, например, как местоположение носителя (на позиции, на каретке автооператора либо вне линии), номер технологического цикла обработки, в котором участвует носитель и номер текущей операции в нем. Эти данные нужны для учёта количества носителей в алгоритме, для выбора конкретного носителя, который должен перенести автооператор. Для носителей также следует нарисовать изображения на экране, с номером каждого носителя;

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


3 ЛОГИЧЕСКОЕ ПРОЕКТИРОВАНИЕ

3.1 Построение концептуальной модели данных

Исходя из анализа предметной области, можно выделить следующие сущности: АВТООПЕРАТОР, ПОЗИЦИЯ, НОСИТЕЛЬ.

Рассмотрим сущность АВТООПЕРАТОР. Она должна иметь следующие атрибуты:

– уникальный номер автооператора;

– номер текущей позиции;

– первый номер диапазона позиций, в котором разрешено движение данного автооператора;

– последний номер диапазона позиций, в котором разрешено движение данного автооператора;

– адрес модуля ПЛК автооператора для связи с ним;

– состояния всех датчиков, установленных на модуле автооператора для обработки их состояний;

– состояния всех выходов автооператора;

– координаты отображения на экране визуализации автооператора.

Рассмотрим сущность ПОЗИЦИЯ. Она должна иметь следующие атрибуты:

– уникальный номер позиции;

– название;

– номер альтернативной позиции;

– продолжительность обработки детали для данной позиции.

Рассмотрим сущность НОСИТЕЛЬ. Она должна иметь следующие атрибуты:

– уникальный номер носителя;

– тип носителя;

– текущее положение носителя;

– текущий технологический цикл, в котором участвует носитель;

– текущая стадия технологического цикла, в котором участвует носитель.

Рассмотрим более подробно все сущности для выяснения, какого типа данные для каждой переменной потребуются.

Для таких атрибутов сущности АВТООПЕРАТОР, как уникальный номер автооператора, текущий номер позиции и номера границ диапазона, в котором разрешено движение данного автооператора будет достаточно однобайтовой переменной, так как автооператоров будет 2, а позиций – не более 30.

Адрес модуля ПЛК автооператора вынесем в отдельную сущность – СВЯЗЬ. Это требуется в связи с тем, что помимо управления автооператорами в будущем в программе потребуется связь с выпрямителями, ПЛК управления щитом управления.

Для атрибута «состояния датчиков автооператора» используем булеву переменную, которая может принимать два значения, как и контролируемый датчик. Для простоты отображения концептуальной модели внесем один вход и один выход.

Для координат положения изображения на экране автооператора будет достаточно двухбайтового числа.

Для сущности СВЯЗЬ будут характерны следующие атрибуты:

– адрес модуля, является уникальным номером сущности, т.к. номера в сети связи должны быть уникальны. Для данного атрибута будет достаточно однобайтового числа, т.к. количество узлов связи не будет превышать 256 модулей;

– таймаут связи – однобайтовое число, значение в миллисекундах, по истечении которого связь с модулем будет считаться утерянной;

– флаг активности связи – однобитовая переменная, индицирующая, установлена ли связь с конкретным модулем;

– приемный и передающий буферы, для записи и приема данных из модуля. Размерность буферов будет определена на этапе физического моделирования, после выбора языка программирования и средства связи с автооператором.

Для сущности ПОЗИЦИЯ характеристики атрибутов будут следующими. Для уникального номера позиции и номера альтернативной позиции будет достаточно однобайтового числа, для названия – строки длиной 30 символов, для продолжительности обработки детали – двухбайтового числа.

Все атрибуты сущности НОСИТЕЛЬ будут однобайтовыми числами, кроме типа, который будет булевой переменной (так как носитель может являться только барабаном, либо подвеской).

Таким образом, в концептуальной модели данных можно выделить две сущности, связанные между собой отношением «включать в себя», и две отдельные, не связанные с ними, сущности. На основе этих данных концептуальная модель данных разрабатываемой программы будет выглядеть в соответствии с рисунком 3.1:

Рисунок 3.1 – Концептуальная модель данных

3.2 Разработка диаграмм вариантов использования

Для того чтобы сформулировать общие требования к функциональному поведению проектируемой системы, используем описание функциональности системы через варианты использования (Use Case). Разрабатываемая система представляется в виде множества сущностей или актеров, взаимодействующих с ней с помощью вариантов использования. При этом актером (actor) или действующим лицом называется любая сущность, взаимодействующая с системой извне. Вариант использования служит для описания сервисов, которые система предоставляет актеру. В данном программном обеспечении можно выделить оператора, главного технолога и программиста, как действующих лиц. Реализуем диаграмму вариантов использования с помощью yEd Graph Editor.

Рассмотрим возможных пользователей программы автоматического управления автооператорами гальванической линии. Это могут быть:

– оператор;

– главный технолог;

– программист.

Рассмотрим, какие основные действия могут выполнять вышеописанные пользователи.

Оператор линии должен иметь возможность:

– наблюдать за ходом выполнения технологического процесса;

– запускать новый цикл технологической обработки;

– исключать из цикла одну либо нескольких ванн оцинкования для профилактического обслуживания;

– просматривать список аварий.

Главный технолог должен иметь те же возможности, что и оператор, и помимо этого:

– изменять уставки времени обработки деталей на отдельных позициях;

– добавлять, удалять или редактировать данные о возможных деталях, подлежащих обработке;

– удалять из списка неактивные аварии.

Программист должен обладать в системе наивысшими привилегиями, и должен иметь возможность, помимо всего, что могут сделать оператор и главный технолог:

– изменять системные переменные;

– полостью удалять архивы аварий и событий;

– изменять порядок технологических операций.

На основе этих данных на рисунке 3.2 представлена диаграмма вариантов использования программы:

Рисунок 3.2 – Диаграмма вариантов использования программы различными

пользователями.

3.3 Построение диаграмм состояний

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

Диаграммы состояний, отображенные на рисунках 3.3, 3.4 и 3.5, описывают работу оператора, главного технолога и программиста, соответственно.

Рисунок 3.3 – Диаграмма состояний для оператора программы

автоматического управления

Рисунок 3.4 – Диаграмма состояний для главного технолога программы

автоматического управления

Рисунок 3.5 – Диаграмма состояний для программиста программы

автоматического управления

3.4  Разработка макетов экранных форм

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

Таким образом, меню приложения и интерфейс, должны быть оптимальными (в плане удобства пользования). Макет главной экранной формы проектируемой программы автоматического управления автооператорами гальванической линии представлен на рисунке 3.6:

Рисунок 3.6 – Макет главной экранной формы программы автоматического управления автооператорами

На главной экранной форме должны быть кнопка завершения работы программы по окончанию смены, форма для различных подэкранов (визуализация линии, настройки и пр.), кнопки для выбора различных подэкранов.

Сверху в текстовом виде должны быть название текущего подэкрана, описание активной аварии (если есть) и текущее время.

Макет подэкрана линии, как одного из пунктов экранного меню, размещенного в форме для подэкранов, представлен на рисунке 3.7

Рисунок 3.7 – Макет подэкрана линии

Макет подэкрана запуска цикла техпроцесса, как одного из пунктов экранного меню, размещенного в форме для подэкранов, представлен на рисунке 3.8:

Рисунок 3.8 – Макет экрана запуска техпроцесса

Для редактирования числовых и буквенных переменных потребуется экранная клавиатура. Ее макет представлен на рисунке 3.9:

Рисунок 3.9 – Макет экранной клавиатуры


4 ФИЗИЧЕСКОЕ МОДЕЛИРОВАНИЕ

4.1 Выбор операционной системы, среды разработки и языка программирования

Для реализации поставленной задачи выбрана операционная система Microsoft Windows XP. MS Windows – одна из самых популярных в мире операционных систем благодаря тому, что ее сопровождает большое число компаний.

Windows – это полная многозадачная многопользовательская операционная система. Она достаточно хорошо совместима с рядом стандартов. Большинство свободно распространяемых по сети Internet программ специально откомпилированы для Windows.

Для обеспечения отладки ядро Windows выдает дампы памяти для дальнейшего анализа. Использование дампа и динамических отладчиков позволяет определить причины выхода программы из строя.[15]

Средства быстрой разработки приложений в англоязычной компьютерной литературе [16] имеют лаконичную аббревиатуру – RAD (Rapid Application Development). С ними связывают этап, причем этап революционный, развития информационных технологий. Это естественная реакция компьютерной индустрии на информационные потребности быстроразвивающегося общества.

Идея резкого повышения эффективности средств разработки программ воплощается в современных версиях пакетов программ для создания систем автоматизации обработки данных, которые отвечают требованиям RAD. Можно выделить следующие отличительные черты таких средств разработки:

– наличие объектно-ориентированного языка программирования, позволяющее очень эффективно использовать модульный принцип составления программ;

– визуальные средства разработки, предоставляющие возможность заменить написание программного кода рисованием пользовательского интерфейса и заданием необходимой функциональности диалоговыми средствами;

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

Перечень современных средств разработки систем автоматизации обработки данных, в которых заложены идеи RAD, весьма обширен. Почти каждый месяц появляются новые версии этих продуктов того или иного производителя программного обеспечения. Они включают все новые и новые возможности, облегчающие труд программиста.

Одной из популярных RAD можно назвать Embarcadero RAD Studio XE, которая имеет богатый набор визуальных средств и представляет собой достойную альтернативу продуктам Microsoft. Был выбран вариант с языком программирования Delphi (в среде есть альтернативный, С++)

Процесс разработки в Delphi XE предельно упрощен. В первую очередь это относится к созданию интерфейса, который создается путем переноса нужных компонентов на поверхность Windows-окна (в Delphi оно называется формой). При наличии макетов требуемых форм это не составляет труда. Затем настраиваются свойства элементов с помощью специального инструмента (Object Inspector). С его помощью можно связать события этих компонентов (нажатие на кнопку, выбор мышью элемента в списке и т.д.) с кодом его обработки. Мощные средства отладки (вплоть до пошагового выполнения команд процессора), удобная контекстная справочная система (в том числе и по Microsoft API), средства коллективной работы над проектом, позволяют быстро и эффективно разрабатывать требуемое приложение.

В Delphi XE используется язык Object Pascal, который постоянно расширяется и дополняется Borland. Язык в полной мере поддерживает все требования, предъявляемые к объектно-ориентированному языку программирования. Как и положено строго типизированному языку, классы поддерживают только простое наследование, но зато интерфейсы могут иметь сразу несколько предков. К числу особенностей языка следует отнести поддержку обработки исключительных ситуаций (exceptions), а также перегрузку методов и подпрограмм (overload) в стиле C++.

Некоторые элементы разрабатываемой программы (такие, как изображения носителей, позиций) было решено создавать динамически, в realtime при загрузке программы. Это дает возможность отображать на экране и держать в памяти именно столько элементов, сколько нужно для текущей программы, не больше, и не меньше.

Для экранной клавиатуры использована отдельная форма, вызываемая модально, и отображаемая поверх главного окна. Это не даст возможность «скрыть» форму с клавиатурой за главное окно, пока пользователь не введет данные, либо не нажмет кнопку отмены.

Для сохранения будут использоваться текстовые файлы, так как объемы данных и частота их изменения на настоящий момент небольшие.

4.2 Выбор интерфейса и протокола связи с модулем автооператора

Основные требования, предъявляемые к стандарту физического уровня общей сети:

– совместимость с IBM-совместимым компьютером;

– использование одной витой пары;

– максимальная протяженность (без применения дополнительных устройств - повторителей сигнала) не менее 100м;

– максимальное количество модулей подключаемых к сети не менее 10;

– надежная работа в промышленных цехах;

– скорости работы достаточные для обеспечения связи с модулями не реже 10 раз в секунду;

– хорошая документированность.

С учетом предъявляемых требований был выбран стандарт RS-485.

RS-485 (англ. Recommended Standard 485), EIA-485 (англ. Electronic Industries Alliance-485) – стандарт физического уровня для асинхронного интерфейса. Регламентирует электрические параметры полудуплексной многоточечной дифференциальной линии связи типа «общая шина».

Стандарт приобрел большую популярность и стал основой для создания целого семейства промышленных сетей широко используемых в промышленной автоматизации.

Стандарт RS-485 совместно разработан двумя ассоциациями: Ассоциацией электронной промышленности (EIA – Electronics Industries Association) и Ассоциацией промышленности средств связи (TIA – Telecommunications Industry Association).

В стандарте RS-485 для передачи и приема данных используется одна витая пара проводов, иногда сопровождаемая экранирующей оплеткой или общим проводом. Передача данных осуществляется с помощью дифференциальных сигналов. Разница напряжений между проводниками одной полярности означает логическую единицу, разница другой полярности — ноль.

Для согласования с компьютером были выбраны модули Transio A53 фирмы Moxa. Эти модули преобразуют интерфейс RS-485 в RS-232.

Основные требования, предъявляемые к протоколу передачи данных:

– открытый коммуникационный протокол;

– использование клиент-серверной модели;

– хорошая документированность;

– использование в качестве физического интерфейса RS-485;

– обеспечение высокой надежности;

– максимальное количество модулей подключаемых к сети не менее 10;

– скорости работы, достаточные для связи с модулями не реже 10 раз в секунду.

С учетом предъявляемых требований был выбран протокол ModBus – открытый коммуникационный протокол, основанный на архитектуре «клиент-сервер». Широко применяется в промышленности для организации связи между электронными устройствами. Может использовать для передачи данных последовательные линии связи RS-485, RS-422, RS-232, а также сети TCP/IP (MODBUS TCP).

Modbus был разработан компанией Modicon (в настоящее время принадлежит Schneider Electric) для использования в ее контроллерах с программируемой логикой. Впервые спецификация протокола была опубликована в 1979 году.

Основные достоинства стандарта – открытость и массовость.

Обычно в сети ModBus есть только один клиент, так называемое, «главное» (англ. master) устройство, и несколько серверов – «подчиненных» (slaves) устройств. Главное устройство инициирует транзакции (передает запросы). Главный может адресовать запрос индивидуально подчиненному или инициировать передачу широковещательного сообщения для всех подчиненных устройств. Подчиненное устройство отвечает на запрос, адресованный именно ему. При получении широковещательного запроса ответ не формируется.

Спецификация Modbus описывает структуру запросов и ответов. Их основа — элементарный пакет протокола, так называемый PDU (Protocol Data Unit). Структура PDU, приведенная в таблице 4.1 не зависит от типа линии связи и включает в себя код функции и поле данных. Код функции кодируется однобайтовым полем и может принимать значения в диапазоне 1…127. Диапазон значений 128…255 зарезервирован для кодов ошибок. Поле данных может быть переменной длины. Размер пакета PDU ограничен 253 байтами.

Таблица 4.1 – Структура элементарного пакета протокола PDU

Modbus PDU

Номер функции

Данные

1 байт

N < 253 (байт)

Для передачи пакета по физическим линиям связи PDU помещается в другой пакет, содержащий дополнительные поля. Этот пакет носит название ADU (Application Data Unit). Формат ADU зависит от типа линии связи.

Существуют три основных реализации протокола Modbus, две для передачи данных по последовательным линиям связи, как медным EIA/TIA-232-E (RS-232), EIA-422, EIA/TIA-485-A (RS-485), так и оптическим и радио:

– Modbus ASCII — для обмена используются только ASCII символы. Для проверки целостности используется алгоритм en:Longitudinal redundancy check. Сообщение разделяется на столбцы с помощью символа «:» и заканчивается символами новой строки CR/LF.

– Modbus RTU

и для передачи данных по сетям Ethernet поверх TCP/IP:

– Modbus TCP.

Общая структура ADU представлена в таблице 4.2 (в зависимости от реализации, некоторые из полей могут отсутствовать).

Таблица 4.2 – Общая структура ADU

Адрес ведомого устройства

Номер функции

Данные

Блок обнаружения ошибок

– адрес ведомого устройства – адрес подчиненного устройства, к которому адресован запрос. Ведомые устройства отвечают только на запросы, поступившие в их адрес. Ответ также начинается с адреса отвечающего ведомого устройства, который может изменяться от 1 до 247. Адрес 0 используется для широковещательной передачи, его распознает каждое устройство, адреса в диапазоне 248…255 – зарезервированы;

– номер функции – это следующее однобайтное поле кадра. Оно говорит ведомому устройству, какие данные или выполнение какого действия требует от него ведущее устройство;

– данные – поле содержит информацию, необходимую ведомому устройству для выполнения заданной мастером функции или содержит данные, передаваемые ведомым устройством в ответ на запрос ведущего. Длина и формат поля зависит от номера функции;

– блок обнаружения ошибок – контрольная сумма для проверки отсутствия ошибок в кадре.

Максимальный размер ADU для последовательных сетей RS232/RS485 – 256 байт, для сетей TCP – 260 байт.

В действующей в настоящее время спецификации протокола определяются три категории кодов функций:

– стандартные команды, описание которых опубликовано и утверждено Modbus-IDA. Эта категория включает в себя как уже определенные, так и свободные в настоящее время коды;

– пользовательские команды – два диапазона кодов (от 65 до 72 и от 100 до 110), для которых пользователь может реализовать произвольную функцию. При этом не гарантируется, что какое-то другое устройство не будет использовать тот же самый код для выполнения другой функции;

– зарезервированные, категорию которых входят коды функций, не являющиеся стандартными, но уже используемые в устройствах, производимых различными компаниями. Это коды 9, 10, 13, 14, 41, 42, 90, 91, 125, 126 и 127.

Одно из типичных применений протокола – чтение и запись данных в регистры контроллеров. Спецификация протокола определяет четыре типа данных, информация о которых приведена в таблице 4.3.

Таблица 4.3 – Информация о четырех типах данных

Тип данных

Тип элемента

Тип доступа

Дискретные входы (Discrete Inputs)

Один бит

Только чтение

Регистры флагов (Coils)

Один бит

Чтение и запись

Регистры ввода (Input Registers)

16-битное слово

Только чтение

Регистры хранения (Holding Registers)

16-битное слово

Чтение и запись

Доступ к элементам в каждой таблице осуществляется с помощью 16-битного адреса, первой ячейке соответствует адрес 0.

4.3 Построение физической модели данных

По вышеприведенной концептуальной модели данных была построена физическая модель данных, оформленная в виде массивов структур. В листингах 4.1, 4.2, 4.3 приведены примеры описания, инициализации и работы со структурой позиций:

Листинг 4.1 – Описание структуры:

type

 Pos_type            = record        // Запись для позиции

 length              : Integer;      // Длина позиции

 name                : string;       // Название позиции

 alt_pos             : Byte;         // Номер альтернативной позиции

 min_proc_time       : Integer;      // Минимальное время обработки на позиции

 max_proc_time       : Integer;      // Максимальное время обработки на позиции

   proc_time           : Word;         // Время обработки носителя на данной позиции

 runoff_time         : Byte;         // Время стекания носителя над данной позицией

 holding_order       : Byte;         // Номер позиции в порядке постановки носителей на хранение; если 0, то позиция не может быть позицией для хранения

 Color               : TColor;       // Цвет позиции

 bottom_img          : TPanel;       // Изображение дна позиции

   end;

Листинг 4.2 – Инициализация массива структур, содержащего все позиции:

Pos: array[1..pos_rate] of Pos_type = ( (name: 'Загрузка/выгрузка'; alt_pos: 0;   color: ClBlack;),   // 1

                                         (name: 'Сушка'; alt_pos: 0; color: ClGray;),    // 2

                                         (name: 'Снятие брака'; alt_pos: 0; color: clPurple;),  // 3

                                         (name: 'Химическое обезжиривание'; alt_pos: 0; color: clPurple;),  // 4

                                         (name: 'Промывка холодная'; alt_pos: 0; color: ClBlue;),    // 5

                                         (name: 'Промывка холодная'; alt_pos: 0; color: ClBlue;),    // 6

                                         (name: 'Электрохим. обезжиривание';  alt_pos: 0; color: ClOlive;),   // 7

                                         (name: 'Промывка холодная';  alt_pos: 0;  color: ClBlue;),    // 8

                                         (name: 'Промывка холодная'; alt_pos: 0; color: ClBlue;),    // 9

                                         (name: 'Активация'; alt_pos: 0; color: ClPurple;),  // 10

                                         (name: 'Промывка холодная'; alt_pos: 0; color: ClBlue;),    // 11

                                         (name: 'Промывка холодная'; alt_pos: 0; color: ClBlue;),    // 12

                                         (name: 'Промывка холодная'; alt_pos: 0; color: ClBlue;),    // 13

                                         (name: 'Промывка холодная'; alt_pos: 0; color: ClBlue;),    // 14

                                         (name: 'Пассивация хром 6+'; alt_pos: 0; color: ClMaroon;),  // 15

                                         (name: 'Промывка холодная'; alt_pos: 0; color: ClBlue;),    // 16

                                         (name: 'Промывка холодная'; alt_pos: 0; color: ClBlue;),    // 17

                                         (name: 'Пассивация хром 3+'; alt_pos: 0; color: ClMaroon;),  // 18

                                         (name: 'Промывка тёплая'; alt_pos: 0; color: ClBlue;),    // 19

                                         (name: 'Промывка тёплая'; alt_pos: 0; color: ClBlue;),    // 20

                                         (name: 'Промывка (уловитель)'; alt_pos: 0; color: ClBlue;),    // 21

                                         (name: 'Цинкование'; alt_pos: 24 color: ClOlive;),   // 22

                                         (name: 'Цинкование';  alt_pos: 25; color: ClOlive;),   // 23

                                         (name: 'Цинкование';  alt_pos: 0; color: ClOlive;));  // 24

Количество позиций задается байтовой константой pos_rate.

Листинг 4.3 – Пример работы с записью конкретной позиции:

Pos[3].proc_time := 60; // установить время обработки носителя на позиции 3 – 60 секунд.


5 РЕАЛИЗАЦИЯ И ТЕСТИРОВАНИЕ ПРОГРАММЫ

5.1 Назначение и описание компонентов программы, их исходные тексты

Программа состоит из двух модулей, Main_unit.pas и KeyUnit.pas.

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

При запуске программы по событию «OnShow» главной формы загружаются данные из текстовых файлов, на экране настраиваются элементы визуализации.

Листинг 5.1 – Процедура, вызываемая при запуске программы

procedure TMain_Form.FormShow(Sender: TObject);

  var

 i, c: word;

begin

 init_crc16_tab;// Инициализация таблицы CRC

 PreVis; // Однократная отрисовка визуализации, рассчёт параметров линии

 LoadState; // Загрузка данных

 LoadVL_State;

 LoadPosTimes;

 MainStringGrid.Cells[0,0] := 'Носитель';  // Заполнение таблиц

 MainStringGrid.Cells[1,0] := 'Местонахождение носителя';

 MainStringGrid.Cells[2,0] := 'Техпроцесс';

 MainStringGrid.Cells[3,0] := 'Стадия';

 MainStringGrid.Cells[4,0] := 'Время, с';

 PosStringGrid.Cells[0,0] := 'Позиция';

 PosStringGrid.Cells[1,0] := 'Название позиции';

 PosStringGrid.Cells[2,0] := 'Выдержка';

 PosStringGrid.Cells[3,0] := 'Стекание';

 for i := 1 to pos_rate do

   begin

     //if (Pos[i].max_proc_time > 0) then

       begin

         if (PosStringGrid.RowCount > 2) or (PosStringGrid.Cells[1,1] <> '') then

           PosStringGrid.RowCount := PosStringGrid.RowCount + 1;

         c := c + 1;

         PosStringGrid.Cells[0,c] := IntToStr(i);

         PosStringGrid.Cells[1,c] := Pos[i].name;

         if (Pos[i].max_proc_time > 0) then

           PosStringGrid.Cells[2,c] := IntToStr(Pos[i].proc_time);

         PosStringGrid.Cells[3,c] := IntToStr(Pos[i].runoff_time);

       end;

   end;

 LoadDetails;

 RepaintVL; // Отрисовка визуализации

 OperatorPanel.BringToFront; // Настройка панелей отображения информации

 OperatorPageControl.ActivePageIndex := 0;

 ExtendedPageControl.ActivePageIndex := 0;

 StartTimer.Enabled := True; // запуск таймеров работы

 RepaintVisualization;

 if VirtualLine_RadioButton.Checked then // настройка логики работы

   if AutoMode_rbtn.Checked then

     ProcessTimer.Tag := 4

   else

     ProcessTimer.Tag := 5;

 for i := 0 to DetailStringGrid.ColCount - 1 do

   begin

     with DetailStringGrid do

       begin

         case i of

           0: Cells[i,0] := 'Код';

           1: Cells[i,0] := 'Название';

           2: Cells[i,0] := 'Обработка';

           3: Cells[i,0] := 'Покрытие';

           4: Cells[i,0] := 'Площадь';

           5: Cells[i,0] := 'Вес';

         end;

       end;

     OnStartDetailStringGrid.ColWidths[i] := DetailStringGrid.ColWidths[i];

   end;

 //DetailIndex := 1;

 //DetailSEdit.Text := DetailStringGrid.Cells[2, DetailStringGrid.Row];

 DetailHeightEdit.Text := DetailStringGrid.Cells[3, DetailStringGrid.Row];

 with Chrom3Panel do

   begin

     Font.Color := clRed; Chrom3Panel.Font.Size := 20;

     Tag := 1;

   end;

 Chrom6Panel.Tag := 0;

 Panel6mcm.Font.Color := clRed; Panel6mcm.Font.Size := 48;

 ElectrochDegrAmpDensEdit.Text := '2';

end;

Для связи с устройствами линиями разработаны функции чтения и записи по протоколу ModBus RTU.

Листинг 5.2 – Функция чтения нескольких регистров

function TMain_Form.ModBus_rd(data: plink_type; reg_adr: Word; count: Word) : word;

var

 buf: array [0..256] of byte;

 crc_word, rx_count, regs_count, i, j, reg_value: word;

 p: pointer;

 l: link_type;

begin

 l := data^;

 p := @buf;

 buf[0] := l.dev_adr;                                                   // Готовим посылку: первый байт - адрес устройства

 buf[1] := 3;                                                               // Второй байт - команда, чтение регистров хранения

 buf[2] := Hi(reg_adr);

 buf[3] := Lo(reg_adr);

 buf[4] := Hi(count);

 buf[5] := Lo(count);

 crc_word := CRC16(p,6);

 buf[6] := Lo(crc_word);

 buf[7] := Hi(crc_word);

 RS485.FlushBuffers(true,true);

 RS485.SendData(p,8);

 Result := 0;

 for i := 1 to l.timeout + 1 do

   begin

     if RS485.CountRX = 5 + count * 2 then    // если пришли все ожидаемые байты

       begin

         rx_count := RS485.CountRX;

         RS485.ReadData(p,rx_count);

         crc_word := CRC16(p, rx_count - 2);

           if (Lo(crc_word) = buf[rx_count - 2]) and (Hi(crc_word) = buf[rx_count - 1]) then

             if buf[1] = 3 then

               begin

                 regs_count := buf[2] div 2;

                 for j := 0 to regs_count - 1 do

                   begin

                     reg_value := buf[3 + j * 2];

                     reg_value := reg_value shl 8;

                     reg_value := reg_value or buf[4 + j * 2];

                     l.RX_buf[j] := reg_value;

                   end;

                 result := regs_count;

                 data^ := l;

               end

             else

               begin

                 ErrorFunction_label.Caption := IntToStr(StrToInt(ErrorFunction_label.Caption) + 1);

                 result := 0

               end

           else

             begin

               ErrorIncorrectCRC_label.Caption := IntToStr(StrToInt(ErrorIncorrectCRC_label.Caption) + 1);

               result := 0

             end;

         Break;

       end;

     if i = l.timeout then

       begin

         ErrorIncorrectCount_label.Caption := IntToStr(StrToInt(ErrorIncorrectCount_label.Caption) + 1);

         result := 0;

         Break;

       end;

     Sleep(1);

   end;

end;

Для расстановки носителей на стартовые позиции линии разработан алгоритм, позволяющий исключить лишние движения автооператоров.

Листинг 5.3 – Алгоритм расстановки носителей

procedure TMain_Form.ProcessTimerTimer(Sender: TObject);

var

 i, j, target_pos, distance_to_target, temp_order_no, target_car_no, car_count_for_start_arrangement: Byte;

begin

           case AO[1].command_process of

             0: // Вычисление адресных позиций для расстановки носителей

               begin

                 temp_order_no := pos_rate + 1;

                 target_pos := 0;

                 for i := 1 to Pos_rate do

                   begin  // определение первой по порядку незанятой стартовой позиции

                     if (Pos[i].start_order in [1 .. (temp_order_no - 1)]) and (IsPosBusy(i) = 0) then

                       begin

                         temp_order_no := Pos[i].start_order;

                         target_pos := i;

                       end;

                   end;

                 target_car_no := 0;

                 if target_pos > 0 then

                   begin

                     distance_to_target := pos_rate + 1;

                     for i := 1 to Carriers_rate do

                       if (Carrier[i].location in [1..100]) and

                         not(Pos[Carrier[i].location].start_order in [1 .. Pos[target_pos].start_order]) then

                         begin

                           car_count_for_start_arrangement := 0;

                           for j := 1 to Carriers_rate do

                             if (Carrier[j].location in [1..100]) and not(j = i) and

                               not(Pos[Carrier[j].location].start_order in [1 .. Pos[target_pos].start_order]) then

                                 car_count_for_start_arrangement := car_count_for_start_arrangement + 1;

                           if (car_count_for_start_arrangement < (Abs(Carrier[i].location - target_pos) - 1)) or (Pos[Carrier[i].location].start_order = 0) then

                             if Abs(Carrier[i].location - target_pos) < distance_to_target then

                               begin

                                 distance_to_target := Abs(Carrier[i].location - target_pos);

                                 target_car_no := i;

                               end;

                         end;

                     if target_car_no > 0 then

                       begin

                         with Command do

                           begin

                             AO_no := 1;

                             com_type := True;

                             first_adr := Carrier[target_car_no].location;

                             up_move := true;

                             second_adr := target_pos;

                           end;

                         CommandAssembly(Command);

                       end;

                   end;

                 if ((target_car_no = 0) or (target_pos = 0)) then

                   if AO[1].pos = AO[1].synchro_pos then

                     ProcessTimer.Tag := 4

                   else

                     begin

                       with Command do

                         begin

                           AO_no := 1;

                           com_type := True;

                           first_adr := AO[1].synchro_pos;

                           up_move := false;

                         end;

                       CommandAssembly(Command);

                     end;

               end;

             3:  begin                                 // Секунда ожидания

                   AO[1].command_process := 4;         // И переход к ожиданию неактивности флага автоматического движения

                 end;

end;

В модуле KeyUnit.pas описаны процедуры обработки нажатий кнопок экранной клавиатуры.

Листинг 5.4 – Процедуры обработки нажатий кнопок экранной клавиатуры

procedure TKeyForm.Button_zMouseDown(Sender: TObject; Button: TMouseButton;

 Shift: TShiftState; X, Y: Integer);

begin

 Edit.Text := Edit.Text + TButton(Sender).Caption;

end;

procedure TKeyForm.CancelButtonMouseDown(Sender: TObject; Button: TMouseButton;

 Shift: TShiftState; X, Y: Integer);

begin

 CancelAndExit;

end;

procedure TKeyForm.ClearButtonMouseDown(Sender: TObject; Button: TMouseButton;

 Shift: TShiftState; X, Y: Integer);

begin

 Edit.Text := '';

end;

procedure TKeyForm.FormShow(Sender: TObject);

// temp: Integer;

begin

 HintStaticText.Caption := Main_unit.KeyOptions.hint;

 if Main_unit.KeyOptions.mode then

   begin

     with SmallBoardPanel do

       begin

         SendToBack;

         Visible := False;

         Enabled := False;

       end;

     with BigBoardPanel do

       begin

         BringToFront;

         Visible := True;

         Enabled := True;

       end;

     with Edit do

       begin

         NumbersOnly := False;

         Alignment := taLeftJustify;

         Text := '';

       end;

   end

 else

   begin

     with SmallBoardPanel do

       begin

         BringToFront;

         Visible := True;

         Enabled := True;

       end;

     with BigBoardPanel do

       begin

         SendToBack;

         Visible := False;

         Enabled := False;

       end;

     with Edit do

       begin

         NumbersOnly := True;

         Alignment := taRightJustify;

         Text := '0';

       end;

       {

     if Main_unit.KeyOptions.value > '' then

       temp := StrToInt(Main_unit.KeyOptions.value)

     else

       temp := 0;}

   end;

end;

procedure TKeyForm.SaveAndExit;

begin

 if Main_unit.KeyOptions.mode then

   begin

     if Edit.Text = '' then

       Main_unit.KeyOptions.mode := False

     else

       begin

         Main_unit.KeyOptions.value := Edit.Text;

       end;

   end

 else

   begin

     if Edit.Text = '' then

       Edit.Text := '0';

     if StrToInt(Edit.Text) < Main_unit.KeyOptions.min_value then

       Main_unit.KeyOptions.value := IntToStr(Main_unit.KeyOptions.min_value)

     else

       Main_unit.KeyOptions.value := temp_output_value;

     Main_unit.KeyOptions.mode := True;

   end;

 Close;

end;

procedure TKeyForm.OkButtonMouseDown(Sender: TObject; Button: TMouseButton;

 Shift: TShiftState; X, Y: Integer);

begin

 SaveAndExit;

end;

Листинги всех описанных модулей представлены в приложении Б.

5.2 Выбор панельного компьютера

Компьютер для системы автоматического управления промышленной гальванической линией должен удовлетворять следующим требованиям, приведенным в таблице 5.2.1

Таблица 5.1 – Требования к характеристикам панельного компьютера

Требование

Характеристика

Архитектура

IBM-совместимый

Тип

Панельный

Частота процессора

≥ 1 ГГц

Объем оперативной памяти

≥ 1 ГБ

Объем жесткого диска

50 ГБ

Режим работы дисплея

≥ 1280·1024, Full Color

Размер диагонали дисплея

≥ 17

Количество интерфейсов RS-232

2

Наличие сенсорной панели

Да

Количество портов USB

2

Низкое энергопотребление

Да

В полной мере данным требованиям удовлетворяет панельный компьютер APPC1721T фирмы Nexcomm.

5.3 Тестирование программного обеспечения

Тестирование – один из важнейших этапов процесса разработки программного продукта, который необходим для выявления ошибок программирования или других дефектов, с целью их последующего устранения, что в свою очередь положительным образом сказывается на его качестве.

Цель тестирования – обнаружить все имеющиеся дефекты, чтобы обеспечить полное соответствие программного продукта требованиям, которые к нему предъявляются. По окончанию работ, а часто и в процессе разработки, готовые модули или программный продукт проходят тщательное тестирование.

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

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

Требование удобства эксплуатации также является требованием, предъявляемым к специальному ПО в целом и обеспечивается общей логикой организации пользовательского интерфейса.

Тестовые случаи размещены в таблице 5.2

Таблица 5.2 – Тестовые случаи

Название

модуля/экрана

Описание

тестового случая

Ожидаемые результаты

Тестовый случай пройден?

Да/Нет

Комментарии

1

Главная

форма

Нажатие кнопки

«Меню»

Вход в

расширенное меню

Да

-

2

Главная

форма

Нажатие строки событий

Вход в меню

«Связь»

Да

-

3

Главная

форма

Нажатие поля

для ввода

Вызов экранной клавиатуры

Да

-

4

Форма

экранной

клавиатуры

Попытка ввода числа вне разрешеного

диапазона

Установка граничного числа

диапазона

Да

-

5

Форма

экранной

клавиатуры

Нажатие кнопки «Ок» либо «Отмена»

Закрытие экранной клавиатуры

Да

-

6

Главная

форма

Нажатие кнопки «Сканирование

линии»

Сканирование автооператорами линии при подтверждении запроса

Да

-

7

Главная

форма

Нажатие кнопки

«Завершение работы»

Завершение работы программы при подтверждении запроса

Да

-

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


6 РУКОВОДСТВО ПОЛЬЗОВАТЕЛЯ

При включении компьютера программа запускается автоматически, при этом откроется главная форма приложения, представленная на рисунке 6.1:

Рисунок 6.1 – Главная форма приложения

При первом запуске приложения необходимо определить положение носителей на линии, для чего нужно нажать кнопку «Сканирование линии». При нажатии кнопки приложение выдаст запрос на подтверждение сканирования линии, показанный на рисунке 6.2:

Рисунок 6.2 – Экранная клавиатура с запросом на подтверждение

Для запуска нового техпроцесса следует нажать закладку «Пуск», после этого отобразиться экран пуска техпроцесса, изображенный на рисунке 6.3:

Рисунок 6.3 – Экран запуска техпроцесса

Необходимо выбрать нужный техпроцесс из списка таблицы, нажав на соответствующую строку. Если требуемый техпроцесс не отображается в видимой части таблицы, ее строки следует прокрутить вниз с помощью кнопок «Вниз» или «К концу». После выбора нужного техпроцесса следует ввести количество деталей либо общий вес деталей, пользуясь полями «Количество деталей» либо «Общий вес». Подача команды на пуск техпроцесса завершается нажатием механической кнопки на лицевой панели щита управления линией.

При отсутствии связи с узлами линии в верхней части экрана программы отображется сообщение об аварии связи, изображённое на рисунке 6.4:

Рисунок 6.4 – Сообщение об аварии связи с модулями

При нажатии на это сообщение откроется меню «Связь», изображенное на рисунке 6.5:

Рисунок 6.5 – Экран меню связи с модулями

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


7 ОПРЕДЕЛЕНИЕ ЭКОНОМИЧЕСКОЙ ЭФФЕКТИВНОСТИ РАЗРАБОТКИ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ

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

Годовые эксплуатационные расходы при ручной обработке информации определяются по формуле:

   (7.1)

где  – трудоемкость разового решения задачи вручную, чел-ч. ( = 5);

к – периодичность решения задачи в течение года (к = 255);

– среднечасовая ставка работника, осуществляющего ручной расчет задачи, тыс. руб.;

q – коэффициент, учитывающий процент премий (q = 0.4);

а – коэффициент, учитывающий дополнительную заработную плату (а = 0.15);

b – коэффициент, учитывающий начисления на заработную плату, включая отчисления в фонд социальной защиты населения (b = 0.35).

Трудоемкость разового решения задачи вручную определяется по нормам времени на разработку конструкторской или технологической документации или нормам трудоемкости обслуживания и управления производством в зависимости от темы проекта.

Согласно Постановлению Совета Министров Республики Беларусь от 20.12.2010 года №1844 «Об установлении размера минимальной заработной платы» среднечасовая ставка работника равна:

,                                                               (7.2)

где  – среднечасовая заработная плата;

– тарифный коэффициент для соответствующего разряда ( = 2,48);

тыс.руб.                                           (7.3)

тыс. руб.

Готовые текущие затраты, связаны с эксплуатацией задачи, определяются по формуле:

,                           (7.4)

где  – затраты на заработную плату пользователя программы;

– затраты на оплату аренды ЭВМ при решении задачи.

Затраты на заработную плату пользователя программы определяются по формуле:

,                                             (7.5)

где  – время решения задачи на ЭВМ, час;

– среднечасовая ставка пользователя программы, руб. (определяется аналогично ставке работника, осуществляющего ручной расчет,  = 2.48).

Время решения задачи на ЭВМ определяется по формуле:

,                                           (7.6)

где  – время ввода в ЭВМ исходных данных, необходимых для решения задачи, мин.;

– время вычислений, мин.( = 0.05);

– время вывода результатов решения задачи (включая время распечатки на принтере и графопостроителе), мин. ( = 1);

– коэффициент, учитывающий подготовительно-заключительное время (dпз =0.2).

Время ввода в ЭВМ исходных данных может быть определено по формуле:

,                                                     (7.7)

где  – среднее количество знаков, набираемых с клавиатуры при вводе исходных данных ( = 60);

- норматив набора 100 знаков, мин. (Hz = 3).

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

6.488 тыс.руб.

мин.

час.

тыс.руб.

Затраты на оплату аренды ЭВМ для решения задачи определяются по следующей формуле:

,                                                  (7.8)

где  – стоимость одного машино-часа работы ЭВМ, тыс. руб.

Стоимость машино-часа работы ЭВМ определяется по формуле:

,                 (7.9)

где Сэ – расходы на электроэнергию за час работы ЭВМ, тыс. руб.;

– годовая величина амортизационных отчислений на реновацию ЭВМ, тыс. руб.;

– годовые затраты на ремонт и техническое обслуживание ЭВМ тыс. руб.;

– годовая величина амортизационных отчислений на реновацию производственных площадей, занимаемых ЭВМ. тыс. руб.;

– годовые затраты на ремонт и содержание производственных площадей, тыс. руб.;

– годовая величина налога на недвижимость, тыс. руб.;

– годовой фонд времени работы ЭВМ, час.

Расходы на электроэнергию за час работы ЭВМ определяются по формуле:

,                                                   (7.10)

где  – установленная мощность электродвигателя ЭВМ, кВт ( = 0.35),

– коэффициент  использования энергоустановок по мощности ( = 0.9);

– стоимость 1 кВт-часа электроэнергии, тыс. руб;

– среднечасовое потребление электроэнергии ЭВМ, кВт.

тыс.руб.

Годовая величина амортизационных отчислений на реновацию ЭВМ определяется по формуле:

,             (7.12)

где  – цена ЭВМ на момент ее выпуска, тыс. руб. ( = 1200 тыс.руб.);

– коэффициент удорожания ЭВМ ( = 1);

– коэффициент, учитывающий затраты на монтаж и транспортировку ЭВМ ( = 1.05);

– норма амортизационных отчислений на ЭВМ,%

– балансовая стоимость ЭВМ, тыс.руб.

=  тыс.руб.

тыс.руб.

Годовые затраты на ремонт и техническое обслуживание ЭВМ укрупнено могут быть определены по формуле:

,                                            (7.13)

где  – коэффициент, учитывающий затраты на ремонт и техническое обслуживание ЭВМ, в том числе затраты на запчасти, зарплату ремонтного персонала и др.

( = 0.1).

тыс.руб.

Годовая величина амортизационных отчислений на реновацию производственных площадей, занятых ЭВМ определяется по формуле:

,                         (7.14)

где  – балансовая стоимость площадей, тыс. руб.,

– норма амортизационных отчислений на производственные площади, %

( = 1.2);

– площадь, занимаемая ЭВМ, кв. м. ( = 2.5);

– коэффициент, учитывающий дополнительную площадь

– цена 1 квадратного метра площади, тыс. руб. ( = 520).

=

= тыс.руб.

Годовые затраты на ремонт и содержание производственных площадей укрупнено могут быть определены по формуле:

,                                                     (7.15)

где  – коэффициент, учитывающий затраты на ремонт и эксплуатацию производственных площадей ( = 0.05).

=  тыс.руб.

Величина налога на недвижимость определяется по формуле:

,                                           (7.16)

где  – ставка налога на недвижимость ( = 0.01).

тыс.руб.

Годовой фонд времени работы ЭВМ определяется исходя из режима ее работы и может быть рассчитан по формуле:

,                                                           (7.17)

где  – среднесуточная фактическая загрузка ЭВМ, час. ( = 12);

– среднее количество дней работы ЭВМ в год ( = 255).

час.

тыс.руб.

Прирост условной прибыли в результате внедрения задачи определяется по формуле:

,                                             (7.18)

где  - ставка налога на прибыль ( = 0.24).

тыс.руб.

тыс.руб.

тыс.руб.

Для определения годового экономического эффекта от разработанной программы необходимо определить суммарные капитальные затраты на разработку и внедрения программы по формуле:

                                                       (7.19)

где  – капитальные и приравненные к ним затраты, руб.;

– отпускная цена программы, руб.

Капитальные и приравненные к ним затраты определяются следующим образом:

1) в случае, если необходимо приобретение новой ЭВМ для решения комплекса задач, в который входит рассматриваемая, по формуле:

,                                              (7.20)

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

2) в случае, если ЭВМ, на которой предполагается решать рассматриваемую задачу, отслужила к моменту расчета X лет (X = 3), по формуле

;                     (7.21)

тыс. руб.

Отпускная цена программы определяется по формуле:

                                         (7.22)

где  – оптовая цена программы, руб.;

– затраты на заработную плату разработчиков программы, тыс.руб.;

– размер плановой прибыли на программу, тыс.руб.;

– ставка налога на добавленную стоимость ( = 0.2).

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

,                                       (7.23)

где  - трудоемкость разработки программы, час;

- среднечасовая ставка работника, осуществляющего разработку программы, руб.

Трудоемкость разработки программы включает время на постановку задачи и время на программирование задачи и определяется по формуле:

,                                                 (7.24)

где  – количество этапов разработки программы;

– трудоемкость постановки задачи на i-м этапе разработки программы, дней;

– трудоемкость программирования задачи на i-м этапе разработки программы, дней.

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

                                     (7.25)

где  – трудоемкость подготовки описания задачи и исследования алгоритма решения;

– трудоемкость разработки блок-схемы алгоритма;

– трудоемкость программирования по готовой блок-схеме;

– трудоемкость отладки программы на ЭВМ;

– трудоемкость подготовки документации по задаче в рукописи;

– трудоемкость редактирования, печати и оформления документации по задаче.

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

,                                                                (7.26)

где  – число операторов в программе;

– коэффициент сложности программы;

– коэффициент коррекции программы в ходе ее разработки.

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

Коэффициент коррекции программ характеризует увеличение объема работ за счет внесения изменений в алгоритм и программу, изменения состава и структуры информации, а также уточнений, вносимых разработчиком программы для улучшения ее качества без изменения постановки задачи. Значение может быть принято равным 0.15...0.5.

Тогда составляющие трудоемкости разработки программы определятся по формулам:

;                                              (7.27)

;                                                 (7.28)

;                                                   (7.29)

;                                                     (7.30)

;                                                     (7.31)

.                                                           (7.32)

где  – коэффициент увеличения затрат труда вследствие недостаточного или некачественного описания задачи ( = 1.2...1.5);

– коэффициент квалификации разработчика алгоритмов и программ (при стаже работы от трех до пяти лет  = 1.1…1.2). Получаем:

= 1.2;

= 1.2

тыс.руб.;

тыс.руб.

Нормы времени учитывают ряд факторов, наибольшим образом влияющих на трудоемкость разработки проекта:

1) количество разновидностей форм входной информации;

2) количество разновидностей форм выходной информации;

3) степень новизны задачи;

4) сложность алгоритма;

5) вид используемой информации;

6) сложность контроля входной и выходной информации;

7) язык программирования;

8) объем входной информации;

9) использование типовых решений, типовых проектов и программ,

10) стандартных модулей.

Предусмотрено четыре степени новизны разрабатываемых задач:

1) разработка задач, предусматривающая применение принципиально новых методов разработки, проведение научно-исследовательских работ;

2) разработка типовых проектных решений, оригинальных задач и систем, не имеющих аналогов;

3) разработка проекта с использованием типовых проектных решений при условии их изменения, разработка проектов, имеющих аналогичные решения;

4) привязка типовых проектных решений.

Сложность алгоритма представлена тремя группами:

1) алгоритмы оптимизации и моделирования систем и объектов;

2) алгоритмы учета, отчетности, статистики и поиска;

3) алгоритмы, реализующие стандартные методы решения, а также не предусматривающие применения сложных численных и логических методов.

Данная программа относится к степени 3 новизны разрабатываемой задачи (разработка проекта с использованием типовых проектных решений при условии их изменения, разработка проектов, имеющих аналогичные решения). Сложность алгоритма решаемой задачи – 1 (алгоритмы оптимизации и моделирования систем и объектов).

Плановая прибыль на программу определяется по формуле:

,                                                    (7.33)

где  – себестоимость программы, тыс. руб.;

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

Себестоимость программы определяется по формуле:

,                                              (7.34)

где  – коэффициент накладных расходов проектной организации без учета эксплуатации ЭВМ (при отсутствии данных принять  = 1.16);

– затраты на отладку программы.

Затраты на отладку программы определяются по формуле:

,                                                  (7.35)

где  – трудоемкость отладки программы, час ().

тыс.руб.;

тыс.руб.;

Оптовая цена программы определяется по формуле:

;                                                      (7.36)

тыс.руб. ;

тыс.руб.;

тыс.руб.

Ожидаемый годовой экономический эффект от сокращения ручного труда при обработке информации определяется по формуле:

,                              (7.37)

где  – коэффициент эффективности, равный ставке за кредиты на рынке долгосрочных кредитов ( = 0,25).

тыс.руб.

Срок возврата инвестиций определяется по формуле:

;                                                   (7.38)

Результаты расчета сводятся в таблице 7.1.

Таблица 7.1 – Технико-экономические показатели проекта

Наименование показателя

Базовый вариант

Проектный вариант

1. Трудоемкость решения задачи, час.

5

0.057

2. Периодичность решения задачи, раз/год

255

255

3. Годовые текущие затраты, связанные с решение задачи, тыс.руб.

17980.7

209.078

4. Отпускная цена программы, тыс.руб.

-

2805.1

5. Степень новизны программы

-

3

6. Группа сложности алгоритма

-

1

7. Прирост условной прибыли, тыс.руб.

-

13506.43

8. Ожидаемый годовой экономический эффект, тыс.руб.

-

9817.72

9. Срок возврата инвестиций, лет

-

0.21

Разработанное приложение системы автоматического управления автооператорами промышленной гальванической линии обеспечивает получение годового экономического эффекта в сумме 9817.72 тыс.руб. при отпускной цене программы 2805.1 тыс. руб.

Проект обеспечивает возврат инвестиций за 0.21 года и прирост условной прибыли 13506.43 тыс.руб.


8 ОХРАНА ТРУДА

8.1 Производственная санитария

Производственная санитария – это система организационных мероприятий и технических средств, предотвращающих или уменьшающих воздействие на работников вредных  производственных факторов.

Вредный производственный фактор – производственный фактор, воздействие которого на работника в определенных условиях приводит к заболеванию или снижению работоспособности [1].

Разработка приложения производилась в помещении вычислительного центра с шириной 3,7 м, длиной – 5,4 м, высотой – 3,3 м. Размеры помещения вычислительного центра (ВЦ), соответствуют нормируемым величинам по площади и объему на одного работающего с учетом размещаемого в помещении технологического оборудования. В соответствии с нормами производственной санитарии объем производственного помещения на одного работающего составляет не менее 20 м3 , с площадью помещения не менее 6 м2 [13].

8.1.1 Микроклимат в помещениях вычислительного центра

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

Относительная влажность в пределах 40–60% мало сказывается на состоянии человека. При влажности 99–100% практически выключается регулирующий механизм потоотделения и быстро наступает перегревание.

Контроль параметров микроклимата помещения вычислительного центра осуществляют с помощью приборов периодического и непрерывного измерений. Измерения производятся в дни с температурой наружного воздуха, отличающейся от среднемесячной не более чем на 5°С, не менее 3-х раз в смену и в нескольких точках рабочей зоны.

Полученные результаты измерений сравнивают с нормируемыми величинами. В помещениях ВЦ для обеспечения требуемых показателей микроклимата, используются системы отопления, кондиционирования и вентиляции, отвечающие требованиям СНиП 2.04.05.

Требования к показателям микроклимата, согласно ГОСТ 12.1.005 [5], приведены в таблице 8.1.

Таблица 8.1 – Требования к параметрам микроклимата в производственном помещении

Параметры микроклимата

Значения параметров

зимой

летом

Температура, °C

2224

2325

Скорость воздушных масс, м/с

0.1

0.10.2

Относительная влажность, %

40-60

Требуемые параметры микроклимата поддерживаются в указанных пределах путем использования в холодное время системы водяного отопления, с нагревом воды до 100°С, а в теплое – за счет кондиционирования и вентиляции воздуха.

8.1.2 Шум и вибрация в помещениях вычислительного центра

Одним из вредных производственных факторов в вычислительном центре являются шумы. С точки зрения воздействий на человека шумы могут быть различны:

- постоянны (действуют в течение всего рабочего дня);

- случайны.

В помещениях вычислительных центров источниками шума являются: периферийная оргтехника, множительная техника, сетевое оборудование, аппаратура и оборудование для кондиционирования воздуха, в самих ПЭВМ – вентиляторы систем охлаждения и трансформаторы, накопители и средства ввода-вывода информации, а также шум, проникающим в помещение извне.

Оптимальные показатели уровня шумов в рабочих помещениях конструкторских бюро, кабинетах расчетчиков, программистов нормируются в соответствии с СанПиН 2.2.4/2.1.8.10 – 32 – 2002. При работе на ЭВМ уровень шума не должен превышать 50дБА. В помещениях, где работают операторы ЭВМ без дисплеев, уровень шума не должен превышать 65 дБА. На рабочих местах в помещениях для размещения шумных агрегатов вычислительных машин уровень шума не должен превышать 75 дБА.

Для уменьшения шума и вибрации в помещении оборудование, аппараты и приборы  устанавливаются на специальные фундаменты и амортизирующие прокладки. Если стены и потолки помещения являются источниками шумообразования, они должны быть облицованы звукопоглощающим материалом.

Для устранения или ослабления неблагоприятных шумовых воздействий целесообразно изолировать рабочие помещения, размещая их в частях здания, наиболее удаленных от городского шума – расположенных в глубине здания, обращенных окнами во двор и т.п. Шум ослабевает также благодаря зеленым насаждениям, поглощающим звуки. На практике часто применяются и такие методы как: снижение шума в источнике возникновения, изменение его направленности, уменьшение шума на пути его распространения. Все средства и методы защиты от шума определяются в соответствии с ГОСТ 12.1.003 [2].

8.1.3 Электромагнитные излучения

Для защиты от вредного воздействия излучений возможно применение заземленных защитных экранов, значительно уменьшающих их интенсивность. Спецификация определяет уровень электромагнитного излучения мониторов для двух полос частот: 5 Гц – 2 кГц и 2–400 кГц. Напряженность электрического поля в нижней полосе не должна превышать 25 В/м, в верхней – 2.5 В/м.

Для экранов применяют материалы с высокой электрической проводимостью (сталь, медь, алюминий, латунь) в виде листов толщиной не менее 0,5 мм или сетки с ячейками не более 4·4 мм. Каждый экран заземляется.

Допустимые уровни напряженности электромагнитных полей, излучаемых клавиатурой, системным блоком, манипулятором «мышь» и иными вновь разработанными устройствами в зависимости от основной рабочей частоты изделия не превышают значений, приведенных в таблице 8.2.

Таблица 8.2 – Допустимые уровни электромагнитных излучений

Диапазон частот

0,3 -300 Гц

0,3 – 30 МГц

3 -30 МГц

30 -300 МГц

Допустимые уровни

25 В/м

15 В/м

10 В/м

3 В/м

Основными мероприятиями, направленными на снижение опасности воздействия электромагнитного излучения являются:

– снижение интенсивности источника;

– защитное экранирование источника и рабочего места;

– использование средств индивидуальной защиты;

– лечебно-профилактические мероприятия.

8.1.4 Освещение в вычислительном центре

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

Для реализации поставленной задачи принимают ряд мер, важнейшими из которых являются:

– обеспечение уровня освещенности и контрастности на экране и вокруг него, которые обеспечивают зрительный комфорт и позволяют оператору быстро адаптироваться к типу поставленной задачи;

– обеспечение равномерной яркости в различных зонах зрительного пространства, с целью исключения зрительного комфорта;

– применение в окраске внутренних поверхностей (стен, потолков) помещений цветов, стимулирующих умственную деятельность, сосредоточение внимания, снятие психофизиологического напряжения.

В зависимости от источника света, производственное освещение может быть естественным, искусственным и совмещенным. Искусственное освещение по месту расположения светильников используется двух систем: общее и комбинированное. Для освещения рабочих мест операторов ВЦ применяется одностороннее боковое естественное освещение. В случаях, когда естественного освещения в помещении недостаточно, используют комбинированное освещение (общее и местное).

При выборе требуемого минимального уровня освещенности рабочего места необходимо установить разряд (характер) выполняемой зрительной работы. Его определяют по наименьшему размеру различения. Зрительная работа, проводимая в помещениях ВЦ, относится к II – V разрядам зрительной работы.

Нормирование естественного освещения производится с помощью относительного показателя – коэффициента естественной освещенности (КЕО, е). При боковом одностороннем освещении нормируется минимальное значение КЕО.

КЕО для помещений ВЦ составляет не менее 1,5% при боковом естественном освещении.

Нормирование искусственного освещения оценивается непосредственно по освещенности рабочей поверхности (Е, лк). При выборе нормы освещенности кроме характера (разряда) зрительной работы учитывается контраст объекта различения с фоном и характеристика фона, на котором рассматривается объект (т.е. определяется один из четырех подразрядов зрительной работы) [14].

Расчет искусственного освещения в помещениях можно производить четырьмя методами: точечным, ватт (по таблицам удельной мощности), графическим и методом использования светового потока. Метод коэффициента использования светового потока наиболее применим для расчета общего равномерного освещения помещения в условиях эксплуатации промышленных предприятий. При расчете этим методом учитывается как прямой свет от светильника, так и свет, отраженный от стен и потолка.

Световой поток лампы светильника определяется по формуле 8.1:

,                                                     (8.1)

где Emin – нормативная освещенность, лк;

S – площадь освещаемого помещения, м2;

К – коэффициент запаса, учитывающий снижение освещенности в процессе эксплуатации вследствие загрязнения и старения источников света (ламп и светильников), а также снижения отражающих свойств поверхностей помещения;

Z – коэффициент, характеризующий неравномерность освещения. Он зависит от отношения расстояния между светильниками (L) к высоте их подвеса (hp), с увеличением этого отношения (L/hp) значение Z возрастает. При проведение расчетов рекомендуется принимать значение Z равным 1.1 для люминесцентных ламп и 1.15 для ламп накаливания;

n – количество светильников (или ламп);

η – коэффициент использования светового потока, равный отношению светового потока, падающего на рабочую поверхность, к суммарному потоку всех ламп.

Расположение светильников – симметричное в один ряд. Симметричное размещение светильников обеспечивает одинаковое освещение оборудования и рабочих поверхностей.

Определяем высоту расположения светильников над освещаемой поверхностью    

по формуле 8.2:

,                                                    (8.2)

где Н – общая высота помещения (H = 3.3 м);

hc – высота от потолка до нижней части светильника (hc = 0.15);

hp – высота от пола до освещаемой поверхности (hp = 0.7 м).

.

Определяем отношение расстояния между светильниками L к высоте их подвеса Hc. В соответствии с рекомендация, принимаем данное соотношение равным 1.4. Откуда находим L по формуле 8.3:

;                                                       (8.3)

Найдем нужное число светильников (формула 8.4):

;                                                             (8.4)

шт.

Определяем показатель помещения по формуле 8.5:

,                                                       (8.5)

где а – длина помещения (а = 5.4 м);

b – ширина помещения (b = 3.7 м).

В соответствии со справочными данными, определим значение коэффициентов отражения потолка (белая краска) ρпот = 0.7, стен (краска бежевого оттенка) ρст = 0.5, рабочей поверхности (потемневшее дерево) ρр = 0.3 [14].

По найденному показателю помещения i и значениям коэффициентов отражения потолка, стен и рабочей поверхности, по соответствующим таблицам определим значение коэффициента использования светового потока η. Т.о. η принимаем равным 0.46.

Согласно классификации помещения ВЦ относятся к помещениям общественных и жилых зданий с нормальными условиями среды. В соответствии с этим, значение коэффициента запаса К будет равно 1.4. Величина коэффициента неравномерности z определяется из отношения (формула 8.6):

,                                                            (8.6)

где Еср – средняя освещенность (Еср = 300 лк);

Еmin – наименьшая освещенность (Еmin = 200 лк, при освещении помещений ВЦ и экрана дисплея [13]).

.

Таким образом, подставив полученные значения в формулу (8.1), получим:

По найденному значению светового потока определяется мощность и тип лампы.

Для искусственного освещения помещений ВЦ рекомендуется использовать люминесцентные лампы, у которых высокая световая отдача (до 75 лм/Вт и более), большой срок службы (до 10000 часов), малая яркость. Одним из недостатков таких ламп является высокая пульсация светового потока, вызывающая утомление зрения.

Исходя из результатов расчета и учитывая, что в светильник устанавливают по две лампы, оптимальными будут варианты люминесцентны ламп со стандартными значениями светового потока – 1890 лм и мощностью –30 Вт. К ним относятся лампы типа ЛБ-30-4.

Для ограничения неблагоприятного действия пульсирующих световых потоков  установлены предельные значения коэффициентов пульсации освещенности рабочих мест в пределах 10–20 % в зависимости от разряда зрительной работы [14].

8.1.5 Рабочее место программиста

Согласно СанПиН 9-131 РБ 2000, рабочее место – место постоянного или временного пребывания работника в процессе трудовой деятельности [13].

Рабочее место и взаимное расположение всех его элементов должно соответствовать антропометрическим, физическим и психологическим требованиям. При организации рабочего места программиста должны быть соблюдены следующие основные условия:

– оптимальное размещение оборудования, входящего в состав рабочего места и достаточное рабочее пространство, позволяющее осуществлять все необходимые движения и перемещения;

– необходимо естественное и искусственное освещение для выполнения поставленных задач;

– уровень акустического шума не должен превышать допустимого значения;

– достаточная вентиляция рабочего места.

Главными элементами рабочего места программиста являются письменный стол и кресло.

Высота рабочей поверхности рекомендуется в пределах 680–800 мм. Глубина и ширина стола 800–1000 и 800–1200 мм соответственно. Стол должен быть оборудован подставкой для ног: ширина подставки не менее 300 мм, глубина – не менее 400 мм. Размеры и форма стола должна предусматривать возможность размещения документов справа и слева

Высота рабочей поверхности, на которую устанавливается клавиатура, должна быть 650 мм. Клавиатуру располагают на поверхности стола на расстоянии 100–200 мм от края, обращенного к пользователю.

Большое значение придается характеристикам рабочего кресла. Рекомендуемая высота сиденья над уровнем пола должна быть в пределах 400–550 мм.

Экран монитора должен находиться от глаз пользователя на оптимальном расстоянии 600–700 мм, расстояние от глаз до клавиатуры 400 мм, расстояние от глаз до документов 500 мм. Должна существовать возможность регулирования экрана по высоте, по наклону, в левом и в правом направлениях.

Продолжительность непрерывной работы с компьютером не должна превышать 2 часов.

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

Существуют требования к помещению, в котором располагается вычислительный центр. Его площадь из расчета на одного человека следует предусматривать не менее 6.0 м2, а объем воздуха – не менее 20 м3. Ширина проходов в вычислительном центре должна быть не менее 1 метра.

В помещениях, где эксплуатируются компьютеры, искусственное освещение должно быть общим и равномерным. Освещенность поверхности стола в зоне размещения рабочего документа должна составлять 300–500 лк. Рабочие места должны располагаться таким образом, чтобы естественный свет падал сбоку, преимущественно слева.

Схемы размещения рабочих мест должны учитывать расстояние между рабочими столами с мониторами, которое должно быть не менее 2 м, а между боковыми поверхностями мониторов – не менее 1.2 м.

Для поддержания в помещении нормального, отвечающего гигиеническим требованиям состава воздуха, удаления из него вредных газов, паров и пыли должна быть организована вентиляция. В вычислительном центре должна использоваться естественная или искусственная вентиляция, либо их сочетание – смешанная вентиляция.

8.2 Техника безопасности

В вычислительных центрах размещены ЭВМ, ПЭВМ, дисплеи, периферийное и вспомогательное электрооборудование (кондиционеры, вентиляторы, светильники и т.п.). Снабжение электроэнергией происходит через сеть напряжением 220 В.

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

Электробезопасность – это система организационных мероприятий, технических средств, обеспечивающих защиту человека от воздействия электрического тока, дуги, электромагнитного поля и статического электричества, в соответствии с ГОСТ 12.1.009 [6].

Основными причинами электротравматизма являются:

– случайное прикосновение к токоведущим частям;

– неисправность защитных средств;

– повреждения изоляции;

– замыкание фаз на землю;

– появление напряжения на токоведущих частях оборудования в результате ошибочного включения тогда, когда на нем выполняют работу;

– наведение напряжения от соседних работающих установок и т. д.

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

При проведении работ в электроустановках необходимо строго выполнять и соблюдать соответствующие организационные и технические мероприятия. К организационным мероприятиям относят обучение, инструктажи, оформление работы нарядом или устным распоряжением, допуск к работе, надзор во время работы, оформление перерыва в работе.

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

Кроме того, на рабочем месте оператора ЭВМ необходимо обеспечить защиту от статического электричества.

В вычислительных центрах разрядные токи статического электричества чаще всего возникают при прикосновении обслуживающего персонала к любому из элементов ЭВМ. Такие разряды могут привести к выходу из строя ЭВМ. Они оказывают неблагоприятное воздействие на работающих, ухудшают условия труда.

Для снижения величины возникающих разрядов статического электричества в ВЦ, покрытие технологических полов следует выполнять из однослойного антистатического линолеума марки АСН. К общим мерам защиты от статического электричества в ВЦ можно отнести увлажнение воздуха (до 75%), ионизацию воздуха. Данные защитные меры регламентирует ГОСТ 12.4.124 [7].

8.3 Пожарная безопасность

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

Основные причины пожара в помещениях ВЦ носят электрический и неэлектрический характер [4].

К причинам возникновения пожаров относятся:

– неосторожное и халатное обращение с огнем;

– неправильное устройство или неисправность отопления;

– неисправность оборудования и нарушение режима производственного процесса;

– короткое замыкание;

– перегрузка проводов сети.

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

К организационно-техническим мероприятиям относятся:

– соблюдение норм и правил содержания помещений ВЦ, обязательный противопожарный инструктаж работников и служащих;

– соблюдение противопожарных правил, норм при проектировании помещений, при устройстве электропроводов и оборудования, отопления, вентиляции, освещения.

– запрещение курения в не установленных местах, производство пожароопасных работ в помещении машинного зала ВЦ.

Для пожаротушения и локализации очага возгорания в ВЦ применяются следующие методы:

– применение порошковых огнетушителей типа ОП-10 согласно ГОСТ 12.1.038 [4];

– система сигнализации.


ЗАКЛЮЧЕНИЕ

Целью данного дипломного проекта являлась разработка системы автоматического управления автооператорами промышленной гальванической линии. Для достижения результата были успешно решены следующие задачи:

1) проведен обзор существующих решений систем автоматического управления автооператорами, а также изучена литература по вопросу;

2) изучена предметная область задачи: проведен сбор и систематизация различной информации необходимой для написания приложения;

3) разработана концептуальная модель данных и диаграмма вариантов использования системы;

4) проведен выбор операционной системы, языка и среды программирования;

3) разработана система автоматического управления автооператорами;

4) разработанное ПО прошло этап тщательного тестирования;

5) проведена калькуляция экономического эффекта, полученного от разработанного ПО;

6) в заключительной части работы освещены вопросы, связанные с охраной труда и техникой безопасности.

Разработанный проект в скором времени будет внедрен на завод «ВЗЭП», г. Витебск. ПО имеет большую значимость в работе предприятий, связанных с гальванической промышленностью.


СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ

1 ГОСТ 12.0.002 Система стандартов безопасности труда. Термины и определения.

2 ГОСТ 12.1.003 ССБТ Шум и вибрация.

3 ГОСТ 12.1.038 Электробезопасность. Предельно допустимые значения напряжений прикосновения и токов.

4 ГОСТ 12.1.004 Пожарная безопасность.

5 ГОСТ 12.1.005 Общие санитарно-гигиенические требования к воздуху рабочей зоны.

6 ГОСТ 12.1.009 Электробезопасность. Термины и определения.

7 ГОСТ 12.4.124 Средства защиты от статического электричества. Общие технические требования.

8 ГОСТ 2.104–2006 Единая система конструкторской документации. Основные надписи.

9 ГОСТ 2.105–95 Единая система конструкторской документации. Общие требования к текстовым документам.

10 Большая советская энциклопедия, т. 15 : справочное издание / А. М. Прохоров [и др.] ; под ред. А. М. Прохоров. – Изд. 3-е, – Москва : Советская энциклопедия, 1974. – 632 с.

11 Гибкие автоматизированные гальванические линии : Справочник / В. Л. Зубченко [и др.] ; под общ. ред. В. Л. Зубченко. – Москва : Машиностроение, 1989. – 672 с. – ISBN 5-217-00391-Х.

12 Методические указания к выполнению дипломного проекта для студентов специальностей 1 40 01 01 «Программное обеспечение информационных технологий», 1 40 01 02 «Информационные системы и технологии», 1 53 01 02 «Автоматизированные системы обработки информации» / Сост. В.И.Лакин, И.А.Бухвалова, Ю.Б.Попова. – Минск.: БНТУ, 2011. – 30 с.

13 СанПиН 9-131 РБ Гигиенические требования к видеодисплейным терминалам, электронно-вычислительным машинам и организации работы.

14 СНБ 2.04.05 Естественное и искусственное освещение.

15 Фленов, М. Библия Delphi. – СПб.: БХВ, 2011. – 688 с.

16 Хомоненко, А.Д. Самоучитель Delphi / В.Э. Гофман. – СПб.: БХВ, 2008. – 576 с.

17 Хомоненко, А.Д. Delphi 7 / В.Э. Гофман. – СПб.: БХВ, 2010. – 1216 с.


ПРИЛОЖЕНИЕ А. 

Диаграмма вариантов использования

Рисунок А1 – Диаграмма вариантов использования


ПРИЛОЖЕНИЕ Б. 

Листинг программы

unit Main_unit;

interface

uses

 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

 Dialogs, StdCtrls, ExtCtrls, CPDrv, ComCtrls, Keyboard, Grids, Buttons, ImgList,

 XPMan, ButtonGroup;

type

 link_type           = record      // Запись для связи с устройством

 // Входные и выходные буферы регистров

 TX_buf              : array [0..20] of Word;  // Выходной

 RX_buf              : array [0..20] of Word;  // Входной

 BaudRate            : Integer;                // Скорость передачи данных по сети

 end;

type

 AO_type             = record      // Запись свойств автооператора

 link                : link_type;

// === Далее идут параметры исключительно параметры автооператора ===

 command_process     : byte;       // Байт состояния посылки автооператору:

 first_pos           : Byte;       // Первая позиция

 synchro_pos         : Byte;       // Позиция синхронизации

 last_pos            : Byte;       // Последняя позиция

 end;

type

 TMain_Form = class(TForm)

   Timer2                    : TTimer;

   TimeLabel                 : TLabel;

   MainLink_stxt             : TStaticText;

   RS485: TCommPortDriver;

   StartTimer: TTimer;

   LinkTimer: TTimer;

   ProcessTimer: TTimer;

   Carriers_ImageList: TImageList;

   AOImageList: TImageList;

   BogieImageList: TImageList;

   eCarriers_ImageList: TImageList;

   procedure Button3Click(Sender: TObject);

   procedure ProcessTimerTimer(Sender: TObject);

   procedure LinkTimerTimer(Sender: TObject);

   procedure FormCreate(Sender: TObject);

   procedure ExtendedPageControlChange(Sender: TObject);

//    procedure ResetOutputVirtualAOs;

   procedure CarrierAssigmentNumber(no: Byte);

   procedure MainLink_stxtChange;

   function ModBus_rd(data: plink_type; reg_adr: Word; count: Word) : word;

   function ModBus_wr(data: plink_type; reg_adr: Word; count: Word) : word;

   function CheckAllConnect : Boolean;

   { Private declarations }

 public

   { Public declarations }

 end;

type

 Carrier_type            = record    // Запись для носителя

 style                   : boolean;  // Тип носителя: True - подвеска, False - барабан

 no                      : Byte;     // Номер носителя (для каждого типа номера свои)

 location                : Byte;     // Положение носителя ( 0 - вне линии, 101..10x (где x - количество автооператоров на данной линии) - на автооператоре x, 1..pos_rate - на указанной позиции

 time                    : Integer;  // Время, которое осталось обрабатываться носителю на данной стадии

 end;

type

 Pos_type            = record        // Запись для позиции

 length              : Integer;      // Длина позиции

 name                : string;       // Название позиции

 alt_pos             : Byte;         // Номер альтернативной позиции, если текущая занята; 0, если у позиции нет замещающей позиции

 min_proc_time       : Integer;      // Минимальное время обработки на позиции

 max_proc_time       : Integer;      // Максимальное время обработки на позиции

 end;

const

 AO_rate                 = Integer (2);        // Количество автооператоров на линии

 pos_rate                = Integer (24);       // Количество позиций на линии

 Carriers_rate           = Integer (6);        // Количество носителей на линии

 MPLC_rate               = Integer (1);        // Количество контроллеров щита управления

 IO_rate                 = Integer (1);        // Количество модулей дискретного ввода/вывода

 P_16                    = $A001;              // Константа для рассчёта CRC16, контрольной суммы для ModBus связи

 start_pos_no            = Integer (1);        // Номер стартовой позиции

 var

 Main_Form: TMain_Form;

 iii: Byte;

 last_state_auto_move: Boolean;

 last_state_byte: Byte;

 // Массив автооператоров

 AO: array [1..AO_rate] of AO_type = ((link: (dev_adr: 101; timeout: 15); first_pos: 1;  synchro_pos: 5;  last_pos: 14; past_pos: 5;),

                                     (link: (dev_adr: 102; timeout: 15); first_pos: 11; synchro_pos: 16; last_pos: 24; past_pos: 16;));

 // Массив, хранящий данные о носителях

 Carrier : array [1..Carriers_rate] of Carrier_type = ((style: Pod; no: 1),  // 1 носитель

                                                       (style: Pod; no: 2),  // 2 носитель

                                                       (style: Pod; no: 3),  // 3 носитель

                                                       (style: Pod; no: 4),  // 4 носитель

                                                       (style: Pod; no: 5),  // 5 носитель

                                                       (style: Pod; no: 6)); // 6 носитель

 KeyOptions: KeyStruct; // Структура для обмена данными с виртуально клавиатурой

 crc_tab16: array[0..255] of word; // Таблица для расчёта CRC

 event_strings, details_strings: TStrings;  // Объекты строк для ведения лога событий и списка деталей

 general_state: Byte;

 delay_array : array [1..5] of Byte = (5, 5, 10, 5, 5);

 time_delay : Byte;

 process_timer_substate: Byte;

implementation

uses KeyUnit;

{$R *.dfm}

//==============================================================================

function TMain_Form.ModBus_rd(data: plink_type; reg_adr: Word; count: Word) : word;

var

 buf: array [0..256] of byte;

 crc_word, rx_count, regs_count, i, j, reg_value: word;

 p: pointer;

 l: link_type;

begin

 l := data^;

 p := @buf;

 buf[0] := l.dev_adr;                                                          // Готовим посылку: первый байт - адрес устройства

 buf[1] := 3;                                                                  // Второй байт - команда, чтение регистров хранения

 buf[2] := Hi(reg_adr);

 buf[3] := Lo(reg_adr);

 buf[4] := Hi(count);

 buf[5] := Lo(count);

 crc_word := CRC16(p,6);

 buf[6] := Lo(crc_word);

 buf[7] := Hi(crc_word);

 RS485.FlushBuffers(true,true);

 RS485.SendData(p,8);

 Result := 0;

 for i := 1 to l.timeout + 1 do

   begin

     if RS485.CountRX = 5 + count * 2 then    // если пришли все ожидаемые байты

       begin

         rx_count := RS485.CountRX;

         RS485.ReadData(p,rx_count);

         crc_word := CRC16(p, rx_count - 2);

           if (Lo(crc_word) = buf[rx_count - 2]) and (Hi(crc_word) = buf[rx_count - 1]) then

             if buf[1] = 3 then

               begin

                 regs_count := buf[2] div 2;

                 for j := 0 to regs_count - 1 do

                   begin

                     reg_value := buf[3 + j * 2];

                     reg_value := reg_value shl 8;

                     reg_value := reg_value or buf[4 + j * 2];

                     l.RX_buf[j] := reg_value;

                   end;

                 result := regs_count;

                 data^ := l;

               end

             else

               begin

                 ErrorFunction_label.Caption := IntToStr(StrToInt(ErrorFunction_label.Caption) + 1);

                 result := 0

               end

           else

             begin

               ErrorIncorrectCRC_label.Caption := IntToStr(StrToInt(ErrorIncorrectCRC_label.Caption) + 1);

               result := 0

             end;

         Break;

       end;

     if i = l.timeout then

       begin

         ErrorIncorrectCount_label.Caption := IntToStr(StrToInt(ErrorIncorrectCount_label.Caption) + 1);

         result := 0;

         Break;

       end;

     Sleep(1);

   end;

end;

procedure TMain_Form.MainStringGridChange;

var

 i: Byte;

begin

 with MainStringGrid do

   begin

     for i := 1 to Carriers_rate do

       begin

           begin

             if Carrier[i].location = 0 then

               Cells[1,i] := 'Вне линии'

             else

               if Carrier[i].location > 100 then

                 Cells[1,i] := 'Автооператор ' + IntToStr(Carrier[i].location - 100)

               else

                 Cells[1,i] := IntToStr(Carrier[i].location) + ' - ' + Pos[Carrier[i].location].name;

             if Carrier[i].cycl_num = 0 then

               Cells[2,i] := 'Не в работе'

             else

               Cells[2,i] := CyclOrder[Carrier[i].cycl_num].name;

             //Cells[3,i] := IntToStr(Carrier[i].cycl_stage);

             Cells[4,i] := IntToStr(Carrier[i].time);

           end;

       end;

   end;

end;

procedure TMain_Form.RepaintVisualization;

var

 i, j, TempCar: Byte;

begin

 for i := 1 to AO_rate do

   begin

     if AO[i].link.connect then

       begin

         CopyDataFromBuferAO(1);

         if AO[i].before xor AO[i].after then

           begin

             if AO[i].before then

               begin

                 TLabel(FindComponent('AO' + IntToStr(i) + 'PosState_label')).Caption := 'Автооператор ' + IntToStr(i) + ' перед позицией ' +  IntToStr(AO[i].pos);

               end

             else

               begin

                 TLabel(FindComponent('AO' + IntToStr(i) + 'PosState_label')).Caption := 'Автооператор ' + IntToStr(i) + ' за позицией ' +  IntToStr(AO[i].pos);

               end;

           end

         else

           begin

             if AO[i].before then

               begin

                 TLabel(FindComponent('AO' + IntToStr(i) + 'PosState_label')).Caption := 'Ошибка позиционирования автооператора ' + IntToStr(i);

               end

             else

               begin

                 TLabel(FindComponent('AO' + IntToStr(i) + 'PosState_label')).Caption := 'Автооператор ' + IntToStr(i) + ' на позиции ' +  IntToStr(AO[i].pos);

               end;

           end;

         // Защита от ошибки счёта позиций автооператором

         if not(AO[i].pos in [AO[i].first_pos..AO[i].last_pos]) then

           AO[i].pos := AO[i].past_pos   // ******* Здесь надо вывести сообщение об ошибке позиционирования ******

         else

           AO[i].past_pos := AO[i].pos;

         if AO[i].first and AO[i].second then

           AO[i].A_img.Left := Pos[AO[i].pos].bottom_img.Left + A_pos_offset

         else

           if AO[i].before then

             begin

               if AO[i].first and not(AO[i].second) then

                 AO[i].A_img.Left := Pos[AO[i].pos].bottom_img.Left + A_before_first_offset

               else

                 if not(AO[i].first) and not(AO[i].second) then

                   AO[i].A_img.Left := Pos[AO[i].pos].bottom_img.Left + A_before_offset

                 else

                   if not(AO[i].first) and AO[i].second then

                     AO[i].A_img.Left := Pos[AO[i].pos].bottom_img.Left + A_before_second_offset;

             end

           else

             if AO[i].after then

               begin

                 if AO[i].first and not(AO[i].second) then

                   AO[i].A_img.Left := Pos[AO[i].pos].bottom_img.Left + A_after_first_offset

                 else

                   if not(AO[i].first) and not(AO[i].second) then

                     AO[i].A_img.Left := Pos[AO[i].pos].bottom_img.Left + A_after_offset

                   else

                     if not(AO[i].first) and AO[i].second then

                       AO[i].A_img.Left := Pos[AO[i].pos].bottom_img.Left + A_before_second_offset

               end;

         AO[i].B_img.Left := AO[i].B_img.Left + B_A_hor_offset;

         if AO[i].top_term then

           AO[i].B_img.Top := B_term_top

         else

           if AO[i].bottom_term then

             AO[i].B_img.Top := B_term_bottom

           else

             if AO[i].top_stop and not(AO[i].top_brake) then

               AO[i].B_img.Top := B_alarm_top

             else

               if AO[i].top_stop and AO[i].top_brake then

                 AO[i].B_img.Top := B_normal_top

               else

                 if not(AO[i].top_stop) and AO[i].top_brake then

                   AO[i].B_img.Top := B_top_middle

                 else

                   if not(AO[i].top_stop) and not(AO[i].top_brake) and not(AO[i].bottom_brake) and not(AO[i].bottom_stop) and not(AO[i].bottom_term) then

                     AO[i].B_img.Top := B_middle

                   else

                     if AO[i].bottom_brake and not(AO[i].bottom_stop) then

                       AO[i].B_img.Top := B_middle_bottom

                     else

                       if AO[i].bottom_brake and AO[i].bottom_stop then

                         AO[i].B_img.Top := B_normal_bottom

                       else

                         if not(AO[i].bottom_brake) and AO[i].bottom_stop then

                           AO[i].B_img.Top := B_alarm_bottom;

         if not(AO[i].bottom_stop) and AO[i].past_bottom_stop then

           begin

             TempCar := IsPosBusy(AO[i].pos);

             if TempCar > 0 then

               Carrier[TempCar].location := 100 + i;

           end;

         if AO[i].bottom_stop and not(AO[i].past_bottom_stop) then

           begin

             TempCar := FindCarOnAO(i);

             if TempCar > 0 then

               Carrier[TempCar].location := AO[i].pos;

           end;

         AO[i].past_bottom_stop := AO[i].bottom_stop;

       end;

   end;

 for i := 1 to Carriers_rate do

   begin

     if Carrier[i].location = 0 then

       Carrier[i].img.Left := 2000  // Некрасиво? Придумай лучше!

     else

       if Carrier[i].location > 100 then

         begin

           for j := 1 to AO_rate do

             begin

               if Carrier[i].location = j + 100 then

                 begin

                   Carrier[i].img.Left := AO[i].B_img.Left + С_B_hor_offset;

                   Carrier[i].img.Top := AO[i].B_img.Top + C_B_vert_offset;

                 end;

             end;

         end

       else

         begin

           Carrier[i].img.Left := Pos[Carrier[i].location].bottom_img.Left + C_pos_hor_offset;

           Carrier[i].img.Top := pos_top + C_pos_vert_offset;

         end;

   end;

 MainStringGridChange;

end;

procedure StartPreciseTimer;

begin

if QueryPerformanceFrequency( Divisor ) then

 begin

   QueryPerformanceCounter(T2);

 end;

end;

function StopAndGetResultPreciseTimer() : string;

begin

 QueryPerformanceCounter(T1);

 result := FloatToStr((T1-T2)/Divisor);

end;

procedure TMain_Form.SaveLog;

var

 f : TStrings;

 i : integer;

 f1: TFileStream;

 s : string;

begin

 for i := 0 to event_strings.count - 1 do                                      // добавить на экран новые произошедшие события

   begin

     Event_Memo.Lines.Add(event_strings[i]);

   end;

 f := TStringList.Create;

 if FileExists('log.txt') then                                                 // если лог не стёрли, загружаем из него данные

   begin

     f.LoadFromFile('log.txt');

   end

 else

   begin

     f1 := TFileStream.Create('log.txt', fmCreate);                            // иначе создаём новый лог

     f1.Free;

   end;

 f.AddStrings(event_strings);                                                  // добавляем новые события

 if f.Count > max_log_line_count then                                          // если лог стал слишком большим

   begin

     if not(DirectoryExists('log')) then                                       // проверка, не удалили ли папку с логом

       begin

         ForceDirectories(GetCurrentDir + '/log');                             // если удалили, создать

       end;

     s := 'log ' + FormatDateTime('dd.mm.yyyy hh.mm.ss.zzz' , Now) + '.txt';   // записать в строку имя для файла, состоящее из даты и точного времени

     f.SaveToFile('log/' + s);                                                 // сохранить лог в файл под созданным именем

     f.Clear;                                                                  // очищаем лог

   end;

 if not(FileExists('log.txt')) then                                            // если файл лога стёрли

   begin

     f1 := TFileStream.Create('log.txt', fmCreate);                            // создаём новый

     f1.Free;

   end;

 f.SaveToFile('log.txt');                                                      // записываем в файл

 f.Free;

 event_strings.Clear;                                                          // очищаем список событий

end;

procedure TMain_Form.LinkTimerTimer(Sender: TObject);

var

 t, i, j, k, reg_count, reg_adr: byte;

begin

 if VirtualLine_RadioButton.Checked then

   begin

     RepaintEL;

   end;

 RS485.Disconnect;

 if RS485.Connect then

   begin                                                                   // если связь не идёт, увеличивать таймаут

     COM_label.Caption := 'COM-порт ' + Copy(RS485.PortName,8,2) + ' окрыт.';

     COM_label.Font.Color := clGreen;

     for j := 0 to 2 do

       begin

         reg_count := 2;

         t := ModBus_rd(@MPLC, 0, reg_count);

         if t = reg_count then

           begin

             TLabel(FindComponent('LinkMPLC_label')).Caption := 'Связь c ПЛК щита управления установлена.';

             TLabel(FindComponent('LinkMPLC_label')).Font.Color := clGreen;

             //MPLC.cyl_to_cycl_btn := ((MPLC.RX_buf[0] and (1 shl 0)) > 0) or MPLC.cyl_to_cycl_btn;

             break;

           end

         else

           if j = 2 then

             begin

               TLabel(FindComponent('LinkMPLC_label')).Caption := 'Связь c ПЛК щита управления отсутствует!';

               TLabel(FindComponent('LinkMPLC_label')).Font.Color := clRed;

             end;

       end;

   end

 else

   begin

     COM_label.Caption := 'COM-порт ' + Copy(RS485.PortName,8,2) + ' не удалось открыть!';

     COM_label.Font.Color := clRed;

   end;

     if LocalMode_rbtn.checked then

       begin

         AO[i].link.TX_buf[0] := 0; // Обнулятор

         AO[i].link.TX_buf[1] := 0; // Разрешено местное управление

       end

     else

       begin

         if not(AO[i].command_process = 1) then

           begin

             AO[i].link.TX_buf[0] := 0; // Обнулятор

             AO[i].link.TX_buf[1] := $0001; // Удержание автооператора в состоянии ожидания команды после завершения текущей

           end;

       end;

     RS485.Disconnect;

     if RS485.Connect then

       begin                 //

       COM_label.Caption := 'COM-порт ' + Copy(RS485.PortName,8,2) + ' окрыт.';

       COM_label.Font.Color := clGreen;

         for j := 0 to 2 do

           begin

             t := ModBus_wr(@AO[i].link, 0, reg_count);  // запись команды

             if t = reg_count then  // если отправлено верное число регистров, будем читать ответ

               begin

                 if AO[i].command_process = 1 then  // когда отправим посылку,

                   AO[i].command_process := 2;      // установим флаг - команда отправлена в автооператор

                 TLabel(FindComponent('LinkAO' + IntToStr(i) + '_label')).Caption := 'Связь c автооператором ' + IntToStr(i) + ' установлена.';

                 TLabel(FindComponent('LinkAO' + IntToStr(i) + '_label')).Font.Color := clGreen;

                 AO[i].link.connect := True;

                 reg_adr := 6;

                 reg_count := 8;

                 RS485.Disconnect;

                 if RS485.Connect then

                   begin

                     COM_label.Caption := 'COM-порт ' + Copy(RS485.PortName,8,2) + ' окрыт.';

                     COM_label.Font.Color := clGreen;

                     for k := 0 to 2 do

                       begin

                         t := ModBus_rd(@AO[i].link, reg_adr, reg_count);

                         if t = reg_count then

                           begin

                             if AO[i].command_process = 2 then

                             AO[i].command_process := 3;  // считан первый ответ из автооператора

                      end;

                   end

                 else

                   begin

                     COM_label.Caption := 'COM-порт ' + Copy(RS485.PortName,8,2) + ' не удалось открыть!';

                     COM_label.Font.Color := clRed;

                     AO[1].link.connect := false;

                     AO[2].link.connect := false;

                   end;

                 Break;

               end

             else

               if j = 2 then

                 begin

                   TLabel(FindComponent('LinkAO' + IntToStr(i) + '_label')).Caption := 'Связь c автооператором ' + IntToStr(i) + ' отсутствует!';

                   TLabel(FindComponent('LinkAO' + IntToStr(i) + '_label')).Font.Color := clRed;

                   AO[1].link.connect := false;

                 end;

           end;

       end

     else

       begin

         COM_label.Caption := 'COM-порт ' + Copy(RS485.PortName,8,2) + ' не удалось открыть!';

         COM_label.Font.Color := clRed;

         AO[1].link.connect := false;

         AO[2].link.connect := false;

       end;

   end;

end;

         begin

           t := ModBus_rd(@MPLC[1].link, reg_adr, reg_count);

           if t = reg_count then

             begin

               TLabel(FindComponent('LinkMPLC_label')).Caption := 'Связь c ПЛК щита управления установлена.';

               TLabel(FindComponent('LinkMPLC_label')).Font.Color := clGreen;

               Break;

             end

           else

             if j = 2 then

               begin

                 TLabel(FindComponent('LinkMPLC_label')).Caption := 'Связь c ПЛК щита управления отсутствует!';

                 TLabel(FindComponent('LinkMPLC_label')).Font.Color := clRed;

               end;

         end;

     end

   else

     begin

       COM_label.Caption := 'COM-порт ' + Copy(RS485.PortName,8,2) + ' не удалось открыть!';

       COM_label.Font.Color := clRed;

       LinkMPLC_label.Caption := 'Связь c ПЛК щита управления отсутствует!';

       LinkMPLC_label.Font.Color := clRed;

     end;

 end;

 for i := 1 to AO_rate do

   begin

     reg_count := 3;

     AO[i].link.TX_buf[0] := 0;

     AO[i].link.TX_buf[1] := $004F; // Передача команды на установку позиции автооператора

     AO[i].link.TX_buf[1] := AO[i].link.TX_buf[1] or (AO[i].pos shl 8);

     AO[i].link.TX_buf[1] := AO[i].link.TX_buf[1] or (ord(AO[i].before) shl 15);

     AO[i].link.TX_buf[1] := AO[i].link.TX_buf[1] or (ord(AO[i].after) shl 14);

     reg_adr := 0;

     RS485.Disconnect;

     if RS485.Connect then

       begin

         COM_label.Caption := 'COM-порт ' + Copy(RS485.PortName,8,2) + ' открыт.';

         COM_label.Font.Color := clGreen;

         for j := 0 to 2 do

           begin

             t := ModBus_wr(@AO[i].link, reg_adr, reg_count);

             if t = reg_count then

               begin

                 TLabel(FindComponent('LinkAO' + IntToStr(i) + '_label')).Caption := 'Связь c автооператором ' + IntToStr(i) + ' установлена.';

                 TLabel(FindComponent('LinkAO' + IntToStr(i) + '_label')).Font.Color := clGreen;

                 AO[i].link.connect := True;

                 if CheckAllConnect then

                   begin

                     StartTimer.Enabled := False;

                     LinkTimer.Enabled := True;

                   end;

                 Break;

               end

             else

               if j = 2 then

                 begin

                   TLabel(FindComponent('LinkAO' + IntToStr(i) + '_label')).Caption := 'Связь c автооператором ' + IntToStr(i) + ' отсутствует!';

                   TLabel(FindComponent('LinkAO' + IntToStr(i) + '_label')).Font.Color := clRed;

                 end;

           end;

       end

     else

       begin

         COM_label.Caption := 'COM-порт ' + Copy(RS485.PortName,8,2) + ' не удалось открыть!';

         COM_label.Font.Color := clRed;

       end;

   end;

   MainLink_stxtChange;

end;

procedure TMain_Form.CommandAssembly(data: Command_type);

var

 no: Byte;

begin

 no := data.AO_no;

 AO[no].link.TX_buf[0] := 0;

 AO[no].link.TX_buf[1] := $0080;

 AO[no].link.TX_buf[1] := AO[no].link.TX_buf[1] or data.first_adr;

 if data.up_move then

   begin

     AO[no].link.TX_buf[1] := AO[1].link.TX_buf[1] or (1 shl 15);

     AO[no].link.TX_buf[1] := AO[1].link.TX_buf[1] or (data.runoff_time shl 8);

     AO[no].link.TX_buf[2] := data.second_adr;

     AO[no].link.TX_buf[2] := AO[1].link.TX_buf[2] or (data.third_adr shl 8);

   end;

 AO[no].command_process := 1;      // 1 - Команда собрана, готова к отправке

end;

Procedure TMain_Form.DetailStringGridMouseDown(Sender: TObject;

 Button: TMouseButton; Shift: TShiftState; X, Y: Integer);

var

 Col, Row: Integer;

begin

 DetailStringGrid.MouseToCell(X,Y,Col,Row);

 if Row > 0 then

   if (Col > 0) then

     begin

       KeyOptions.mode := False;

       case Col of

         1:  begin

               with KeyOptions do

                 begin

                   mode := true;

                   value := DetailStringGrid.Cells[Col,Row];

                   hint := 'Введите название детали №' + IntToStr(Row) + '. Максимальная длина названия - 20 символов. Текущее название - "Деталь ' + IntToStr(Row) + '".';

                 end;

             end;

         2:  begin

               with KeyOptions do

                 begin

                   min_value := detail_min_S;

                   max_value := detail_max_S;

                   value := DetailStringGrid.Cells[Col,Row];

                   hint := 'Введите площадь поверхности детали "' + DetailStringGrid.cells[1,Row] + '" в миллиметрах квадратных. Минимальное значение - ' + IntToStr(min_value) + ', максимальное значение - ' + IntToStr(max_value) + '. Текущее значение - ' + value + ' мм. кв.';

                 end;

             end;

         3:  begin

               with KeyOptions do

                 begin

                   min_value := detail_min_weight;

                   max_value := detail_max_weight;

                   value := DetailStringGrid.Cells[Col,Row];

                   hint := 'Введите массу детали "' + DetailStringGrid.cells[1,Row] + '" в граммах. Минимальное значение - ' + IntToStr(min_value) + ', максимальное значение - ' + IntToStr(max_value) + '. Текущее значение - ' + value + ' г.';

                 end;

             end;

       end;

       KeyForm.ShowModal;

       DetailStringGrid.Cells[Col,Row] := KeyOptions.value;

       SaveDetail;

     end

   else

     begin

       DetailStringGrid.Row := Row;

       DetailStringGrid.Col := Col + 1;

     end;

end;

procedure TMain_Form.ProcessTimerTimer(Sender: TObject);

var

 i, j, target_pos, distance_to_target, temp_order_no, target_car_no, car_count_for_start_arrangement: Byte;

begin

 if AO[1].link.connect then

   case ProcessTimer.Tag of

     // две стадии сканирования линии

     1:  begin

             case AO[1].command_process of               // В зависимости от состояния байта состояния отправки команды автооператору

               0:  begin                                 // 0 - автооператор ожидает команды

                     // поменять цифру на константу последней позиции

                     if AO[1].pos = 25 then      // если автооператор на последней позиции

                       ProcessTimer.Tag := 2             // перейти ко второй стадии сканирования линии

                     else                                // иначе собрать команду на движение к пследней позиции

                       begin

                         with Command do

                           begin

                             AO_no := 1;

                             com_type := True;

                             // поменять цифру на константу последней позиции

                             first_adr := 25;

                             up_move := False;

                           end;

                         CommandAssembly(Command);

                       end;

                   end;

               3:  begin                                 // Секунда ожидания

                      AO[1].command_process := 4;        // И переход к ожиданию неактивности флага автоматического движения

                   end;

               4:  begin

                     if not(AO[1].auto_move) then        //

                       begin

                         AO[1].command_process := 0;

                         ProcessTimer.Tag := 2;

                       end;

                   end

               else

                 AO[1].command_process := 0;

             end;

         end;

     2:  begin

           case AO[1].command_process of

             0:  begin

                   with Command do

                     begin

                       AO_no := 1;

                       com_type := True;

                       first_adr := 1;

                       up_move := False;

                     end;

                     CommandAssembly(Command);

                 end;

             3:  begin                                 // Секунда ожидания

                   AO[1].command_process := 4;    // Переход к ожиданию флага автоматического движения

                 end;

             {

             3:  begin

                     if AO[1].auto_move then

                       begin

                         AO[1].command_process := 4;

                       end;

                 end;    }

             4:  begin

                   if not(AO[1].auto_move) then

                     begin

                       AO[1].command_process := 0;

                       for i := 1 to Carriers_rate do

                         Carrier[i].location := 0;

                       for i := 0 to 3 do

                         if AO[1].link.RX_buf[4 + i] > 0 then

                           begin

                             if ((AO[1].link.RX_buf[4 + i] and $0001) > 0) or ((AO[1].link.RX_buf[4 + i] and $0002) > 0) then

                               CarrierAssigmentNumber(1 + i * 8);

                             if ((AO[1].link.RX_buf[4 + i] and $0004) > 0) or ((AO[1].link.RX_buf[4 + i] and $0008) > 0) then

                               CarrierAssigmentNumber(2 + i * 8);

                             if ((AO[1].link.RX_buf[4 + i] and $0010) > 0) or ((AO[1].link.RX_buf[4 + i] and $0020) > 0) then

                               CarrierAssigmentNumber(3 + i * 8);

                             if ((AO[1].link.RX_buf[4 + i] and $0040) > 0) or ((AO[1].link.RX_buf[4 + i] and $0080) > 0) then

                               CarrierAssigmentNumber(4 + i * 8);

                             if ((AO[1].link.RX_buf[4 + i] and $0100) > 0) or ((AO[1].link.RX_buf[4 + i] and $0200) > 0) then

                               CarrierAssigmentNumber(5 + i * 8);

                             if ((AO[1].link.RX_buf[4 + i] and $0400) > 0) or ((AO[1].link.RX_buf[4 + i] and $0800) > 0) then

                               CarrierAssigmentNumber(6 + i * 8);

                             if ((AO[1].link.RX_buf[4 + i] and $1000) > 0) or ((AO[1].link.RX_buf[4 + i] and $2000) > 0) then

                               CarrierAssigmentNumber(7 + i * 8);

                             if ((AO[1].link.RX_buf[4 + i] and $4000) > 0) or ((AO[1].link.RX_buf[4 + i] and $8000) > 0) then

                               CarrierAssigmentNumber(8 + i * 8);

                           end;

                       MainStringGridChange;

                       ProcessTimer.Tag := 4;

                     end;

                 end;

           else

           end;

         end;

end.

Unit KeyUnit;

interface

uses

 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

 Dialogs, StdCtrls, ExtCtrls, Main_unit;

type

 TKeyForm = class(TForm)

   SmallBoardPanel: TPanel;

   Button7: TButton;

   Button8: TButton;

   Button9: TButton;

   Button6: TButton;

   ClearButton: TButton;

   OkButton: TButton;

   CancelButton: TButton;

   Button0: TButton;

   BigBoardPanel: TPanel;

   Button_ii: TButton;

   Button_er: TButton;

   Button_no: TButton;

   ButtonClearAll: TButton;

   HintStaticText: TStaticText;

   Edit: TEdit;

   procedure Button1MouseDown(Sender: TObject; Button: TMouseButton;

     Shift: TShiftState; X, Y: Integer);

   procedure Button2MouseDown(Sender: TObject; Button: TMouseButton;

     Shift: TShiftState; X, Y: Integer);

 private

   { Private declarations }

   procedure Lower_Case;

   procedure Upper_Case;

   procedure SaveAndExit;

   procedure EnterNumbers(value : string);

   procedure CancelAndExit;

 public

   { Public declarations }

 end;

var

 KeyForm: TKeyForm;

 temp_output_value: string;

implementation

{$R *.dfm}

procedure TKeyForm.Lower_Case;

begin

 Button_a.Caption := 'а';

 Button_b.Caption := 'б';

 Button_v.Caption := 'в';

 Button_g.Caption := 'г';

 Button_d.Caption := 'д';

 Button_e.Caption := 'е';

 Button_ye.Caption := 'ё';

 Button_zh.Caption := 'ж';

 Button_z.Caption := 'з';

end;

procedure TKeyForm.CancelAndExit;

begin

 Main_unit.KeyOptions.mode := False;

 Close;

end;

procedure TKeyForm.EnterNumbers(value : string);

begin

 if Edit.Text = '0' then

   Edit.Text := value

 else

   Edit.Text := Edit.Text + value;

 if StrToInt(Edit.Text) > Main_unit.KeyOptions.max_value then

   Edit.Text := IntToStr(Main_unit.KeyOptions.max_value);

 temp_output_value := Edit.Text;

end;

procedure TKeyForm.Button0MouseDown(Sender: TObject; Button: TMouseButton;

 Shift: TShiftState; X, Y: Integer);

begin

 EnterNumbers(TButton(Sender).Caption);

end;

procedure TKeyForm.Button1MouseDown(Sender: TObject; Button: TMouseButton;

 Shift: TShiftState; X, Y: Integer);

begin

 EnterNumbers(TButton(Sender).Caption);

end;

procedure TKeyForm.ButtonClearAllMouseDown(Sender: TObject;

 Button: TMouseButton; Shift: TShiftState; X, Y: Integer);

begin

 Edit.Clear;

end;

procedure TKeyForm.ButtonEnterClick(Sender: TObject);

begin

 SaveAndExit;

end;

procedure TKeyForm.Button_ClearMouseDown(Sender: TObject; Button: TMouseButton;

 Shift: TShiftState; X, Y: Integer);

var

 s : string;

begin

 s := Edit.Text;

 if Length(s) > 0 then

   begin

     s := Copy(s, 1, Length(s) - 1);

     Edit.Text := s;

   end;

 temp_output_value := Edit.Text;

end;

procedure TKeyForm.Button_cMouseDown(Sender: TObject; Button: TMouseButton;

 Shift: TShiftState; X, Y: Integer);

begin

 Edit.Text := Edit.Text + TButton(Sender).Caption;

end;

procedure TKeyForm.Button_dMouseDown(Sender: TObject; Button: TMouseButton;

 Shift: TShiftState; X, Y: Integer);

begin

 Edit.Text := Edit.Text + TButton(Sender).Caption;

end;

procedure TKeyForm.Button_eeMouseDown(Sender: TObject; Button: TMouseButton;

 Shift: TShiftState; X, Y: Integer);

begin

 Edit.Text := Edit.Text + TButton(Sender).Caption;

end;

procedure TKeyForm.CancelButtonMouseDown(Sender: TObject; Button: TMouseButton;

 Shift: TShiftState; X, Y: Integer);

begin

 CancelAndExit;

end;

procedure TKeyForm.OkButtonMouseDown(Sender: TObject; Button: TMouseButton;

 Shift: TShiftState; X, Y: Integer);

begin

 SaveAndExit;

end;

end. 


ПРИЛОЖЕНИЕ В. 

Опись листов графической части дипломного проекта

Лист 1 – Цель и задачи проекта.

Лист 2 – Средства разработки и реализации проекта

Лист 3 – Концептуальная модель.

Лист 4 – Диаграмма вариантов использования.

Лист 5 – Пример структуры данных.

Лист 6 – Требования к характеристикам панельного компьютера.

Лист 7 – Главная форма.

Лист 8 – Экран запуска техпроцесса

Лист 9 – Форма экранной клавиатуры

Лист 10 – Технико-экономические показатели проекта.

Лист 11 – Выводы по проекту.


 

А также другие работы, которые могут Вас заинтересовать

51272. МОДЕЛИРОВАНИЕ КОМПЬЮТЕРНЫХ СИСТЕМ. МЕТОДИЧЕСКАЯ РАЗРАБОТКА 357.5 KB
  Суть компьютерного моделирования заключена в получении количественных и качественных результатов на основе имеющейся модели. Качественные выводы сделанные по результатам компьютерного моделирования позволяют обнаружить такие свойства сложной системы как ее структуру динамику развития устойчивость целостность и др. Одно из основных направлений использования компьютерного моделирования – поиск оптимальных вариантов внешнего воздействия на объект с целью получения наивысших показателей его функционирования. Методологической основой...
51273. МОДЕЛЮВАННЯ КОМПЮТЕРНИХ СИСТЕМ. МЕТОДИЧНА РОЗРОБКА 1.23 MB
  Обгрунтування моделі передбачає визначення класифікаціїонних ознак виявлення та модельне опис основних інформаційних пропроцесів що діють в системі вибір використовуваних принципів і критеріїв оцінки системи методів і засобів моделювання розробку моделі зовнішнього середовища і мо делей базових компонентів створюваної системи. Реализація моделі системи. Після того як визначені методи і засоби моделювання і сформовано безліч альтернативних варіантів створюваної системи виконується безпосередня розробка моделі що забезпечує вико...
51274. СЭЗ как инструменты регионального развития, мировой опыт, его применение в Республике Беларусь 241.6 KB
  Одновременно с изменениями в мировой экономике происходила эволюция организационно-функциональных форм СЭЗ. На начальном этапе своего развития свободные зоны были преимущественно ориентированы на торговлю товарами
51276. ПРОГРАММНО-АППАРАТНАЯ ЗАЩИТА ИНФОРМАЦИИ 967 KB
  Межсетевые экраны по понятным причинам используются для сетей TCP IP и классифицируются в соответствии с уровнем эталонной модели взаимодействия открытых систем сетевой моделью OSI. Вопервых сетевая модель сетей TCP IP предусматривает только 5 уровней физический интерфейсный сетевой транспортный и прикладной в то время как модель OSI 7 уровней физический канальный сетевой транспортный сеансовый презентационный и прикладной. Для сканирования всех 131070 портов от 1 до 65535 для TCP и UDP на всех узлах может понадобиться...
51277. Распределение объема услуг предприятия бытового обслуживания 130.5 KB
  Выполнить распределение объема услуг предприятия по видам услуг и ассортименту изделий по форме табл. Определить объем бытовых услуг заданного предприятия структурного подразделения в форме табл.1 вначале по видам услуг затем по ассортименту изделий.
51278. Теплотехника и теплоэнергетика. Лабораторные работы 5.76 MB
  Вентиляторы – это воздуходувные машины создающие определенное давление и служащие для перемещения воздуха при потерях давления в вентиляционной сети не более 12кПа. Вентиляторы высокого давления используют в основном для технологических целей например для дутья в вагранки в агломерационных установках для подачи воздуха к форсункам в фильтроочистительных системах и в системах пневмопочты. При вращении рабочего колеса 1 частицы воздуха увлекаются лопатками 2 во вращательное движение при этом на частицы воздуха действуют центробежные...
51279. Настройка параметров Windows 127 KB
  Microsoft Windows хранит информацию о конфигурации в двух местах: реестре и службе каталогов ctive Directory. Модификации реестра или ctive Directory приводят к изменению конфигурации Windows. Для настройки среды Windows прежде всего просматривает файл utoexec.