commit | author | age
|
8e03d7
|
1 |
-- The HV down converter will step down HV EUs to MV EUs |
R |
2 |
-- If we take the solar panel as calibration then the |
|
3 |
-- 1 HVEU = 5 MVEU as we stack 5 MV arrays to get a HV array. |
|
4 |
-- The downconverter does of course have a conversion loss. |
|
5 |
-- This loses 30% of the power. |
|
6 |
-- The converter does not store any energy by itself. |
|
7 |
minetest.register_node("technic:down_converter_hv", { |
|
8 |
description = "HV Down Converter", |
|
9 |
tiles = {"technic_hv_down_converter_top.png", "technic_hv_down_converter_bottom.png", "technic_hv_down_converter_side.png", |
|
10 |
"technic_hv_down_converter_side.png", "technic_hv_down_converter_side.png", "technic_hv_down_converter_side.png"}, |
|
11 |
groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2}, |
|
12 |
sounds = default.node_sound_wood_defaults(), |
|
13 |
drawtype = "nodebox", |
|
14 |
paramtype = "light", |
|
15 |
is_ground_content = true, |
|
16 |
node_box = { |
|
17 |
type = "fixed", |
|
18 |
fixed = {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, |
|
19 |
}, |
|
20 |
selection_box = { |
|
21 |
type = "fixed", |
|
22 |
fixed = {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, |
|
23 |
}, |
|
24 |
on_construct = function(pos) |
|
25 |
local meta = minetest.env:get_meta(pos) |
|
26 |
meta:set_float("technic_hv_power_machine", 1) |
|
27 |
meta:set_float("technic_mv_power_machine", 1) |
|
28 |
meta:set_float("internal_EU_buffer",0) |
|
29 |
meta:set_float("internal_EU_buffer_size",0) |
|
30 |
meta:set_string("infotext", "HV Down Converter") |
|
31 |
meta:set_float("active", false) |
|
32 |
end, |
|
33 |
}) |
|
34 |
|
|
35 |
minetest.register_craft({ |
|
36 |
output = 'technic:down_converter_hv 1', |
|
37 |
recipe = { |
|
38 |
{'technic:stainless_steel_ingot', 'technic:stainless_steel_ingot','technic:stainless_steel_ingot'}, |
|
39 |
{'technic:hv_transformer', 'technic:hv_cable', 'technic:mv_transformer'}, |
|
40 |
{'technic:hv_cable', 'technic:rubber', 'technic:mv_cable'}, |
|
41 |
} |
|
42 |
}) |
|
43 |
|
|
44 |
minetest.register_abm( |
|
45 |
{nodenames = {"technic:down_converter_hv"}, |
|
46 |
interval = 1, |
|
47 |
chance = 1, |
|
48 |
action = function(pos, node, active_object_count, active_object_count_wider) |
|
49 |
-- HV->MV conversion factor |
|
50 |
local hv_mv_factor = 5 |
|
51 |
-- The maximun charge a single converter can handle. Let's set this to |
|
52 |
-- what 5 HV solar arrays can produce - 30% loss (2880*5*0.7) |
|
53 |
local max_charge = 10080*hv_mv_factor |
|
54 |
|
|
55 |
local meta = minetest.env:get_meta(pos) |
|
56 |
local meta1 = nil |
|
57 |
local pos1 = {} |
|
58 |
local available_charge = 0 -- counted in MV units |
|
59 |
local used_charge = 0 -- counted in MV units |
|
60 |
|
|
61 |
-- Index all HV nodes connected to the network |
|
62 |
-- HV cable comes in through the bottom |
|
63 |
pos1.y = pos.y-1 |
|
64 |
pos1.x = pos.x |
|
65 |
pos1.z = pos.z |
|
66 |
meta1 = minetest.env:get_meta(pos1) |
|
67 |
if meta1:get_float("hv_cablelike")~=1 then return end |
|
68 |
|
|
69 |
local HV_nodes = {} -- HV type |
|
70 |
local HV_PR_nodes = {} -- HV type |
|
71 |
local HV_BA_nodes = {} -- HV type |
|
72 |
|
|
73 |
HV_nodes[1] = {} |
|
74 |
HV_nodes[1].x = pos1.x |
|
75 |
HV_nodes[1].y = pos1.y |
|
76 |
HV_nodes[1].z = pos1.z |
|
77 |
|
|
78 |
local table_index = 1 |
|
79 |
repeat |
|
80 |
check_HV_node(HV_PR_nodes,nil,HV_BA_nodes,HV_nodes,table_index) |
|
81 |
table_index = table_index + 1 |
|
82 |
if HV_nodes[table_index] == nil then break end |
|
83 |
until false |
|
84 |
|
|
85 |
--print("HV_nodes: PR="..table.getn(HV_PR_nodes).." BA="..table.getn(HV_BA_nodes)) |
|
86 |
|
|
87 |
-- Index all MV nodes connected to the network |
|
88 |
-- MV cable comes out of the top |
|
89 |
pos1.y = pos.y+1 |
|
90 |
pos1.x = pos.x |
|
91 |
pos1.z = pos.z |
|
92 |
meta1 = minetest.env:get_meta(pos1) |
|
93 |
if meta1:get_float("mv_cablelike")~=1 then return end |
|
94 |
|
|
95 |
local MV_nodes = {} -- MV type |
|
96 |
local MV_RE_nodes = {} -- MV type |
|
97 |
local MV_BA_nodes = {} -- MV type |
|
98 |
|
|
99 |
MV_nodes[1] = {} |
|
100 |
MV_nodes[1].x = pos1.x |
|
101 |
MV_nodes[1].y = pos1.y |
|
102 |
MV_nodes[1].z = pos1.z |
|
103 |
|
|
104 |
table_index = 1 |
|
105 |
repeat |
|
106 |
check_MV_node(nil,MV_RE_nodes,MV_BA_nodes,MV_nodes,table_index) |
|
107 |
table_index = table_index + 1 |
|
108 |
if MV_nodes[table_index] == nil then break end |
|
109 |
until false |
|
110 |
|
|
111 |
--print("MV_nodes: RE="..table.getn(MV_RE_nodes).." BA="..table.getn(MV_BA_nodes)) |
|
112 |
|
|
113 |
-- First get available power from all the attached HV suppliers |
|
114 |
-- Get the supplier internal EU buffer and read the EUs from it |
|
115 |
-- No update yet! |
|
116 |
local pos1 |
|
117 |
-- FIXME: Until further leave the producers out of it and just let the batteries be the hub |
|
118 |
-- for _,pos1 in ipairs(HV_PR_nodes) do |
|
119 |
-- meta1 = minetest.env:get_meta(pos1) |
|
120 |
-- local internal_EU_buffer = meta1:get_float("internal_EU_buffer") |
|
121 |
-- available_charge = available_charge + meta1:get_float("internal_EU_buffer") * hv_mv_factor |
|
122 |
-- -- Limit conversion capacity |
|
123 |
-- if available_charge > max_charge then |
|
124 |
-- available_charge = max_charge |
|
125 |
-- break |
|
126 |
-- end |
|
127 |
-- end |
|
128 |
-- --print("Available_charge PR:"..available_charge) |
|
129 |
|
|
130 |
for _,pos1 in ipairs(HV_BA_nodes) do |
|
131 |
meta1 = minetest.env:get_meta(pos1) |
|
132 |
local internal_EU_buffer = meta1:get_float("internal_EU_buffer") |
|
133 |
available_charge = available_charge + meta1:get_float("internal_EU_buffer") * hv_mv_factor |
|
134 |
-- Limit conversion capacity |
|
135 |
if available_charge > max_charge then |
|
136 |
available_charge = max_charge |
|
137 |
break |
|
138 |
end |
|
139 |
end |
|
140 |
--print("Available_charge PR+BA:"..available_charge) |
|
141 |
|
|
142 |
-- Calculate total number of receivers: |
|
143 |
local MV_receivers = table.getn(MV_RE_nodes)+table.getn(MV_BA_nodes) |
|
144 |
|
|
145 |
-- Next supply power to all connected MV machines |
|
146 |
-- Get the power receiver internal EU buffer and give EUs to it |
|
147 |
-- Note: for now leave out RE type machines until producers distribute power themselves even without a battery |
|
148 |
-- for _,pos1 in ipairs(MV_RE_nodes) do |
|
149 |
-- local meta1 = minetest.env:get_meta(pos1) |
|
150 |
-- local internal_EU_buffer = meta1:get_float("internal_EU_buffer") |
|
151 |
-- local internal_EU_buffer_size = meta1:get_float("internal_EU_buffer_size") |
|
152 |
-- local charge_to_give = math.min(4000, available_charge/MV_receivers) -- power rating limit on the MV wire |
|
153 |
-- -- How much can this unit take? |
|
154 |
-- if internal_EU_buffer+charge_to_give > internal_EU_buffer_size then |
|
155 |
-- charge_to_give=internal_EU_buffer_size-internal_EU_buffer |
|
156 |
-- end |
|
157 |
-- -- If we are emptying the supply take the remainder |
|
158 |
-- if available_charge<used_charge+charge_to_give then charge_to_give=available_charge-used_charge end |
|
159 |
-- -- Update the unit supplied to |
|
160 |
-- internal_EU_buffer = internal_EU_buffer + charge_to_give |
|
161 |
-- meta1:set_float("internal_EU_buffer",internal_EU_buffer) |
|
162 |
-- -- Do the accounting |
|
163 |
-- used_charge = used_charge + charge_to_give |
|
164 |
-- if available_charge == used_charge then break end -- bail out if supply depleted |
|
165 |
-- end |
|
166 |
--print("used_charge RE:"..used_charge) |
|
167 |
|
|
168 |
for _,pos1 in ipairs(MV_BA_nodes) do |
|
169 |
local meta1 = minetest.env:get_meta(pos1) |
|
170 |
local internal_EU_buffer = meta1:get_float("internal_EU_buffer") |
|
171 |
local internal_EU_buffer_size = meta1:get_float("internal_EU_buffer_size") |
|
172 |
--print("internal_EU_buffer:"..internal_EU_buffer) |
|
173 |
--print("internal_EU_buffer_size:"..internal_EU_buffer_size) |
|
174 |
local charge_to_give = math.min(math.floor(available_charge/MV_receivers), 4000) -- power rating limit on the MV wire |
|
175 |
--print("charge_to_give:"..charge_to_give) |
|
176 |
-- How much can this unit take? |
|
177 |
if internal_EU_buffer+charge_to_give > internal_EU_buffer_size then |
|
178 |
charge_to_give=internal_EU_buffer_size-internal_EU_buffer |
|
179 |
end |
|
180 |
--print("charge_to_give2:"..charge_to_give) |
|
181 |
-- If we are emptying the supply take the remainder |
|
182 |
if available_charge<used_charge+charge_to_give then charge_to_give=available_charge-used_charge end |
|
183 |
-- Update the unit supplied to |
|
184 |
--print("charge_to_give3:"..charge_to_give) |
|
185 |
internal_EU_buffer = internal_EU_buffer + charge_to_give |
|
186 |
--print("internal_EU_buffer:"..internal_EU_buffer) |
|
187 |
meta1:set_float("internal_EU_buffer",internal_EU_buffer) |
|
188 |
-- Do the accounting |
|
189 |
used_charge = used_charge + charge_to_give |
|
190 |
--print("used_charge:"..used_charge) |
|
191 |
if available_charge == used_charge then break end -- bail out if supply depleted |
|
192 |
end |
|
193 |
--print("used_charge RE+BA:"..used_charge) |
|
194 |
|
|
195 |
-- Last update the HV suppliers with the actual demand. |
|
196 |
-- Get the supplier internal EU buffer and update the EUs from it |
|
197 |
-- Note: So far PR nodes left out and only BA nodes are updated |
|
198 |
local HV_BA_size = table.getn(HV_BA_nodes) |
|
199 |
for _,pos1 in ipairs(HV_BA_nodes) do |
|
200 |
meta1 = minetest.env:get_meta(pos1) |
|
201 |
local internal_EU_buffer = meta1:get_float("internal_EU_buffer") |
|
202 |
local charge_to_take = math.floor(used_charge/HV_BA_size/hv_mv_factor) -- HV units |
|
203 |
if internal_EU_buffer-charge_to_take <= 0 then |
|
204 |
charge_to_take = internal_EU_buffer |
|
205 |
end |
|
206 |
if charge_to_take > 0 then |
|
207 |
internal_EU_buffer = internal_EU_buffer-charge_to_take |
|
208 |
meta1:set_float("internal_EU_buffer",internal_EU_buffer) |
|
209 |
end |
|
210 |
end |
|
211 |
|
|
212 |
if used_charge>0 then |
|
213 |
meta:set_string("infotext", "HV Down Converter is active (HV:"..available_charge.."/MV:"..used_charge..")"); |
|
214 |
meta:set_float("active",1) -- used for setting textures someday maybe |
|
215 |
else |
|
216 |
meta:set_string("infotext", "HV Down Converter is inactive (HV:"..available_charge.."/MV:"..used_charge..")"); |
|
217 |
meta:set_float("active",0) -- used for setting textures someday maybe |
|
218 |
return |
|
219 |
end |
|
220 |
end, |
|
221 |
}) |
|
222 |
|
|
223 |
-- This machine does not store energy it receives energy from the HV side and outputs it on the MV side |
|
224 |
register_HV_machine ("technic:down_converter_hv","RE") |
|
225 |
register_MV_machine ("technic:down_converter_hv","PR") |