Пример #1
0
        public static byte[] SendWriteChip()
        {
            byte[] data;
            ushort addr;
            ushort len;

            byte[] array;          //data+addr+len
            byte[] Data;           //最终发送的数据

            addr    = 0;
            len     = 8;
            data    = new byte[len];
            data[0] = Module.deadlineOrPermanent;
            data[1] = Module.deadlineYY;
            data[2] = Module.deadlineMM;
            data[3] = Module.deadlineDD;
            data[4] = Module.YY;
            data[5] = Module.MM;
            data[6] = Module.DD;
            data[7] = 1;

            array = ModbusUdp.ArrayAdd(addr, len, data);
            Data  = ModbusUdp.MBReqWriteChip(array);
            return(Data);
        }
Пример #2
0
        /// <summary>
        /// 根据功能码来判断要发送的指令
        /// </summary>
        public static void Send()
        {
            //byte[] data ;
            //ushort addr ;
            //ushort len ;
            //byte[] array;          //data+addr+len
            byte[] Data;             //最终发送的数据

            while (true)
            {
                if (UdpConnect.flagValue == true)  //连接成功标志
                {
                    switch (flagSend)              //发送标志
                    {
                    case 101:
                        Data = ModbusUdp.MBReqMonitor(1);
                        break;

                    case 102:                       //read_ram
                        Data = SendRead();
                        break;

                    //case 103:                  //write_ram
                    // Data = SendWrite(Window1.sliderPositionValue);
                    // break;
                    case 104:                    //read_falsh
                        Data     = SendReadChip();
                        flagSend = 0;
                        break;

                    case 105:                   //write_falsh
                        Data     = SendWriteChip();
                        flagSend = 0;
                        break;

                    case 106:                 //GetId
                        //Data = Mcu.ModbusUdp.MBReqUuid();
                        Data     = SendGetId();
                        flagSend = 0;
                        break;

                    case 107:                //GetTimeCode
                        Data = SendGetTimeCode();
                        break;

                    default:
                        Data = new byte[0];
                        break;
                    }
                    UdpSend.UdpSendData(Data, Data.Length, UdpInit.RemotePoint);
                }
                Thread.Sleep(1000);
            }
        }
Пример #3
0
        /// <summary>
        /// 影片结束发送复位指令
        /// </summary>
        public static void SendZero()
        {
            byte[] data;
            ushort addr;
            ushort len;

            byte[] array;          //data+addr+len
            byte[] Data;           //最终发送的数据

            addr  = 0;
            len   = 10;
            data  = new byte[len];
            array = ModbusUdp.ArrayAdd(addr, len, data);
            Data  = ModbusUdp.MBReqSend_Data(array);
            UdpSendData(Data, Data.Length, UdpInit.RemotePoint);
        }
Пример #4
0
 public static void UdpSendData(byte[] data, int len, EndPoint ip)
 {
     if (UdpInit.mySocket != null)
     {
         try
         {
             UdpInit.mySocket.SendTo(data, len, SocketFlags.None, ip);
             Debug.WriteLine("Send Data{0}", count++);
             Debug.WriteLine(ModbusUdp.ByteToHexStr(data));
         }
         catch (Exception e)
         {
             Module.WriteLogFile(e.Message);
         }
     }
 }
Пример #5
0
        /// <summary>
        /// 发送获取时间码指令
        /// </summary>
        /// <returns></returns>
        public static byte[] SendGetTimeCode()
        {
            byte[] data;
            ushort addr;
            ushort len;

            byte[] array;          //data+addr+len
            byte[] Data;           //最终发送的数据

            addr = 0;
            len  = 4;
            data = new byte[0];

            array = ModbusUdp.ArrayAdd(addr, len, data);
            Data  = ModbusUdp.MBReqGetTimeCode(array);
            return(Data);
        }
Пример #6
0
        public byte[] McuSendRead(ushort addr, ushort len)
        {
            byte[] send_pack = ModbusUdp.MBReqConnect();
            McuSend(send_pack, send_pack.Length);

            //Timeout = 300;
            //while (timeout--)
            //{ //等待应答
            //    if(应答成功)
            //    {
            //        return get_data;
            //    }
            //    sleep(1);
            //}

            return(null);
        }
Пример #7
0
            private void ReceiveHandle()
            {
                //接收数据处理线程
                string msg;

                byte[] data = new byte[1024];
                byte[] RecData;

                while (true)
                {
                    if (mySocket == null || mySocket.Available < 1)
                    {
                        Thread.Sleep(10);
                        continue;
                    }
                    //跨线程调用控件
                    //接收UDP数据报,引用参数RemotePoint获得源地址
                    int rlen = mySocket.ReceiveFrom(data, ref RemotePoint);
                    if (UdpReceiveFun != null)
                    {
                        UdpReceiveFun(data, rlen);
                    }

                    if ((data[0] == 0xff) && (data[1] == 0x00))
                    {
                        UdpConnectCompleteFlag.Value = true;
                    }

                    if (UdpConnectCompleteFlag.Value)
                    {
                        if ((data[0] == 0xff) && (data[1] == 0x01))
                        {
                            MonitorTickAck.Value = data[2];
                            msg = data[2].ToString();
                            Debug.WriteLine(RemotePoint.ToString() + " : " + msg);
                        }
                        RecData = new byte[rlen];
                        Array.Copy(data, 0, RecData, 0, rlen);
                        RecData = ModbusUdp.MBRsp(RecData);
                        if (RecData != null)
                        {
                            Debug.WriteLine(ModbusUdp.ByteToHexStr(RecData));
                        }
                    }
                }
            }
Пример #8
0
        /// <summary>
        /// 影片结束发送复位指令
        /// </summary>
        public static void SendReset()
        {
            byte[] data;
            ushort addr;
            ushort len;

            byte[] array;          //data+addr+len
            byte[] Data;           //最终发送的数据

            addr = 0;
            len  = 10;
            data = new byte[len];
            if ("2DOF".Equals(MainWindow.PlayDOF))
            {
                //两自由度数据
                data[0] = 127;
                data[1] = 127;
                data[2] = 127;
            }
            else
            {
                //三自由度数据
                data[0] = 0;
                data[1] = 0;
                data[2] = 0;
            }
            //复位指令
            if (movieStop == true)
            {
                data[8] = 0;
            }
            else
            {
                data[8] = 1;
            }
            array = ModbusUdp.ArrayAdd(addr, len, data);
            Data  = ModbusUdp.MBReqSend_Data(array);
            UdpSendData(Data, Data.Length, UdpInit.RemotePoint);
        }
Пример #9
0
        private void ReceiveHandle()
        {
            //接收数据处理线程
            byte[] data = new byte[1024];

            while (true)
            {
                if (UdpInit.mySocket == null || UdpInit.mySocket.Available < 1)
                {
                    Thread.Sleep(10);
                    continue;
                }

                //接收UDP数据报,引用参数RemotePoint获得源地址
                try
                {
                    int rlen;
                    //这段代码需要测试
                    if (isMac == false)
                    {
                        rlen = UdpInit.mySocket.ReceiveFrom(data, ref UdpInit.RemotePoint);
                    }
                    else
                    {
                        Thread.Sleep(50);
                        rlen = UdpInit.mySocket.Receive(data);
                    }
                    ReceiveCallback tx = SetReceiveData;
                    tx(rlen, data);
                }
                catch (Exception e)
                {
                    Debug.WriteLine(e);
                    //data = Mcu.ModbusUdp.MBReqConnect();
                    UdpSend.UdpSendData(ModbusUdp.MBReqConnect(), ModbusUdp.MBReqConnect().Length, UdpInit.BroadcastRemotePoint);
                    Debug.WriteLine("Search server");
                }
            }
        }
Пример #10
0
 /// <summary>
 /// 发送获取id指令
 /// </summary>
 /// <returns></returns>
 public static byte[] SendGetId()
 {
     byte[] Data;           //最终发送的数据
     Data = ModbusUdp.MBReqUuid();
     return(Data);
 }
Пример #11
0
        public static void SendWrite(double pos)
        {
            byte[] data;
            ushort addr;
            ushort len;

            byte[] array;          //data+addr+len
            byte[] Data;           //最终发送的数据
            pos = pos * 2400;
            Debug.WriteLine(pos);
            addr = 0;
            len  = 10;
            data = new byte[len];
            int num1 = 3 * (int)(pos / 50);                  //actionFile数组下标
            int num2 = 3 * (int)(pos / 50) + 1;
            int num3 = 3 * (int)(pos / 50) + 2;
            int num4 = 2 * (int)(pos / 50);                  //effectFile数组下标
            int num5 = 2 * (int)(pos / 50) + 1;

            if (num1 - timeCodeTemp > 9 && num1 - timeCodeTemp < 0)
            {
                num1 = timeCodeTemp + 3;
                num2 = timeCodeTemp + 4;
                num3 = timeCodeTemp + 5;
            }
            Debug.WriteLine(num1 + " " + num2 + " " + num3);
            try
            {
                if (num3 > Module.actionFile.Length)
                {
                    if ("2DOF".Equals(MainWindow.PlayDOF))
                    {
                        //两自由度数据
                        data[0] = 127;                      //1号缸
                        data[1] = 127;                      //2号缸
                        data[2] = 127;                      //3号缸
                    }
                    else
                    {
                        //三自由度数据
                        data[0] = 0;                          //1号缸
                        data[1] = 0;                          //2号缸
                        data[2] = 0;                          //3号缸
                    }
                }
                else
                {
                    data[0] = (byte)(Module.actionFile[num1] * MainWindow.PlayHeight / 100);      //1号缸
                    data[1] = (byte)(Module.actionFile[num2] * MainWindow.PlayHeight / 100);      //2号缸
                    data[2] = (byte)(Module.actionFile[num3] * MainWindow.PlayHeight / 100);      //3号缸

                    //data[0] = Module.actionFile[num1];
                    //data[1] = Module.actionFile[num2];
                    //data[2] = Module.actionFile[num3];
                }

                data[3] = 0;                                                    //4号缸
                data[4] = 0;                                                    //5号缸
                data[5] = 0;                                                    //6号缸
                //data[6] = 0;                                                  //保留
                //data[7] = 0;                                                  //保留

                if (Module.shakeFile != null)
                {
                    if (num5 > Module.shakeFile.Length)
                    {
                        data[6] = 0;                                                 //振幅
                        data[7] = 0;                                                 //频率
                    }
                    else
                    {
                        data[6] = Module.shakeFile[num4];
                        data[7] = Module.shakeFile[num5];
                    }
                }

                if (num5 > Module.effectFile.Length)
                {
                    data[8] = 0;                                                 //座椅特效
                    //data[9] = 0;                                               //环境特效
                    data[9] = dataLight;
                }
                else
                {
                    data[8] = Module.effectFile[num5];                          //座椅特效
                    //data[9] = Module.effectFile[num4];                        //环境特效
                    data[9] = (byte)(Module.effectFile[num4] | dataLight);
                }
                Debug.WriteLine((int)(3 * (pos / 50)));
            }
            catch (Exception e)
            {
                Debug.WriteLine(e);
            }

            array = ModbusUdp.ArrayAdd(addr, len, data);
            Data  = ModbusUdp.MBReqSend_Data(array);

            UdpSendData(Data, Data.Length, UdpInit.RemotePoint);
            timeCodeTemp = num1;
        }
Пример #12
0
        public static void SendTotalNew(double pos)
        {
            byte[] data;
            ushort addr;
            ushort len;
            int    dmxLen;

            byte[] array;          //data+addr+len
            byte[] Data;           //最终发送的数据
            switch (MainWindow.PlayFrame)
            {
            case 48:
                pos = pos * 2400;
                break;

            case 60:
                pos = pos * 3000;
                break;

            case 120:
                pos = pos * 6000;
                break;
            }
            //5D模式下默认使用60帧
            //if (MainWindow.PlayType.Equals("5D"))
            //{
            //    pos = pos * 3000;
            //}
            Debug.WriteLine(pos);
            addr = 0;
            len  = 46;
            data = new byte[len];
            int num1 = 3 * (int)(pos / 50);                  //actionFile2DOF与actionFile3DOF数组下标
            int num2 = 3 * (int)(pos / 50) + 1;
            int num3 = 3 * (int)(pos / 50) + 2;

            int numEffect1 = 2 * (int)(pos / 50);                  //effectFile与shakeFile数组下标
            int numEffect2 = 2 * (int)(pos / 50) + 1;

            try
            {
                switch (MainWindow.PlayDOF)
                {
                case "2DOF":
                    if (Module.actionFile2DOF != null)
                    {
                        if (num3 > Module.actionFile2DOF.Length)
                        {
                            data[0] = 127;
                            data[1] = 127;
                            data[2] = 127;
                        }
                        else
                        {
                            data[0] = (byte)(Module.actionFile2DOF[num1] * MainWindow.PlayHeight / 100);          //1号缸
                            data[1] = (byte)(Module.actionFile2DOF[num2] * MainWindow.PlayHeight / 100);          //2号缸
                            data[2] = (byte)(Module.actionFile2DOF[num3] * MainWindow.PlayHeight / 100);          //3号缸
                        }
                    }
                    else
                    {
                        data[0] = 127;
                        data[1] = 127;
                        data[2] = 127;
                    }
                    break;

                case "3DOF":
                    if (Module.actionFile3DOF != null)
                    {
                        if (num3 > Module.actionFile3DOF.Length)
                        {
                            data[0] = 0;
                            data[1] = 0;
                            data[2] = 0;
                        }
                        else
                        {
                            data[0] = (byte)(Module.actionFile3DOF[num1] * MainWindow.PlayHeight / 100);          //1号缸
                            data[1] = (byte)(Module.actionFile3DOF[num2] * MainWindow.PlayHeight / 100);          //2号缸
                            data[2] = (byte)(Module.actionFile3DOF[num3] * MainWindow.PlayHeight / 100);          //3号缸
                        }
                    }
                    break;

                case "6DOF":
                    int num6DOF1 = 6 * (int)(pos / 50);                      //actionFile6DOF数组下标
                    int num6DOF2 = 6 * (int)(pos / 50) + 1;
                    int num6DOF3 = 6 * (int)(pos / 50) + 2;
                    int num6DOF4 = 6 * (int)(pos / 50) + 3;
                    int num6DOF5 = 6 * (int)(pos / 50) + 4;
                    int num6DOF6 = 6 * (int)(pos / 50) + 5;
                    if (Module.actionFile6DOF != null)
                    {
                        if (num6DOF6 > Module.actionFile6DOF.Length)
                        {
                            //六自由度数据
                            data[0] = 0;                          //1号缸
                            data[1] = 0;                          //2号缸
                            data[2] = 0;                          //3号缸
                            data[3] = 0;                          //4号缸
                            data[4] = 0;                          //5号缸
                            data[5] = 0;                          //6号缸
                        }
                        else
                        {
                            data[0] = (byte)(Module.actionFile6DOF[num6DOF1] * MainWindow.PlayHeight / 100);          //1号缸
                            data[1] = (byte)(Module.actionFile6DOF[num6DOF2] * MainWindow.PlayHeight / 100);          //2号缸
                            data[2] = (byte)(Module.actionFile6DOF[num6DOF3] * MainWindow.PlayHeight / 100);          //3号缸
                            data[3] = (byte)(Module.actionFile6DOF[num6DOF4] * MainWindow.PlayHeight / 100);          //4号缸
                            data[4] = (byte)(Module.actionFile6DOF[num6DOF5] * MainWindow.PlayHeight / 100);          //5号缸
                            data[5] = (byte)(Module.actionFile6DOF[num6DOF6] * MainWindow.PlayHeight / 100);          //6号缸
                        }
                    }
                    break;
                }

                if (Module.shakeFile != null)
                {
                    if (numEffect2 > Module.shakeFile.Length)
                    {
                        data[6] = 0;                                                 //振幅
                        data[7] = 0;                                                 //频率
                    }
                    else
                    {
                        data[6] = Module.shakeFile[numEffect1];
                        data[7] = Module.shakeFile[numEffect2];
                    }
                }
                if (Module.effectFile != null)
                {
                    if (numEffect2 > Module.effectFile.Length)
                    {
                        data[8] = 0;
                        data[9] = dataLight;
                    }
                    else
                    {
                        data[8] = Module.effectFile[numEffect2];                         //座椅特效
                        data[9] = (byte)(Module.effectFile[numEffect1] | dataLight);     //环境特效
                    }
                }
            }
            catch (Exception e)
            {
                Debug.WriteLine(e.Message);
            }

            //测试选座
            //if (MainWindow.imageArray.Count == 0)
            //{
            //    data[9] = 0;
            //}
            //else
            //{
            //    data[9] = (byte)MainWindow.imageArray[iii];
            //}
            //iii = iii + 1;
            //if (iii >= MainWindow.imageArray.Count)
            //{
            //    iii = 0;
            //}

            if (Module.dmx512File != null)
            {
                dmxLen = 0;
                byte[] dataDmxLen = new byte[8];
                if (Module.dmx512File.Length != 0)
                {
                    for (int ii = 0; ii < 8; ii++)
                    {
                        dmxLen        += Module.dmx512File[ii];
                        dataDmxLen[ii] = Module.dmx512File[ii];
                    }
                }
                byte[] dataDmx = new byte[dmxLen];
                if (((int)(pos / 50) + 1) * dmxLen < Module.dmx512File.Length)
                {
                    for (int i = 0; i < dmxLen; i++)
                    {
                        dataDmx[i] = (byte)Module.dmx512File[(int)(pos / 50) * dmxLen + i + 8];
                    }
                }
                else
                {
                    dataDmx = new byte[dmxLen];
                }
                dataDmxLen.CopyTo(data, 12);
                dataDmx.CopyTo(data, 20);
            }
            array = ModbusUdp.ArrayAdd(addr, len, data);
            Data  = ModbusUdp.MBReqSend_Data(array);
            UdpSendData(Data, Data.Length, UdpInit.RemotePoint);
        }
Пример #13
0
        private void UdpServerTask()
        {
            //启动一个新的线程,执行方法this.ReceiveHandle,
            //以便在一个独立的进程中执行数据接收的操作
            byte   monitorTick = 0;
            Thread thread      = new Thread(new ThreadStart(this.ReceiveHandle));

            thread.IsBackground = true; //设置为后台线程
            thread.Start();

            //发送UDP数据包
            byte[] data;

            while (true)
            {
                if (flagValue == false)
                {
                    data = ModbusUdp.MBReqConnect();
                    if (MainWindow.PlayMac.Equals("TRUE"))
                    {
                        IPAddress  ip   = IPAddress.Parse(Module.macFile[1]);
                        IPEndPoint ipep = new IPEndPoint(ip, 1030);
                        UdpInit.RemotePoint = (EndPoint)(ipep);
                        isMac = true;
                        //flagValue = true;
                        //UdpSend.flagSend = (byte)ModbusUdp.MBFunctionCode.GetId;
                        UdpSend.UdpSendData(data, data.Length, UdpInit.RemotePoint);
                    }
                    else
                    {
                        UdpSend.UdpSendData(data, data.Length, UdpInit.BroadcastRemotePoint);
                    }
                    Debug.WriteLine("寻找服务器" + data);
                    //Module.WriteLogFile("重新连接");
                }

                else
                {
                    //发送UDP心跳包
                    if (monitorTickRx != monitorTick)
                    {
                        if (monitorTickRx >= 0)
                        {
                            monitorTickTimeOut++;
                        }
                    }

                    if (monitorTickTimeOut == 5)     //计时超过5秒,重新连接
                    {
                        flagValue = false;
                        //取消测试
                        //connectFlag = false;
                        monitorTick        = 0;
                        monitorTickRx      = 0;
                        monitorTickTimeOut = 0;
                        Debug.WriteLine("Connect lose...");
                        Module.WriteLogFile("连接丢失");
                    }

                    if (monitorTick < 0xff)
                    {
                        monitorTick++;
                    }
                    else
                    {
                        monitorTick = 0;
                    }

                    data = ModbusUdp.MBReqMonitor(monitorTick);
                    UdpSend.UdpSendData(data, data.Length, UdpInit.RemotePoint);
                    Debug.WriteLine("Connect monitor...");
                }
                Thread.Sleep(1000);
            }
        }
Пример #14
0
        public void SetReceiveData(int rlen, byte[] data)
        {
            byte[] RecData;
            RecData = new byte[rlen];
            //byte[] realData;
            //realData = new byte[10];
            Array.Copy(data, 0, RecData, 0, rlen);

            if (data[0] == 0xff && data[1] == 0x68 && data[2] == 0 && data[3] == 0x0A)
            {
            }
            //Module.controlCommand = System.Text.Encoding.Default.GetString(RecData);
            //Module.WriteLogFile(Module.controlCommand +"    Len:"+ Module.controlCommand.Length);
            //string str = System.Text.Encoding.ASCII.GetString(RecData);
            Debug.WriteLine(ModbusUdp.ByteToHexStr(RecData));
            //Debug.WriteLine("字符长度为:" + Module.controlCommand.Length);
            if (RecData[0] == 0xff && RecData[1] == 0x6c)
            {
                /*保存时间码信息*/
                //Array.Copy(RecData, 14, realData, 0, 10);
                //try
                //{
                //    string path= @"c:\" + Module.nowTimeStr+".txt";
                //    FileStream fs = new FileStream(path, FileMode.Append);
                //    StreamWriter sw = new StreamWriter(fs);
                //    string pwd = "";
                //    for (int i = 0; i < realData.Length; i++)
                //    {
                //        pwd = pwd + (realData[i].ToString("X").Length < 2 ? "0" + realData[i].ToString("X") : realData [i].ToString("X"));
                //    }
                //    sw.WriteLine(pwd);
                //    sw.Close();
                //}
                //catch (IOException ex)
                //{
                //    Console.WriteLine(ex.Message);
                //    Console.ReadLine();
                //    return;
                //}

                //要发送数据格式
                double hours   = (RecData[6]) * 60 * 60;
                double minutes = (RecData[7]) * 60;
                double seconds = RecData[8];
                double frame   = 0;
                if (MainWindow.PlayFrame == 48)
                {
                    frame = RecData[9] / 24.000;
                }
                else if (MainWindow.PlayFrame == 60)
                {
                    frame = RecData[9] / 30.000;
                }

                //巴克服务器
                //frame = RecData[9] / 60.000;
                //if (isOver39)
                //{
                //    int ii = RecData[9] + 40;
                //    frame = ii / 60.000;
                //    if (ii == 59)
                //    {
                //        isOver39 = false;
                //    }
                //}
                //if (RecData[9] == 39)
                //{
                //    isOver39 = true;
                //}

                // s[i].ToString("X").Length < 2 ? "0" + s[i].ToString("X") : s[i].ToString("X"));
                string strhours   = RecData[6].ToString().Length < 2 ? "0" + RecData[6].ToString() : RecData[6].ToString();
                string strminutes = RecData[7].ToString().Length < 2 ? "0" + RecData[7].ToString() : RecData[7].ToString();
                string strseconds = RecData[8].ToString().Length < 2 ? "0" + RecData[8].ToString() : RecData[8].ToString();
                string strframe   = RecData[9].ToString().Length < 2 ? "0" + RecData[9].ToString() : RecData[9].ToString();

                strTimeCode     = strhours + ":" + strminutes + ":" + strseconds;
                strLongTimeCode = strhours + ":" + strminutes + ":" + strseconds + ":" + strframe;
                TimeCode        = hours + minutes + seconds + frame;
                if (isRegistered == true && isDebug == false && "4DM".Equals(MainWindow.PlayType))
                {
                    //UdpSend.SendWrite(TimeCode);
                    UdpSend.SendTotal(TimeCode);
                }
                //UdpSend.QuDong(TimeCode);               //发送驱动器指令
                //UdpSend.flagSend = (byte)Mcu.ModbusUdp.MBFunctionCode.Write;
            }

            if (RecData[0] == 0xff && RecData[1] == 0x65)        //判断心跳应答
            {
                monitorTickRx = RecData[2];
            }

            if (RecData[0] == 0xff && RecData[1] == 0x6a && RecData[2] == 0)       //判断uuid应答
            {
                uuid = "";
                for (int i = 0; i < RecData[3]; i++)
                {
                    uuid += ((Char)(RecData[i + 4])).ToString();
                }
                Debug.WriteLine("uuid:" + uuid);
                connectFlag = true;
                if (uuid == Module.uuidFile)      //判断uuid是否与初始的一致
                {
                    UdpSend.flagSend = (byte)ModbusUdp.MBFunctionCode.ReadChip;
                }
                //else
                //{
                //  MessageBox.Show ("uuid不正确");
                //}
            }

            if (RecData[0] == 0xff && RecData[1] == 0x68)     //校验日期
            {
                //MessageBox.Show("校验日期");
                //获取储存在芯片的期限时间
                Module.deadlineYY = RecData[7];
                Module.deadlineMM = RecData[8];
                Module.deadlineDD = RecData[9];
                string reyear;
                if (Module.deadlineYY > 9)
                {
                    reyear = "20" + Module.deadlineYY;
                }
                else
                {
                    reyear = "200" + Module.deadlineYY;
                }
                //string reyear = "20" + Module.deadlineYY;
                if (Module.deadlineMM > 31)
                {
                    Module.deadlineMM = 1;
                }
                string remonth = Module.deadlineMM.ToString();
                if (Module.deadlineDD > 31)
                {
                    Module.deadlineDD = 1;
                }
                string reday  = Module.deadlineDD.ToString();
                string redate = reyear + "-" + remonth + "-" + reday;
                valDate = redate;
                //获取储存在芯片的当前时间
                string yearWrite;
                if (RecData[10] > 9)
                {
                    yearWrite = "20" + RecData[10];
                }
                else
                {
                    yearWrite = "200" + RecData[10];
                }

                string monthWrite = RecData[11].ToString();
                string dayWrite   = RecData[12].ToString();
                string dateWrite  = yearWrite + "-" + monthWrite + "-" + dayWrite;

                //获取当前电脑的系统时间
                DateTime dateNow = Convert.ToDateTime(DateTime.Now.ToShortDateString());

                DateTime getDate, getDateWrite;
                try
                {
                    getDate      = Convert.ToDateTime(redate);
                    getDateWrite = Convert.ToDateTime(dateWrite);
                }
                catch (Exception e)
                {
                    Debug.WriteLine(e);
                    getDate      = Convert.ToDateTime(DateTime.Now.ToShortDateString());
                    getDateWrite = Convert.ToDateTime(DateTime.Now.ToShortDateString());
                }

                TimeSpan ts  = getDate - dateNow;
                TimeSpan ts1 = dateNow - getDateWrite;

                int getday      = ts.Days;           //到期时间跟电脑时间对比
                int contractDay = ts1.Days;          //写进芯片的当前时间跟现在电脑时间对比

                if (getday < 0 || contractDay < 0)
                {
                    //isRegistered = false;
                    Module.deadlineYY = 0;
                    Module.deadlineMM = 1;
                    Module.deadlineDD = 1;
                    UdpSend.flagSend  = (byte)ModbusUdp.MBFunctionCode.WriteChip;
                }
                else
                {
                    isRegistered     = true;
                    UdpSend.flagSend = (byte)ModbusUdp.MBFunctionCode.WriteChip;
                    switch (getday)
                    {
                    case 9:
                        //MessageBox.Show("提示:使用期限还有10天");
                        Module.hintShow    = true;
                        Module.deadlineDay = 10;
                        break;

                    case 5:
                        //MessageBox.Show("提示:使用期限还有6天");
                        Module.hintShow    = true;
                        Module.deadlineDay = 5;
                        break;

                    case 2:
                        // MessageBox.Show("提示:使用期限还有3天");
                        Module.hintShow    = true;
                        Module.deadlineDay = 3;
                        break;

                    case 1:
                        // MessageBox.Show("提示:使用期限还有2天");
                        Module.hintShow    = true;
                        Module.deadlineDay = 2;
                        break;

                    case 0:
                        Module.hintShow    = true;
                        Module.deadlineDay = 1;
                        //MessageBox.Show("提示:使用期限还有1天");
                        break;

                    default:
                        break;
                    }
                    //判断日期结束发送复位数据(两自由度)
                    //if (clickRegisterFlag == false)
                    //{
                    //    UdpSend.SendReset();
                    //}
                }
            }  //校验日期结尾


            RecData = ModbusUdp.MBRsp(RecData);
            Debug.WriteLine(ModbusUdp.ByteToHexStr(RecData));
            if (RecData != null)
            {
                if (RecData[0] == 0 && RecData[1] == 0 && RecData[2] == 0x01 && RecData[3] == 0x41)
                {
                    IPEndPoint i  = (IPEndPoint)(UdpInit.RemotePoint);
                    string     s2 = UdpInit.RemotePoint.ToString();
                    string     ss = i.Address.ToString();
                    string     s1 = GetMacAddress(ss);
                    //Debug.WriteLine(s1);
                    if (MainWindow.PlayMac.Equals("TRUE"))
                    {
                        if (s1.Equals(Module.macFile[0]))
                        {
                            IPAddress  ip   = IPAddress.Parse(Module.macFile[1]);
                            IPEndPoint ipep = new IPEndPoint(ip, 1031);
                            UdpInit.RemotePoint = (EndPoint)(ipep);
                            flagValue           = true;
                            //要发送数据格式
                            UdpSend.flagSend = (byte)ModbusUdp.MBFunctionCode.GetId;
                        }
                    }
                    else
                    {
                        //File.WriteAllText(Directory.GetCurrentDirectory() + @"\shuqeeMac.bin", s1);
                        StreamWriter sw = new StreamWriter(Directory.GetCurrentDirectory() + @"\shuqeeMac.bin", false, System.Text.Encoding.Default);
                        sw.WriteLine(s1);
                        sw.WriteLine(ss);
                        sw.Close();
                        flagValue = true;
                        //要发送数据格式
                        UdpSend.flagSend = (byte)ModbusUdp.MBFunctionCode.GetId;
                    }
                }

                if (RecData[0] == 0 && RecData[1] == 0xff && RecData[2] == 0 && RecData[3] == 0x1)
                {
                    while (true)
                    {
                        byte[] Data = new byte[8];
                        Data[0] = 0xff;
                        Data[1] = 0x64;
                        Data[2] = 0x00;
                        Data[3] = 0x00;
                        Data[4] = 0x01;
                        Data[5] = 0xc8;
                        Data[6] = 0x65;
                        Data[7] = 0xda;
                        UdpSend.UdpSendData(Data, Data.Length, UdpInit.BroadcastRemotePoint);
                        Thread.Sleep(1000);
                    }
                }
            }
        }
Пример #15
0
 //MCU数据发送函数
 public void McuSendConnect()
 {
     byte[] send_pack = ModbusUdp.MBReqConnect();
     McuSend(send_pack, send_pack.Length);
 }
Пример #16
0
            private void UdpServerTask()
            {
                byte MonitorTick = 0;

                IPAddress ip;
                int       port;

                //得到本机IP,设置UDP端口号
                IPAddress.TryParse(GetLocalIP(), out ip);
                port         = 0; //自动分配端口
                ipLocalPoint = new IPEndPoint(ip, port);

                //定义网络类型,数据连接类型和网络协议UDP
                mySocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);

                //绑定网络地址
                try
                {
                    mySocket.Bind(ipLocalPoint);
                }
                catch
                {
                    MessageBox.Show("网络端口被占用");
                    //System.Environment.Exit(0);
                }

                //设置广播地址
                ip   = IPAddress.Broadcast;
                port = 1030;
                IPEndPoint ipep = new IPEndPoint(ip, port);
                EndPoint   BroadcastRemotePoint = (EndPoint)(ipep);

                //设置客户机IP,默认为广播地址
                RemotePoint = (EndPoint)(ipep);

                //允许广播
                mySocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Broadcast, 1);

                //启动一个新的线程,执行方法this.ReceiveHandle,
                //以便在一个独立的进程中执行数据接收的操作

                Thread thread = new Thread(new ThreadStart(this.ReceiveHandle));

                thread.IsBackground = true; //设置为后台线程
                thread.Start();

                //发送UDP数据包
                byte[] data;

                while (true)
                {
                    if (!UdpConnectCompleteFlag.Value)
                    {
                        data = ModbusUdp.MBReqConnect();
                        mySocket.SendTo(data, data.Length, SocketFlags.None, BroadcastRemotePoint);
                        Debug.WriteLine("Search udp server...");
                    }
                    else
                    {
                        if (MonitorTickAck.Value != MonitorTick)
                        {
                            if (MonitorTickTimeout.Value > 0)
                            {
                                MonitorTickTimeout.Value--;
                            }
                        }
                        else
                        {
                            MonitorTickTimeout.Value = MonitorTickTimeoutValue;
                        }

                        if (MonitorTickTimeout.Value == 0)
                        {
                            UdpConnectCompleteFlag.Value = false;
                            MonitorTick              = 0;
                            MonitorTickAck.Value     = 0;
                            MonitorTickTimeout.Value = MonitorTickTimeoutValue;
                            Debug.WriteLine("Connect lose...");
                            continue;
                        }
                        else
                        {
                            //发送UDP心跳包
                            if (MonitorTick < 0xff)
                            {
                                MonitorTick++;
                            }
                            else
                            {
                                MonitorTick = 0;
                            }
                            data = ModbusUdp.MBReqMonitor(MonitorTick);
                            mySocket.SendTo(data, data.Length, SocketFlags.None, RemotePoint);
                            Debug.WriteLine("Connect monitor...");
                        }
                    }
                    Thread.Sleep(1000);
                }
            }