//

    private void DoDiTask(int id)
    {
        if (DiCntMdStp >= 99)
        {
            ResStr01 = "Failed";
            ProcessView(new ListViewData()
            {
                Ch     = Ref_IO_Mod.Ch,
                Step   = DiCntMdStp.ToString(),
                Result = ResStr01
            });
            FailCnt++;
            DiCntMdStp = 0;
            mainTaskStp++;
        }
        else if (DiCntMdStp > 8 && DiCntMdStp < 99)
        {
            ResStr01 = "Passed"; mainTaskStp++;
            Thread.Sleep(50);
            ProcessView(new ListViewData()
            {
                Ch = Ref_IO_Mod.Ch, Step = ProcessStep, Result = ResStr01
            });
            DiCntMdStp = 0;
        }
        else if (DiCntMdStp == 8) //判斷cnt start Modbus status =0(0x33)
        {
            GetDeviceItems(id);
            if (!ReadDiCntStart(di_id_offset + Ref_IO_Mod.Ch))
            {
                DiCntMdStp++;
            }
            else
            {
                DiCntMdStp = 99;
            }
        }
        else if (DiCntMdStp == 7) //cnt start =0(stop), (0x33)
        {
            GetDeviceItems(id);
            ProcessView(new ListViewData()
            {
                Ch      = Ref_IO_Mod.Ch,
                Step    = DiCntMdStp.ToString(),
                RowData = "Set cnt to Stop  "
            });
            SetDiCntStart(0);
            DiCntMdStp++;
        }

        else if (DiCntMdStp == 6) //判斷Cnt val Modbus status =0 (4x01)
        {
            GetDeviceItems(id);
            ProcessView(new ListViewData()
            {
                Ch      = Ref_IO_Mod.Ch,
                Step    = DiCntMdStp.ToString(),
                RowData = "Check Mds cnt val = 0"
            });

            //add ascii cmd
            bool chkAscii = CheckAsciicmd(di_id_offset + Ref_IO_Mod.Ch, "0");
            if (ReadCntVal(di_id_offset + Ref_IO_Mod.Ch) == 0 && chkAscii)
            {
                DiCntMdStp++;
            }
            else
            {
                DiCntMdStp = 99;
            }
        }
        else if (DiCntMdStp == 5) //clear cnt=1(0x34)
        {
            ClrDiCntVal();
            ProcessView(new ListViewData()
            {
                Ch      = Ref_IO_Mod.Ch,
                Step    = DiCntMdStp.ToString(),
                RowData = "Clear Mds 0x val  "
            });
            //getTxtbox[0].Text = IOitem.Val.ToString();
            DiCntMdStp++;
        }
        else if (DiCntMdStp == 4)//判斷 Cnt val Modbus status =10 (4x01)
        {
            GetDeviceItems(id);
            ProcessView(new ListViewData()
            {
                Ch      = Ref_IO_Mod.Ch,
                Step    = DiCntMdStp.ToString(),
                RowData = "Check Mds cnt val =10"
            });
            MBData01 = ReadCntVal(di_id_offset + Ref_IO_Mod.Ch).ToString();
            //add ascii cmd
            bool chkAscii = CheckAsciicmd(di_id_offset + Ref_IO_Mod.Ch, "A");
            if (ReadCntVal(di_id_offset + Ref_IO_Mod.Ch) >= 10 && chkAscii)
            {
                DiCntMdStp++;
            }
            else
            {
                DiCntMdStp = 99;
            }
        }

        else if (DiCntMdStp == 3)//out apax5070 DO to H for 10 times
        {
            ProcessView(new ListViewData()
            {
                Ch      = Ref_IO_Mod.Ch,
                Step    = DiCntMdStp.ToString(),
                RowData = "Out5070 DO from H to L for 10 times"
            });
            for (int i = 0; i < 10; i++)
            {
                OutData01 = OutputDO(1);
                Thread.Sleep(10);
                GetDeviceItems(id);
                getTxtbox[0].Text = IOitem.Val.ToString();
                OutData01         = OutputDO(0);
                Thread.Sleep(10);
            }
            GetDeviceItems(id);
            getTxtbox[0].Text = IOitem.Val.ToString();
            DiCntMdStp++;
        }
        else if (DiCntMdStp == 2)//判斷cnt start Modbus status =1(0x33)
        {
            if (ReadDiCntStart(di_id_offset + Ref_IO_Mod.Ch))
            {
                DiCntMdStp++;
            }
            else
            {
                DiCntMdStp = 99;
            }
        }
        else if (DiCntMdStp == 1)//切換到cnt mode, chk cnt=0 cntotherwise break
        {
            GetDeviceItems(id);
            //md 0=DI, md 1=counter, md 2=L to H ,md 3=H to L, md 4=f
            IOitem.Md = 1; //Cnt mode
            if (Device.ModuleType == "Adam6052")
            {
                IOitem.Inv = 0;                                  //only 6052 different
            }
            else
            {
                IOitem.Inv = 1;  //enable inverse
            }
            ADAM6KReqService.UpdateIOConfig(IOitem);
            if (ReadClrCntVal(di_id_offset + Ref_IO_Mod.Ch))
            {
                SetDiCntStart(1);
                DiCntMdStp++;
            }
            else
            {
                DiCntMdStp = 99;
            }
        }
        else if (DiCntMdStp == 0)//initial, clr cnt value, stop cnt, DO to L
        {
            ResStr01
                = MBData01 = "";
            ClrDiCntVal();
            SetDiCntStart(0);        //set cnt to Stop
            OutData01 = OutputDO(0); //initail APAX Do out 0
            DiCntMdStp++;
        }
    }
    //

    private void DoDiTask(int id)
    {
        if (DiCntMdStp >= 99)
        {
            ResStr01 = "Failed";
            ProcessView(new ListViewData()
            {
                Ch     = Ref_IO_Mod.Ch,
                Step   = DiCntMdStp.ToString(),
                Result = ResStr01
            });
            FailCnt++;
            s1.Abort();
            DiCntMdStp = 0;
            mainTaskStp++;
        }
        else if (DiCntMdStp > 3 && DiCntMdStp < 99)
        {
            ResStr01 = "Passed"; mainTaskStp++;
            s1.Abort();
            Thread.Sleep(50);
            OutputDO(0); //initail APAX Do out 0
            ProcessView(new ListViewData()
            {
                Ch = Ref_IO_Mod.Ch, Step = ProcessStep, Result = ResStr01
            });
            DiCntMdStp = 0;
        }

        else if (DiCntMdStp == 3)//判斷Fq val Modbus status >=99 (4x01) 約99/10=9.9hz up
        {
            Thread.Sleep(200);
            MBData01 = ReadFreqVal(di_id_offset + Ref_IO_Mod.Ch).ToString();
            ProcessView(new ListViewData()
            {
                Ch      = Ref_IO_Mod.Ch,
                Step    = DiCntMdStp.ToString(),
                RowData = "Check Mds equal 10hz , read 4x = " + MBData01
            });
            //GetDeviceItems(id);
            //getTxtbox[0].Text = IOitem.Val.ToString();
            if (ReadFreqVal(di_id_offset + Ref_IO_Mod.Ch) >= 99)
            {
                DiCntMdStp++;
            }
            else
            {
                DiCntMdStp = 99;
            }
        }
        else if (DiCntMdStp == 2)//Out APAX5070 DO High Low =10hz(delay 40ms)
        {
            ProcessView(new ListViewData()
            {
                Ch      = Ref_IO_Mod.Ch,
                Step    = DiCntMdStp.ToString(),
                RowData = "Out5070 DO from H to L for 10hz"
            });
            s1 = new Thread(FrqOut);
            s1.Start();
            DiCntMdStp++;
        }
        else if (DiCntMdStp == 1)//切換到Fq mode, chk cnt/fq =0 cntotherwise break
        {
            GetDeviceItems(id);
            //md 0=DI, md 1=counter, md 2=L to H ,md 3=H to L, md 4=f
            IOitem.Md = 4; //Fq mode
            ADAM6KReqService.UpdateIOConfig(IOitem);
            if (ReadClrCntVal(di_id_offset + Ref_IO_Mod.Ch))
            {
                DiCntMdStp++;
            }
            else
            {
                DiCntMdStp = 99;
            }
        }
        else if (DiCntMdStp == 0)//initial, clr cnt value, stop cnt, DO to L
        {
            ResStr01
                = MBData01 = "";
            ClrDiCntVal();
            SetDiCntStart(0); //set cnt to Stop
            //OutData01 = OutputDO(0); //initail APAX Do out 0
            OutputDO(0);      //initail APAX Do out 0
            DiCntMdStp++;
        }
    }