Перейти к содержимому
red2211

Контроллер реактора из IC2

Рекомендуемые сообщения

Контроллер реактора IC2

 

Принцип работы:

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

 

Pastebin - https://pastebin.com/dqEmUsfx

pastebin get dqEmUsfx your_name.lua

 

Что требуется для роботы:

  • Системный блок 3 лвл
  • Видеокарта 3 лвл
  • Процессор 1 лвл и выше
  • Интернет карта (для загрузки программы через Pastebin)
  • ОЗУ 256кб и выше
  • Монитор 3 лвл
  • Адаптер
  • Красный контроллер
  • Реактор из IC2
  • Реакторная камера из IC2
  • Преобразователь енергии (для питания пк от реактора)
  • Рычаг (для первого запуска реактора, затем надо выключить или сломать)

 

Схема подключения и робота:

 

Скрытый текст

Пример подключения

1.png

 

2.png

 

3.png

 

4.png

 

Любая схема для реактора

6.png                                      7.png

 

Перегрев системы

8.png

 

Планы на будущие:

  • Оптимизация кода - на начальной стадии
  • Добавить поддержку мониторов 2-го лвл
  • Добавить автоотключение реактора при выходе из програмы
  • Добавить кнопки управления (вкл/выкл реактора)
  • Добавить статус стержней
  • Улучшить интерфейс

 

Что готово уже:

  • Включение реактора при запуске программы
  • Отключение во время перегрева
  • Включение реактора после возврата теплоёмкости к допустимым значениям

 

P. S. Это моя первая программа на lua под OC так что не обессудьте. Буду рад любым исправлениям и замечаниям.

Изменено пользователем red2211

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
9 минут назад, red2211 сказал:

Что требуется для роботы:

  • ...
  • Красный контроллер

 

10 минут назад, red2211 сказал:

Планы на будущие:

  • ...
  • Добавить автоотключение реактора при выходе из програмы

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

 

16 минут назад, red2211 сказал:

Что требуется для роботы:

  • ...
  • Рычаг (для первого запуска реактора, затем надо выключить или сломать)

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

 

 

И зачем в коде везде используется string.format, даже там, где отсутствуют переменные, вывод которых требуется форматировать? Чем больше лишних действий делает программа, тем вероятнее этот компьютер отключится на перегруженном сервере. А если он не успеет к этому моменту отключить красный контроллер, то можно потерять и реактор и свой домик.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
9 часов назад, eu_tomat сказал:

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

 Полностью с вами согласен. Буду что-то думать чтобы и пк был дома и реактор отключал. 

 

9 часов назад, eu_tomat сказал:

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

Рычаг нужен для запуска реактора если компьютер будет питаться от него. Иначе откуда компьютер возьмёт энергию если другого источника нету. 

 

9 часов назад, eu_tomat сказал:

И зачем в коде везде используется string.format, даже там, где отсутствуют переменные, вывод которых требуется форматировать?

Ошибку понял, буду исправлять. Исправил.

Изменено пользователем red2211

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
9 часов назад, red2211 сказал:

Рычаг нужен для запуска реактора если компьютер будет питаться от него. Иначе откуда компьютер возьмёт энергию если другого источника нету.

Да, в этой схеме нужен. Я невнимательно её рассмотрел. Привык к тому, что управляющий реактором компьютер питается от резервного энергохранителя на случай затухания реактора при нарушении поставок топлива.

 

Обнаружилась ошибка:

11 час назад, red2211 сказал:

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

Почитав код, я заметил, что на самом деле проверяется не температура реактора, а количество тепла в нём, что нарушает задуманную логику. Для получения именно температуры потребуется разделить количество тепла в реакторе на теплоёмкость реактора: T = reactor.getHeat()/reactor.getMaxHeat().

 

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

while getHeat() >= 50 do
            
  gpu.setForeground(red)

  -- вывод фигуры треугольника
  ...
            
  gpu.setForeground(yellow)
            
  -- вывод фигуры огня и какой-то надписи
  ...

  computer.beep(500)
  os.sleep(1)
            
  gpu.setForeground(red)
            
  -- вывод фигуры огня и какой-то надписи
  ...

  computer.beep(500)
  os.sleep(1)
end

Чтобы не дублировать код вывода фигуры огня, и не перерисовывать на каждой итерации цикле фигуру треугольника, можно использовать такой код:

gpu.setForeground(red)

-- вывод фигуры треугольника
...

local color = red
while T >= 50
  gpu.setForeground(color)
            
  -- вывод фигуры огня и какой-то надписи
  ...

  computer.beep(500)
  os.sleep(1)
  color = color==red and yellow or red
end

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

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
1 час назад, eu_tomat сказал:

Почитав код, я заметил, что на самом деле проверяется не температура реактора, а количество тепла в нём, что нарушает задуманную логику. Для получения именно температуры потребуется разделить количество тепла в реакторе на теплоёмкость реактора: T = reactor.getHeat()/reactor.getMaxHeat().

Теперь программа проверяет теплоёмкость) Если мы будем делить текущую теплоёмкость на максимальную то значения буду очень маленькие. К примеру сейчас теплоёмкость 4000, а макс 10000 то в нас получится 0,4. Думаю лучше оставить большые значения.

 

1 час назад, eu_tomat сказал:

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

Не подскажете как реализовать что-то типу import в python, чтобы вынести все функции в отдельный файл?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
28 минут назад, red2211 сказал:

Не подскажете как реализовать что-то типу import в python, чтобы вынести все функции в отдельный файл?

Все очень просто

local library = require("library")

В функции require пишется имя библиотеки без расширения, но сама либа должна лежать в одном из определенных мест, иначе будет ошибка импорта:

Gh4OtRR.png

 

В самой либе можно создать таблицу, натолкать в нее нужных функций и return <tablename>

Подробнее лучше прочитать какой-нибуть мануал про библиотеки

 

P.S.: Я не уверен, стоит ли настолько заморачиваться ради небольшой програмки. Думаю достаточно просто вынести функции в начало программы.

Изменено пользователем Bs0Dd

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
15 минут назад, red2211 сказал:

Если мы будем делить текущую теплоёмкость на максимальную то значения буду очень маленькие. К примеру сейчас теплоёмкость 4000, а макс 10000 то в нас получится 0,4. Думаю лучше оставить большые значения.

Не совсем так. Не текущая теплоёмкость, а текущее количество тепла getHeat(). А максимально возможное количество тепла getMaxHeat это и есть теплоёмкость реактора. Да, значения получаются маленькими в диапазоне от нуля до единицы включительно. Но если домножить на 100, то получим степень нагрева в процентах, если удобно работать с большими значениями.

 

15 минут назад, red2211 сказал:

Не подскажете как реализовать что-то типу import в python, чтобы вынести все функции в отдельный файл?

В Lua для подключения библиотек используется функция require.

На форуме даже есть тема о создании библиотеки: Как создать библиотеку

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
3 часа назад, red2211 сказал:

Не подскажете как реализовать что-то типу import в python, чтобы вынести все функции в отдельный файл?

Есть еще вот такой "фреймворк" ,позволяющий писать модульные приложения

https://computercraft.ru/topic/4099-umfal-avtomaticheskiy-zagruzchik-moduley-dlya-slozhnyh-prilozheniy/

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
3 часа назад, eu_tomat сказал:

Не совсем так. Не текущая теплоёмкость, а текущее количество тепла getHeat(). А максимально возможное количество тепла getMaxHeat это и есть теплоёмкость реактора. Да, значения получаются маленькими в диапазоне от нуля до единицы включительно. Но если домножить на 100, то получим степень нагрева в процентах, если удобно работать с большими значениями.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
3 часа назад, Bs0Dd сказал:

P.S.: Я не уверен, стоит ли настолько заморачиваться ради небольшой програмки. Думаю достаточно просто вынести функции в начало программы.

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

 

3 часа назад, Bs0Dd сказал:

Все очень просто


local library = require("library")

В функции require пишется имя библиотеки без расширения, но сама либа должна лежать в одном из определенных мест, иначе будет ошибка импорта:

Gh4OtRR.png

 

В самой либе можно создать таблицу, натолкать в нее нужных функций и return <tablename>

Подробнее лучше прочитать какой-нибуть мануал про библиотеки

А за это спасибо, буду что-то для себя экспериментировать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
10 минут назад, red2211 сказал:

Мы получаем то же значение что и при делении количество тепла в реакторе на теплоёмкость реактора

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
13 минуты назад, red2211 сказал:

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

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

 

Обшивка реактора увеличивает теплоёмкость реактора. Поэтому при том же количестве тепла в реакторе его температура будет ниже. Но программа продолжит считать тепло вместо температуры.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Сорян за оплошность, еще не очень хорошо знаю ic2. Но на ошибках учимся! Иду исправлять.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Присоединяйтесь к обсуждению

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

Гость
Ответить в тему...

×   Вы вставили отформатированное содержимое.   Удалить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.


×
×
  • Создать...