package promauto.jroboplc.roboplant;
import static org.junit.Assert.*;
import org.junit.Test;
import promauto.jroboplc.JRoboUtils;
import promauto.jroboplc.Module;
import promauto.jroboplc.Tag;
public class SeqControlTest {
@Test
public void test() {
System.out.println("\n\n\n===== SeqControlTest");
Module m0 = new Module();
m0.moduleName = "mod0";
try {
JRoboUtils.clearModules();
JRoboUtils.addModules(m0);
} catch (Exception e) {
}
Tag tagInput1 = m0.tagTable.createTag("MCHB_111_Input", 0);
Tag tagMasterout1 = m0.tagTable.createTag("MCHB_111_Masterout", 0);
Tag tagSusp1 = m0.tagTable.createTag("MCHB_111_Susp", 0);
Tag tagInput2 = m0.tagTable.createTag("MCHB_222_Input", 0);
Tag tagMasterout2 = m0.tagTable.createTag("MCHB_222_Masterout", 0);
Tag tagSusp2 = m0.tagTable.createTag("MCHB_222_Susp", 0);
Tag tagA2 = m0.tagTable.createTag("A2", 0);
Tag tagInput3 = m0.tagTable.createTag("MCHB_333_Input", 0);
Tag tagMasterout3 = m0.tagTable.createTag("MCHB_333_Masterout", 0);
Tag tagSusp3 = m0.tagTable.createTag("MCHB_333_Susp", 0);
Tag tagA3 = m0.tagTable.createTag("A3", 0);
Tag tagB3 = m0.tagTable.createTag("B3", 0);
Tag tagBb3 = m0.tagTable.createTag("Bb3", 0);
SeqControl m = new SeqControl(m0, "S01", "test seq S01");
m.setTimeStepMs(0);
SeqEntry se1 = m.create("111", "descr 111");
se1.setTime(0, 0);
se1.setDeviceInputTag(tagInput1, 1, 0);
se1.setDeviceStateTag(tagMasterout1, 1);
se1.setDeviceSuspTag(tagSusp1, 1);
SeqEntry se2 = m.create("222", "descr 222");
se2.setTime(2, 1);
se2.setDeviceInputTag(tagInput2, 1, 0);
se2.setDeviceStateTag(tagMasterout2, 1);
se2.setDeviceSuspTag(tagSusp2, 1);
se2.addControlTag(tagA2, 1);
se2.addControlTag(se1.tagOutput, 1);
SeqEntry se3 = m.create("333", "descr 333");
se3.setTime(4, 2);
se3.setDeviceInputTag(tagInput3, 1, 0);
se3.setDeviceStateTag(tagMasterout3, 1);
se3.setDeviceSuspTag(tagSusp3, 1);
se3.addControlTag(tagA3, 1);
se3.addControlTag(se2.tagOutput, 1);
se3.addControlTagGroup();
se3.addControlTag(tagB3, 1);
se3.addControlTag(tagBb3, 1);
se3.addControlTag(se2.tagOutput, 1);
assertEquals(m.tagInput.getName(), "SEQCTL_S01_Input");
assertEquals(m.tagSusp.getName(), "SEQCTL_S01_Susp");
assertEquals(m.tagState.getName(), "SEQCTL_S01_State");
assertEquals(m.tagCntRun.getName(), "SEQCTL_S01_CntRun");
assertEquals(se1.tagInput.getName(), "SEQCTL_S01_111_Input");
assertEquals(se1.tagOutput.getName(), "SEQCTL_S01_111_Output");
assertEquals(se1.tagTimeStart.getName(),"SEQCTL_S01_111_TimeStart");
assertEquals(se1.tagTimeStop.getName(), "SEQCTL_S01_111_TimeStop");
m.execute();
assertEquals(m.tagInput.get(), 0);
assertEquals(m.tagSusp.get(), 0);
assertEquals(m.tagState.get(), 0);
assertEquals(m.tagCntRun.get(), 0);
assertEquals(se1.tagInput.get(), 0);
assertEquals(se1.tagOutput.get(), 0);
assertEquals(se1.tagDeviceInput.get(), 0);
assertEquals(se1.tagDeviceState.get(), 0);
assertEquals(se2.tagInput.get(), 0);
assertEquals(se2.tagOutput.get(), 0);
assertEquals(se2.tagDeviceInput.get(), 0);
assertEquals(se2.tagDeviceState.get(), 0);
assertEquals(se3.tagInput.get(), 0);
assertEquals(se3.tagOutput.get(), 0);
assertEquals(se3.tagDeviceInput.get(), 0);
assertEquals(se3.tagDeviceState.get(), 0);
m.tagInput.set(1);
m.execute();
assertEquals(m.tagState.get(), 2);
assertEquals(m.tagCntRun.get(), 0);
assertEquals(se1.tagInput.get(), 1);
assertEquals(se2.tagInput.get(), 0);
assertEquals(se3.tagInput.get(), 0);
assertEquals(se1.tagOutput.get(), 0);
assertEquals(se2.tagOutput.get(), 0);
assertEquals(se3.tagOutput.get(), 0);
tagMasterout1.set(1);
m.execute();
assertEquals(m.tagState.get(), 2);
assertEquals(m.tagCntRun.get(), 1);
assertEquals(se1.tagInput.get(), 1);
assertEquals(se2.tagInput.get(), 0);
assertEquals(se3.tagInput.get(), 0);
assertEquals(se1.tagOutput.get(), 1);
assertEquals(se2.tagOutput.get(), 0);
assertEquals(se3.tagOutput.get(), 0);
tagA2.set(1);
m.execute();
assertEquals(m.tagState.get(), 2);
assertEquals(m.tagCntRun.get(), 1);
assertEquals(se1.tagInput.get(), 1);
assertEquals(se2.tagInput.get(), 1);
assertEquals(se3.tagInput.get(), 0);
assertEquals(se1.tagOutput.get(), 1);
assertEquals(se2.tagOutput.get(), 0);
assertEquals(se3.tagOutput.get(), 0);
tagMasterout2.set(1);
m.execute();
assertEquals(m.tagState.get(), 2);
assertEquals(m.tagCntRun.get(), 2);
assertEquals(se1.tagInput.get(), 1);
assertEquals(se2.tagInput.get(), 1);
assertEquals(se3.tagInput.get(), 0);
assertEquals(se1.tagOutput.get(), 1);
assertEquals(se2.tagOutput.get(), 1);
assertEquals(se3.tagOutput.get(), 0);
tagA3.set(1);
tagB3.set(1);
tagBb3.set(1);
m.execute();
assertEquals(m.tagState.get(), 1); //2
assertEquals(m.tagCntRun.get(), 2);
assertEquals(se1.tagInput.get(), 1);
assertEquals(se2.tagInput.get(), 1);
assertEquals(se3.tagInput.get(), 1);
assertEquals(se1.tagOutput.get(), 1);
assertEquals(se2.tagOutput.get(), 1);
assertEquals(se3.tagOutput.get(), 0);
// start has ended up
tagMasterout3.set(1);
m.execute();
assertEquals(m.tagState.get(), 1);
assertEquals(m.tagCntRun.get(), 3);
assertEquals(se1.tagInput.get(), 1);
assertEquals(se2.tagInput.get(), 1);
assertEquals(se3.tagInput.get(), 1);
assertEquals(se1.tagOutput.get(), 1);
assertEquals(se2.tagOutput.get(), 1);
assertEquals(se3.tagOutput.get(), 1);
// just running
m.execute();
assertEquals(m.tagState.get(), 1);
assertEquals(m.tagCntRun.get(), 3);
assertEquals(se1.tagInput.get(), 1);
assertEquals(se2.tagInput.get(), 1);
assertEquals(se3.tagInput.get(), 1);
assertEquals(se1.tagOutput.get(), 1);
assertEquals(se2.tagOutput.get(), 1);
assertEquals(se3.tagOutput.get(), 1);
// alarm in the middle of chain
tagMasterout2.set(0);
m.execute();
assertEquals(m.tagState.get(), 1);
assertEquals(m.tagCntRun.get(), 1);
assertEquals(se1.tagInput.get(), 1);
assertEquals(se2.tagInput.get(), 1);
assertEquals(se3.tagInput.get(), 0);
assertEquals(se1.tagOutput.get(), 1);
assertEquals(se2.tagOutput.get(), 0);
assertEquals(se3.tagOutput.get(), 0);
tagMasterout2.set(1);
tagMasterout3.set(0);
m.execute();
assertEquals(m.tagState.get(), 1);
assertEquals(m.tagCntRun.get(), 2);
assertEquals(se1.tagInput.get(), 1);
assertEquals(se2.tagInput.get(), 1);
assertEquals(se3.tagInput.get(), 1);
assertEquals(se1.tagOutput.get(), 1);
assertEquals(se2.tagOutput.get(), 1);
assertEquals(se3.tagOutput.get(), 0);
tagMasterout3.set(1);
m.execute();
assertEquals(m.tagState.get(), 1);
assertEquals(m.tagCntRun.get(), 3);
assertEquals(se1.tagInput.get(), 1);
assertEquals(se2.tagInput.get(), 1);
assertEquals(se3.tagInput.get(), 1);
assertEquals(se1.tagOutput.get(), 1);
assertEquals(se2.tagOutput.get(), 1);
assertEquals(se3.tagOutput.get(), 1);
// stopping
m.tagInput.set(0);
m.execute();
assertEquals(m.tagState.get(), 3);
assertEquals(m.tagCntRun.get(), 3);
assertEquals(se1.tagInput.get(), 1);
assertEquals(se2.tagInput.get(), 1);
assertEquals(se3.tagInput.get(), 1);
assertEquals(se1.tagOutput.get(), 1);
assertEquals(se2.tagOutput.get(), 1);
assertEquals(se3.tagOutput.get(), 1);
m.execute();
assertEquals(m.tagState.get(), 3);
assertEquals(m.tagCntRun.get(), 2);
assertEquals(se1.tagInput.get(), 1);
assertEquals(se2.tagInput.get(), 1);
assertEquals(se3.tagInput.get(), 0);
assertEquals(se1.tagOutput.get(), 1);
assertEquals(se2.tagOutput.get(), 1);
assertEquals(se3.tagOutput.get(), 0);
m.execute();
assertEquals(m.tagState.get(), 3);
assertEquals(m.tagCntRun.get(), 1);
assertEquals(se1.tagInput.get(), 1);
assertEquals(se2.tagInput.get(), 0);
assertEquals(se3.tagInput.get(), 0);
assertEquals(se1.tagOutput.get(), 1);
assertEquals(se2.tagOutput.get(), 0);
assertEquals(se3.tagOutput.get(), 0);
m.execute();
assertEquals(m.tagState.get(), 0);//3
assertEquals(m.tagCntRun.get(), 0);
assertEquals(se1.tagInput.get(), 0);
assertEquals(se2.tagInput.get(), 0);
assertEquals(se3.tagInput.get(), 0);
assertEquals(se1.tagOutput.get(), 0);
assertEquals(se2.tagOutput.get(), 0);
assertEquals(se3.tagOutput.get(), 0);
m.execute();
assertEquals(m.tagState.get(), 0);
assertEquals(m.tagCntRun.get(), 0);
// start susp
m.tagInput.set(1);
m.execute();
assertEquals(m.tagState.get(), 2);
assertEquals(m.tagCntRun.get(), 1);
assertEquals(se1.tagInput.get(), 1);
assertEquals(se2.tagInput.get(), 0);
assertEquals(se3.tagInput.get(), 0);
tagSusp2.set(1);
m.execute();
assertEquals(m.tagState.get(), 4);
assertEquals(m.tagCntRun.get(), 1);
assertEquals(se1.tagInput.get(), 1);
assertEquals(se2.tagInput.get(), 0);
assertEquals(se3.tagInput.get(), 0);
m.execute();
assertEquals(m.tagState.get(), 4);
assertEquals(m.tagCntRun.get(), 1);
assertEquals(se1.tagInput.get(), 1);
assertEquals(se2.tagInput.get(), 0);
assertEquals(se3.tagInput.get(), 0);
tagSusp2.set(0);
m.execute();
assertEquals(m.tagState.get(), 4);
assertEquals(m.tagCntRun.get(), 1);
assertEquals(se1.tagInput.get(), 1);
assertEquals(se2.tagInput.get(), 0);
assertEquals(se3.tagInput.get(), 0);
m.tagSusp.set(0);
m.execute();
assertEquals(m.tagState.get(), 2);
assertEquals(m.tagCntRun.get(), 1);
assertEquals(se1.tagInput.get(), 1);
assertEquals(se2.tagInput.get(), 0);
assertEquals(se3.tagInput.get(), 0);
m.execute();
assertEquals(m.tagState.get(), 2);
assertEquals(m.tagCntRun.get(), 1);
assertEquals(se1.tagInput.get(), 1);
assertEquals(se2.tagInput.get(), 0);
assertEquals(se3.tagInput.get(), 0);
m.execute();
assertEquals(m.tagState.get(), 2);
assertEquals(m.tagCntRun.get(), 2);
assertEquals(se1.tagInput.get(), 1);
assertEquals(se2.tagInput.get(), 1);
assertEquals(se3.tagInput.get(), 0);
m.execute();
assertEquals(m.tagState.get(), 2);
assertEquals(m.tagCntRun.get(), 2);
assertEquals(se1.tagInput.get(), 1);
assertEquals(se2.tagInput.get(), 1);
assertEquals(se3.tagInput.get(), 0);
m.execute();
assertEquals(m.tagState.get(), 1);//2
assertEquals(m.tagCntRun.get(), 3);
assertEquals(se1.tagInput.get(), 1);
assertEquals(se2.tagInput.get(), 1);
assertEquals(se3.tagInput.get(), 1);
m.execute();
assertEquals(m.tagState.get(), 1);
assertEquals(m.tagCntRun.get(), 3);
assertEquals(se1.tagInput.get(), 1);
assertEquals(se2.tagInput.get(), 1);
assertEquals(se3.tagInput.get(), 1);
// stopping susp
m.tagInput.set(0);
m.execute();
assertEquals(m.tagState.get(), 3);
assertEquals(m.tagCntRun.get(), 3);
assertEquals(se1.tagInput.get(), 1);
assertEquals(se2.tagInput.get(), 1);
assertEquals(se3.tagInput.get(), 1);
tagSusp2.set(0);
m.execute();
assertEquals(m.tagState.get(), 3);
assertEquals(m.tagCntRun.get(), 2);
assertEquals(se1.tagInput.get(), 1);
assertEquals(se2.tagInput.get(), 1);
assertEquals(se3.tagInput.get(), 0);
m.tagSusp.set(1);
m.execute();
assertEquals(m.tagState.get(), 5);
assertEquals(m.tagCntRun.get(), 2);
assertEquals(se1.tagInput.get(), 1);
assertEquals(se2.tagInput.get(), 1);
assertEquals(se3.tagInput.get(), 0);
m.execute();
assertEquals(m.tagState.get(), 5);
assertEquals(m.tagCntRun.get(), 2);
assertEquals(se1.tagInput.get(), 1);
assertEquals(se2.tagInput.get(), 1);
assertEquals(se3.tagInput.get(), 0);
m.tagSusp.set(0);
m.execute();
assertEquals(m.tagState.get(), 3);
assertEquals(m.tagCntRun.get(), 2);
assertEquals(se1.tagInput.get(), 1);
assertEquals(se2.tagInput.get(), 1);
assertEquals(se3.tagInput.get(), 0);
m.execute();
assertEquals(m.tagState.get(), 3);
assertEquals(m.tagCntRun.get(), 1);
assertEquals(se1.tagInput.get(), 1);
assertEquals(se2.tagInput.get(), 0);
assertEquals(se3.tagInput.get(), 0);
m.execute();
assertEquals(m.tagState.get(), 0);//3
assertEquals(m.tagCntRun.get(), 0);
assertEquals(se1.tagInput.get(), 0);
assertEquals(se2.tagInput.get(), 0);
assertEquals(se3.tagInput.get(), 0);
m.execute();
assertEquals(m.tagState.get(), 0);
assertEquals(m.tagCntRun.get(), 0);
// time step ms
m.setTimeStepMs(1000);
m.tagInput.set(1);
int cntstart = 0;
int cntstop = 0;
System.out.println("starting...");
boolean startsusp = false, stopsusp = false;
long l1 = System.nanoTime(), l2;
while (true) {
m.execute();
if ((cntstart != m.getCntStart()) || (cntstop != m.getCntStop())) {
cntstart = m.getCntStart();
cntstop = m.getCntStop();
l2 = System.nanoTime() - l1;
System.out.println("cntStartStop=" + cntstart + "/" + cntstop + " CntRun=" + m.tagCntRun.getInteger() + " time=" + l2);
checkTime(m, cntstart, cntstop, l2, 0, 2, 0);
checkTime(m, cntstart, cntstop, l2, 1, 2, 1);
checkTime(m, cntstart, cntstop, l2, 2, 2, 2);
checkTime(m, cntstart, cntstop, l2, 3, 2, 5);
checkTime(m, cntstart, cntstop, l2, 4, 2, 6);
checkTime(m, cntstart, cntstop, l2, 4, 1, 7);
checkTime(m, cntstart, cntstop, l2, 4, 0, 10);
checkTime(m, cntstart, cntstop, l2, 4,-1, 11);
}
// susp starting
if (cntstart==2 && cntstop==2 && m.tagInput.getInteger()==1 && !startsusp) {
long sleepsecs = 2;
m.tagSusp.set(1);
System.out.println("susp=1 (sleeping for " + sleepsecs + "s...)");
for (int i=0; i<(sleepsecs*10); i++)
try {
Thread.sleep(100);
m.execute();
} catch (InterruptedException e) { }
m.tagSusp.set(0);
System.out.println("susp=0 (wake up!)");
startsusp = true;
}
// susp stopping
if (cntstart==4 && cntstop==1 && m.tagInput.getInteger()==0 && !stopsusp) {
long sleepsecs = 2;
m.tagSusp.set(1);
System.out.println("susp=1 (sleeping for " + sleepsecs + "s...)");
for (int i=0; i<(sleepsecs*10); i++)
try {
Thread.sleep(100);
m.execute();
} catch (InterruptedException e) { }
m.tagSusp.set(0);
System.out.println("susp=0 (wake up!)");
stopsusp = true;
}
// end of starting
if (cntstart==4 && cntstop==2 && m.tagInput.getInteger()==1) {
m.tagInput.set(0);
System.out.println("stopping...");
}
// end of stopping
if (m.tagState.getInteger()==0) {
System.out.println("end");
break;
}
}
}
private void checkTime(SeqControl m, int cntstart, int cntstop, long l2,
int cnt1, int cnt2, long tm) {
tm = tm * 1000000000;
if (cntstart==cnt1 && cntstop==cnt2) {
assertTrue("too fast", l2 > tm);
assertTrue("too slow", l2 < (tm+500000000));
}
}
}