Урок 1. Линия и лампы

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


1.1. Идея: цех на одной площадке

Весь цех стоит на площадке — прямоугольнике, который собирает ноги всех деталей на себе и выводит их на свой край. Ноги станков и ламп не надо искать среди лент: все они по периметру площадки, у каждой подписано, чья она (m1.BUSY, D1.In), а метка висит снаружи. Внутри — только механика и пульт, снаружи — электроника.

M1M2M3M4M5m1.BUSYB1m2.BUSYB2m3.BUSYB3m4.BUSYB4m5.BUSYB5src.RELEASECKвнутри — механика и лампы; снаружи — метки на ногах края площадки
Урок 1: цех на площадке. Ноги станков и источника вышли на край площадки, метки — снаружи; лампы горят, пока станок работает (BUSY).

1.2. Идея: сбалансированная линия

Каждый станок обрабатывает деталь ровно за 1 секунду. Источник выдаёт деталь раз в секунду. Значит, каждый станок успевает ровно столько, сколько ему подают, — ни больше, ни меньше. Такую линию называют сбалансированной: мощности всех участков равны спросу. Кажется, что лучше и не придумать: никто не простаивает, никто не завален.

Пока станки работают как часы, так и есть. В уроке 4 мы дадим им «кубик» — и увидим, что из этого выйдет.

CKBUSY1BUSY2BUSY3BUSY4BUSY5деталь за деталью: станки включаются по очереди и дальше работают без остановки
Сбалансированная линия без кубиков: выпуск — деталь в секунду, каждый станок — секунда на деталь. Лампы зажигаются «бегущей волной» и горят ровно.

1.3. Идея: лампа — нога BUSY

У станка три ноги сверху: START, BUSY, READY. BUSY = 1, пока станок обрабатывает деталь. Лампа просто подключена к BUSY через метку: B1 … B5. Горит — работает, погасла — ждёт детали.

Генератор 1 Гц выдаёт CK. Источник выпускает деталь по фронту RELEASE — значит, RELEASE = CK: каждая секунда — новая деталь.

1.4. Сборка

Микросхем в этом уроке нет. Вставь урок через Cmd+I (текст — в конце урока). Появятся:

  • площадка с цехом: источник → лента → станок 1 → … → станок 5 → длинная быстрая лента → сток;
  • пять ламп над станками;
  • генератор 1 Гц и питание VCC, GND — снаружи площадки.

Последняя лента длиннее остальных и едет вдвое быстрее: в уроке 2 на ней встанет ИК-пара, и детали должны проходить мимо неё с зазором.

1.5. Проверка

  1. Включи питание.
  2. Каждую секунду из источника выходит деталь и едет к первому станку.
  3. Лампы загораются по очереди — «бегущая волна» слева направо, и дальше горят ровно: каждый станок всё время занят.
  4. В стоке растёт число готовых деталей.
Что смотришьЧто видно
источникчисло выпущенных растёт раз в секунду
лампы D1…D5зажглись по очереди и горят
стокпервая деталь — примерно через 13 секунд

Щёлкни по кубику на одном станке (два раза — до оранжевого): его лампа начнёт мигать, а лампы следующих станков — гаснуть. Это и есть тема урока 4.

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

# Lesson 1 — the line and its lamps. A base with the factory: source -> 5 machines -> sink.# Each machine takes 1 s per part. Release comes straight from a 1 Hz clock: one part a second.# The lamps on the base light while their machine is working (BUSY).power(VCC)ground(GND)base B{w=860, h=400, hideUnused=true}msource src{color=red}(RELEASE=CK)at(src, B, 40, 185)mbelt b0{len=60}(RUN=VCC)mount(b0, src.out)mmachine m1{time=1, cap=3}(BUSY=B1)mount(m1.in, b0.end)mbelt b1{len=60}(RUN=VCC)mount(b1, m1.out)mmachine m2{time=1, cap=3}(BUSY=B2)mount(m2.in, b1.end)mbelt b2{len=60}(RUN=VCC)mount(b2, m2.out)mmachine m3{time=1, cap=3}(BUSY=B3)mount(m3.in, b2.end)mbelt b3{len=60}(RUN=VCC)mount(b3, m3.out)mmachine m4{time=1, cap=3}(BUSY=B4)mount(m4.in, b3.end)mbelt b4{len=60}(RUN=VCC)mount(b4, m4.out)mmachine m5{time=1, cap=3}(BUSY=B5)mount(m5.in, b4.end)# the last belt is longer and fast (160): parts reach the sink with a wide gap — the IR pair of lesson 2 counts each onembelt b5{len=120, spd=160}(RUN=VCC)mount(b5, m5.out)msink skmount(sk.in, b5.end)led d1(B1)at(d1, B, 150, 110)led d2(B2)at(d2, B, 270, 110)led d3(B3)at(d3, B, 390, 110)led d4(B4)at(d4, B, 510, 110)led d5(B5)at(d5, B, 630, 110)clock{rt=1}(CK)

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