Скачиваний:
4
Добавлен:
02.05.2014
Размер:
169.71 Кб
Скачать
# -*- coding: cp1251 -*-

# -----------------------------------------------------
#   Данный файл parATKvXXX.py является основным файлом программы
#   АТК: Автоматизированный технологическийц комплекс.
#   Данная программа реализует алгоритмическую модель
#   автоматизированного технологического комплекса
#   типа агрегатного сверлильного станка
#   для многосторонней обработки корпусных деталей
#
#   Реализуются разные конфигурации АТК0..АТК12
#   технологической системы
#   по числу h = 0..12 сверлильных силовых головок
#
#   Программа предназначена
#   для систематического исследования и изучения:
#   -  параллельных (и последовательных) алгоритмов
#      с наглядной и доступной прикладной интерпретацией
#   -  их многопоточной программной реализации
#      (средствами языка программирования Python)
#
#   Файл parATKvXXX.py программы используется
#   совместно с другими файлами:
#       onHelpMsg.py  - модуль вывода сообщений меню Справка
#       expSub.py     - модуль дополнительных циклов конфигурации АТК12
#       paramSet.py      - модуль для организации записи и загрузки
#                             комплексов параметров настройки конфигуациий АТК 
#       parDefault.ini      - файл стандартных параметров (по умолчанию)
#       xxxxxx              - возможные (необязательные) дополнительные файлы
#                             нестандартных параметров настройки
#                             (xxxxxx - произвольные имена файлов)
#   vXXX    - общее обозначение версии программы
#             (текущая версия:  v150 и выше)
#
#   Программа находится в состоянии разработки
#
#   Разработчик программы parATK    Житников А.П.       
#                                   Ноябрь 2005г.  
# ------------------------------------------------------ 

from Tkinter import *
import math, time
import sys

import thread
#import threading 

import pdb

import onHelpMsg      # Модуль вывода сообщений меню Справка
import paramSet          # Модуль настройки параметров
import expSub         # Модуль дополнительных подпрограмм (експерименты)


############   класс констант (парамтеры по умолчанию):
                # некоторые константы
                # могут изменяться в режиме наладки системы

class Consts:       # общий класс констант

#########
#        параметры задержек
    delay = 0.75             # общая задержка: между ходами
    delay_st = 0.01          # задержка шага хода (циклов премещений)


#########
#        габаритные размеры окон (по габаритам канвы)
            # габариты окна 1: Технологическая схема
    win1_width = 600
    win1_height = 400
            # габариты окна 3: Временная диаграмма      
    win3_width = 600
    win3_height = 400


########
        # габариты (прямоугольника) детали (потокового объекта)
    det_width = 120              # ширина
    det_height = 40             # высота

#########
         # константы пространства перемещения деталей

    
            # ходовые позиции (номера позиций)
#    p_det = [0, 1, 2]

            # координаты позиций детали

                # данные по координате y

    hhh = 150           # высота от низа окна


#########
#        координаты базовой точки
    x_base = win1_width/2
    y_base = win1_height - hhh


    ddy = 50            # разность высоты уровней позиций

    yp_det_left = ddy
    yp_det_right = ddy

    yp_det = [
        y_base + yp_det_left,
        y_base,
        y_base - yp_det_right
        ]

                # данные по координате x
                                
    kxy = 3             # коэффициент  kxy = ddx/dddy связи координат:      
                            # котангенс угла наклонной лиинии движения деталей
    ddx = ddy * kxy     # расстояние до рабочей позиции (по горизонтали)

    xp_det_left = ddx
    xp_det_right = ddx

    xp_det = [
        x_base - xp_det_left,
        x_base,
        x_base + xp_det_right
        ]


        # габариты установочных позиций деталей:
            # загрузочная, рабочая, разгрузочная позиция
    poz_width = det_width + 10      # ширина
    poz_height = 6                          # высота


########
        # парамтры силовых головок

            # габариты корпуса
    corpus_length = 60              # длина корпуса с.головки (???) 
    corpus_height = 30              # высота корпуса с.головки

            # габариты инструмента - начальные данные )по умолчанию)
    instrum_length = [70, 20, 60, 30, 15, 50, 20, 40, 30, 10, 20, 15]
#    instrum_length = [70, 50, 30]    # длина инструмента с.головки
#    instrum_length = [100, 20, 10]    # длина инструмента с.головки
    instrum_diametr = 6            # диаметр инструмента с.головки

            # скоростные парамтеры
#    high_spead = 3          # скорость холостого хода (для всех головок) - шаг
#    work_spead = 1          # скорость рабочего хода - щаг
                #???

########
        # константы пространства размщения с.головок

            # ходовые позиции с.головки 1 (номера позиций)
#    p_hh1 = [0, 1]

            # длина пути (быстрого) подвода с.головок 
    hihgh_speed_lenth = 30

            # координаты позиций с.гоовки 1
                # расстояния от торца головки до детали
    a_h1_end = 10       # конечное расстояние: без инструмента
    a_h1_pr = a_h1_end + instrum_length[1-1]  # пром: инструмент
    a_h1_begin = a_h1_pr + hihgh_speed_lenth    # начальное: быстрый подвод
                # координаты

            # координаты позиций с.гоовки 2
                # расстояния от торца головки до детали
    a_h2_end = 10       # конечное расстояние: без инструмента)
    a_h2_pr = a_h2_end + instrum_length[2-1]  # пром: инструмент
    a_h2_begin = a_h2_pr + hihgh_speed_lenth    # начальное: быстрый подвод
                # координаты    

            # координаты позиций с.гоовки 3
    a_xp_h3 = 32                   # сдвиг линий по оси x
                # расстояния от торца головки до детали
    a_h3_end = 10       # конечное расстояние: без инструмента)
    a_h3_pr = a_h2_end + instrum_length[3-1]  # пром: инструмент
    a_h3_begin = a_h2_pr + hihgh_speed_lenth    # начальное: быстрый подвод
                # координаты    


######################################
######################################
########## 

class Wins:                 # окна


    win2 = Tk();
    win2.title(u'АТК: Агрегатный технологический комплекс. ПУЛЬТ УПРАВЛЕНИЯ')


    win1 = Toplevel();
    win1.title(u'АТК: Агрегатный технологический комплекс. ТЕХНОЛОГИЧЕСКАЯ СХЕМА (мнемосхема)')

    c1 = Canvas(        # канва (холст) окна: технологическая схема
        win1,
        bg = "Yellow",#"white",
        width = Consts.win1_width,
        height = Consts.win1_height
        )
    c1.pack()           # канва 1 (холст для рисунка)


#    win3 = Toplevel();
#    win3.title(u'АТК: Агрегатный технологический комплекс. ВРЕМЕННАЯ ДИАГРАММА')
            # канва (холст) окна: временная диаграмма
#    c3 = Canvas(
#        win3,
#        bg = "Yellow",
#        width = Consts.win3_width,
#        height = Consts.win3_height
#        )
#    c3.pack()


    def onDefaultParams(self):
        print 'onDefaultParams'
        paramSet.onImportParams(self.atk1+2*self.atk2+3*self.atk3+4*self.atk4+12*self.atk12,crt.c_board,'parDefault.ini')

    def onLoadParams(self):
        print 'onLoadParams'
        paramSet.onImportParams(self.atk1+2*self.atk2+3*self.atk3+4*self.atk4+12*self.atk12,crt.c_board,'')

    def onSaveParams(self):
        print 'onSaveParams'
        paramSet.onExportParams(self.atk1+2*self.atk2+3*self.atk3+4*self.atk4+12*self.atk12,crt.c_board)

    def onAbout(self):
        print 'onAbout'
        onHelpMsg.onAbout(wins)

    def onData(self):
        print 'onData'
        onHelpMsg.onData(wins)
                   

    def onExit(self):
        print 'onExit'
        wins.win2.destroy()


#------------------


    cccrt = 0
    print 'cccrt =', cccrt


    def sys_delete(self):
        if self.atk1:
            crt.techsys.del_heads1()
        if self.atk2:
            crt.techsys.del_heads2()
        if self.atk3 or self.atk3s:
            crt.techsys.del_heads3()
        if self.atk4:
            crt.techsys.del_heads4()
        if self.atk12:
            crt.techsys.del_heads12()
        crt.techsys.det_pos.inscriptions_del()
        del crt.techsys
        del crt.h_cycles
        del crt.w_cycles
        del crt.c_board
        wins.fr1.pack_forget()
        wins.fr2.pack_forget()
        wins.fr3.pack_forget()

    def sys_null(self):
        self.atk0 = 0
        self.atk1 = 0
        self.atk2 = 0
        self.atk3 = 0
        self.atk3s = 0
        self.atk4 = 0
        self.atk12 = 0

    def onATK0(self):
        if self.cccrt == 1:
            self.sys_delete()
        self.sys_null()
        self.atk0 = 1
        Head.head_number = 0
        wins.win2.geometry('630x210+300+400')       # Пульт управления
        crt.creatATK()
        print 'onATK0:  atk0 =', self.atk0
        
    def onATK1(self):
        if self.cccrt == 1:
            self.sys_delete()
        self.sys_null()
        self.atk1 = 1
        Head.head_number = 0
        wins.win2.geometry('630x313+300+400')       # Пульт управления            self.length1 = IntVar()
        crt.creatATK()
        print 'onATK1:  atk1 =', self.atk1

    def onATK2(self):
        if self.cccrt == 1:
            self.sys_delete()
        self.sys_null()
        self.atk2 = 1
        Head.head_number = 0
        wins.win2.geometry('630x313+300+400')       # Пульт управления            self.length1 = IntVar()
        crt.creatATK()
        print 'onATK2:  atk2 =', self.atk2

    def onATK3(self):
        if self.cccrt == 1:
            self.sys_delete()
        self.sys_null()
        self.atk3 = 1
        Head.head_number = 0
        wins.win2.geometry('630x313+300+400')       # Пульт управления            self.length1 = IntVar()
        crt.creatATK()
        print 'onATK3:  atk3 =', self.atk3

    def onATK3s(self):
        if self.cccrt == 1:
            self.sys_delete()
        self.sys_null()
        self.atk3s = 1
        Head.head_number = 0
        wins.win2.geometry('630x313+300+400')       # Пульт управления            self.length1 = IntVar()
        crt.creatATK()
        print 'onATK3s:  atk3s =', self.atk3s

    def onATK4(self):
        if self.cccrt == 1:
            self.sys_delete()
        self.sys_null()
        self.atk4 = 1
        Head.head_number = 0
        wins.win2.geometry('630x367+300+400')   # Пульт управления
        crt.creatATK()
        print 'onATK4:  atk4 =', self.atk4

    def onATK12(self):
        if self.cccrt == 1:
            self.sys_delete()
        self.sys_null()
        self.atk12 = 1
        Head.head_number = 0
        wins.win2.geometry('630x569+300+400')   # Пульт управления
        crt.creatATK()
        print 'onATK12:  atk12 =', self.atk12


# -------------------------------
   
    def create_menu(self):
    
        self.top_menu = Menu(self.win1)
        self.win1.config(menu = self.top_menu)

        self.file_menu = Menu(self.top_menu)
        self.config_menu = Menu(self.top_menu)
        self.param_menu = Menu(self.top_menu)
        self.help_menu = Menu(self.top_menu)

        self.top_menu.add_cascade(label = u"Файл", menu = self.file_menu)
        self.file_menu.add_command(label = u"Создать")#, command = show("создать"))
        self.file_menu.add_command(label = u"Открыть")#, command = show("создать"))
        self.file_menu.add_command(label = u"Выход", command = self.onExit)

        self.top_menu.add_cascade(
            label = u"Конфигурация",
            menu = self.config_menu
            )

        self.config_menu.add_command(
            label = u"АТК0:    Нет силовых головок",
            command = self.onATK0
            )

        self.config_menu.add_command(
            label = u"АТК1:    Одна силовая головка",
            command = self.onATK1
            )

        self.config_menu.add_separator()

        self.config_menu.add_command(
            label = u"АТК2:    Две силовые головки",
            command = self.onATK2
            )

        self.config_menu.add_separator()

        self.config_menu.add_command(
            label = u"АТК3:    Три силовые головки",
            command = self.onATK3
            )

        self.config_menu.add_command(
            label = u"АТК3s:  Три силовые головки:  спец.функции",
            command = self.onATK3s
            )

#        self.config_menu.add_separator()

        self.config_menu.add_command(
            label = u"АТК4:    Четыре силовые головки                       (заготовка конфигурации)",
            command = self.onATK4
            )
        self.config_menu.add_command(
            label = u"АТК12:  Двенадцать силовых головок",
            command = self.onATK12
            )

        self.top_menu.add_cascade(label = u"Настройки", menu = self.param_menu)
        self.param_menu.add_command(
            label = u"Загрузка стандартных параметров", command = self.onDefaultParams)
        self.param_menu.add_command(
            label = u"Загрузка заданных параметров", command = self.onLoadParams)
        self.param_menu.add_command(
            label = u"Запись заданных параметров", command = self.onSaveParams)

        self.top_menu.add_cascade(label = u"Справка", menu = self.help_menu)

        self.help_menu.add_command(label = u"О программе", command = self.onAbout)

        self.help_menu.add_separator()
        
        self.help_menu.add_command(label = u"Краткие данные", command = self.onData)
   


#####################
    


########### классы технологической системы


class DetPositions:         # позиции детали

    def set_det_positions_coords(self):

        self.xp_det_left = Consts.ddx
        self.xp_det_right = Consts.ddx

        self.xp_det = [
            Consts.x_base - self.xp_det_left,
            Consts.x_base,
            Consts.x_base + self.xp_det_right
            ]

        self.yp_det_left = Consts.ddy
        self.yp_det_right = Consts.ddy

        self.yp_det = [
            Consts.y_base + self.yp_det_left,
            Consts.y_base,
            Consts.y_base - self.yp_det_right
            ]

#    print 'xp_det = ', Consts.xp_det
#    print 'yp_det = ', Consts.yp_det


        # создание системы позиций

    def creat_det_positions(self):      # позиции деталей

            # общая линия рабочих позиций деталей (технологческий канал)    
        tech_line = wins.c1.create_line(                 #??? hor
            self.xp_det[0],
            self.yp_det[0],
            self.xp_det[2],
            self.yp_det[2],
#            fill = "Blue"
            )

            # разметка позиций короткими вертикальных линиями (штрихами)
        ver_line1 = [ ]                  # пустой начальный список
        for i in xrange(3):
            ver_line1.append(            # добавление в список
                wins.c1.create_line(
                    self.xp_det[i],
                    self.yp_det[i] - 5,
                    self.xp_det[i],
                    self.yp_det[i] + 10,
#                    fill = "Red"
                    )
                )
            
            # установочные позиции            
        det_position = []                  # пустой начальный список
        idet_poz = [0, 1, 2]
        for ii in idet_poz:
            det_position.append(            # добавление в список
                wins.c1.create_rectangle(
                    self.xp_det[ii] - Consts.poz_width/2,
                    self.yp_det[ii],
                    self.xp_det[ii] + Consts.poz_width/2,
                    self.yp_det[ii] + Consts.poz_height,
                    fill = "Black"
                    )
                )


    def creat_inscriptions(self):      # формирование надписей


        self.text11 = wins.c1.create_text(
            Consts.win1_width - 500,
            20,
            text = u'Состояние:'
            )

        self.text12 = wins.c1.create_text(
            Consts.win1_width - 500,
            38,
            font = "Times 13 bold",            
            text = u'ГОТОВНОСТЬ'
            )

        self.text21 = wins.c1.create_text(
            Consts.win1_width - 100,
            20,
            text = u'Число'
            )

        self.text22 = wins.c1.create_text(
            Consts.win1_width - 100,
            32,
            text = u'обработанных'
            )

        self.text23 = wins.c1.create_text(
            Consts.win1_width - 100,
            44,
            text = u'деталей'
            )

        self.text24 = wins.c1.create_text(
            Consts.win1_width - 100,
            60,
            font = "Times 13 bold",            
            text = 0
            )


    def __init__(self):
        self.set_det_positions_coords()        
        self.creat_det_positions()
        self.creat_inscriptions()

    def inscriptions_del(self):
        wins.c1.delete(self.text11)
        wins.c1.delete(self.text12)
        wins.c1.delete(self.text21)
        wins.c1.delete(self.text22)
        wins.c1.delete(self.text23)
        wins.c1.delete(self.text24)
        

##############################u

class Detale:                   # детали

    det_number = 0
    
    def __init__(self):                       # iidet - номер детали
        self.det_number = self.det_number + 1
        self.det_tag = 'det_teg' + str(self.det_number)

    def set_det_pos(self, ppp):             # установка детали в уст.позицию

        self.rect = wins.c1.create_rectangle(        # прямоугольник
            Consts.xp_det[ppp] - Consts.det_width/2,
            Consts.yp_det[ppp] - Consts.det_height,
            Consts.xp_det[ppp] + Consts.det_width/2,
            Consts.yp_det[ppp],
            fill = 'White',
            tag = self.det_tag              # элемент помечен тегом
            )

        self.det_text = wins.c1.create_text(
            Consts.xp_det[ppp],
            Consts.yp_det[ppp] - 10,
            text = 0,
            font = "Times 12 bold",
#            font = "Courer 10 bold",
            tag = self.det_tag              # элемент помечен тегом
            )

        wins.c1.update()             # перерисовка виджета c1

    def det_move(self, ppp):                    # перемещение детали влево
        det_coords = wins.c1.coords(self.rect)
        xxs = det_coords[0]             # текущая координата прямоугольника
        xxc = Consts.det_width/2          # поправка
        x0_det = Consts.xp_det[ppp]      # заданная позиционная абсцисса
        dxp = float(Consts.xp_det[2] - Consts.xp_det[0])
        dyp = float(Consts.yp_det[0] - Consts.yp_det[2])
        kxy = dyp/dxp
        dx = 2.
        dy = -(dx * kxy)
        delay = crt.c_board.step_delay.get() * 0.0001
        while (xxs + xxc < x0_det):
            if crt.c_board.extr_stop == 1: break    # прерывание цикла
            wins.c1.move(self.det_tag, dx, dy)    # подвижка группы фигур    
            det_coords = wins.c1.coords(self.rect)  # координаты прям-ка детали
            xxs = det_coords[0]             # текущая координата прямоугольника
            wins.c1.update()             # перерисовка виджета c1
            time.sleep(delay)

    

##########################################



class Head:             # силовые головки

        # номер последней созданной сюголовки
    head_number = 0       
        # базовые координаты
    def set_head_base(self, xh_bbb, yh_bbb):
        self.xh_base = xh_bbb
        self.yh_base = yh_bbb   

    
                
    #####################


    def set_par_head_pos(self):     # параметры опизиций эталонной с.головок

                # продольные параметры (относительно базы)                
        self.sd_bound = 30       # граница детали             
        self.shd_min = 10        # допустимое минимальное растояние с.головки до детали
        self.hihgh_speed_lenth = Consts.hihgh_speed_lenth    # длина пути (быстрого) подвода с.головок 


            # позиции эталонной с.головки в абстрактной системе (от базы)
        self.shp2 = self.sd_bound + self.shd_min        # конечная позиция
        self.inst_length = Consts.instrum_length[self.head_number - 1] # длина инстр.
        self.shp1 = self.shp2 + self.inst_length        # промежуточная позиция
        self.shp0 = self.shp1 + self.hihgh_speed_lenth  # начальная позиция

            # списки координт позиций с.головок в абсолюной системе
        self.xhp = [
            self.xh_base - self.shp0,
            self.xh_base - self.shp1,
            self.xh_base - self.shp2,
            ]
        self.yhp = [
            self.yh_base,
            self.yh_base,
            self.yh_base,
            ]
                      
    def set_par_head_positions_long_line(self):  # линии разметаки позиций с.головок
            # параметры длинной общей линии
        self.x1_long_line = self.xh_base - (Consts.win1_width/2 - 10)
        self.y1_long_line = self.yh_base
        self.x2_long_line = self.xh_base
        self.y2_long_line = self.yh_base

    def creat_head_positions_long_line(self):
            # горизонтальная линия позиций с.головок    
        self.long_line = wins.c1.create_line(
            self.x1_long_line,
            self.y1_long_line,
            self.x2_long_line,
            self.y2_long_line,
            tag = self.line_head_tag,              # элемент помечен тегом связи
            )

    def set_par_head_positions_short_lines(self):  # линии разметаки позиций с.головок
            # списка параметров (3-х) коротких линий позиций
        self.x1_short_line = self.xhp
        self.y1_short_line = self.yhp
        self.x2_short_line = self.xhp
        self.y2_short_line = [
            self.yh_base + 10,
            self.yh_base + 10,
            self.yh_base + 10
            ]
    
    def creat_head_positions_short_lines(self):
            # вертмкальные линии позиций с.гоuловок         
        self.short_line = [ ]                  # пустой начальный список
        ih_pos = [0, 1, 2]          # список номеров (индексов) позиций
        for ii in ih_pos:
            self.short_line.append(            # добавление в список
                wins.c1.create_line(
                    self.x1_short_line[ii],
                    self.y1_short_line[ii],
                    self.x2_short_line[ii],
                    self.y2_short_line[ii],
                    tag = (self.line_head_tag, 
                        self.short_line_head_tag),   # элемент помечен тегом связи
                    )
                )


    #################        


    def set_par_set_head(self):    # установка параметров установки с.головки

                # координаты установочной (начальной) позиции
        self.x0_head = self.xhp[0]
        self.y0_head = self.yhp[0]

                # параметры прямоугольника корпуса с.головки
                    # поправки координат (относительно базовой позиции)
        yyy = 5             # отступ от длинной позиционной линии
        self.xxx1_corp = - Consts.corpus_length
        self.yyy1_corp = - Consts.corpus_height - yyy
        self.xxx2_corp = 0
        self.yyy2_corp = - yyy

                # параметры прямоугольникa инструмента с.головки
                    # поправки координат (относительно базовой позиции)
        self.xxx1_inst = 0
        y_exis = (Consts.corpus_height/2 + Consts.instrum_diametr/2) # ось инст.
        self.yyy1_inst = - y_exis - yyy
        self.xxx2_inst = self.inst_length 
        self.yyy2_inst = self.yyy1_inst + Consts.instrum_diametr


    def set_head(self):    # установка с.головки в начальную позицию

                # прямоугольник корпуса с.головки
                    # координаты
        xc1 = self.x0_head + self.xxx1_corp
        yc1 = self.y0_head + self.yyy1_corp
        xc2 = self.x0_head + self.xxx2_corp
        yc2 = self.y0_head + self.yyy2_corp
                    # создание прямоугольгика
        self.corpus_rect = wins.c1.create_rectangle(
            xc1,
            yc1,
            xc2,
            yc2,
            fill = "Black",
            tag = self.head_tag             # элемент помечен тегом связи
            )

                # вписывание текста с номером с.головки (в поле корпуса)
                    # координаты
        rect_coords = wins.c1.coords(self.corpus_rect)
        xt = rect_coords[0] + (rect_coords[2] - rect_coords[0])/2
        yt = rect_coords[1] + (rect_coords[3] - rect_coords[1])/2
                    # создание текста
        self.head_text = wins.c1.create_text(
            xt,
            yt,
            text = self.head_number,
#            font = "Times 11 bold",
            font = "Courer 11 bold",
            fill = "White",
            tag = self.head_tag              # элемент помечен тегом связи
            )
        
            # прямоугольник инструмента с.головки
                   # координаты
        xi1 = self.x0_head + self.xxx1_inst
        yi1 = self.y0_head + self.yyy1_inst
        xi2 = self.x0_head + self.xxx2_inst
        yi2 = self.y0_head + self.yyy2_inst
                    # создание прямоугольгика
        self.inst_rect = wins.c1.create_rectangle(
            xi1,
            yi1,
            xi2,
            yi2,
            fill = "Black",
            tag = self.head_tag             # элемент помечен тегом связи
            )
        
        # связка графических элементов тегом (для совместного премещения)
#        wins.c1.addtag_withtag(self.head_tag, self.corpus_rect)

    #########################

        # установка параметров движегия сюголовки
    def set_par_move(self):
            # заданные (базовые) координаты позиций
        self.bc_head = self.xhp
            # модуль шага        
        self.mdx = 1
        self.mdy = 0
            # базовый параметр координат прямоугольника корпуса
        self.par = 2            #   0: x1;  1: y1;  2: x2;  3: y2

    ###########################

    def move_head(self, pp_head, speed):  # перемещение с.головки
        # pp_head = 0, 1, 2: заданная позиция с.головки : 
        # speed - заданная скорость хода с.головки:
            # high - высокая скорость (быстрый подвод инструмента к детали)
            # work - рабочая скорость (work feed: рабочая подача)

            # координаты прямоугольника корпуса
        rect_coords = wins.c1.coords(self.corpus_rect)  # координаты прям-ка
        wc_head = rect_coords[self.par]         # текущая базовая координата
            # координата заданной позиция
        gc_head = self.bc_head[pp_head]
        if wc_head < gc_head:
            dx = self.mdx
            dy = self.mdy
        if wc_head > gc_head:
            dx = - self.mdx
            dy = - self.mdy            
        delay = crt.c_board.step_delay.get() * 0.0001
        while (wc_head != gc_head):
            if crt.c_board.extr_stop == 1: break    # проверка прерывания            
            wins.c1.move(self.head_tag, dx, dy)     # подвижка группы фигур
            rect_coords = wins.c1.coords(self.corpus_rect)
            wc_head = rect_coords[self.par]   # текущая рабочая координата
            wins.c1.update()                  # обновление экрана
            if speed == 'high':               # внутрицикловая задержка 
#                time.sleep(Consts.delay_st)
                time.sleep(delay)
            elif speed == 'work':
#                time.sleep(Consts.delay_st * 10)
                time.sleep(delay * 10)

    #####################

    def create_head(self):
        self.set_par_head_pos()             #
        self.set_par_head_positions_long_line()
        self.set_par_head_positions_short_lines()
        self.creat_head_positions_long_line()
        self.creat_head_positions_short_lines()
        self.set_par_set_head()
        self.set_head()
        self.set_par_move()


    #####################


    def __init__(self, xh_bbb, yh_bbb):
            # тег очереного объекта силовой головки
        Head.head_number = Head.head_number + 1
        self.head_number = Head.head_number
        self.head_tag = 'head_tag' + str(self.head_number)
        self.line_head_tag = 'line_head_tag' + str(self.head_number)
        self.short_line_head_tag = 'short_line_head_tag' + str(self.head_number)
        self.set_head_base(xh_bbb, yh_bbb)
        self.create_head()

    #####################

    

########################


class LeftHead(Head):          # левая с.головка

    def set_par_head_pos(self):     # параметры опизиций эталонной с.головок

                # продольные параметры (относительно базы)                
        self.sd_bound = Consts.det_width/2       # граница детали             
        self.shd_min = 10        # допустимое минимаьное растояние с.головки до детали
#        self.inst_length = Consts.instrum_length # список длины интсрумента с.головок
        self.hihgh_speed_lenth = Consts.hihgh_speed_lenth    # длина пути (быстрого) подвода с.головок 

            # позиции эталонной с.головки в абстрактной системе (от базы_
        self.shp2 = self.sd_bound + self.shd_min    # конечная позиция
        self.inst_length = Consts.instrum_length[self.head_number - 1] # длина инстр.
        self.shp1 = self.shp2 + self.inst_length    # промежуточная позиция
        self.ahp0 = self.shp1 + self.hihgh_speed_lenth  # начальная позиция

            # списки координт позиций с.головок в абсолюной системе
        self.xhp = [
            self.xh_base - self.ahp0,
            self.xh_base - self.shp1,
            self.xh_base - self.shp2,
            ]
        self.yhp = [
            self.yh_base,
            self.yh_base,
            self.yh_base,
            ]



class RightHead(Head):          # левая с.головка

    
    def set_par_head_pos(self):     # абстрактные позициии силовых головок

        self.sd_bound = Consts.det_width/2
        self.shd_min = 10        # допустимое минимаьное растояние с.головки до детали
        self.hihgh_speed_lenth = Consts.hihgh_speed_lenth    # длина пути (быстрого) подвода с.головок 

            # позиции эталонной с.головки в абстрактной системе
        self.shp2 = self.sd_bound + self.shd_min      # расстояние до конечной позиции (от s-базы)
        self.inst_length = Consts.instrum_length[self.head_number - 1]
        self.shp1 = self.shp2 + self.inst_length
        self.ahp0 = self.shp1 + self.hihgh_speed_lenth

            # списки координта позиций в абсолюной системе
        self.xhp = [
            self.xh_base + self.ahp0,
            self.xh_base + self.shp1,
            self.xh_base + self.shp2,
            ]
        self.yhp = [
            self.yh_base,
            self.yh_base,
            self.yh_base,
            ]

    def set_par_head_positions_long_line(self):      # рабочие позиции силовых головок
            # ждинная линия
        self.x1_long_line = self.xh_base + (Consts.win1_width/2 - 10)
        self.y1_long_line = self.yh_base
        self.x2_long_line = self.xh_base
        self.y2_long_line = self.yh_base

    def set_par_head_positions_short_lines(self):
             # списка параметров (3-х) коротких линий
        self.x1_short_line = self.xhp
        self.y1_short_line = self.yhp
        self.x2_short_line = self.xhp
        self.y2_short_line = [
            self.yh_base + 10,
            self.yh_base + 10,
            self.yh_base + 10
            ]

    def set_par_set_head(self):    # установка параметров установки с.головки
                # координаты позиции
        self.x0_head = self.xhp[0]
        self.y0_head = self.yhp[0]
                # параметры прямоугольника корпуса с.головки
                    # поправки координат (относительно базовой позиции)
        self.xxx1_corp = 0
        self.yyy1_corp = - Consts.corpus_height - 5
        self.xxx2_corp = Consts.corpus_length
        self.yyy2_corp = - 5
                # параметры прямоугольникa инструмента с.головки
                    # поправки координат (относительно базовой позиции)
        self.xxx1_inst = - self.inst_length #Consts.instrum_length[Head.head_number
        self.yyy1_inst = -(Consts.corpus_height/2 + Consts.instrum_diametr/2) -5
        self.xxx2_inst = 0
        self.yyy2_inst = self.yyy1_inst + Consts.instrum_diametr

    def set_par_move(self):
            # заданные (базовые) координаты позиций
        self.bc_head = self.xhp
            # модуль (величина) шага        
        self.mdx = 1
        self.mdy = 0
            # базовые параметры координат прямоугольника корпуса
        self.par = 0            #   0: x1;  1: y1;  2: x2;  3: y2



###################################
        
class UpperHead(Head):          # левая с.головка


    def set_par_head_pos(self):     # абстрактные позициии силовых головок
        self.sd_bound = Consts.det_height
        self.shd_min = 10        # допустимое минимаьное растояние с.головки до детали
        self.hihgh_speed_lenth = Consts.hihgh_speed_lenth    # длина пути (быстрого) подвода с.головок 
        
        print 'det_height UH =', Consts.det_height


            # позиции эталонной с.головки в абстрактной системе
        self.shp2 = self.sd_bound + self.shd_min      # расстояние до конечной позиции (от s-базы)
        self.inst_length = Consts.instrum_length[self.head_number - 1]
        self.shp1 = self.shp2 + self.inst_length
        self.ahp0 = self.shp1 + self.hihgh_speed_lenth

            # списки координта позиций в абсолюной системе
        self.xhp = [
            self.xh_base,
            self.xh_base,
            self.xh_base,
            ]
        self.yhp = [
            self.yh_base - self.ahp0,
            self.yh_base - self.shp1,
            self.yh_base - self.shp2,
            ]

    def set_par_head_positions_long_line(self):      # рабочие позиции силовых головок
            # ждинная линия
        self.x1_long_line = self.xh_base + (Consts.corpus_height/2 + 5)
        self.y1_long_line = self.yh_base - (Consts.win1_height/2 - 10)
        self.x2_long_line = self.xh_base + (Consts.corpus_height/2 + 5)
        self.y2_long_line = self.yh_base

    def set_par_head_positions_short_lines(self):
            # списка параметров (3-х) коротких линий
        self.x1_short_line = [
            self.xh_base + (Consts.corpus_height/2 + 5),
            self.xh_base + (Consts.corpus_height/2 + 5),
            self.xh_base + (Consts.corpus_height/2 + 5)
            ]
        self.y1_short_line = self.yhp
        self.x2_short_line = [
            self.xh_base + (Consts.corpus_height/2 + 5) + 10,
            self.xh_base + (Consts.corpus_height/2 + 5) + 10,
            self.xh_base + (Consts.corpus_height/2 + 5) + 10
            ]
        self.y2_short_line = self.yhp

    def set_par_set_head(self):    # установка параметров установки с.головки
                # координаты позиции
        self.x0_head = self.xhp[0]
        self.y0_head = self.yhp[0]
                # параметры прямоугольника корпуса с.головки
                    # поправки координат (относительно базовой позиции)
        self.xxx1_corp = - Consts.corpus_height/2
        self.yyy1_corp = - Consts.corpus_length
        self.xxx2_corp = + Consts.corpus_height/2
        self.yyy2_corp = 0
                # параметры прямоугольникa инструмента с.головки
                    # поправки координат (относительно базовой позиции)
        self.xxx1_inst = - Consts.instrum_diametr/2
        self.yyy1_inst = 0
        self.xxx2_inst = + Consts.instrum_diametr/2
        self.yyy2_inst = self.inst_length

    def set_par_move(self):
            # заданные (базовые) координаты позиций
        self.bc_head = self.yhp
            # модуль (величина) шага        
        self.mdx = 0
        self.mdy = 1
            # базовые параметры координат прямоугольника корпуса
        self.par = 3            #   0: x1;  1: y1;  2: x2;  3: y2



#########################

class LowerHead(Head):          # нижняя с.головка


    def set_par_head_pos(self):     # абстрактные позициии силовых головок

        self.sd_bound = 0#Consts.det_height
        self.shd_min = 10        # допустимое минимаьное растояние с.головки до детали
        self.hihgh_speed_lenth = Consts.hihgh_speed_lenth    # длина пути (быстрого) подвода с.головок 


            # позиции эталонной с.головки в абстрактной системе
        self.shp2 = self.sd_bound + self.shd_min      # расстояние до конечной позиции (от s-базы)
        self.inst_length = Consts.instrum_length[self.head_number - 1]
        self.shp1 = self.shp2 + self.inst_length
        self.ahp0 = self.shp1 + self.hihgh_speed_lenth

            # списки координта позиций в абсолюной системе
        self.xhp = [
            self.xh_base,
            self.xh_base,
            self.xh_base,
            ]
        self.yhp = [
            self.yh_base + self.ahp0,
            self.yh_base + self.shp1,
            self.yh_base + self.shp2,
            ]

    def set_par_head_positions_long_line(self):      # рабочие позиции силовых головок
            # ждинная линия
        self.x1_long_line = self.xh_base + (Consts.corpus_height/2 + 5)
        self.y1_long_line = self.yh_base 
        self.x2_long_line = self.xh_base + (Consts.corpus_height/2 + 5)
        self.y2_long_line = self.yh_base + (Consts.win1_height/2 - 10)

    def set_par_head_positions_short_lines(self):
            # списка параметров (3-х) коротких линий
        self.x1_short_line = [
            self.xh_base + (Consts.corpus_height/2 + 5),
            self.xh_base + (Consts.corpus_height/2 + 5),
            self.xh_base + (Consts.corpus_height/2 + 5)
            ]
        self.y1_short_line = self.yhp
        self.x2_short_line = [
            self.xh_base + (Consts.corpus_height/2 + 5) + 10,
            self.xh_base + (Consts.corpus_height/2 + 5) + 10,
            self.xh_base + (Consts.corpus_height/2 + 5) + 10
            ]
        self.y2_short_line = self.yhp

    def set_par_set_head(self):    # установка параметров установки с.головки
                # координаты позиции
        self.x0_head = self.xhp[0]
        self.y0_head = self.yhp[0]
                # параметры прямоугольника корпуса с.головки
                    # поправки координат (относительно базовой позиции)
        self.xxx1_corp = - Consts.corpus_height/2
        self.yyy1_corp = 0
        self.xxx2_corp = + Consts.corpus_height/2
        self.yyy2_corp = + Consts.corpus_length
                # параметры прямоугольникa инструмента с.головки
                    # поправки координат (относительно базовой позиции)
        self.xxx1_inst = - Consts.instrum_diametr/2
        self.yyy1_inst = - self.inst_length
        self.xxx2_inst = + Consts.instrum_diametr/2
        self.yyy2_inst = 0

    def set_par_move(self):
            # заданные (базовые) координаты позиций
        self.bc_head = self.yhp
            # модуль (величина) шага        
        self.mdx = 0
        self.mdy = 1
            # базовые параметры координат прямоугольника корпуса
        self.par = 1            #   0: x1;  1: y1;  2: x2;  3: y2




###################################################

class CreatHeads0:      # технологическая система

    def creat_heads0(self):     # создание и размещение силовых головок

        Consts.det_height = 40         # новые размеры детали
        Consts.det_width = 120

        xxx = Consts.x_base     # базовая модель
        yyy = Consts.y_base

###########
        
class CreatHeads1:      # технологическая система

    def creat_heads1(self):     # создание и размещение силовых головок

        Consts.det_height = 40         # новые размеры детали
        Consts.det_width = 120

        xxx = Consts.x_base     # 1 с.головка    
        yyy = Consts.y_base
        self.head1 = LeftHead(xxx, yyy)               # с.головка СГ1

        self.head1.zzh = 0

    def del_heads1(self):
        wins.c1.delete(self.head1.head_tag)
        wins.c1.delete(self.head1.line_head_tag)        

##########
        
class CreatHeads2:      # технологическая система

    def creat_heads2(self):     # создание и размещение силовых головок

        Consts.det_height = 40         # новые размеры детали
        Consts.det_width = 120

        xxx = Consts.x_base     # 2 с.головки
        yyy = Consts.y_base
        self.head1 = LeftHead(xxx, yyy)               # с.головка СГ1
        self.head2 = RightHead(xxx, yyy)               # с.головка СГ2

        self.head1.zzh = 0
        self.head2.zzh = 0

    def del_heads2(self):

        wins.c1.delete(self.head1.head_tag)
        wins.c1.delete(self.head2.head_tag)

        wins.c1.delete(self.head1.line_head_tag)        
        wins.c1.delete(self.head2.line_head_tag)        

###########

class CreatHeads3:      # технологическая система

    def creat_heads3(self):     # создание и размещение силовых головок

        Consts.det_height = 40         # новые размеры детали
        Consts.det_width = 120

        xxx = Consts.x_base     # 3 с.головки
        yyy = Consts.y_base
        self.head1 = LeftHead(xxx, yyy)               # с.головка СГ1
        self.head2 = RightHead(xxx, yyy)               # с.головка СГ2
        self.head3 = UpperHead(xxx, yyy)               # с.головка СГ3

        self.head1.zzh = 0
        self.head2.zzh = 0
        self.head3.zzh = 0

    def del_heads3(self):

        wins.c1.delete(self.head1.head_tag)
        wins.c1.delete(self.head2.head_tag)
        wins.c1.delete(self.head3.head_tag)

        wins.c1.delete(self.head1.line_head_tag)        
        wins.c1.delete(self.head2.line_head_tag)        
        wins.c1.delete(self.head3.line_head_tag)        

###########
        
class CreatHeads4:      # технологическая система

    def creat_heads4(self):     # создание и размещение силовых головок
        xxx = Consts.x_base     # 4 с.головки
        yyy = Consts.y_base
        self.head1 = LeftHead(xxx, yyy)               # с.головка СГ1
        self.head2 = RightHead(xxx, yyy)               # с.головка СГ2
        self.head3 = UpperHead(xxx, yyy)               # с.головка СГ3
        self.head4 = LowerHead(xxx, yyy)               # с.головка СГ3

        self.head1.zzh = 0
        self.head2.zzh = 0
        self.head3.zzh = 0
        self.head4.zzh = 0

    def del_heads4(self):

        wins.c1.delete(self.head1.head_tag)
        wins.c1.delete(self.head2.head_tag)
        wins.c1.delete(self.head3.head_tag)
        wins.c1.delete(self.head4.head_tag)

        wins.c1.delete(self.head1.line_head_tag)        
        wins.c1.delete(self.head2.line_head_tag)        
        wins.c1.delete(self.head3.line_head_tag)        
        wins.c1.delete(self.head4.line_head_tag)        

#############
        
class CreatHeads12:      # технологическая система

    def creat_heads12(self):        # создание и размещение силовых головок
                                    # 12 с.головок
        Consts.det_height = 120         # новые размеры детали
        Consts.det_width = 128

        xxx = Consts.x_base
        yyy = Consts.y_base
        self.head1 = LeftHead(xxx, yyy)               # с.головка СГ1
        self.head2 = LeftHead(xxx, yyy - 40)               # с.головка СГ2
        self.head3 = LeftHead(xxx, yyy - 80)               # с.головка СГ3
        self.head4 = RightHead(xxx, yyy)               # с.головка СГ4
        self.head5 = RightHead(xxx, yyy - 40)               # с.головка СГ5
        self.head6 = RightHead(xxx, yyy - 80)               # с.головка СГ6
        self.head7 = UpperHead(xxx - 40, yyy)               # с.головка СГ7
        self.head8 = UpperHead(xxx, yyy)               # с.головка СГ8
        self.head9 = UpperHead(xxx + 40, yyy)               # с.головка СГ9
        self.head10 = LowerHead(xxx - 40, yyy)               # с.головка СГ10
        self.head11 = LowerHead(xxx, yyy)               # с.головка СГ11
        self.head12 = LowerHead(xxx + 40, yyy)               # с.головка СГ12

        self.head1.zzh = 0
        self.head2.zzh = 0
        self.head3.zzh = 0
        self.head4.zzh = 0
        self.head5.zzh = 0
        self.head6.zzh = 0
        self.head7.zzh = 0
        self.head8.zzh = 0
        self.head9.zzh = 0
        self.head10.zzh = 0
        self.head11.zzh = 0
        self.head12.zzh = 0

    def del_heads12(self):

        wins.c1.delete(self.head1.head_tag)
        wins.c1.delete(self.head2.head_tag)
        wins.c1.delete(self.head3.head_tag)
        wins.c1.delete(self.head4.head_tag)
        wins.c1.delete(self.head5.head_tag)
        wins.c1.delete(self.head6.head_tag)
        wins.c1.delete(self.head7.head_tag)
        wins.c1.delete(self.head8.head_tag)
        wins.c1.delete(self.head9.head_tag)
        wins.c1.delete(self.head10.head_tag)
        wins.c1.delete(self.head11.head_tag)
        wins.c1.delete(self.head12.head_tag)

        wins.c1.delete(self.head1.line_head_tag)        
        wins.c1.delete(self.head2.line_head_tag)        
        wins.c1.delete(self.head3.line_head_tag)        
        wins.c1.delete(self.head4.line_head_tag)        
        wins.c1.delete(self.head5.line_head_tag)        
        wins.c1.delete(self.head6.line_head_tag)        
        wins.c1.delete(self.head7.line_head_tag)        
        wins.c1.delete(self.head8.line_head_tag)        
        wins.c1.delete(self.head9.line_head_tag)        
        wins.c1.delete(self.head10.line_head_tag)        
        wins.c1.delete(self.head11.line_head_tag)        
        wins.c1.delete(self.head12.line_head_tag)        

################

class TechnolSystem(
    CreatHeads0,
    CreatHeads1,
    CreatHeads2,
    CreatHeads3,
    CreatHeads4,
    CreatHeads12,
    ):      # технологическая система: множественное наследование классов

    def  __init__(self):                # порождение заданной конфигурации
        self.det_pos = DetPositions()
        if wins.atk0:
            self.creat_heads0()
        if wins.atk1:
            self.creat_heads1()
        if wins.atk2:
            self.creat_heads2()
        if wins.atk3 or wins.atk3s:
            self.creat_heads3()
        if wins.atk4:
            self.creat_heads4()
        if wins.atk12:
            self.creat_heads12()



####################################################
############### классы блоков управления


class HeadsCycles:
        # БУЦ-У1: Блок управления цикламиюУровень 1:
        # управление циклами работы силовых головок
         
            # циклы работы силовых головок
            # hhhn - (полное) имя (екземпляра) сюголовки

    def head_cycle_i0t0(self, hhhn):    # простой цикл силовой головки^
                                            # i0 - без прерываний
                                            # t0 - без вывода времени
                                    # силовая головка в позиции p0                                        
        hhhn.move_head(1, 'high')       # быстрый подвод в позицию p1
        hhhn.move_head(2, 'work')       # рабочая подача в позицию p2
        time.sleep(Consts.delay/2)      # вдержка на упоре (для глухихи отв-ий)
        hhhn.move_head(0, 'high')       # выстрцый возврат в позицию p0

    def head_cycle_i0t1(self, hhhn):    # цикл силовой головки
                                            # i0 - без прерываний
                                            # t1 - с выводом времени
        mutex = thread.allocate_lock()  # замок взаимного исключения доступа

#        mutex.acquire()
#        print
#        print 'начало цикла с.головки hc', hhhn
        tb_hc = time.clock()
#        print 'tb_h', hhhn, ' = ', tb_hc
#        mutex.release()

        hhhn.move_head(1, 'high')
        hhhn.move_head(2, 'work')
        time.sleep(Consts.delay/2)
        hhhn.move_head(0, 'high')

#        mutex.acquire()
#        print
#        print 'конец цикла с.головки hc', hhhn
        te_hc = time.clock()
#        print 'te_hc', hhhn, ' = ', te_hc
        mutex.acquire()
#        print
        print 'длительность цикла с.головки hc', hhhn.head_number
        mz_hc = te_hc - tb_hc
        print 'mz_hc', hhhn.head_number, ' = ', mz_hc
        mutex.release()


    def head_cycle_i1(self, hhhn):      # цикл силовой головки
                                            # i1 - с прерываниями
                                            # t1 - с выводом времени
        if crt.c_board.extr_stop == 0:            
#            if crt.c_board.cycle_var.get() == 11: # последовательный цикл
#                if crt.c_board.wait_cbtn_var.get() == 1:
#                    wins.c1.wait_variable(crt.c_board.wait_var)
            hhhn.move_head(1, 'high')
        if crt.c_board.extr_stop == 0:
#            print 'cycle_var = ', crt.c_board.cycle_var.get()
            if crt.c_board.cycle_var.get() == 11: # последовательный цикл
                if crt.c_board.wait_cbtn_var.get() == 1:
                    wins.c1.wait_variable(crt.c_board.wait_var)
            hhhn.move_head(2, 'work')
        time.sleep(Consts.delay/2)
        if crt.c_board.extr_stop == 0:
            if crt.c_board.cycle_var.get() == 11: # последовательный цикл
                if crt.c_board.wait_cbtn_var.get() == 1:
                    wins.c1.wait_variable(crt.c_board.wait_var)
            hhhn.move_head(0, 'high')


    def head_cycle(self, hhhn):         # цикл силовой головки
                                        # Выбор вариантов исполнения
                        # hhhn - (полное) имя (екземпляра) с.головки
        if crt.c_board.interruptions_var.get() == 0:
            if crt.c_board.t_var.get() == 0:
                self.head_cycle_i0t0(hhhn)
            else:
                self.head_cycle_i0t1(hhhn)
        else:
            self.head_cycle_i1(hhhn)


    def Zh(self, hhhn):         # команда управления циклом силовой головки
        hhhn.yzh = 0                # выходная переменная – передача управления
        hhhn.zzh = 1                # переменная индикации рабочего состояния 
        self.head_cycle(hhhn)
        hhhn.zzh = 0                # переменная индикации рабочего состояния
        hhhn.yzh = 1                # выходная переменная      


####################

class HeadsGroupCycles_atk0(HeadsCycles):   # пустые групповые циклы
                                            # нет с.головок
    def A001(self):             # пустой алгоритм
        pass                    # интепретация 1 - закнутая перемычка

    def A002(self):             # пустой алгоритм - пока не реализован
        pass                    # интепретация 2 - разомкнутая перемычка

    def heads_group_cycle_atk0(self):
        if crt.c_board.cycle_var.get() == 'A001':     # частичный параллелизм
            self.A001()
        if crt.c_board.cycle_var.get() == 'A002':     # частичный параллелизм
            self.A002()

####################


class HeadsGroupCycles_atk1(HeadsCycles):   # еденичные групповые циклы
                                            # одлна с. головка СГ1
    def A101(self):
        self.Zh(crt.techsys.head1)

    def A101_2(self):
        pass

    def heads_group_cycle_atk1(self):
        if crt.c_board.cycle_var.get() == 'A101':
            self.A101()
        if crt.c_board.cycle_var.get() == 'A101_2':
            self.A101_2()


####################

class HeadsGroupCycles_atk2(HeadsCycles):   # групповые циклы: СГ1, СГ2, СГ3 

    def A211(self):           # прямая последовательность циклов СГ
        self.Zh(crt.techsys.head1)          # СГ1 - типовой цикл
        self.Zh(crt.techsys.head2)          # СГ2 - типовой цикл

    def A211_2(self):           # обратная последовательность циклов СГ
        self.Zh(crt.techsys.head2)          # СГ2 - типовой цикл
        self.Zh(crt.techsys.head1)          # СГ1 - типовой цикл

    def A222(self):           # параллельная конъюнкция процессов
        thread.start_new(self.Zh, (crt.techsys.head2, )) # поток СГ2        
        self.Zh(crt.techsys.head1)          # СГ1 - типовой цикл 
        while not(crt.techsys.head2.yzh):
            pass

    def A222_2(self):           # параллельная конъюнкция процессов
        thread.start_new(self.Zh, (crt.techsys.head1, )) # поток СГ1        
        thread.start_new(self.Zh, (crt.techsys.head2, )) # поток СГ2        
        time.sleep(1)
        while not(crt.techsys.head1.yzh):
            pass
        while not(crt.techsys.head2.yzh):
            pass

    def A222_3(self):           # параллельная конъюнкция процессов
        thread.start_new(self.Zh, (crt.techsys.head1, )) # поток СГ1        
        thread.start_new(self.Zh, (crt.techsys.head2, )) # поток СГ2        
        time.sleep(1)
        while not(crt.techsys.head1.yzh and crt.techsys.head2.yzh):
            pass

    def A232(self):             # параллельная дизъюнкция процессов
        thread.start_new(self.Zh, (crt.techsys.head1, )) # поток СГ1        
        thread.start_new(self.Zh, (crt.techsys.head2, )) # поток СГ2        
        time.sleep(1)
        while not(crt.techsys.head1.yzh or crt.techsys.head2.yzh):
            pass

    def heads_group_cycle_atk2(self):
    
        if crt.c_board.cycle_var.get() == 'A211':  # последовательный цикл
            self.A211()

        if crt.c_board.cycle_var.get() == 'A211_2':  # последовательный цикл
            self.A211_2()

        if crt.c_board.cycle_var.get() == 'A222':  # параллельный цикл
            self.A222()

        if crt.c_board.cycle_var.get() == 'A222_2':  # параллельный цикл
            self.A222_2()

        if crt.c_board.cycle_var.get() == 'A222_3':  # параллельныйй цикл
            self.A222_3()

        if crt.c_board.cycle_var.get() == 'A232':   # параллельный цикл
            self.A232()

####################

class HeadsGroupCycles_atk3(HeadsCycles):   # групповые циклы СГ1, СГ2, СГ3 


    def A311(self):           # простой последовательный цикл
        self.Zh(crt.techsys.head1)          # СГ1 - типовой цикл
        self.Zh(crt.techsys.head2)          # СГ2 - типовой цикл
        self.Zh(crt.techsys.head3)          # СГ3 - типовой цикл

    def A01(self):          # подпрограмма второго потока
        self.za01 = 0
        thread.start_new(self.Zh, (crt.techsys.head3, )) # поток СГ1        
        self.Zh(crt.techsys.head2)    
        while not(crt.techsys.head3.yzh):
            pass
        self.za01 = 1
        
    def A323(self):
        thread.start_new(self.A01, ( )) # поток СГ1
        self.Zh(crt.techsys.head1)              # типовой цикл СГ1
        while not(self.za01):
            pass

    def A323_2(self):  # все три цикла выносятся в потоки
        thread.start_new(self.Zh, (crt.techsys.head1, ))
        thread.start_new(self.Zh, (crt.techsys.head2, ))
        thread.start_new(self.Zh, (crt.techsys.head3, ))
        time.sleep(1)
        while not(crt.techsys.head1.yzh and crt.techsys.head2.yzh and crt.techsys.head3.yzh):
            pass


    def A322(self):   
        thread.start_new(self.Zh, (crt.techsys.head1, ))
        thread.start_new(self.Zh, (crt.techsys.head2, ))
        time.sleep(1)
        while not(crt.techsys.head1.yzh and crt.techsys.head2.yzh):
            pass
        while not crt.techsys.head2.yzh: 
            pass

        self.Zh(crt.techsys.head3)               # цикл силовой головки

    def A332(self):
        thread.start_new(self.Zh, (crt.techsys.head1, ))
        thread.start_new(self.Zh, (crt.techsys.head2, ))
        time.sleep(1)                               # спец. задержка
        while not(crt.techsys.head1.yzh or crt.techsys.head2.yzh):
            pass
        self.Zh(crt.techsys.head3)                          # цикл силовой головки

    def A342(self):
        thread.start_new(self.Zh, (crt.techsys.head1, ))
        thread.start_new(self.Zh, (crt.techsys.head2, ))
        time.sleep(1)                               # спец. задержка
        while not(crt.techsys.head1.yzh or crt.techsys.head2.yzh):
            pass
        self.Zh(crt.techsys.head3)               # цикл силовой головки
        while not(crt.techsys.head1.yzh and crt.techsys.head2.yzh):
            pass


    def heads_group_cycle_atk3(self):
    
        if crt.c_board.cycle_var.get() == 'A311':   # последовательный цикл
            self.A311()

        if crt.c_board.cycle_var.get() == 'A323':  # максимальный параллелизм
            self.A323()

        if crt.c_board.cycle_var.get() == 'A323_2':  # максимальный параллелизм
            self.A323_2()

        if crt.c_board.cycle_var.get() == 'A322':   # частичный параллелизм
            self.A322()

        if crt.c_board.cycle_var.get() == 'A332':   # частичный параллелизм            
            self.A332()

        if crt.c_board.cycle_var.get() == 'A342':   # частичный параллелизм
            self.A342()


####################

class HeadsGroupCycles_atk3s(HeadsCycles):   # групповые циклы СГ1, СГ2, СГ3 


    def A311_i0t0(self):                # простой последовательный цикл
        self.Zh(crt.techsys.head1)          # СГ1 - типовой цикл
        self.Zh(crt.techsys.head2)          # СГ2 - типовой цикл
        self.Zh(crt.techsys.head3)          # СГ3 - типовой цикл

    def A311_i0t1(self):           # последовательный цикл 
                                        # с выводом времени и длительности цикла
        print
        print 'начало цикла группы с.головок hgc11'
        tb_hgc11 = time.clock()
        print 'tb_hgc11 = ', tb_hgc11
        print
        
        self.Zh(crt.techsys.head1)
        self.Zh(crt.techsys.head2)
        self.Zh(crt.techsys.head3)

        print
        print 'конец цикла группы с.головок hgc11'
        te_hgc11 = time.clock()
        print 'te_hgc11 = ', te_hgc11
#        print
        print 'длительность цикла группы с.головок hgc11'
        ma_hgc11 = te_hgc11 - tb_hgc11
        print 'ma_hgc11 = ', ma_hgc11

    def A311_i1(self):             # последовательный цикл - с прерываниями
        if crt.c_board.tech_stop2 == 0:
            if crt.c_board.extr_stop == 0:
#            if ControlBoard.extr_stop == 0:
#               if crt.c_board.wait_cbtn_var.get() == 1:
#                       wins.c1.wait_variable(crt.c_board.wait_var)
                self.Zh(crt.techsys.head1)               # цикл силовой головки
        else:
            wins.c1.wait_variable(crt.c_board.wait_var)
            crt.c_board.tech_stop2 = 0
            self.Zh(crt.techsys.head1)               # цикл силовой головки

        if crt.c_board.tech_stop2 == 0:
            if crt.c_board.extr_stop == 0:
                if crt.c_board.wait_cbtn_var.get() == 1:
                    wins.c1.wait_variable(crt.c_board.wait_var)
                self.Zh(crt.techsys.head2)               # цикл силовой головки
        else:
            wins.c1.wait_variable(crt.c_board.wait_var)
            crt.c_board.tech_stop2 = 0
            self.Zh(crt.techsys.head2)               # цикл силовой головки


        if crt.c_board.tech_stop2 == 0:
            if crt.c_board.extr_stop == 0:
                if crt.c_board.wait_cbtn_var.get() == 1:
                    wins.c1.wait_variable(crt.c_board.wait_var)
                self.Zh(crt.techsys.head3)               # цикл силовой головки
        else:
            wins.c1.wait_variable(crt.c_board.wait_var)
            crt.c_board.tech_stop2 = 0
            self.Zh(crt.techsys.head3)               # цикл силовой головки

    za01 = 0                # переменная индикации окончания подпрограммы
    
    def A01(self):          # подпрограмма второго потока
        self.za01 = 0
        thread.start_new(self.Zh, (crt.techsys.head3, )) # поток СГ1        
        self.Zh(crt.techsys.head2)    
        while not(crt.techsys.head3.yzh):
            pass
        self.za01 = 1
        
    def A3231_i0t0(self):
        thread.start_new(self.A01, ( )) # поток СГ1
        self.Zh(crt.techsys.head1)              # типовой цикл СГ1
        while not(self.za01):
            pass

    def A3231_i0t1(self):

        print
        print 'начало цикла группы с.головок hgc321'
        tb_hgc321 = time.clock()
        print 'tb_hgc321 = ', tb_hgc321
        print

        thread.start_new(self.Zh, (crt.techsys.head1, ))
        thread.start_new(self.Zh, (crt.techsys.head2, ))
        self.Zh(crt.techsys.head3)               # цикл силовой головки
        while not(crt.techsys.head1.yzh and crt.techsys.head2.yzh):
            pass

        print
        print 'конец цикла группы с.головок hgc321'
        te_hgc321 = time.clock()
        print 'te_hgc321 = ', te_hgc321
#        print
        print 'длительность цикла группы с.головок hgc321'
        ma_hgc321 = te_hgc321 - tb_hgc321
        print 'ma_hgc321 = ', ma_hgc321

    def A3231_i1(self):
        if crt.c_board.tech_stop2 == 0:            
            if crt.c_board.extr_stop == 0:
                thread.start_new(self.Zh, (crt.techsys.head1, ))
                thread.start_new(self.Zh, (crt.techsys.head2, ))
                self.Zh(crt.techsys.head3)               # цикл силовой головки
        while not(crt.techsys.head1.yzh and crt.techsys.head2.yzh):
            if crt.c_board.tech_stop2 == 1: break
            if crt.c_board.extr_stop == 1: break


    def A3232_i0t0(self):  # все три цикла выносятся в потоки
        thread.start_new(self.Zh, (crt.techsys.head1, ))
        thread.start_new(self.Zh, (crt.techsys.head2, ))
        thread.start_new(self.Zh, (crt.techsys.head3, ))
        #time.sleep(1)
        while not(crt.techsys.head1.yzh and crt.techsys.head2.yzh and crt.techsys.head3.yzh):
#        while not(HeadsCycles.Zh(head1).yzh and HeadsCycles.Zh(head2).yzh and HeadsCycles.Zh(head3).yzh):
            pass

    def A3232_i0t1(self):

        print
        print 'начало цикла группы с.головок hgc322'
        tb_hgc322 = time.clock()
        print 'tb_hgc322 = ', tb_hgc322
        print

        thread.start_new(self.Zh, (crt.techsys.head1, ))
        thread.start_new(self.Zh, (crt.techsys.head2, ))
        thread.start_new(self.Zh, (crt.techsys.head3, ))
        #time.sleep(1)
        while not(crt.techsys.head1.yzh and crt.techsys.head2.yzh and crt.techsys.head3.yzh):
            pass

        print
        print 'конец цикла группы с.головок hgc322'
        te_hgc322 = time.clock()
        print 'te_hgc322 = ', te_hgc322
#        print
        print 'длительность цикла группы с.головок hgc322'
        ma_hgc322 = te_hgc322 - tb_hgc322
        print 'ma_hgc322 = ', ma_hgc322

    def A3232_i1(self):
        if crt.c_board.tech_stop2 == 0:            
            if crt.c_board.extr_stop == 0:
                thread.start_new(self.Zh, (crt.techsys.head1, ))
                thread.start_new(self.Zh, (crt.techsys.head2, ))
                thread.start_new(self.Zh, (crt.techsys.head3, ))
                time.sleep(1)
        while not(crt.techsys.head1.yzh and crt.techsys.head2.yzh and crt.techsys.head3.yzh):
            if crt.c_board.tech_stop2 == 1: break
            if crt.c_board.extr_stop == 1: break


    def A322_i0t0(self):   
        thread.start_new(self.Zh, (crt.techsys.head1, ))
        thread.start_new(self.Zh, (crt.techsys.head2, ))
        time.sleep(1)
        while not(crt.techsys.head1.yzh and crt.techsys.head2.yzh):
            pass
        while not crt.techsys.head2.yzh: 
            pass

        self.Zh(crt.techsys.head3)               # цикл силовой головки


    def A322_i0t1(self):

        print
        print 'начало цикла группы с.головок hgc22'
        tb_hgc22 = time.clock()
        print 'tb_hgc22 = ', tb_hgc22
        print

        thread.start_new(self.Zh, (crt.techsys.head2, ))
        thread.start_new(self.Zh, (crt.techsys.head1, ))
        self.Zh(crt.techsys.head1)
        #time.sleep(1)
        thread.join(self.head1_cycle, ( ))
        thread.join(self.head2_cycle, ( ))
        #while not crt.techsys.head1.yzh:
        #    pass
        #while not crt.techsys.head2.yzh: 
        #    pass
        self.Zh(crt.techsys.head3)               # цикл силовой головки

        print
        print 'конец цикла группы с.головок hgc22'
        te_hgc22 = time.clock()
        print 'te_hgc22 = ', te_hgc22
#        print
        print 'длительность цикла группы с.головок hgc22'
        ma_hgc22 = te_hgc22 - tb_hgc22
        print 'ma_hgc22 = ', ma_hgc22

    def A322_i1(self):
        if crt.c_board.tech_stop2 == 0:            
            if crt.c_board.extr_stop == 0:
                thread.start_new(self.Zh, (crt.techsys.head1, ))
                thread.start_new(self.Zh, (crt.techsys.head2, ))
                time.sleep(1)
        while not(crt.techsys.head1.yzh and crt.techsys.head2.yzh):
            if crt.c_board.tech_stop2 == 1: break
            if crt.c_board.extr_stop == 1: break
        if crt.c_board.tech_stop2 == 0:
            if crt.c_board.extr_stop == 0:
                self.Zh(crt.techsys.head3)               # цикл силовой головки


    def A332_i0t0(self):
        thread.start_new(self.Zh, (crt.techsys.head1, ))
        thread.start_new(self.Zh, (crt.techsys.head2, ))
        #time.sleep(1)                               # спец. задержка
        while not(crt.techsys.head1.yzh or crt.techsys.head2.yzh):
            pass
        self.Zh(crt.techsys.head3)                          # цикл силовой головки


    def A332_i0t1(self):

        print
        print 'начало цикла группы с.головок hgc23'
        tb_hgc23 = time.clock()
        print 'tb_hgc23 = ', tb_hgc23
        print

        thread.start_new(self.Zh, (crt.techsys.head1, ))
        thread.start_new(self.Zh, (crt.techsys.head2, ))
        time.sleep(1)                               # спец. задержка
        while not(crt.techsys.head1.yzh or crt.techsys.head2.yzh):
            pass
        self.Zh(crt.techsys.head3)                          # цикл силовой головки

        print
        print 'конец цикла группы с.головок hgc23'
        te_hgc23 = time.clock()
        print 'te_hgc23 = ', te_hgc23
#        print
        print 'длительность цикла группы с.головок hgc231'
        ma_hgc23 = te_hgc23 - tb_hgc23
        print 'ma_hgc23 = ', ma_hgc23

    def A332_i1(self):
        if crt.c_board.tech_stop2 == 0:            
            if crt.c_board.extr_stop == 0:
                thread.start_new(self.Zh, (crt.techsys.head1, ))
                thread.start_new(self.Zh, (crt.techsys.head2, ))
                time.sleep(1)               # спец. задержка
        while not(crt.techsys.head1.yzh or crt.techsys.head2.yzh):
            if crt.c_board.tech_stop2 == 1: break
            if crt.c_board.extr_stop == 1: break
        if crt.c_board.tech_stop2 == 0:
            if crt.c_board.extr_stop == 0:
                self.Zh(crt.techsys.head3)               # цикл силовой головки


    def cycle3_42_i0t0(self):
        thread.start_new(self.Zh, (crt.techsys.head1, ))
        thread.start_new(self.Zh, (crt.techsys.head2, ))
        print 'спец. задержка'
        while not(crt.techsys.head1.yzh or crt.techsys.head2.yzh):
            pass
        self.Zh(crt.techsys.head3)               # цикл силовой головки
 #       while not(crt.techsys.head1.yzh and crt.techsys.head2.yzh and crt.techsys.head3.yzh):
        while not(crt.techsys.head1.yzh and crt.techsys.head2.yzh):
            pass

    def A342_i0t1(self):

        print
        print 'начало цикла группы с.головок hgc24'
        tb_hgc24 = time.clock()
        print 'tb_hgc24 = ', tb_hgc24
        print

        thread.start_new(self.Zh, (crt.techsys.head1, ))
        thread.start_new(self.Zh, (crt.techsys.head2, ))
        print 'спец. задержка'
        while not(crt.techsys.head1.yzh or crt.techsys.head2.yzh):
            pass
        self.Zh(crt.techsys.head3)               # цикл силовой головки
        while not(crt.techsys.head1.yzh and crt.techsys.head2.yzh and crt.techsys.head3.yzh):
            pass

        print
        print 'конец цикла группы с.головок hgc24'
        te_hgc24 = time.clock()
        print 'te_hgc24 = ', te_hgc24
#        print
        print 'длительность цикла группы с.головок hgc24'
        ma_hgc24 = te_hgc24 - tb_hgc24
        print 'ma_hgc24 = ', ma_hgc24

    def A342_i1(self):
        if crt.c_board.tech_stop2 == 0:            
            if crt.c_board.extr_stop == 0:
                thread.start_new(self.Zh, (crt.techsys.head1, ))
                thread.start_new(self.Zh, (crt.techsys.head2, ))
                print 'спец. задержка'
        while not(crt.techsys.head1.yzh or crt.techsys.head2.yzh):
            if crt.c_board.tech_stop2 == 1: break
            if crt.c_board.extr_stop == 1: break
        self.Zh(crt.techsys.head3)               # цикл силовой головки
        while not(crt.techsys.head1.yzh and crt.techsys.head2.yzh and crt.techsys.head3.yzh):
            if crt.c_board.tech_stop2 == 1: break
            if crt.c_board.extr_stop == 1: break


            # цикл1 обработки детали (в рабочей позиции): последовательный ц.
    def heads_group_cycle_atk3s(self):
  
        if crt.c_board.cycle_var.get() == 'A311': # последовательный цикл
            if crt.c_board.interruptions_var.get() == 0:
                if crt.c_board.t_var.get() == 0:
                    self.A311_i0t0()
                else:
                    self.A311_i0t1()
            else:
                self.A311_i1()                

        if crt.c_board.cycle_var.get() == 'A3231':     # максимальный параллелизм
            if crt.c_board.interruptions_var.get() == 0:        
                if crt.c_board.t_var.get() == 0:
                    self.A3231_i0t0()
                else:
                    self.A3231_i0t1()
            else:
                self.A3231_i1()

        if crt.c_board.cycle_var.get() == 'A3232':     # максимальный параллелизм
            if crt.c_board.interruptions_var.get() == 0:        
                if crt.c_board.t_var.get() == 0:
                    self.A3232_i0t0()
                else:
                    self.A3232_i0t1()
            else:
                self.A3232_i1()

        if crt.c_board.cycle_var.get() == 'A322':     # частичный параллелизм
            if crt.c_board.interruptions_var.get() == 0:        
                if crt.c_board.t_var.get() == 0:
                    self.A322_i0t0()
                else:
                    self.A322_i0t1()
            else:
                self.A322_i1()

        if crt.c_board.cycle_var.get() == 'A332':     # частичный параллелизм            
            if crt.c_board.interruptions_var.get() == 0:       
                if crt.c_board.t_var.get() == 0:
                    self.A332_i0t0()
                else:
                    self.A332_i0t1()
            else:
                self.A332_i1()

        if crt.c_board.cycle_var.get() == 'A342':     # частичный параллелизм
            if crt.c_board.interruptions_var.get() == 0:        
                if crt.c_board.t_var.get() == 0:
                    self.A342_i0t0()
                else:
                    self.A342_i0t1()
            else:
                self.A342_i1()

class HeadsGroupCycles_atk12(HeadsCycles):   # групповые циклы СГ1, СГ2, СГ3 

        #####################

    def A12_2_12(self):
        thread.start_new(self.Zh, (crt.techsys.head1, ))
        thread.start_new(self.Zh, (crt.techsys.head2, ))
        thread.start_new(self.Zh, (crt.techsys.head3, ))
        thread.start_new(self.Zh, (crt.techsys.head4, ))
        thread.start_new(self.Zh, (crt.techsys.head5, ))
        thread.start_new(self.Zh, (crt.techsys.head6, ))
        thread.start_new(self.Zh, (crt.techsys.head7, ))
        thread.start_new(self.Zh, (crt.techsys.head8, ))
        thread.start_new(self.Zh, (crt.techsys.head9, ))
        thread.start_new(self.Zh, (crt.techsys.head10, ))
        thread.start_new(self.Zh, (crt.techsys.head11, ))
        thread.start_new(self.Zh, (crt.techsys.head12, ))
        time.sleep(1)
        while not(crt.techsys.head1.yzh and crt.techsys.head2.yzh and crt.techsys.head3.yzh):
            pass
        while not(crt.techsys.head4.yzh and crt.techsys.head5.yzh and crt.techsys.head6.yzh):
            pass
        while not(crt.techsys.head7.yzh and crt.techsys.head8.yzh and crt.techsys.head9.yzh):
            pass
        while not(crt.techsys.head10.yzh and crt.techsys.head11.yzh and crt.techsys.head12.yzh):
            pass

    def A12_2_3x4(self):           # простой последовательный цикл
        thread.start_new(self.Zh, (crt.techsys.head1, ))
        thread.start_new(self.Zh, (crt.techsys.head2, ))
        thread.start_new(self.Zh, (crt.techsys.head3, ))
        time.sleep(1)
        while not(crt.techsys.head1.yzh and crt.techsys.head2.yzh and crt.techsys.head3.yzh):
            pass
        thread.start_new(self.Zh, (crt.techsys.head4, ))
        thread.start_new(self.Zh, (crt.techsys.head5, ))
        thread.start_new(self.Zh, (crt.techsys.head6, ))
        time.sleep(1)
        while not(crt.techsys.head4.yzh and crt.techsys.head5.yzh and crt.techsys.head6.yzh):
            pass
        thread.start_new(self.Zh, (crt.techsys.head7, ))
        thread.start_new(self.Zh, (crt.techsys.head8, ))
        thread.start_new(self.Zh, (crt.techsys.head9, ))
        time.sleep(1)
        while not(crt.techsys.head7.yzh and crt.techsys.head8.yzh and crt.techsys.head9.yzh):
            pass
        thread.start_new(self.Zh, (crt.techsys.head10, ))
        thread.start_new(self.Zh, (crt.techsys.head11, ))
        thread.start_new(self.Zh, (crt.techsys.head12, ))
        time.sleep(1)
        while not(crt.techsys.head10.yzh and crt.techsys.head11.yzh and crt.techsys.head12.yzh):
            pass




    def heads_group_cycle_atk12(self):

            ###################
        
        if crt.c_board.cycle_var.get() == 'A12_2_12':   # последовательный цикл
            self.A12_2_12()

        if crt.c_board.cycle_var.get() == 'A12_2_3x4':   # последовательный цикл
            self.A12_2_3x4()



            ##################

                ###

        if crt.c_board.cycle_var.get() == 'eA001':   # последовательный цикл
            expSub.eA001(crt, crt.h_cycles)

        if crt.c_board.cycle_var.get() == 'eA101':   # последовательный цикл
            expSub.eA101(crt, crt.h_cycles)

        if crt.c_board.cycle_var.get() == 'eA211':   # последовательный цикл
            expSub.eA211(crt, crt.h_cycles)

        if crt.c_board.cycle_var.get() == 'eA222':
            expSub.eA222(crt, crt.h_cycles)

        if crt.c_board.cycle_var.get() == 'eA222_2':   
            expSub.eA222_2(crt, crt.h_cycles)

        if crt.c_board.cycle_var.get() == 'eA222_3':   
            expSub.eA222_3(crt, crt.h_cycles)

        if crt.c_board.cycle_var.get() == 'eA232':   
            expSub.eA232(crt, crt.h_cycles)

        if crt.c_board.cycle_var.get() == 'eA323':   
            expSub.eA323(crt, crt.h_cycles)

        if crt.c_board.cycle_var.get() == 'eA342':   
            expSub.eA342(crt, crt.h_cycles)

                ###
            
        if crt.c_board.cycle_var.get() == 'eAxx1':   # последовательный цикл
            expSub.eAxx1(crt, crt.h_cycles)

        if crt.c_board.cycle_var.get() == 'eAxx2':   
            expSub.eAxx2(crt, crt.h_cycles)

        if crt.c_board.cycle_var.get() == 'eAxx3':   
            expSub.eAxx3(crt, crt.h_cycles)

        if crt.c_board.cycle_var.get() == 'eAxx4':   
            expSub.eAxx4(crt, crt.h_cycles)

        if crt.c_board.cycle_var.get() == 'eAxx5':   
            expSub.eAxx5(crt, crt.h_cycles)

        if crt.c_board.cycle_var.get() == 'eAxx6':   
            expSub.eAxx6(crt, crt.h_cycles)

        if crt.c_board.cycle_var.get() == 'eAxx7':   
            expSub.eAxx7(crt, crt.h_cycles)

        if crt.c_board.cycle_var.get() == 'eAxx8':   
            expSub.eAxx8(crt, crt.h_cycles)

        if crt.c_board.cycle_var.get() == 'eAxx9':   
            expSub.eAxx9(crt, crt.h_cycles)


#############################

class HeadsGroupCycles(
    HeadsGroupCycles_atk0,
    HeadsGroupCycles_atk1,
    HeadsGroupCycles_atk2,
    HeadsGroupCycles_atk3,
    HeadsGroupCycles_atk3s,
    HeadsGroupCycles_atk12,
    ):

    def heads_group_cycle(self):
        if wins.atk0:
            self.heads_group_cycle_atk0()
        if wins.atk1:
            self.heads_group_cycle_atk1()
        if wins.atk2:
            self.heads_group_cycle_atk2()
        if wins.atk3:
            self.heads_group_cycle_atk3()
        if wins.atk3s:
            self.heads_group_cycle_atk3s()
        if wins.atk12:
            self.heads_group_cycle_atk12()


###############################

class WorkingCycles(HeadsGroupCycles):
        # БУЦ-У2: Блок управленя циклами. Уровень 2:
            # управление цилами обработки деталей
            # (в рабочей позиции)

            # создание списка детелей партий обработки деталей

    det = Detale( )
      
    def set_new_det(self, iidet):   # установка новой детали
        self.det.set_det_pos(0)     # установка очередной детали в позицию
        wins.c1.itemconfig(         # смена указателя числа обработанных деталей
            self.det.det_text,
            text = iidet + 1
            )

        wins.c1.update()                # перерисовка виджета c1
        time.sleep(Consts.delay)


        # перемещания детали в заданные позиции (в конвейерном режиме)
        
    def det_move1(self):                # перемещение детали в позицию 1    
       
        if crt.c_board.t_var.get() == 1:
#            print
#            print 'начало цикла загрузки детали dc1'
            tb_dc1 = time.clock()
#            print 'tb_dc1 = ', tb_dc1

        self.d_move1 = 0
        self.det.det_move(1)
        self.d_move1 = 1

        if crt.c_board.t_var.get() == 1:
#            print 'конец цикла загрузки детали dc1'
            te_dc1 = time.clock()
#            print 'te_dc1 = ', te_dc1
            print
            print 'длительность цикла загрузки детали dc1'
            ma_dc1 = te_dc1 - tb_dc1
            print 'ma_dc1 = ', ma_dc1

    def det_move2(self):                # перемещение детали в позицию 2    

        if wins.atk2 or wins.atk3:
            wins.c1.lift(crt.techsys.head2.head_tag)   # подъем уровня слоя изображения
        if wins.atk12:
            wins.c1.lift(crt.techsys.head4.head_tag)   # подъем уровня слоя изображения
            wins.c1.lift(crt.techsys.head5.head_tag)   # подъем уровня слоя изображения
            wins.c1.lift(crt.techsys.head6.head_tag)   # подъем уровня слоя изображения

        if crt.c_board.t_var.get() == 1:
#            print
#            print 'начало цикла разгрузки детали dc2'
            tb_dc2 = time.clock()
#            print 'tb_dc2 = ', tb_dc2

        self.d_move2 = 0
        self.det.det_move(2)
        self.d_move2 = 1

        if crt.c_board.t_var.get() == 1:
#            print 'конец цикла разгрузки детали dc2'
            te_dc2 = time.clock()
#            print 'te_dc2 = ', te_dc2
            print
            print 'длительность цикла разгрузки детали dc2'
            ma_dc2 = te_dc2 - tb_dc2
            print 'ma_dc2 = ', ma_dc2
            print


    def det_moving_off(self):           # удаление детали

            # удаление (объекта) изображения детали
        wins.c1.delete(self.det.det_tag)

        wins.c1.update()       # перерисовка виджета c1
        time.sleep(Consts.delay)



    def operation_i0(self, iidet):       # операционный цикл 0: без прерываний
        self.set_new_det(iidet)         # установка очередной детали
        self.det_move1()                # перемещение детали в позицию
        self.heads_group_cycle()        # обработка детали
        self.det_move2()                # перемещение детали в позицию
            # смена указателя числа обработанных деталей
        wins.c1.itemconfig(
            crt.techsys.det_pos.text24,
            text = iidet + 1
            )
        wins.c1.update()                    # перерисовка виджета c1
        time.sleep(Consts.delay)

        self.det_moving_off()       # удаление детали
        wins.c1.update()                    # перерисовка виджета c1
        time.sleep(Consts.delay)

    def operation_i1(self, iidet):   # операционный цикл 1: с прерываниями

        s = crt.c_board.tech_stop1 or crt.c_board.tech_stop2 or crt.c_board.extr_stop
        if not s:
            time.sleep(Consts.delay)

        s = crt.c_board.tech_stop1 or crt.c_board.tech_stop2 or crt.c_board.extr_stop
        if not s:            
            if crt.c_board.wait_cbtn_var.get() == 1:
                wins.c1.wait_variable(crt.c_board.wait_var)
            self.set_new_det(iidet)      # установка очередной детали
            crt.c_board.wait_var.set(0)
        else:
            if crt.c_board.tech_stop1 or crt.c_board.tech_stop2:
                wins.c1.wait_variable(crt.c_board.wait_var)
                crt.c_board.tech_stop1 = 0
                crt.c_board.tech_stop2 = 0
                self.set_new_det(iidet)      # установка очередной детали
                crt.c_board.wait_var.set(0)            

        s = crt.c_board.tech_stop1 or crt.c_board.tech_stop2 or crt.c_board.extr_stop
        if not s:
            if crt.c_board.wait_cbtn_var.get() == 1:
                wins.c1.wait_variable(crt.c_board.wait_var)
#            self.det.det_move(1)  # перемещение детали в позицию
            self.det_move1()  # перемещение детали в позицию
            crt.c_board.wait_var.set(0)
        else:
            if crt.c_board.tech_stop1 or crt.c_board.tech_stop2:
                wins.c1.wait_variable(crt.c_board.wait_var)
                crt.c_board.tech_stop1 = 0
                crt.c_board.tech_stop2 = 0
                self.det.det_move(1)  # перемещение детали в позицию
                crt.c_board.wait_var.set(0)

        s = crt.c_board.tech_stop1 or crt.c_board.tech_stop2 or crt.c_board.extr_stop
        if not s:
            if crt.c_board.wait_cbtn_var.get() == 1:
                wins.c1.wait_variable(crt.c_board.wait_var)
            self.heads_group_cycle()     # обработка детали
            crt.c_board.wait_var.set(0)
        else:
            if crt.c_board.tech_stop1 or crt.c_board.tech_stop2:
                wins.c1.wait_variable(crt.c_board.wait_var)
                crt.c_board.tech_stop1 = 0
                crt.c_board.tech_stop2 = 0
                self.heads_group_cycle()     # обработка детали
                crt.c_board.wait_var.set(0)

        s = crt.c_board.tech_stop1 or crt.c_board.tech_stop2 or crt.c_board.extr_stop
        if not s:
            if crt.c_board.wait_cbtn_var.get() == 1:
                wins.c1.wait_variable(crt.c_board.wait_var)
            self.det_move2()  # перемещение детали в позицию
            wins.c1.update()       # перерисовка виджета c1
            crt.c_board.wait_var.set(0)
            time.sleep(Consts.delay)
        else:
            if crt.c_board.tech_stop1 or crt.c_board.tech_stop2:
                wins.c1.wait_variable(crt.c_board.wait_var)
                crt.c_board.tech_stop1 = 0
                crt.c_board.tech_stop2 = 0
                self.det.det_move(2)  # перемещение детали в позицию
                wins.c1.update()       # перерисовка виджета c1
                crt.c_board.wait_var.set(0)
                time.sleep(Consts.delay)

            # смена указателя числа обработанных деталей
        s = crt.c_board.tech_stop1 or crt.c_board.tech_stop2 or crt.c_board.extr_stop
        if not s:
            if crt.c_board.wait_cbtn_var.get() == 1:
                wins.c1.wait_variable(crt.c_board.wait_var)
            wins.c1.itemconfig(
                crt.techsys.det_pos.text24,
                text = iidet + 1
                )
            crt.c_board.wait_var.set(0)
            wins.c1.update()       # перерисовка виджета c1
            time.sleep(Consts.delay)
        else:
            if crt.c_board.tech_stop1 or crt.c_board.tech_stop2:
                wins.c1.wait_variable(crt.c_board.wait_var)
                crt.c_board.tech_stop1 = 0
                crt.c_board.tech_stop2 = 0
                wins.c1.itemconfig(
                    crt.techsys.det_pos.text24,
                    text = iidet + 1
                    )
                crt.c_board.wait_var.set(0)
                wins.c1.update()       # перерисовка виджета c1
                time.sleep(Consts.delay)

        s = crt.c_board.tech_stop1 or crt.c_board.tech_stop2 or crt.c_board.extr_stop
        if not s:
            if crt.c_board.wait_cbtn_var.get() == 1:
                wins.c1.wait_variable(crt.c_board.wait_var)
            self.det_moving_off()   # удаление детали
            crt.c_board.wait_var.set(0)
        else:
            if crt.c_board.tech_stop1 or crt.c_board.tech_stop2:
                wins.c1.wait_variable(crt.c_board.wait_var)
                crt.c_board.tech_stop1 = 0
                crt.c_board.tech_stop2 = 0
                self.det_moving_off()   # удаление детали
                crt.c_board.wait_var.set(0)
    

    det_number = - 1
    zparty = 0

    def party_working_cycle(self):        # обработка партии деталей                

        wins.c1.itemconfig(
            crt.techsys.det_pos.text12,
            text = u'ОБРАБОТКА'
            )

        if crt.c_board.t_var.get() == 1:
            print
            print 'начало цикла обработки партии'
            tb_pc = time.clock()
            print 'tb_pc = ', tb_pc
            print

        self.zparty = 1             # индикация обработки партии
      
            # нулевая установка указателя числа обработанных деталей
        wins.c1.itemconfig(
            crt.techsys.det_pos.text24,
            text = 0
            )

            # блокировка (нормального) выхода из программы (до конца цикла)
        for idet in xrange(crt.c_board.party_size.get()):

#            wins.c1.itemconfig(
#                crt.techsys.det_pos.text12,
#                text = u'ОПЕРАЦИЯ'
#                )

            self.det_number = idet

            if crt.c_board.t_var.get() == 1:
#                print
#                print 'начало цикла обработки детали ', idet + 1
                tb_dc = time.clock()
#                print 'tb_dc', idet + 1, ' = ', tb_dc 

            if crt.c_board.interruptions_var.get() == 0:
                self.operation_i0(idet)
            else:
                self.operation_i1(idet)
                    
#            print time.clock(), 'конец обработки детали ', idet + 1
#            t_det_end = time.time()
#            print 'm_det ', idet + 1, ' = ', t_det_end - t_det_begin

            s = crt.c_board.tech_stop1 or crt.c_board.tech_stop2 or crt.c_board.extr_stop
            if s:
                wins.c1.itemconfig(
                    crt.techsys.det_pos.text12,
                    text = u'ПРЕРЫВАНИЕ'
                    )
                break
#            time.sleep(Consts.delay)

#            s = crt.c_board.tech_stop1 or crt.c_board.tech_stop2 or crt.c_board.extr_stop
#            if not s:
#                if crt.c_board.wait_cbtn_var.get() == 1:
#                    wins.c1.wait_variable(crt.c_board.wait_var)
#                wins.c1.itemconfig(
#                    crt.techsys.det_pos.text12,
#                    text = u'ГОТОВНОСТЬ'
#                    )

            if crt.c_board.t_var.get() == 1:
#                print
#                print 'конец цикла обработки детали ', idet + 1
                te_dc = time.clock()
#                print 'te_dc',idet + 1, ' = ', te_dc  
                print 'длительность цикла обработки детали ', idet + 1
                ma_dc = te_dc - tb_dc
                print 'ma_dc', idet + 1, ' = ', ma_dc  


        s = crt.c_board.tech_stop1 or crt.c_board.tech_stop2 or crt.c_board.extr_stop
        if not s:
            self.zparty = 0
            wins.c1.itemconfig(
                crt.techsys.det_pos.text12,
                text = u'ГОТОВНОСТЬ'
                )

            if crt.c_board.t_var.get() == 1:
                print
                print 'конец цикла обработки партии'
                te_pc = time.clock()
                print 'te_pc = ', te_pc
    #            print
                print 'длительность цикла обработки партии'
                ma_pc = te_pc - tb_pc
                print 'ma_pc = ', ma_pc
                print
                print "------------------------------"



#####################################################
#        if ContBoard.tech_stop1 == 0:
#            if ContBoard.tech_stop2 == 0:
#                if ContBoard.extr_stop == 0:
######################################################        
#        if ContBoard.tech_stop1 == 1: break
#        if ContBoard.tech_stop2 == 1: break
#        if ContBoard.extr_stop == 1: break


#############################################
##############################################





class ControlBoard0:          # панель управления
        # виджеты элементов (панели) управления

############
###########
            # кнопки управления (на панели управления)

################
                # переменные управления обработчиков событий
    exit_blocking = 0       # блокировка (нормального) выхода
    tech_stop1 = 0          # технологический останов 1
    tech_stop2 = 0          # технологический останов 2 
    extr_stop = 0           # экстренный останов
    # дополнительные переменные    

##################


    def set_frames(self):       # разметка панели wins.win2

        # кнопки управления автоматизированной технологичекой системой                     
        wins.fr1 = Frame(
            wins.win2,
            pady = 2,
            padx = 2,
            bg = "White"
            )
        wins.fr1.pack(fill = X)

        # переключатели режимов и циклов
        wins.fr2 = Frame(
            wins.win2,        
#            pady = 2,
            padx = 2,
            bg = "White",
            )
        wins.fr2.pack()

        # ползунки установки длины инструмента и положения с.головок
        wins.fr3 = Frame(
            wins.win2,
            pady = 2,
            padx = 2,
            bg = "White",
            )        
        wins.fr3.pack(fill = X)
                
#    def __init__(self):
#        self.set_frames()

################
################


class ControlBoard1(ControlBoard0):          # панель управления

                # обработчики событий на кнопках управления

                    # запуск
    def start(self, event):         # запуск цикла обработки
        print "-----------------------------"
        print
        print 'start: С Т А Р Т'
        self.wait_var.set(1)
        stop = self.extr_stop
        xxx = not self.exit_blocking and not stop
        if xxx and self.mode_var.get() == 'work_mode':
            self.exit_blocking = 1       # блокировка (нормлаьного) выхода
            self.set_mode_rbtn.config(state = DISABLED)

            if self.wait_cbtn_var.get() == 0:
                self.start_btn.config(state = DISABLED)

            crt.w_cycles.party_working_cycle()
            self.set_mode_rbtn.config(state = NORMAL)
            self.exit_blocking = 0       # блокировка (нормлаьного) выхода

            stop = self.extr_stop# or self.tech_stop1 or self.tech_stop2
            if stop == 0:
                self.start_btn.config(state = NORMAL)


    def extr_stoppp(self, event):    # экстенный останов
        print 'extr_stop: ЭКСТРЕННЫЙ ОСТАНОВ'
        if self.interruptions_var.get():
            self.extr_stop = 1

    def tech_stoppp1(self, event):   # технологический останов 1
        print 'tech_stop1: ТЕХНОЛОГИЧЕСКИЙ ОСТАНОВ 1'
        if self.interruptions_var.get():
            if wins.atk3s:
                self.tech_stop1 = 1
                self.start_btn.config(state = NORMAL)
        
    def tech_stoppp2(self, event):   # технологический останов 2
        print 'tech_stop2: ТЕХНОЛОГИЧЕСКИЙ ОСТАНОВ 2'
        if self.interruptions_var.get() == 1:
            if wins.atk3s:
                self.tech_stop2 = 1
                self.start_btn.config(state = NORMAL)



################
                # создание кнопок управлени (на панели управления)
    def creat_frames_in_fr1(self):

        wins.fr100 = Frame(wins.fr1)
        wins.fr100.pack(fill = X)

        wins.fr10 = Frame(wins.fr100)
        wins.fr10.pack()

        wins.fr11 = Frame(wins.fr10)
        wins.fr11.pack(side = LEFT)
                        
        wins.fr12 = Frame(wins.fr10)       
        wins.fr12.pack(side = LEFT)

        wins.fr13 = Frame(wins.fr10)       
        wins.fr13.pack(side = LEFT)


    def creat_working_buttons(self):

                    # запуск цикла обработки партии деталей
                
        self.label_start = Label(
            wins.fr11,
            padx = 5,
            activebackground = "Red"    # для контроля разметки (просветы)
            )
        self.label_start["text"] = u"Запуск партии деталей в обработку"
        self.label_start.pack()
    
        self.start_btn = Button(     # кнопка нормального выхода 
            wins.fr11,                        # по завершению работы
            text = u" С Т А Р Т ",
            )
        self.start_btn.bind("<Button>", self.start)
        self.start_btn.pack()

                    # остановы работы

        self.label_stop = Label(
            wins.fr12,
            padx = 5
            )
        self.label_stop["text"] = u"Экстренный останов процесса"
        self.label_stop.pack()

        self.extr_stop_btn = Button(     # кнопка нормального выхода 
            wins.fr12,                        # по завершению работы
            text = u" С Т О П ",
            )
        self.extr_stop_btn.bind("<Button>", self.extr_stoppp)
        self.extr_stop_btn.pack()

        self.label_tech_stop = Label(
            wins.fr13,
            padx = 5
            )
        self.label_tech_stop["text"] = u"Технологический останов процесса"
        self.label_tech_stop.pack()

                # кнопки технологического останова

        self.tech_stop1_btn = Button (     # кнопка нормального выхода 
            wins.fr13,                        # по завершению работы
            text = u" С Т О П  1 ",
            )
        self.tech_stop1_btn.bind("<Button>", self.tech_stoppp1)
        self.tech_stop1_btn.pack(
            side = LEFT,
            padx = 20,
            )

        self.tech_stop2_btn = Button(     # кнопка нормального выхода 
            wins.fr13,                        # по завершению работы
            text = u" С Т О П  2 ",
            )
        self.tech_stop2_btn.bind("<Button>", self.tech_stoppp2)
        self.tech_stop2_btn.pack(
            side = RIGHT,
            padx = 20,
            )

#    def __init__(self):
#        self.creat_frames_in_fr1()
#        self.creat_working_buttons()

        

#######################################

class ControlBoard21(ControlBoard1):          # панель управления

    def onPress_work_mode_rbtn(self):
        print 'mode_var = ', self.mode_var.get()
        self.set_work_mode_par()
        wins.c1.itemconfig(
            crt.techsys.det_pos.text12,
            text = u'ГОТОВНОСТЬ'
            )

    def onPress_set_mode_rbtn(self):
        print 'mode_var = ', self.mode_var.get()
        self.set_set_mode_par()
        wins.c1.itemconfig(
            crt.techsys.det_pos.text12,
            text = u'НАЛАДКА'
            )

    def onPress_set_Rmode_rbtn(self):
        print 'set_Rmode_var = ', self.set_Rmode_var.get()

    def onPress_cycle_rbtn(self):
        print 'cycle_var = ', self.cycle_var.get()

    def set_interrupt_on_par(self):
        self.extr_stop_btn.config(state = NORMAL)
        self.tech_stop1_btn.config(state = NORMAL)
        self.tech_stop2_btn.config(state = NORMAL)
        self.interrupt_wait_cbtn.config(state = NORMAL)

    def set_interrupt_off_par(self):
        self.extr_stop_btn.config(state = DISABLED)
        self.tech_stop1_btn.config(state = DISABLED)
        self.tech_stop2_btn.config(state = DISABLED)
        self.interrupt_wait_cbtn.config(state = DISABLED)

    def onPress_interrupt_cbtn(self):
        print 'interruptions_var = ', self.interruptions_var.get()
        if self.interruptions_var.get() == 1:
            self.set_interrupt_on_par()
        if self.interruptions_var.get() == 0:
            self.set_interrupt_off_par()

    def onPress_interrupt_wait_cbtn(self):
        print 'wait_cbtn_var = ', self.wait_cbtn_var.get()

    def creat_frames_in_fr2(self):       

#        print '#####################'

        wins.fr21 = Frame(wins.fr2)#, bg = "Red",)        
        wins.fr21.pack()


        wins.fr211 = Frame(wins.fr21)#, bg = "Blue",)
        wins.fr211.pack(fill = X)


        wins.fr2111 = Frame(wins.fr211)       # Рабочий режим       
        wins.fr2111.pack(side = LEFT)

        wins.fr2110 = Frame(wins.fr211,       # Наладочный режимы       
            pady = 2,
            padx = 2,
#            bg = "White"
            )
        wins.fr2110.pack(side = RIGHT)

        wins.fr2112 = Frame(wins.fr2110,       # Наладочный режимы       
            pady = 2,
            padx = 2,
            bg = "White"
            )
        wins.fr2112.pack()

        wins.fr212 = Frame(wins.fr21)#, bg = "Blue",)   # циклы рабочего режима
        wins.fr212.pack(fill = X)

        wins.fr214 = Frame(wins.fr21)#, bg = "Blue",)   # дополнительные циклы 
        wins.fr214.pack(fill = X)

        wins.fr215 = Frame(wins.fr21)#, bg = "Blue",)   # дополнительные циклы 
        wins.fr215.pack(fill = X)

        wins.fr213 = Frame(wins.fr21)#, bg = "Blue",    # прерывания и т.п.
        wins.fr213.pack(fill = X)
        

####### режимы

    def creat_switchs21(self):       


            # переключатель рабчего и наладочного режима
        
        self.mode_var = StringVar()
        self.mode_var.set('work_mode') 

        self.work_mode_rbtn = Radiobutton(
            wins.fr2111,
            text = u'РАБОЧИЙ РЕЖИМ:     ',
            command = self.onPress_work_mode_rbtn,
            variable = self.mode_var,
            value = 'work_mode',
            )
        self.work_mode_rbtn.pack(side = LEFT)

        self.set_mode_rbtn = Radiobutton(
            wins.fr2112,
            text = u'НАЛАДОЧНЫЙ РЕЖИМ: ',
            command = self.onPress_set_mode_rbtn,
            variable = self.mode_var,
            value = 'set_mode',
            )
        self.set_mode_rbtn.pack(side = LEFT)


            # переключатель R-режимов общeго наладочного режима

        self.set_Rmode_var = StringVar()
        self.set_Rmode_var.set('R3') 

        self.cycle_rbtnR1 = Radiobutton(
            wins.fr2112,
            text = u'R1*',
            command = self.onPress_set_Rmode_rbtn,
            variable = self.set_Rmode_var,
            value = 'R1',
            )
        self.cycle_rbtnR1.pack(side = LEFT)

        self.cycle_rbtnR2 = Radiobutton(
            wins.fr2112,
            text = u'R2*',
            command = self.onPress_set_Rmode_rbtn,
            variable = self.set_Rmode_var,
            value = 'R2',
            )
        self.cycle_rbtnR2.pack(side = LEFT)

        self.cycle_rbtnR3 = Radiobutton(
            wins.fr2112,
            text = u'R3',
            command = self.onPress_set_Rmode_rbtn,
            variable = self.set_Rmode_var,
            value = 'R3',
            )
        self.cycle_rbtnR3.pack(side = LEFT)

        self.cycle_rbtnR4 = Radiobutton(
            wins.fr2112,
            text = u'R4',
            command = self.onPress_set_Rmode_rbtn,
            variable = self.set_Rmode_var,
            value = 'R4',
            )
        self.cycle_rbtnR4.pack(side = LEFT)

            

#    def __init__(self):

#        print '#####################'

#        self.creat_frames_in_fr2()
#        self.creat_switchs21()
      
Соседние файлы в папке ATK ASOI 231 Baimuratov 060126'1
  • #
    02.05.201414.41 Кб4expSub.pyc
  • #
    02.05.20146.2 Кб4onHelpMsg.py
  • #
    02.05.20149.72 Кб5onHelpMsg.pyc
  • #
    02.05.20145.39 Кб4paramSet.py
  • #
    02.05.20144.55 Кб4paramSet.pyc
  • #
    02.05.2014169.71 Кб4parATKv181.py
  • #
    02.05.20141.17 Кб5parDefault.ini
  • #
    02.05.2014298 б4zzz12_e2#&
  • #
    02.05.2014301 б4zzz12_eA990