From a35667c017049a08b7604e9d412957452b6bf400 Mon Sep 17 00:00:00 2001 From: Debora Date: Fri, 27 Sep 2024 17:49:08 -0300 Subject: [PATCH] feat: Unit test for automatic fault reset --- test/task_test.rb | 156 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 156 insertions(+) diff --git a/test/task_test.rb b/test/task_test.rb index fc53295..e49d73b 100644 --- a/test/task_test.rb +++ b/test/task_test.rb @@ -59,6 +59,10 @@ modbus_set(93, 14) modbus_set(94, 15) modbus_set(95, 16) + + modbus_set(265, 11) # no external fault + modbus_set(266, 12) # reset + modbus_set(275, 21) # pre-charge ok end after do @@ -236,6 +240,82 @@ assert_in_delta 1.6, sample.inverter_output_voltage end + it "keeps writing on the output ports when it is in error state when the inverter is in under-voltage status" do + modbus_configure_and_start + + now = Time.now + modbus_expect_execution(@writer, @reader) do + modbus_set(49, 1) + modbus_set(6, 2) + end.to do + emit task.controller_under_voltage_event + have_one_new_sample task.fault_state_port + have_one_new_sample task.joint_samples_port + have_one_new_sample task.inverter_state_port + have_one_new_sample task.alarm_state_port + have_one_new_sample task.temperatures_port + end + + modbus_expect_execution(@writer, @reader).to do + have_one_new_sample task.fault_state_port + have_one_new_sample task.joint_samples_port + have_one_new_sample task.inverter_state_port + have_one_new_sample task.alarm_state_port + have_one_new_sample task.temperatures_port + end + end + + it "transits between error state and running state when the inverter stops reporting the under-voltage status" do + modbus_configure_and_start + + now = Time.now + modbus_expect_execution(@writer, @reader) do + modbus_set(49, 1) + modbus_set(6, 2) + end.to do + emit task.controller_under_voltage_event + end + + modbus_expect_execution(@writer, @reader) do + modbus_set(49, 1) + modbus_set(6, 1) + end.to do + emit task.running_event + end + + modbus_expect_execution(@writer, @reader) do + modbus_set(49, 1) + modbus_set(6, 2) + end.to do + emit task.controller_under_voltage_event + end + end + + it "emits the last error state when receiving new input commands while the inverter is in under-voltage status" do + modbus_configure_and_start + + now = Time.now + modbus_expect_execution(@writer, @reader) do + modbus_set(49, 1) + modbus_set(6, 2) + end.to do + emit task.controller_under_voltage_event + end + + modbus_expect_execution(@writer, @reader).to do + not_emit task.controller_under_voltage_event, within: 0.2 + end + + cmd = Types.base.samples.Joints.new( + elements: [Types.base.JointState.Speed(1000 * 2 * Math::PI / 60)] + ) + modbus_expect_execution(@writer, @reader) do + syskit_write task.cmd_in_port, cmd + end.to do + emit task.controller_under_voltage_event + end + end + it "outputs a fault state structure and transitions to fault if there is a fault" do modbus_configure_and_start @@ -257,6 +337,82 @@ assert_in_delta 1.5, sample.inverter_output_frequency assert_in_delta 1.6, sample.inverter_output_voltage end + + it "keeps writing on the output ports when it is in error state when the inverter is in fault status" do + modbus_configure_and_start + + now = Time.now + modbus_expect_execution(@writer, @reader) do + modbus_set(49, 1) + modbus_set(6, 3) + end.to do + emit task.controller_fault_event + have_one_new_sample task.fault_state_port + have_one_new_sample task.joint_samples_port + have_one_new_sample task.inverter_state_port + have_one_new_sample task.alarm_state_port + have_one_new_sample task.temperatures_port + end + + modbus_expect_execution(@writer, @reader).to do + have_one_new_sample task.fault_state_port + have_one_new_sample task.joint_samples_port + have_one_new_sample task.inverter_state_port + have_one_new_sample task.alarm_state_port + have_one_new_sample task.temperatures_port + end + end + + it "transits between error state and running state when the inverter stops reporting the fault status" do + modbus_configure_and_start + + now = Time.now + modbus_expect_execution(@writer, @reader) do + modbus_set(49, 1) + modbus_set(6, 3) + end.to do + emit task.controller_fault_event + end + + modbus_expect_execution(@writer, @reader) do + modbus_set(49, 1) + modbus_set(6, 1) + end.to do + emit task.running_event + end + + modbus_expect_execution(@writer, @reader) do + modbus_set(49, 1) + modbus_set(6, 3) + end.to do + emit task.controller_fault_event + end + end + + it "emits the last error state when receiving new input commands while the inverter is in fault status" do + modbus_configure_and_start + + now = Time.now + modbus_expect_execution(@writer, @reader) do + modbus_set(49, 1) + modbus_set(6, 3) + end.to do + emit task.controller_fault_event + end + + modbus_expect_execution(@writer, @reader).to do + not_emit task.controller_fault_event, within: 0.2 + end + + cmd = Types.base.samples.Joints.new( + elements: [Types.base.JointState.Speed(1000 * 2 * Math::PI / 60)] + ) + modbus_expect_execution(@writer, @reader) do + syskit_write task.cmd_in_port, cmd + end.to do + emit task.controller_fault_event + end + end end describe "inverted = false" do