public CCTimer(ITagOp tagOp, string tagName, string outTagName, int onLast = 1000, string offOutTagName = "", int offLast = 1000) : base(tagName) { TagOp = tagOp; OnLastMs = onLast; OffLastMs = offLast; Func <bool?> check = () => { if (tagOp != null) { return(tagOp.ReadBit(tagName)); } else { return(null); } }; Name = $"{tagName}-{outTagName}:{onLast}-{offOutTagName}:{offLast}"; CheckFunc = check; OnLastMs = onLast; OffLastMs = offLast; ThreadStart = new ControlledThreadStart(RunCheck); ThreadController = new ThreadController(ThreadStart, null, Name); StartThread(); OutTag = outTagName; OffOutTag = offOutTagName; OutChanged += Task_OutChanged; OffOutChanged += Task_OffOutChanged; }