I am doing an assignment where I need to create an office management system that takes care of security, lighting, and heating on its own. It is required for us to make it in the sequential function chart logic from ladder logic, but I don't understand how to make it since we never took it. I tried to research it, but I still don't know how to convert it from ladder logic to SFC.
Please need help
The program functionality should be as follows:
• All counters/timers must be reset when entering "run" mode for the first time (use the first scan bit).
• Only during the day should the current number of occupants be counted by incrementing/decrementing as they enter or leave. Counting should not be done in the middle of the night. The count should be shown on the BCD display.
• The thermostat must control the heating during the day. At night, the heating is turned off.
• The main light system must activate as follows when the office is occupied during the day (using a LIM or Compare function). Daylight switch 1 should be used to control the first row of the main lighting. Daylight switches 1 and 2 will control main lighting row 2. No daylight switch should be used to control main lighting row 3. Unless an intruder triggers the main lighting, it is turned off at night. When the office is not in use, all the lights should be turned off.
• The night lighting should only be turned on at night.
• When a presence is detected at night, the external alarm should activate (70 percent duty cycle for 3 seconds) and latch, the internal alarm should start (30 percent duty cycle for 1 second) and latch, and the main lighting should activate after a time delay of 6 seconds and remain on for 20 seconds.
• When activated, all intruder alarms latch and can only be reset by pressing the reset button.
• In the event of a mains failure (from on to off the mains power switch), the emergency lighting should turn on immediately (day or night) and latch on the external alarm after a 6-second delay. The external alarm should have a duty cycle of 60% and a duration of 2 seconds. When the mains power is restored, the external alarm should be reset.
This is my ladder logic using RSlogix5000:
My Progress so far, I don't know if I did OSR correct and how to do BSL for the BCD also I am planning to put all these in a single function block:
Timer_1.Acc:=0;
Timer_2.Acc:=0;
Timer_3.Acc:=0;
Timer_4.Acc:=0;
Timer_5.Acc:=0;
Timer_6.Acc:=0;
Timer_7.Acc:=0;
Timer_8.Acc:=0;
BSL_Array[0]:=0;
CTUD(Counter);
Counter.CUEnable:= DNSwitch and PDEntry;
Counter.Reset := RSwitch;
CTUD(Counter);
Counter.CDEnable:= DNSwitch and PDExit;
Counter.Reset := RSwitch;
if DNSwitch and Thermostat
then
Heating:=1;
else
Heating:=0;
end_if;
if DNSwitch and DLSwitch1 and (Counter.ACC >= 0)
then
Row1:=1;
else
Row1:=0;
end_if;
if (DNSwitch and DLSwitch1 and DLSwitch2 and (Counter.ACC >= 0)) or Timer_2.TT
then
Row2:=1;
else
Row2:=0;
end_if;
if (DNSwitch and DLSwitch1 and DLSwitch2 and (Counter.ACC >= 0)) or Timer_2.TT
then
Row2:=1;
else
Row2:=0;
end_if;
if (DNSwitch and (Counter.ACC > 0)) or Timer_2.TT
then
Row3:=1;
else
Row3:=0;
end_if;
if not DNSwitch
then
NLight:=1;
else
NLight:=0;
end_if;
if not DNSwitch and (PDEntry or (Intruder and not RSwitch))
then
Intruder:=1;
else
Intruder:=0;
end_if;
RTOR(Timer_1);
Timer_1.PRE:= 6000;
Timer_1.TimerEnable:= Intruder;
Timer_1.Reset:= RSwitch;
RTOR(Timer_2);
Timer_2.PRE:= 20000;
Timer_2.TimerEnable:= Intruder and Timer_1.DN;
Timer_2.Reset:= RSwitch;
RTOR(Timer_3);
Timer_3.PRE:= 3000;
Timer_3.TimerEnable:= Intruder;
Timer_3.Reset:= RSwitch;
if (Intruder and (Timer_3.ACC <= 2100)) or (MPFail and Timer_5.DN and (Timer_6.ACC <= 1200))
then
ExtAlarm:= 1;
else
ExtAlarm:= 0;
end_if;
RTOR(Timer_4);
Timer_4.PRE:= 1000;
Timer_4.TimerEnable:= Intruder;
Timer_4.Reset:= RSwitch;
if (Intruder and (Timer_4.ACC <= 300))
then
IntAlarm:= 1;
else
IntAlarm:= 0;
end_if;
If MPFail
then
Elight:= 1;
else
Elight:= 0;
end_if;
RTOR(Timer_5);
Timer_5.PRE:= 2000;
Timer_5.TimerEnable:= MPFail;
Timer_5.Reset:= RSwitch;
RTOR(Timer_6);
Timer_6.PRE:= 2000;
Timer_6.TimerEnable:= Timer_5.DN;
Timer_6.Reset:= RSwitch;
(*BCD*)
RTOR(Timer_7);
Timer_7.PRE:= 25;
Timer_7.TimerEnable:= DNSwitch and not Timer_8.DN;
Timer_7.Reset:= RSwitch;
RTOR(Timer_8);
Timer_8.PRE:= 25;
Timer_8.TimerEnable:= DNSwitch and not Timer_8.DN and Timer_7.DN;
Timer_8.Reset:= RSwitch;
OSRI_Fn.InputBit := Timer_7.DN;
OSRI(OSRI_Fn);
OSR_1 := OSRI_Fn.OutputBit;