// variables to be edited by user double delayInSeconds = 3.0; // can be no more than 16.3 double durationInSeconds = 1.0; // can be no more than 16.3 // variables that should not need to be edited by user // would like to define these variables as final, but this is // not amenable to script which can run multiple times String plcName = "PLogic:E:36"; String propPosition = "PointerPosition"; String propCellType = "EditCellCellType"; String propCellConfig = "EditCellConfig"; String propCellInput1 = "EditCellInput1"; String propCellInput2 = "EditCellInput2"; String propCellInput3 = "EditCellInput3"; String propUpdates = "EditCellUpdateAutomatically"; String propSaveSettings = "SaveCardSettings"; String valNo = "No"; String valDFlop = "1 - D flop"; String valDelay = "15 - delay (NRT)"; String valOneShot = "14 - one shot (NRT)"; String valSaveSettings = "Z - save settings to card (partial)"; int addrAcqFlag = 1; int addrOnceCell = 6; int addrDelayCell = 7; int addrOneShotCell = 9; int addrOutput3 = 35; int addrCameraA = 41; int addrInvert= 64; int addrEdge = 128; int ticsPerSecond = 4000; // turn off updates to speed communication String valUpdatesOriginal = mmc.getProperty(plcName, propUpdates); mmc.setProperty(plcName, propUpdates, valNo); // program cell 6 as a one-time-triggered flop that stays high until reset when acquition starts mmc.setProperty(plcName, propPosition, addrOnceCell); mmc.setProperty(plcName, propCellType, valDFlop); mmc.setProperty(plcName, propCellInput1, addrInvert); // input is logic 1 mmc.setProperty(plcName, propCellInput2, addrCameraA); // clock with CamA mmc.setProperty(plcName, propCellInput3, addrAcqFlag + addrEdge); // reset when acquisition starts // program cell 7 as delay with user-specified value mmc.setProperty(plcName, propPosition, addrDelayCell); mmc.setProperty(plcName, propCellType, valDelay); mmc.setProperty(plcName, propCellConfig, (int)(ticsPerSecond*delayInSeconds)); mmc.setProperty(plcName, propCellInput1, addrOnceCell + addrEdge); // trigrer when other flop goes high mmc.setProperty(plcName, propCellInput2, addrInvert + addrEdge); // clock on every tic mmc.setProperty(plcName, propCellInput3, addrAcqFlag + addrEdge); // reset when acquisition starts // program cell 9 as a one-shot to stay high the user-specified duration mmc.setProperty(plcName, propPosition, addrOneShotCell); mmc.setProperty(plcName, propCellType, valOneShot); mmc.setProperty(plcName, propCellConfig, (int)(ticsPerSecond*durationInSeconds)); mmc.setProperty(plcName, propCellInput1, addrDelayCell); // trigger when delay is finished mmc.setProperty(plcName, propCellInput2, addrInvert + addrEdge); // clock on every tic mmc.setProperty(plcName, propCellInput3, addrAcqFlag + addrEdge); // reset when acquisition starts // output #3 reflects cell 9 mmc.setProperty(plcName, propPosition, addrOutput3); mmc.setProperty(plcName, propCellConfig, addrOneShotCell); // save settings mmc.setProperty(plcName, propSaveSettings, valSaveSettings); // restore updates mmc.setProperty(plcName, propUpdates, valUpdatesOriginal);