Урок 2. Верёвка

Буфер мы теперь видим. Осталось им управлять: выпускать деталь, только когда перед Херби становится мало работы. В «Цели» Алекс на походе поставил Херби в голову колонны, чтобы никто не убегал вперёд. Но станок в начало линии не переставишь. Поэтому позже, в книге «Гонка» (1986), Голдратт предложил верёвку: первый в колонне привязан к Херби и не может уйти дальше, чем пускает верёвка. У нас верёвка — провод от счётчика буфера к источнику.


2.1. Идея: выпускать, пока буфер меньше цели

На пульте появятся четыре тумблера — цель буфера в двоичном виде: G3 = 8, G2 = 4, G1 = 2, G0 = 1. Включил G2 — цель 4. Правило верёвки:

  • буфер меньше цели — источник выпускает деталь, как раньше;
  • буфер дошёл до цели — источник ждёт, такты выпуска пропускаются.

Так перед Херби никогда не будет больше деталей, чем цель.

RELSбуфер343434343434LOWRELRцель 4: буфер дошёл до 4 — такты выпуска пропускаются, пока Херби не заберёт деталь
Верёвка по времени: RELS тикает каждую секунду, а до источника доходят только те такты, когда буфер меньше цели.

2.2. Идея: сравнение — CD4585

CD4585 сравнивает два четырёхбитных числа A и B и зажигает один из трёх выходов: LT (A < B), EQ (A = B) или GT (A > B). Буфер у нас восьмибитный, а цель — четырёхбитная, поэтому сравнителей два, каскадом:

  • младший сравнивает младшие половины: A0…A3 = Q0…Q3, B0…B3 = G0…G3; входы каскада EQIN = 1, LTIN = 0, GTIN = 0 — «до меня числа равны»;
  • старший сравнивает старшие половины: A0…A3 = Q4…Q7, B0…B3 = 0000 — у цели старших битов нет; входы каскада — выходы младшего. Если старшие половины равны, старший передаёт ответ младшего;
  • выход старшего LT — метка LOW: «буфер меньше цели».
CD4585младшие 4 битаCD4585старшие 4 битаA0…A3 = Q0…Q3B0…B3 = G0…G3EQIN = 1 · LTIN = 0 · GTIN = 0A0…A3 = Q4…Q7B0…B3 = 0000LT · EQ · GTLOWLOW = 1, когда буфер Q меньше цели G
Сравнение каскадом: младший CD4585 сравнивает младшие половины, старший — старшие (у цели там нули) и при равенстве передаёт ответ младшего.

2.3. Формула

ROPELOWROK — можно выпускать
0—1 — верёвка выключена
111 — буфер меньше цели
100 — буфер полон, ждём
  • NROPE = НЕ ROPE — свободный инвертор CD4069 из FL-01 (вход C, выход I);
  • ROK = LOW ИЛИ NROPE — свободный вентиль CD4071 из FL-02 (E, F → L);
  • RELR = RELS И ROK — свободный вентиль второй CD4081 из FL-02 (C, D → K);
  • источник слушает RELR вместо RELS.
ROPECD4069NROPELOWCD4071ROKRELSCD4081RELRисточникRELEASERELR = RELS · (LOW + НЕ ROPE)
Верёвка из трёх свободных вентилей FL-01 и FL-02: верёвка включена — такт выпуска проходит, только пока буфер меньше цели.

Тумблер ROPE выключен — всё работает как в FL-02, в том числе SLOW: выпуск каждую секунду или в ритме Херби.

2.4. Сборка

Вставь урок через Cmd+I поверх урока 1. Появятся:

  • на площадке, в верхнем ряду — тумблер ROPE и четыре тумблера цели с подписями 8, 4, 2, 1;
  • снаружи — два CD4585;
  • свободные вентили FL-01 и FL-02 получат метки: CD4069 (C → ROPE, I → NROPE), CD4071 (E → LOW, F → NROPE, L → ROK), вторая CD4081 (C → RELS, D → ROK, K → RELR);
  • нога RELEASE источника перецепится с RELS на RELR.

2.5. Проверка

Херби — 2 секунды, SLOW выключен. Каждая смена: питание выкл и вкл → R → ПУСК, смотри 200 секунд.

СменаБуферСделано к 200 с
ROPE выклрастёт до 18около 94
ROPE вкл, цель 4 (G2)не больше 4около 94
ROPE вкл, цель 1 (G0)0 или 1около 24

С целью 4 цех делает столько же, сколько без верёвки, а деталей внутри держит втрое меньше.

С целью 1 Херби почти всё время стоит — прибор простоя FL-02 со щупом на станке 3 (после R нажми S два раза) покажет около 150 секунд из 200. Почему: буфер считает все детали от источника до Херби, а единственной детали ещё надо проехать станки 1 и 2. Пока она в пути, Херби нечего делать. Цель должна покрывать путь до Херби. Какой запас нужен, когда Херби работает неровно, — в следующем уроке.

Вставка урока 2 (Cmd+I)

# Lesson 2 — the rope. Insert on top of lesson 1.# Goal G = four switches (G3 = 8, G2 = 4, G1 = 2, G0 = 1). Two CD4585 compare the buffer Q (8 bits) with G (4 bits, high nibble = 0):# LOW = Q < G. The source may release only while LOW: RELR = RELS · (LOW + NOT ROPE). ROPE off — FL-02 works as before.# NROPE: a free inverter of the FL-01 CD4069 (C → I). ROK = LOW OR NROPE: a free gate of the FL-02 CD4071 (E, F → L).# RELR = RELS AND ROK: a free gate of the second FL-02 CD4081 (C, D → K). The source's RELEASE: RELS → RELR.text tR{text="rope"}at(tR, B, 40, 8)input rope(ROPE)at(rope, B, 40, 20)text t8{text="8"}at(t8, B, 130, 8)input g3(G3)at(g3, B, 130, 20)text t4{text="4"}at(t4, B, 190, 8)input g2(G2)at(g2, B, 190, 20)text t2{text="2"}at(t2, B, 250, 8)input g1(G1)at(g1, B, 250, 20)text t1{text="1"}at(t1, B, 310, 8)input g0(G0)at(g0, B, 310, 20)text tG{text="<- buffer goal: rope on = release only while buffer < goal"}at(tG, B, 370, 24)"TI CD4585B"(A0=Q0, A1=Q1, A2=Q2, A3=Q3, B0=G0, B1=G1, B2=G2, B3=G3, EQIN=VCC, LTIN=GND, GTIN=GND, LT=QLT, EQ=QEQ, GT=QGT)"TI CD4585B"(A0=Q4, A1=Q5, A2=Q6, A3=Q7, B0=GND, B1=GND, B2=GND, B3=GND, LTIN=QLT, EQIN=QEQ, GTIN=QGT, LT=LOW)reconnect(NDONE.C = ROPE)reconnect(NDONE.I = NROPE)reconnect(SRST.E = LOW)reconnect(SRST.F = NROPE)reconnect(SRST.L = ROK)reconnect(A5.C = RELS)reconnect(A5.D = ROK)reconnect(A5.K = RELR)reconnect(src.RELEASE = RELR)

Не получается? Что-то не работает →