// generate a clock signal based on the internal 4kHz clock, e.g. for triggering a camera // currently hard-codes using cells 1 and 2 and BNC output #3 // variables to be edited by user double clockFrequencyHz = 100; // clock frequency in Hertz double clockDutyCycle = 0.5; // should be between 0 and 1 exclusive // 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 propUpdates = "EditCellUpdateAutomatically"; String valNo = "No"; String valOneShotNRT = "14 - one shot (NRT)"; int addrInvert= 64; int addrEdge = 128; double ticsPerSecond = 4000.0; int addrOutputBNC3 = 35; int addrDelayNRT = 1; int addrOneShot = 2; // figure out the cycle period and high period in terms of PLC "tics" (4kHz) int clockPeriodTics = (int) (ticsPerSecond/clockFrequencyHz + 0.5); print("have " + (clockPeriodTics-1) + " (+1) tics in one-shot for actual frequency of " + ticsPerSecond/(clockPeriodTics)); int clockHighTics = (int) (clockPeriodTics * clockDutyCycle); // turn off updates to speed communication String valUpdatesOriginal = mmc.getProperty(plcName, propUpdates); mmc.setProperty(plcName, propUpdates, valNo); // do programming of one-shot and delay cells mmc.setProperty(plcName, propPosition, addrDelayNRT); mmc.setProperty(plcName, propCellType, valOneShotNRT); mmc.setProperty(plcName, propCellConfig, (clockPeriodTics-1)); mmc.setProperty(plcName, propCellInput1, addrInvert + addrEdge); // trigger cell as fast as we can, but NRT prevents re-triggering when active mmc.setProperty(plcName, propCellInput2, addrInvert + addrEdge); // clock on every tic mmc.setProperty(plcName, propPosition, addrOneShot); mmc.setProperty(plcName, propCellType, valOneShotNRT); mmc.setProperty(plcName, propCellConfig, clockHighTics); mmc.setProperty(plcName, propCellInput1, addrDelayNRT); // trigger cell as fast as we can, but NRT prevents re-triggering when active mmc.setProperty(plcName, propCellInput2, addrInvert + addrEdge); // clock on every tic // connect to BNC output mmc.setProperty(plcName, propPosition, addrOutputBNC3); mmc.setProperty(plcName, propCellConfig, addrOneShot); // restore updates mmc.setProperty(plcName, propUpdates, valUpdatesOriginal);