Beispiel #1
0
        /// <summary>
        /// 关闭COM口
        /// </summary>
        /// <returns></returns>
        public bool DisConnectToCOM()
        {
            if (isCOMRun)
            {
                bool     isportname = true;
                string[] strr       = System.IO.Ports.SerialPort.GetPortNames();
                foreach (string strCom in strr)
                {
                    if (strCom == mSerial.PortName)
                    {
                        if (mSerial.IsOpen)
                        {
                            mSerial.Close();
                        }


                        isportname = false;
                        return(!mSerial.IsOpen);
                    }
                }
                if (isportname)
                {
                    MESSIGEEventArgs eE = new MESSIGEEventArgs();
                    eE.MyMessage = "无" + mSerial.PortName + "端口!";
                    eE.MyType    = MESSIGEEventArgs.MessageType.Error;
                    OnTRIGGERMESSIGE(eE);
                }
            }
            return(!mSerial.IsOpen);
        }
Beispiel #2
0
 /// <summary>
 /// 向COM口发送指令
 /// </summary>
 /// <param name="cmd">需要发送的指令</param>
 public void WriteCOM(byte[] cmd)
 {
     MyOutDataTempList.Clear();
     string[] strr = System.IO.Ports.SerialPort.GetPortNames();
     foreach (string strCom in strr)
     {
         if (strCom == mSerial.PortName)
         {
             try
             {
                 if (mSerial.IsOpen)
                 {
                     mSerial.DiscardOutBuffer(); //清除输出缓冲区
                     mSerial.DiscardInBuffer();  //丢弃来自串行驱动程序的接收缓冲区的数据
                     mSerial.Write(cmd, 0, cmd.Length);
                 }
             }
             catch (Exception eee)
             {
                 MESSIGEEventArgs eE = new MESSIGEEventArgs();
                 eE.MyMessage = eee.ToString();
                 eE.MyType    = MESSIGEEventArgs.MessageType.Error;
                 OnTRIGGERMESSIGE(eE);
             }
         }
     }
 }
Beispiel #3
0
        void ConnnectToCOM(SerialPort sp)
        {
            if (isCOMRun)
            {
                mSerial = new SerialPort();
                mSerial = sp;

                bool     isportname = true;
                string[] strr       = System.IO.Ports.SerialPort.GetPortNames();
                foreach (string strCom in strr)
                {
                    if (strCom == mSerial.PortName)
                    {
                        if (!mSerial.IsOpen)
                        {
                            mSerial.Open();
                        }

                        iStopContTemp         = 0;
                        isportname            = false;
                        mSerial.DataReceived += new SerialDataReceivedEventHandler(m_Serial_DataReceived);
                    }
                }
                if (isportname)
                {
                    MESSIGEEventArgs eE = new MESSIGEEventArgs();
                    eE.MyMessage = "无" + mSerial.PortName + "端口!";
                    eE.MyType    = MESSIGEEventArgs.MessageType.Error;
                    OnTRIGGERMESSIGE(eE);
                }
            }
        }
Beispiel #4
0
        public void Tick()
        {
            if (isCOMRun)
            {
                if (SendBytes == null &&
                    list_bytes.Count == 0 &&
                    list_bytes_First.Count == 0 &&
                    list_bytes_Sixed.Count == 0)
                {
                    return;
                }

                if (iStopContTemp > Off_line_Number)
                {
                    if (isResetTemp)
                    {
                        iCount = 0;
                        DisConnectToCOM();
                        ConnnectToCOM();
                        if (iStopContTemp > Off_line_Number - 2)
                        {
                            iStopContTemp = Off_line_Number - 5;
                        }
                        isRUNing    = false;//PLC掉线
                        isResetTemp = false;
                    }
                    else
                    {
                        if (iStopContTemp == Off_line_Number + 1)
                        {
                            iStopContTemp++;

                            MESSIGEEventArgs eE = new MESSIGEEventArgs();
                            eE.MyData    = SendBytes;
                            eE.MyMessage = mSerial.PortName + " 站号:" + SendBytes[0] + "离线!";
                            eE.MyType    = MESSIGEEventArgs.MessageType.Warning;
                            OnTRIGGERMESSIGE(eE);
                        }
                    }
                }
                else if (iStopContTemp > 0 && iStopContTemp % 10 == 0)
                {
                    if (SendBytes != null)
                    {
                        WriteCOM(SendBytes);
                        iCount = 1;
                    }
                    else
                    {
                        SendData();
                    }
                }

                iStopContTemp++;
            }
        }
Beispiel #5
0
        void m_Serial_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            int n = mSerial.BytesToRead; //先记录下来,避免某种原因,人为的原因,操作几次之间时间长,缓存不一致

            byte[] buf = new byte[n];    //
            mSerial.Read(buf, 0, n);     //读取缓冲数据
            mSerial.DiscardInBuffer();   //清除输入缓冲区

            foreach (byte b in buf)
            {
                MyOutDataTempList.Add(b);
            }

            if (MyOutDataTempList.Count > 2)
            {
                if (CRC16_CHECK(MyOutDataTempList))//CRC校验比对是否成功
                {
                    byte[] byteArray = new byte[MyOutDataTempList.Count];
                    for (int i = 0; i < MyOutDataTempList.Count; i++)
                    {
                        byteArray[i] = MyOutDataTempList[i];
                    }
                    MyOutDataTempList.Clear();

                    String           str = BitConverter.ToString(byteArray, 0).ToUpper();
                    MESSIGEEventArgs eE  = new MESSIGEEventArgs();
                    eE.MyMessage = str;
                    eE.SendData  = SendBytes.Clone() as byte[];
                    eE.MyData    = byteArray;
                    eE.MyType    = MESSIGEEventArgs.MessageType.Data;
                    OnTRIGGERMESSIGE(eE);

                    iCountTemp++;
                    if (!watch.IsRunning)
                    {
                        watch.Start();
                    }
                    if (watch.ElapsedMilliseconds > 1000)
                    {
                        watch.Stop();
                        watch.Reset();
                        watch.Start();
                        iCount     = iCountTemp;
                        iCountTemp = 0;
                    }
                    isRUNing      = true;
                    iStopContTemp = 0;
                    SendBytes     = null;
                    SendData();
                }
            }
        }
Beispiel #6
0
        /// <summary>
        /// 连接COM口设备
        /// </summary>
        /// <returns></returns>
        public bool ConnnectToCOM()
        {
            if (isCOMRun)
            {
                bool     isportname = true;
                string[] strr       = System.IO.Ports.SerialPort.GetPortNames();
                foreach (string strCom in strr)
                {
                    if (strCom == mSerial.PortName)
                    {
                        if (!mSerial.IsOpen)
                        {
                            try
                            {
                                mSerial.Open();
                                mSerial.DiscardInBuffer();  //清除输入缓冲区
                                mSerial.DiscardOutBuffer(); //清除输出缓冲区

                                mSerial.DataReceived += new SerialDataReceivedEventHandler(m_Serial_DataReceived);
                                isportname            = false;
                            }
                            catch
                            {
                                MESSIGEEventArgs eE = new MESSIGEEventArgs();
                                eE.MyMessage = mSerial.PortName + "被占用!";
                                eE.MyType    = MESSIGEEventArgs.MessageType.Error;
                                OnTRIGGERMESSIGE(eE);
                            }
                        }
                        return(mSerial.IsOpen);
                    }

                    if (isportname)
                    {
                        MESSIGEEventArgs eEE = new MESSIGEEventArgs();
                        eEE.MyMessage = "无" + mSerial.PortName + "端口!";
                        eEE.MyType    = MESSIGEEventArgs.MessageType.Error;
                        OnTRIGGERMESSIGE(eEE);
                    }
                }
            }
            return(mSerial.IsOpen);
        }
Beispiel #7
0
        /// <summary>
        /// 初始化COM口
        /// </summary>
        /// <param name="isDebug">COM是否跑线</param>
        /// <param name="PLCiniAddress">COM口的INI地址</param>
        public void Initial(string INIAddress, bool isDebug)
        {
            isCOMRun = !isDebug;
            isRUNing = isDebug;
            try
            {
                if (isCOMRun)
                {
                    SERIALPOETINI mINI = new SERIALPOETINI(INIAddress);

                    if (!mSerial.IsOpen)
                    {
                        mSerial.PortName = mINI.stPort;
                        mSerial.BaudRate = mINI.iRates;
                        mSerial.DataBits = mINI.iDataBits;

                        //奇偶校验位
                        if (mINI.Parity == "Even")
                        {
                            mSerial.Parity = Parity.Even;
                        }
                        if (mINI.Parity == "Mark")
                        {
                            mSerial.Parity = Parity.Mark;
                        }
                        if (mINI.Parity == "None")
                        {
                            mSerial.Parity = Parity.None;
                        }
                        if (mINI.Parity == "Odd")
                        {
                            mSerial.Parity = Parity.Odd;
                        }
                        if (mINI.Parity == "Space")
                        {
                            mSerial.Parity = Parity.Space;
                        }
                        //停止位
                        if (mINI.StopBits == 1)
                        {
                            mSerial.StopBits = StopBits.One;
                        }
                        if (mINI.StopBits == 0)
                        {
                            mSerial.StopBits = StopBits.None;
                        }
                        if (mINI.StopBits == 1.5)
                        {
                            mSerial.StopBits = StopBits.OnePointFive;
                        }
                        if (mINI.StopBits == 2)
                        {
                            mSerial.StopBits = StopBits.Two;
                        }

                        mSerial.ReadTimeout     = 60 * 60 * 1000; //读超时
                        mSerial.WriteTimeout    = 60 * 1000;      //写超时
                        mSerial.ReadBufferSize  = 1024;           //设定读出的缓存区大小
                        mSerial.WriteBufferSize = 512;            //设定写入的缓存区大小

                        //bAddress = (byte)mINI.iPRO;
                    }
                    ConnnectToCOM();
                }
            }
            catch (Exception eee)
            {
                MESSIGEEventArgs eE = new MESSIGEEventArgs();
                eE.MyType    = MESSIGEEventArgs.MessageType.Error;
                eE.MyMessage = eee.ToString();
                OnTRIGGERMESSIGE(eE);
            }
        }
Beispiel #8
0
 // 触发事件的方法
 protected virtual void OnTRIGGERMESSIGE(MESSIGEEventArgs e)
 {
     TRIGGERMESSIGE?.Invoke(this, e);
 }
        private void MSERIALPORT_TRIGGERMESSIGE(object sender, SERIALPORT.MESSIGEEventArgs e)
        {
            switch (e.MyType)
            {
            case SERIALPORT.MESSIGEEventArgs.MessageType.Warning:
                break;

            case SERIALPORT.MESSIGEEventArgs.MessageType.Error:
                break;

            case SERIALPORT.MESSIGEEventArgs.MessageType.Message:
                break;

            case SERIALPORT.MESSIGEEventArgs.MessageType.Data:
                if (e.MyData[0] == PRO)
                {
                    //发出去的寄存器地址
                    string strTemp = "";
                    strTemp = e.SendData[2].ToString("X2") + e.SendData[3].ToString("X2");
                    int          iRegister = Convert.ToInt32(strTemp, 16);
                    RegisterEnum temp      = (RegisterEnum)iRegister;
                    //发出去的功能码
                    string           strFunction = e.SendData[1].ToString("X2");
                    FunctionCodeEnum Function    = (FunctionCodeEnum)Convert.ToInt32(strFunction);

                    int    inumber   = 0;
                    byte[] byteArray = null;
                    if (Function == FunctionCodeEnum.MultipleReads)
                    {
                        try
                        {
                            //抓取数据回来
                            inumber   = e.MyData[2];
                            byteArray = new byte[inumber];
                            for (int i = 0; i < inumber; i++)
                            {
                                byteArray[i] = e.MyData[i + 3];
                            }
                        }
                        catch (Exception ex)
                        {
                            MESSIGEEventArgs ee = new MESSIGEEventArgs();
                            ee.MyType    = MESSIGEEventArgs.MessageType.Error;
                            ee.MyMessage = ex.Message;
                            OnTRIGGERMESSIGE(ee);
                        }
                    }
                    else
                    {
                        return;
                    }

                    switch (temp)
                    {
                    case RegisterEnum.MotorMode:
                        MotorModel = System.Text.Encoding.Default.GetString(byteArray).Replace("\0", "");
                        break;

                    case RegisterEnum.MotorVersionHardware:
                        MotorVersionHardware = System.Text.Encoding.Default.GetString(byteArray).Replace("\0", "");
                        break;

                    case RegisterEnum.MotorVersionSoftware:
                        MotorVersionSoftware = System.Text.Encoding.Default.GetString(byteArray).Replace("\0", "");
                        break;

                    case RegisterEnum.MotorErrorCode:
                        string error = "";
                        foreach (byte by in byteArray)
                        {
                            error += Convert.ToString(by, 2).PadLeft(8, '0');
                        }
                        error = ToMotorError(error);
                        if (error != "")
                        {
                            MESSIGEEventArgs ee = new MESSIGEEventArgs();
                            ee.MyType    = MESSIGEEventArgs.MessageType.Error;
                            ee.MyMessage = error;
                            OnTRIGGERMESSIGE(ee);
                        }
                        break;

                    case RegisterEnum.MotorPositionNow:
                        strTemp = "";
                        if (byteArray.Length == 4)
                        {
                            for (int i = 0; i < byteArray.Length; i++)
                            {
                                strTemp += byteArray[i].ToString("X2");
                            }
                        }
                        MotorPositionNow = Convert.ToInt32(strTemp, 16);
                        break;

                    case RegisterEnum.MotorSpeedNow:
                        strTemp = "";
                        for (int i = 0; i < byteArray.Length; i++)
                        {
                            strTemp += byteArray[i].ToString("X2");
                        }

                        MotorSpeedNow = Convert.ToInt32(strTemp, 16);
                        break;

                    case RegisterEnum.MotorObjectPosition:
                        strTemp = "";
                        for (int i = 0; i < byteArray.Length; i++)
                        {
                            strTemp += byteArray[i].ToString("X2");
                        }

                        iObjectrPosition = Convert.ToInt32(strTemp, 16);
                        break;

                    case RegisterEnum.MotorObjectSpeed:
                        strTemp = "";
                        for (int i = 0; i < byteArray.Length; i++)
                        {
                            strTemp += byteArray[i].ToString("X2");
                        }
                        iObjectSpeed = Convert.ToInt32(strTemp, 16);
                        break;

                    case RegisterEnum.MotorAcceleration:
                        strTemp = "";
                        for (int i = 0; i < byteArray.Length; i++)
                        {
                            strTemp += byteArray[i].ToString("X2");
                        }

                        iAcceleration = Convert.ToInt32(strTemp, 16);
                        break;

                    case RegisterEnum.MotorDeceleration:
                        strTemp = "";
                        for (int i = 0; i < byteArray.Length; i++)
                        {
                            strTemp += byteArray[i].ToString("X2");
                        }

                        iDeceleration = Convert.ToInt32(strTemp, 16);
                        break;

                    case RegisterEnum.MotorQuickStopDeceleration:
                        strTemp = "";
                        for (int i = 0; i < byteArray.Length; i++)
                        {
                            strTemp += byteArray[i].ToString("X2");
                        }

                        iQuickStopDeceleration = Convert.ToInt32(strTemp, 16);
                        break;

                    case RegisterEnum.MotorHomeAddSubtract:
                        strTemp = "";
                        for (int i = 0; i < byteArray.Length; i++)
                        {
                            strTemp += byteArray[i].ToString("X2");
                        }
                        iHomeAddSubtract = Convert.ToInt32(strTemp, 16);
                        break;

                    case RegisterEnum.MotorHomeMechanicsSpeed:
                        strTemp = "";
                        for (int i = 0; i < byteArray.Length; i++)
                        {
                            strTemp += byteArray[i].ToString("X2");
                        }
                        iHomeMechanicsSpeed = Convert.ToInt32(strTemp, 16);
                        break;

                    case RegisterEnum.MotorHomeSpeed:
                        strTemp = "";
                        for (int i = 0; i < byteArray.Length; i++)
                        {
                            strTemp += byteArray[i].ToString("X2");
                        }
                        iHomeSpeed = Convert.ToInt32(strTemp, 16);
                        break;

                    case RegisterEnum.MotorZeroOffset:
                        strTemp = "";
                        for (int i = 0; i < byteArray.Length; i++)
                        {
                            strTemp += byteArray[i].ToString("X2");
                        }
                        iZeroOffset = Convert.ToInt32(strTemp, 16);
                        break;

                    case RegisterEnum.MotorState:
                        strTemp = "";
                        for (int i = 0; i < byteArray.Length; i++)
                        {
                            strTemp += byteArray[i].ToString("X2");
                        }
                        strTemp = Convert.ToString(Convert.ToInt32(strTemp, 16), 2).PadLeft(16, '0');
                        ToMotorState(strTemp);
                        break;
                    }
                }
                break;
            }
        }