***
Любители пневматического оружия (винтовок и пистолетов) с предварительной накачкой (англ. Pre Charged Pneumatics, PCP) заправляют его или с помощью насосов высокого давления (НВД), или с помощью компрессоров высокого давления (КВД), или с помощью предварительно заправленного баллона высокого давления (БВД).
Встроенный резервуар PCP-винтовки/пистолета заправляется до давления от 200 до 300 бар (в зависимости от марки оружия).
Баллоны высокого давления (наиболее часто применяют баллоны ёмкостью от 2 до 7 литров), как правило, "задувают" до давления 300 бар.
При выезде на соревнования/"пострелушки" перед стрелком стоит вопрос: на сколько заправок оружия хватит заправленного баллона?
Первоначально сделал шаблон для расчёта количества полных заправок в Microsoft Office Excel [по формуле =B2/B3*(B4-B5)/(B5-B6)]:
Но потом решил создать программу для расчёта в Python.
***
Код программы с графическим интерфейсом для расчёта количества полных заправок резервуара PCP‑винтовки/пистолета:
# Author: Netler
#
# Copyright: (c) Netler 2021
import tkinter as tk
from tkinter import messagebox
def calculate_refills():
try:
# Получаем значения из полей ввода
V = float(entry_V.get()) # Объём баллона, см³
v = float(entry_v.get()) # Объём резервуара, см³
P = float(entry_P.get()) # Давление в баллоне, бар
P_max = float(entry_P_max.get()) # Макс. давление в резервуаре, бар
P_min = float(entry_P_min.get()) # Мин. (остаточное) давление, бар
# Проверяем корректность значений
if V <= 0 or v <= 0:
messagebox.showerror("Ошибка", "Объёмы должны быть положительными числами!")
return
if P <= 0 or P_max <= 0 or P_min < 0:
messagebox.showerror("Ошибка", "Давление должно быть неотрицательным и положительным там, где это требуется!")
return
if P_max <= P_min:
messagebox.showerror("Ошибка", "P_макс должно быть больше P_мин!")
return
if P <= P_max:
messagebox.showinfo("Результат", "Давление в баллоне недостаточно для заправки резервуара.")
entry_result.delete(0, tk.END)
entry_result.insert(0, "0")
return
# Вычисляем количество заправок по формуле
n = (V / v) * (P - P_max) / (P_max - P_min)
# Округляем вниз до целого (полные заправки)
n_full = int(n)
# Выводим результат
entry_result.delete(0, tk.END)
entry_result.insert(0, str(n_full))
except ValueError:
messagebox.showerror("Ошибка", "Пожалуйста, введите корректные числовые значения!")
except Exception as e:
messagebox.showerror("Ошибка", f"Произошла ошибка: {str(e)}")
def on_close():
root.destroy()
# Создаём главное окно
root = tk.Tk()
root.title("Расчёт заправок PCP-оружия")
root.geometry("700x500")
root.resizable(False, False)
# Заголовок
label_title = tk.Label(root, text="Расчёт количества полных заправок резервуара PCP-винтовки/пистолета из баллона со сжатым воздухом", wraplength=480, justify="center", font=("Arial", 10, "bold"))
label_title.pack(pady=10)
# Поля ввода с подписями
tk.Label(root, text="Объём баллона со сжатым воздухом, V, см³").pack(anchor="w", padx=20)
entry_V = tk.Entry(root, width=40)
entry_V.pack(pady=5, padx=20, fill="x")
tk.Label(root, text="Объём резервуара винтовки/пистолета, v, см³").pack(anchor="w", padx=20)
entry_v = tk.Entry(root, width=40)
entry_v.pack(pady=5, padx=20, fill="x")
tk.Label(root, text="Давление в баллоне со сжатым воздухом до начала заправки, P, бар").pack(anchor="w", padx=20)
entry_P = tk.Entry(root, width=40)
entry_P.pack(pady=5, padx=20, fill="x")
tk.Label(root, text="Максимальное давление, до которого требуется заправить резервуар PCP-винтовки/пистолета, P_макс, бар").pack(anchor="w", padx=20)
entry_P_max = tk.Entry(root, width=40)
entry_P_max.pack(pady=5, padx=20, fill="x")
tk.Label(root, text="Минимальное (остаточное) давление в резервуаре PCP-винтовки/пистолета, P_мин, бар").pack(anchor="w", padx=20)
entry_P_min = tk.Entry(root, width=40)
entry_P_min.pack(pady=5, padx=20, fill="x")
# Поле вывода результата
tk.Label(root, text="Количество полных заправок резервуара PCP-винтовки/пистолета, n = V / v * (P - P_макс) / (P_макс - P_мин)").pack(anchor="w", padx=20, pady=(10, 0))
entry_result = tk.Entry(root, width=40, font=("Arial", 10, "bold"), justify="center")
entry_result.pack(pady=5, padx=20, fill="x")
# Кнопки
btn_frame = tk.Frame(root)
btn_frame.pack(pady=15)
btn_calculate = tk.Button(btn_frame, text="Вычислить", command=calculate_refills, width=15, bg="#4CAF50", fg="white")
btn_calculate.pack(side="left", padx=5)
btn_exit = tk.Button(btn_frame, text="Завершить", command=on_close, width=15, bg="#f44336", fg="white")
btn_exit.pack(side="left", padx=5)
# Запуск главного цикла
root.mainloop()
***
Как работает программа
1. Используется библиотека tkinter (встроена в стандартный дистрибутив Python).
2. Интерфейс:
• В верхней части – заголовок с описанием задачи.
• Ниже – 5 полей для ввода параметров (с понятными подписями).
• Под ними – поле для вывода результата.
• Внизу – две кнопки: «Вычислить» и «Завершить».
3. Вводимые параметры:
• V – объём баллона (см³).
• v – объём резервуара оружия (см³).
• P – начальное давление в баллоне (бар).
• P_макс – требуемое максимальное давление в резервуаре (бар).
• P_мин – минимальное (остаточное) давление в резервуаре (бар).
4. Формула расчёта:
• n = V / v * (P - Pмакс) / (Pмакс - Pмин),
где V – объём баллона со сжатым воздухом (в кубических сантиметрах);
v – объём резервуара винтовки/пистолета (в кубических сантиметрах);
P – давление в баллоне со сжатым воздухом до начала заправки резервуара (в барах);
Pмакс – максимальное давление, до которого требуется заправить резервуар PCP-винтовки/пистолета (в барах);
Pмин – минимальное (остаточное) давление в резервуаре PCP-винтовки/пистолета (в барах).
• Результат округляется вниз до целого числа (только полные заправки).
5. Обработка ошибок:
• Проверка на некорректный ввод (если вводятся не числа).
• Проверка на положительные значения объёмов и давлений.
• Проверка, что P_макс > P_мин и P > P_макс (иначе заправка невозможна).
6. Кнопки:
• «Вычислить» – запускает расчёт и выводит результат.
• «Завершить» – закрывает программу.
***
Как запустить
1. Убедитесь, что у вас установлен Python (3.x).
2. Сохраните код в файл, например, pcp_calculator.py.
3. Запустите файл через командную строку (python pcp_calculator.py) или двойным щелчком (если ассоциировано с Python).