diff --git a/PLC/Simulations/STATION_EPC/OIP/SATION_EPC.tscn b/PLC/Simulations/STATION_EPC/OIP/SATION_EPC.tscn index b9d4d00..8396502 100644 --- a/PLC/Simulations/STATION_EPC/OIP/SATION_EPC.tscn +++ b/PLC/Simulations/STATION_EPC/OIP/SATION_EPC.tscn @@ -1,6 +1,6 @@ -[gd_scene load_steps=15 format=3 uid="uid://bcby8jt3gsud8"] +[gd_scene load_steps=13 format=3 uid="uid://cprxsbwebcd5v"] -[ext_resource type="Script" uid="uid://dsxxycqvgg68a" path="res://station_epc.gd" id="1_qc5a3"] +[ext_resource type="Script" uid="uid://b28c5btqltji5" path="res://station_epc.gd" id="1_qc5a3"] [ext_resource type="PackedScene" uid="uid://dyhvoundu2kqc" path="res://parts/Building.tscn" id="1_v76qd"] [ext_resource type="PackedScene" uid="uid://bqlkj4ar8q1ws" path="res://parts/assemblies/BeltConveyorAssembly.tscn" id="3_u7586"] [ext_resource type="PackedScene" uid="uid://gddgyvex6gdj" path="res://parts/PushButton.tscn" id="4_ahe6k"] @@ -17,24 +17,12 @@ friction = 0.5 resource_local_to_scene = true script = ExtResource("8_spet4") active = true -segment_color = Color(0, 1, 0, 0.5) [sub_resource type="Resource" id="Resource_spet4"] resource_local_to_scene = true script = ExtResource("7_kdh4b") segment_datas = [SubResource("Resource_kdh4b")] -[sub_resource type="Resource" id="Resource_3ipjn"] -resource_local_to_scene = true -script = ExtResource("8_spet4") -active = true -segment_color = Color(0, 1, 0, 0.5) - -[sub_resource type="Resource" id="Resource_bghi8"] -resource_local_to_scene = true -script = ExtResource("7_kdh4b") -segment_datas = [SubResource("Resource_3ipjn")] - [node name="Simulation" type="Node3D"] script = ExtResource("1_qc5a3") @@ -49,44 +37,49 @@ transform = Transform3D(2, 0, 0, 0, 1, 0, 0, 0, 2, 4.05126, -1.42588, -1.63314) [node name="UL1_3" parent="." instance=ExtResource("3_u7586")] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.819656, -0.308412, -1.61317) -local_floor_plane = Plane(0, 1, 0, -1.69159) +local_floor_plane = Plane(0, 1, 0, -1.691588) speed = 0.0 belt_physics_material = SubResource("PhysicsMaterial_6pmrs") enable_comms = true speed_tag_name = "UL1_3_OIP" running_tag_name = "" -metadata/hijack_scale = true size = Vector3(8, 0.5, 1.524) -metadata/hijack_scale = true [node name="UL1_3_EPC1" parent="." instance=ExtResource("4_ahe6k")] -transform = Transform3D(1, 0, 0, 0, 0.999853, 0.0171208, 0, -0.0171208, 0.999853, -4.5, -0.18, -0.75) -text = "UL1_3_EPC1" +transform = Transform3D(1, 0, 0, 0, 0.999853, 0.0171208, 0, -0.0171208, 0.999853, -4.922587, -0.18, -0.75) +text = "UL1_3_EPC1_CH1" toggle = true -pressed = true +normally_closed = true lamp = true button_color = Color(0.886275, 0.537255, 0, 1) enable_comms = true -pushbutton_tag_group_name = "TagGroup0" pushbutton_tag_name = "Estop_OIP" -lamp_tag_group_name = "TagGroup0" lamp_tag_name = "Estop_OIP" +[node name="UL1_3_EPC3" parent="." instance=ExtResource("4_ahe6k")] +transform = Transform3D(1, 0, 0, 0, 0.999853, 0.0171208, 0, -0.0171208, 0.999853, -4.4607387, -0.18, -0.75) +text = "UL1_3_EPC1_CH2" +toggle = true +normally_closed = true +lamp = true +button_color = Color(0.886275, 0.537255, 0, 1) +enable_comms = true +pushbutton_tag_name = "Estop_OIP2" +lamp_tag_name = "Estop_OIP2" + [node name="UL1_3_EPC1_STATION" parent="." instance=ExtResource("4_ahe6k")] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -4.5, -0.7, -0.75) +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -4.503487, -0.7, -0.75) text = "STATION EPC1" toggle = true pressed = true lamp = true button_color = Color(0.886275, 0.533333, 0, 1) enable_comms = true -pushbutton_tag_group_name = "TagGroup0" pushbutton_tag_name = "UL1_3_EPC1.CTRL.STS.EStop_Was_Actuated" -lamp_tag_group_name = "TagGroup0" lamp_tag_name = "UL1_3_EPC1.CTRL.STS.EStop_Was_Actuated" [node name="UL1_3_EPC1_BEACON" parent="." instance=ExtResource("6_qc5a3")] -transform = Transform3D(3.03596, -0.00241847, 0, 0.0540532, 0.135836, 0, 0, 0, 3.03644, -4.5, 0.0338165, -0.637099) +transform = Transform3D(3.03596, -0.0024184675, 0, 0.0540532, 0.135836, 0, 0, 0, 3.036441, -4.5, 0.0338165, -0.637099) light_value = 1 _data = SubResource("Resource_spet4") "Light 1" = SubResource("Resource_kdh4b") @@ -94,41 +87,6 @@ enable_comms = true tag_groups = null tag_name = "Beacon_OIP.0" -[node name="UL1_3_EPC2" parent="." instance=ExtResource("4_ahe6k")] -transform = Transform3D(-1, 1.49675e-09, -8.74099e-08, 0, 0.999853, 0.0171208, 8.74228e-08, 0.0171208, -0.999853, -4.5, -0.18, -2.46) -text = "UL1_3_EPC2" -toggle = true -pressed = true -lamp = true -button_color = Color(0.886275, 0.537255, 0, 1) -enable_comms = true -pushbutton_tag_group_name = "TagGroup0" -pushbutton_tag_name = "Estop_OIP2" -lamp_tag_group_name = "TagGroup0" -lamp_tag_name = "Estop_OIP2" - -[node name="UL1_3_EPC2_STATION" parent="." instance=ExtResource("4_ahe6k")] -transform = Transform3D(-1, 0, -8.74228e-08, 0, 1, 0, 8.74228e-08, 0, -1, -4.5, -0.7, -2.46) -text = "STATION EPC2" -toggle = true -pressed = true -lamp = true -button_color = Color(0.886275, 0.533333, 0, 1) -enable_comms = true -pushbutton_tag_group_name = "TagGroup0" -pushbutton_tag_name = "UL1_3_EPC2.CTRL.STS.EStop_Was_Actuated" -lamp_tag_group_name = "TagGroup0" -lamp_tag_name = "UL1_3_EPC2.CTRL.STS.EStop_Was_Actuated" - -[node name="UL1_3_EPC2_BEACON" parent="." instance=ExtResource("6_qc5a3")] -transform = Transform3D(3.03596, -0.00241847, 0, 0.0540532, 0.135836, 0, 0, 0, 3.03644, -4.5, 0.0338165, -2.5929) -light_value = 1 -_data = SubResource("Resource_bghi8") -"Light 1" = SubResource("Resource_3ipjn") -enable_comms = true -tag_groups = null -tag_name = "Beacon_OIP2.0" - [node name="MCM_START" parent="." instance=ExtResource("4_ahe6k")] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -3, -0.18, -0.75) text = "MCM START" @@ -137,20 +95,16 @@ pressed = true lamp = true button_color = Color(0.359592, 0.479432, 1, 1) enable_comms = true -pushbutton_tag_group_name = "TagGroup0" -pushbutton_tag_name = "MCM.STS.Start_PB" -lamp_tag_group_name = "TagGroup0" -lamp_tag_name = "MCM.STS.Start_PB" +pushbutton_tag_name = "MCM.STS.System_Started" +lamp_tag_name = "MCM.STS.System_Started" [node name="START_CONVEYOR" parent="." instance=ExtResource("4_ahe6k")] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -3.5, -0.18, -0.75) text = "START CONVEYOR" -toggle = true +normally_closed = true button_color = Color(0.407843, 1, 0.164706, 1) enable_comms = true -pushbutton_tag_group_name = "TagGroup0" pushbutton_tag_name = "Start_Conveyor_OIP" -lamp_tag_group_name = "TagGroup0" lamp_tag_name = "Start_Conveyor_OIP" [node name="COMMUNIACTION" parent="." instance=ExtResource("4_ahe6k")] @@ -159,7 +113,5 @@ text = "COMMUNIACTION OFF" toggle = true button_color = Color(0.886275, 0.533333, 0, 1) enable_comms = true -pushbutton_tag_group_name = "TagGroup0" -pushbutton_tag_name = "UL1_3_SIO1.CTRL.STS.Communication_Fault" -lamp_tag_group_name = "TagGroup0" -lamp_tag_name = "UL1_3_SIO1.CTRL.STS.Communication_Fault" +pushbutton_tag_name = "Parent_Comm_Faulted" +lamp_tag_name = "Parent_Comm_Faulted" diff --git a/PLC/Simulations/STATION_EPC/OIP/station_epc.gd b/PLC/Simulations/STATION_EPC/OIP/station_epc.gd index 680a975..e056fe0 100644 --- a/PLC/Simulations/STATION_EPC/OIP/station_epc.gd +++ b/PLC/Simulations/STATION_EPC/OIP/station_epc.gd @@ -13,9 +13,6 @@ func _on_simulation_started() -> void: OIPComms.register_tag(tag_group, "UL1_3_EPC1.CTRL.STS.Log.LEN", 1) OIPComms.register_tag(tag_group, "UL1_3_EPC1.HMI.STATE", 1) - # Register tags for EPC2 - OIPComms.register_tag(tag_group, "UL1_3_EPC2.CTRL.STS.Log.LEN", 1) - OIPComms.register_tag(tag_group, "UL1_3_EPC2.HMI.STATE", 1) # Register all 82 DATA tags for both EPCs for i in range(82): @@ -23,9 +20,6 @@ func _on_simulation_started() -> void: var data_tag_epc1 = "UL1_3_EPC1.CTRL.STS.Log.DATA[" + str(i) + "]" OIPComms.register_tag(tag_group, data_tag_epc1, 1) - # EPC2 data tags - var data_tag_epc2 = "UL1_3_EPC2.CTRL.STS.Log.DATA[" + str(i) + "]" - OIPComms.register_tag(tag_group, data_tag_epc2, 1) func _physics_process(delta: float) -> void: if ul1_3.speed == 0: @@ -35,11 +29,7 @@ func _physics_process(delta: float) -> void: # Monitor both EPCs var epc1_state = OIPComms.read_int32(tag_group, "UL1_3_EPC1.HMI.STATE") - var epc2_state = OIPComms.read_int32(tag_group, "UL1_3_EPC2.HMI.STATE") # Monitor both EPCs - UNCOMMENT TO SEE #print("EPC1 State: ", epc1_state) #print("EPC1 Log String: ", Utils.read_string(tag_group, "UL1_3_EPC1.CTRL.STS.Log")) - # - #print("EPC2 State: ", epc2_state) - #print("EPC2 Log String: ", Utils.read_string(tag_group, "UL1_3_EPC2.CTRL.STS.Log")) diff --git a/PLC/Simulations/STATION_EPC/PLC/AOIs/AOI_FLIP_FLOP_AOI.L5X b/PLC/Simulations/STATION_EPC/PLC/AOIs/AOI_FLIP_FLOP_AOI.L5X new file mode 100644 index 0000000..bbed7ce --- /dev/null +++ b/PLC/Simulations/STATION_EPC/PLC/AOIs/AOI_FLIP_FLOP_AOI.L5X @@ -0,0 +1,110 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/PLC/Simulations/STATION_EPC/PLC/AOIs/AOI_MCM_AOI.L5X b/PLC/Simulations/STATION_EPC/PLC/AOIs/AOI_MCM_AOI.L5X new file mode 100644 index 0000000..9efbd33 --- /dev/null +++ b/PLC/Simulations/STATION_EPC/PLC/AOIs/AOI_MCM_AOI.L5X @@ -0,0 +1,1113 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/PLC/Simulations/STATION_EPC/PLC/AOIs/AOI_STATION_EPC_AOI.L5X b/PLC/Simulations/STATION_EPC/PLC/AOIs/AOI_STATION_EPC_AOI.L5X index 8ccb4ed..822a423 100644 --- a/PLC/Simulations/STATION_EPC/PLC/AOIs/AOI_STATION_EPC_AOI.L5X +++ b/PLC/Simulations/STATION_EPC/PLC/AOIs/AOI_STATION_EPC_AOI.L5X @@ -1,9 +1,298 @@  - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -14,11 +303,32 @@ - - + + + + + + + + + + + + + + + + + + + + + + + @@ -27,11 +337,14 @@ + + + - + @@ -39,6 +352,9 @@ + + + @@ -47,6 +363,9 @@ + + + @@ -55,6 +374,9 @@ + + + @@ -69,6 +391,9 @@ + + + @@ -77,6 +402,9 @@ + + + @@ -85,6 +413,9 @@ + + + @@ -93,19 +424,25 @@ + + + - - - - - - + + + + + + + + + @@ -116,35 +453,30 @@ - + - + - + - + - - - - - - + @@ -153,7 +485,7 @@ - + @@ -162,7 +494,7 @@ - + @@ -171,7 +503,7 @@ - + @@ -180,19 +512,14 @@ + + + + + - - - - - - - - - - - + @@ -216,7 +543,6 @@ - diff --git a/PLC/Simulations/STATION_EPC/PLC/AOIs/AOI_VFD_AOI.L5X b/PLC/Simulations/STATION_EPC/PLC/AOIs/AOI_VFD_AOI.L5X new file mode 100644 index 0000000..868fa03 --- /dev/null +++ b/PLC/Simulations/STATION_EPC/PLC/AOIs/AOI_VFD_AOI.L5X @@ -0,0 +1,1468 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/PLC/Simulations/STATION_EPC/PLC/STATION_EPC.L5X b/PLC/Simulations/STATION_EPC/PLC/STATION_EPC.L5X index fd542b0..79c8232 100644 --- a/PLC/Simulations/STATION_EPC/PLC/STATION_EPC.L5X +++ b/PLC/Simulations/STATION_EPC/PLC/STATION_EPC.L5X @@ -1,21 +1,85 @@  - - + - + + + + + + - + - + + + + @@ -106,6 +166,57 @@ + + + + + + + + + + + + + + - - - - - - - - - - @@ -422,9 +325,9 @@ @@ -459,58 +367,28 @@ - - + - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/PLC/Simulations/STATION_EPC/PLC/UDTs/VFD_DataTypes.L5X b/PLC/Simulations/STATION_EPC/PLC/UDTs/VFD_DataTypes.L5X new file mode 100644 index 0000000..b68efe6 --- /dev/null +++ b/PLC/Simulations/STATION_EPC/PLC/UDTs/VFD_DataTypes.L5X @@ -0,0 +1,1478 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +