red2211 5 Опубликовано: 8 апреля, 2021 (изменено) Контроллер реактора IC2 Принцип работы: При включении программа подаёт питания на реактор при помощи красного контроллера и с помощью адаптера считывает информацию с реакторной камеры затем выводит показания на экран и в случае перегрева отключает реактор. Когда температура теплоёмкость реактора вернётся к допустимым значениям он опять включится. Pastebin - https://pastebin.com/dqEmUsfx pastebin get dqEmUsfx your_name.lua Что требуется для роботы: Системный блок 3 лвл Видеокарта 3 лвл Процессор 1 лвл и выше Интернет карта (для загрузки программы через Pastebin) ОЗУ 256кб и выше Монитор 3 лвл Адаптер Красный контроллер Реактор из IC2 Реакторная камера из IC2 Преобразователь енергии (для питания пк от реактора) Рычаг (для первого запуска реактора, затем надо выключить или сломать) Схема подключения и робота: Скрытый текст Пример подключения Любая схема для реактора Перегрев системы Планы на будущие: Оптимизация кода - на начальной стадии Добавить поддержку мониторов 2-го лвл Добавить автоотключение реактора при выходе из програмы Добавить кнопки управления (вкл/выкл реактора) Добавить статус стержней Улучшить интерфейс Что готово уже: Включение реактора при запуске программы Отключение во время перегрева Включение реактора после возврата теплоёмкости к допустимым значениям P. S. Это моя первая программа на lua под OC так что не обессудьте. Буду рад любым исправлениям и замечаниям. Изменено 9 апреля, 2021 пользователем red2211 4 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
eu_tomat 2 154 Опубликовано: 8 апреля, 2021 9 минут назад, red2211 сказал: Что требуется для роботы: ... Красный контроллер 10 минут назад, red2211 сказал: Планы на будущие: ... Добавить автоотключение реактора при выходе из програмы Первым делом хорошо бы добавить автоотключение реактора при аварийном отключении компьютера, что на перегруженных серверах случается часто. При использовании красного контроллера это невозможно, т.к. он сохраняет своё состояние независимо от состояния компьютера. Другое дело, красная плата, вставленная в компьютер: сигнал на её выходе автоматически пропадает при отключении компьютера (не программы), благодаря чему отключается и реактор. Но для реализации такой схемы потребуется установить компьютер вплотную к реактору. 16 минут назад, red2211 сказал: Что требуется для роботы: ... Рычаг (для первого запуска реактора, затем надо выключить или сломать) А рычаг-то зачем, если уже есть красный контроллер или красная плата, которые смогут осуществить не только все последующие запуски, но и первый тоже? И зачем в коде везде используется string.format, даже там, где отсутствуют переменные, вывод которых требуется форматировать? Чем больше лишних действий делает программа, тем вероятнее этот компьютер отключится на перегруженном сервере. А если он не успеет к этому моменту отключить красный контроллер, то можно потерять и реактор и свой домик. 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
red2211 Автор темы 5 Опубликовано: 8 апреля, 2021 (изменено) 9 часов назад, eu_tomat сказал: Первым делом хорошо бы добавить автоотключение реактора при аварийном отключении компьютера, что на перегруженных серверах случается часто. Полностью с вами согласен. Буду что-то думать чтобы и пк был дома и реактор отключал. 9 часов назад, eu_tomat сказал: А рычаг-то зачем, если уже есть красный контроллер или красная плата, которые смогут осуществить не только все последующие запуски, но и первый тоже? Рычаг нужен для запуска реактора если компьютер будет питаться от него. Иначе откуда компьютер возьмёт энергию если другого источника нету. 9 часов назад, eu_tomat сказал: И зачем в коде везде используется string.format, даже там, где отсутствуют переменные, вывод которых требуется форматировать? Ошибку понял, буду исправлять. Исправил. Изменено 9 апреля, 2021 пользователем red2211 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
eu_tomat 2 154 Опубликовано: 9 апреля, 2021 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 А вообще, вывод крупных кусков неизменного текста я рекомендую вынести в отдельные функции. На работу программы это существенным образом не повлияет, но поможет облегчить основную часть кода, отвечающую за логику, что упростит поиск ошибок. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
red2211 Автор темы 5 Опубликовано: 9 апреля, 2021 1 час назад, eu_tomat сказал: Почитав код, я заметил, что на самом деле проверяется не температура реактора, а количество тепла в нём, что нарушает задуманную логику. Для получения именно температуры потребуется разделить количество тепла в реакторе на теплоёмкость реактора: T = reactor.getHeat()/reactor.getMaxHeat(). Теперь программа проверяет теплоёмкость) Если мы будем делить текущую теплоёмкость на максимальную то значения буду очень маленькие. К примеру сейчас теплоёмкость 4000, а макс 10000 то в нас получится 0,4. Думаю лучше оставить большые значения. 1 час назад, eu_tomat сказал: А вообще, вывод крупных кусков неизменного текста я рекомендую вынести в отдельные функции. На работу программы это существенным образом не повлияет, но поможет облегчить основную часть кода, отвечающую за логику, что упростит поиск ошибок. Не подскажете как реализовать что-то типу import в python, чтобы вынести все функции в отдельный файл? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Bs0Dd 206 Опубликовано: 9 апреля, 2021 (изменено) 28 минут назад, red2211 сказал: Не подскажете как реализовать что-то типу import в python, чтобы вынести все функции в отдельный файл? Все очень просто local library = require("library") В функции require пишется имя библиотеки без расширения, но сама либа должна лежать в одном из определенных мест, иначе будет ошибка импорта: В самой либе можно создать таблицу, натолкать в нее нужных функций и return <tablename> Подробнее лучше прочитать какой-нибуть мануал про библиотеки P.S.: Я не уверен, стоит ли настолько заморачиваться ради небольшой програмки. Думаю достаточно просто вынести функции в начало программы. Изменено 9 апреля, 2021 пользователем Bs0Dd 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
eu_tomat 2 154 Опубликовано: 9 апреля, 2021 15 минут назад, red2211 сказал: Если мы будем делить текущую теплоёмкость на максимальную то значения буду очень маленькие. К примеру сейчас теплоёмкость 4000, а макс 10000 то в нас получится 0,4. Думаю лучше оставить большые значения. Не совсем так. Не текущая теплоёмкость, а текущее количество тепла getHeat(). А максимально возможное количество тепла getMaxHeat это и есть теплоёмкость реактора. Да, значения получаются маленькими в диапазоне от нуля до единицы включительно. Но если домножить на 100, то получим степень нагрева в процентах, если удобно работать с большими значениями. 15 минут назад, red2211 сказал: Не подскажете как реализовать что-то типу import в python, чтобы вынести все функции в отдельный файл? В Lua для подключения библиотек используется функция require. На форуме даже есть тема о создании библиотеки: Как создать библиотеку 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
hohserg 197 Опубликовано: 9 апреля, 2021 3 часа назад, red2211 сказал: Не подскажете как реализовать что-то типу import в python, чтобы вынести все функции в отдельный файл? Есть еще вот такой "фреймворк" ,позволяющий писать модульные приложения https://computercraft.ru/topic/4099-umfal-avtomaticheskiy-zagruzchik-moduley-dlya-slozhnyh-prilozheniy/ 2 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
red2211 Автор темы 5 Опубликовано: 9 апреля, 2021 3 часа назад, eu_tomat сказал: Не совсем так. Не текущая теплоёмкость, а текущее количество тепла getHeat(). А максимально возможное количество тепла getMaxHeat это и есть теплоёмкость реактора. Да, значения получаются маленькими в диапазоне от нуля до единицы включительно. Но если домножить на 100, то получим степень нагрева в процентах, если удобно работать с большими значениями. Понял, но не легче сделать как сделал я просто поделить текущее количество тепла на 100. Мы получаем то же значение что и при делении количество тепла в реакторе на теплоёмкость реактора но только на одну операцию меньше. Ведь так? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
red2211 Автор темы 5 Опубликовано: 9 апреля, 2021 3 часа назад, Bs0Dd сказал: P.S.: Я не уверен, стоит ли настолько заморачиваться ради небольшой програмки. Думаю достаточно просто вынести функции в начало программы. Впринципе да, для удобства пользователя лучше оставить один файл программы. 3 часа назад, Bs0Dd сказал: Все очень просто local library = require("library") В функции require пишется имя библиотеки без расширения, но сама либа должна лежать в одном из определенных мест, иначе будет ошибка импорта: В самой либе можно создать таблицу, натолкать в нее нужных функций и return <tablename> Подробнее лучше прочитать какой-нибуть мануал про библиотеки А за это спасибо, буду что-то для себя экспериментировать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
ProgramCrafter 545 Опубликовано: 9 апреля, 2021 10 минут назад, red2211 сказал: Мы получаем то же значение что и при делении количество тепла в реакторе на теплоёмкость реактора Не совсем. Если в реакторе есть пластины обшивки, они увеличат максимальную теплоёмкость, и значения формул начнут расходиться. 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
eu_tomat 2 154 Опубликовано: 9 апреля, 2021 13 минуты назад, red2211 сказал: Понял, но не легче сделать как сделал я просто поделить текущее количество тепла на 100. Мы получаем то же значение что и при делении количество тепла в реакторе на теплоёмкость реактора но только на одну операцию меньше. Ведь так? Так, если в описании программы будет сказано, что она не будет правильно работать при использовании обшивки реактора. Обшивка реактора увеличивает теплоёмкость реактора. Поэтому при том же количестве тепла в реакторе его температура будет ниже. Но программа продолжит считать тепло вместо температуры. 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
red2211 Автор темы 5 Опубликовано: 9 апреля, 2021 Сорян за оплошность, еще не очень хорошо знаю ic2. Но на ошибках учимся! Иду исправлять. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
red2211 Автор темы 5 Опубликовано: 9 апреля, 2021 Исправил и немножко оптимизировал код! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах