Esempio n. 1
0
        void ReceiveMsg()
        {
            while (true)
            {
                loop_cnt_test++;
                //if ((DateTime.Now - ModbusCmdTime).Seconds > 2)
                //  ModbusMaster.Reset();
                try
                {
                    //byte[] buffer = new byte[1024 * 1024];
                    //int n = socketControl.Available;
                    if (socketControl.Available > 0)
                    {
                        byte[] buffer = new byte[1];
                        socketControl.Receive(buffer, 1, 0);
                        ModbusRespeonseResult responseResult = ModbusMaster.Response(buffer);

                        ReciveHandler(buffer, responseResult);
                    }
                }
                catch (ThreadAbortException ex)
                {
                    toolStripStatusLabel1.Text = "";
                    MessageBox.Show("成功终止监听进程");
                }
                catch (Exception ex)
                {
                    MessageBox.Show("错误\r\n\r\n" + ex.Message);
                    //th.Join(); 
                    break;
                }
            }
        }
Esempio n. 2
0
        private void timerSerialPort_Tick(object sender, EventArgs e)
        {
            if (this.CommClosing) //如果正在关闭,忽略操作,直接返回,尽快的完成串口监听线程的一次循环
            {
                return;           //【防止关闭串口时卡死在close()时用到】
            }
            try
            {
                this.CommListening = true;//设置标记,说明我已经开始处理数据,一会儿要使用系统UI的。

                if (comm.BytesToRead > 0)
                {
                    byte[] buffer = new byte[comm.BytesToRead];
                    comm.Read(buffer, 0, comm.BytesToRead);
                    ModbusRespeonseResult responseResult = ModbusMaster.Response(buffer);

                    ReciveHandler(buffer, responseResult);
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("接受数据处理程序异常\r\n\r\n" + ex.ToString());
            }
            finally
            { this.CommListening = false; }
        }
            public ModbusRespeonseResult Response(byte[] buf)
            {
                ModbusRespeonseResult result = ModbusRespeonseResult.None;

                for (int i = 0; i < buf.Length; i++)
                {
                    PortBufQueue.Enqueue(buf[i]);
                }

                recieved = false;
                if (CmdRecord.Enable)
                {
                    if (PortBufQueue.Count < 3)
                    {
                        return(ModbusRespeonseResult.None);
                    }
                    if (PortBufQueue.Dequeue() != this.deviceAddress)  //设备地址
                    {
                        return(ModbusRespeonseResult.None);
                    }
                    byte tmp_cmd = PortBufQueue.Dequeue();
                    if (tmp_cmd != CmdRecord.FunctionCode)  //功能码
                    {
                        return(ModbusRespeonseResult.FunctionCodeError);
                    }

                    switch (tmp_cmd)
                    {
                    case 03:
                    case 04:
                        int len = PortBufQueue.Dequeue();
                        if ((CmdRecord.Length << 1) != len)      //字节长度
                        {
                            return(ModbusRespeonseResult.LenghInconsisten);
                        }
                        CMD_LastLoop = tmp_cmd;

                        break;

                    case 05:
                        CMD_LastLoop = tmp_cmd;
                        break;

                    case 16:
                        CMD_LastLoop = tmp_cmd;
                        break;

                    default:
                        break;
                    }

                    CmdRecord.Enable = false;
                }

                if (CMD_LastLoop != 0xff)
                {
                    byte[] bytetmp = new byte[2];
                    switch (CMD_LastLoop)
                    {
                    case 03:
                    case 04:
                        if (PortBufQueue.Count < (CmdRecord.Length << 1))
                        {
                            return(ModbusRespeonseResult.None);
                        }

                        recieved = true;
                        ushort[] buffer = new ushort[CmdRecord.Length];

                        ushort tmp;
                        for (int i = 0; i < buffer.Length; i++)
                        {
                            bytetmp[0] = PortBufQueue.Dequeue();
                            bytetmp[1] = PortBufQueue.Dequeue();
                            tmp        = BitConverter.ToUInt16(bytetmp, 0);
                            buffer[i]  = (ushort)IPAddress.NetworkToHostOrder((short)tmp);
                        }
                        this.Buffer.Clear();
                        this.Buffer.AddRange(buffer);
                        recieved = true;

                        result       = ModbusRespeonseResult.Recieved;
                        CMD_LastLoop = 0xff;

                        break;

                    case 05:
                        if (4 > PortBufQueue.Count)
                        {
                            return(ModbusRespeonseResult.None);
                        }

                        bytetmp[0] = PortBufQueue.Dequeue();
                        bytetmp[1] = PortBufQueue.Dequeue();
                        tmp        = BitConverter.ToUInt16(bytetmp, 0);
                        tmp        = (ushort)IPAddress.NetworkToHostOrder((short)tmp);
                        if (tmp != CmdRecord.Address)
                        {
                            return(ModbusRespeonseResult.RegisterAddressError);
                        }

                        bytetmp[0] = PortBufQueue.Dequeue();
                        bytetmp[1] = PortBufQueue.Dequeue();
                        tmp        = BitConverter.ToUInt16(bytetmp, 0);
                        tmp        = (ushort)IPAddress.NetworkToHostOrder((short)tmp);
                        if (tmp != CmdRecord.WriteValue[0])
                        {
                            return(ModbusRespeonseResult.DataWritenError);
                        }


                        result       = ModbusRespeonseResult.Recieved;
                        CMD_LastLoop = 0xff;
                        break;

                    case 06:

                        tmp = BitConverter.ToUInt16(PortBuf, 2);     //Register Address
                        tmp = (ushort)IPAddress.NetworkToHostOrder((short)tmp);
                        if (tmp != CmdRecord.Address - 40000)
                        {
                            return(ModbusRespeonseResult.RegisterAddressError);
                        }

                        tmp = BitConverter.ToUInt16(PortBuf, 4);     //Register Value
                        tmp = (ushort)IPAddress.NetworkToHostOrder((short)tmp);
                        if (tmp != CmdRecord.WriteValue[0])
                        {
                            return(ModbusRespeonseResult.DataWritenError);
                        }

                        result = ModbusRespeonseResult.Writen;

                        break;

                    case 16:
                        if (PortBufQueue.Count < 4)
                        {
                            return(ModbusRespeonseResult.None);
                        }

                        CMD_LastLoop = 0xff;

                        bytetmp[0] = PortBufQueue.Dequeue();
                        bytetmp[1] = PortBufQueue.Dequeue();
                        tmp        = BitConverter.ToUInt16(bytetmp, 0); //Register Address
                        tmp        = (ushort)IPAddress.NetworkToHostOrder((short)tmp);
                        if (tmp != CmdRecord.Address - 4000)
                        {
                            result = ModbusRespeonseResult.RegisterAddressError;
                        }

                        bytetmp[0] = PortBufQueue.Dequeue();
                        bytetmp[1] = PortBufQueue.Dequeue();
                        tmp        = BitConverter.ToUInt16(bytetmp, 0); //Register Address
                        tmp        = (ushort)IPAddress.NetworkToHostOrder((short)tmp);
                        if (tmp != CmdRecord.Length)
                        {
                            result = ModbusRespeonseResult.LenghInconsisten;
                        }

                        result = ModbusRespeonseResult.Writen;

                        break;

                    default:
                        result = ModbusRespeonseResult.FunctionCodeError;
                        break;
                    }
                }

                return(result);
            }
            public ModbusRespeonseResult Response()
            {
                ModbusRespeonseResult result = ModbusRespeonseResult.None;

                this.PortBufcount = this.Port.BytesToRead;
                this.PortBuf      = new byte[this.PortBufcount];
                Port.Read(PortBuf, 0, PortBufcount);

                recieved = false;
                if (CmdRecord.Enable)
                {
                    if (PortBuf.Length < 3)
                    {
                        return(ModbusRespeonseResult.None);
                    }
                    if (PortBuf[0] != this.deviceAddress)  //设备地址
                    {
                        return(ModbusRespeonseResult.None);
                    }
                    if (PortBuf[1] != CmdRecord.FunctionCode)  //功能码
                    {
                        return(ModbusRespeonseResult.FunctionCodeError);
                    }
                    switch (PortBuf[1])
                    {
                    case 03:
                    case 04:
                        int len = PortBuf[2];
                        if ((CmdRecord.Length << 1) != len)      //字节长度
                        {
                            return(ModbusRespeonseResult.LenghInconsisten);
                        }
                        if (len + 3 > PortBuf.Length)
                        {
                            return(ModbusRespeonseResult.LengthError);
                        }
                        recieved = true;
                        ushort[] buffer = new ushort[len >> 1];
                        ushort   tmp;
                        for (int i = 0; i < buffer.Length; i++)
                        {
                            tmp       = BitConverter.ToUInt16(PortBuf, 3 + i * 2);
                            buffer[i] = (ushort)IPAddress.NetworkToHostOrder((short)tmp);
                        }
                        this.Buffer.Clear();
                        this.Buffer.AddRange(buffer);
                        recieved = true;
                        result   = ModbusRespeonseResult.Recieved;
                        break;

                    case 06:
                        tmp = BitConverter.ToUInt16(PortBuf, 2);     //Register Address
                        tmp = (ushort)IPAddress.NetworkToHostOrder((short)tmp);
                        if (tmp != CmdRecord.Address)
                        {
                            return(ModbusRespeonseResult.RegisterAddressError);
                        }

                        tmp = BitConverter.ToUInt16(PortBuf, 4);     //Register Value
                        tmp = (ushort)IPAddress.NetworkToHostOrder((short)tmp);
                        if (tmp != CmdRecord.WriteValue[0])
                        {
                            return(ModbusRespeonseResult.DataWritenError);
                        }

                        result = ModbusRespeonseResult.Writen;

                        break;

                    default:
                        result = ModbusRespeonseResult.FunctionCodeError;
                        break;
                    }

                    CmdRecord.Enable = false;
                }

                return(result);
            }
Esempio n. 5
0
        void ReciveHandler(byte[] buffer, ModbusRespeonseResult responseResult)
        {
            //因为要访问ui资源,所以需要使用invoke方式同步ui。
            this.Invoke((EventHandler)(delegate
            {
                builder.Clear();
                //判断是否是显示为16禁止

                /*if (checkBoxHexViewR.Checked)
                 * {
                 *  //依次的拼接出16进制字符串
                 *  foreach (byte b in comt_buf)
                 *  {
                 *      builder.Append(b.ToString("X2") + " ");
                 *  }
                 * }
                 * else
                 * {
                 *  builder.Append(Encoding.ASCII.GetString(comt_buf));//直接按ASCII规则转换成字符串
                 * }*/
                builder.Append(buffer[0].ToString("X2") + " ");
                //依次的拼接出16进制字符串
                //foreach (byte b in buffer)
                //{
                //builder.Append(b.ToString("X2") + " ");
                //}
                //追加的形式添加到文本框末端,并滚动到最后。
                this.textBoxRec.AppendText(builder.ToString());
                builder.Clear();
                //修改接收计数
                RecCnt += 1;
                this.labelRecCnt.Text = RecCnt.ToString();

                //string s2 = Encoding.UTF8.GetString(buffer, 0, 1);
                //ShowMsg(s2);


                if (responseResult == ModbusRespeonseResult.Recieved)
                {
                    if ((ModbusMaster.CmdRecord.Address >= RelayConfig.RegHeadAddress) &&
                        (ModbusMaster.CmdRecord.Address <= RelayConfig.RegTailAddress))
                    {
                        if (formRelayConfiguration != null)
                        {
                            if (!formRelayConfiguration.IsDisposed)
                            {
                                formRelayConfiguration.ShowRelayData(ModbusMaster.CmdRecord.Address, ModbusMaster.Buffer.ToArray());
                            }
                        }
                    }
                    else if ((ModbusMaster.CmdRecord.Address >= RelayConfig.CeilHeadAddress) &&
                             (ModbusMaster.CmdRecord.Address <= RelayConfig.CeilTailAddress))
                    {
                        if (formRelayConfiguration != null)
                        {
                            if (!formRelayConfiguration.IsDisposed)
                            {
                                formRelayConfiguration.buttonRead_Click(formRelayConfiguration.buttonRead, new EventArgs());
                            }
                        }
                    }
                    else if ((ModbusMaster.CmdRecord.Address >= SensorConfig.RWHeadAddress) &&
                             (ModbusMaster.CmdRecord.Address <= SensorConfig.RWTailAddress))
                    {
                        if (formSensorConfiguration != null)
                        {
                            if (!formSensorConfiguration.IsDisposed)
                            {
                                formSensorConfiguration.ShowSensorRWdata(ModbusMaster.CmdRecord.Address, ModbusMaster.Buffer.ToArray());
                            }
                        }
                    }
                    else if ((ModbusMaster.CmdRecord.Address >= SensorConfig.ROHeadAddress) &&
                             (ModbusMaster.CmdRecord.Address <= SensorConfig.ROTailAddress))
                    {
                        if (formSensorConfiguration != null)
                        {
                            if (!formSensorConfiguration.IsDisposed)
                            {
                                formSensorConfiguration.ShowSensorROdata(ModbusMaster.Buffer.ToArray());
                            }
                        }
                    }
                    else if ((ModbusMaster.CmdRecord.Address >= SystemConfig.HeadAddress) &&
                             (ModbusMaster.CmdRecord.Address <= SystemConfig.TailAddress))
                    {
                        SystemConfig1.SetValue(ModbusMaster.Buffer.ToArray());

                        this.textBoxAddressACU.Text = SystemConfig1.AddressACU.ToString();
                        this.textBoxSensorTotalNum.Text = SystemConfig1.SensorTotalNum.ToString();
                        this.comboBoxWorkMode.SelectedIndex = SystemConfig1.WorkMode;
                        this.textBoxUpLoadPeriod.Text = SystemConfig1.UploadPeriod.ToString();
                        this.comboBoxRS485SensorBaud.SelectedIndex = SystemConfig1.RS485SensorBaud;
                        this.comboBoxRS485ExtendBaud.SelectedIndex = SystemConfig1.RS485ExtendBaud;
                        this.textBoxRS485ExtendAddress.Text = SystemConfig1.RS485ExtendAddress.ToString();
                        this.comboBoxRS485_4GBaud.SelectedIndex = SystemConfig1.Rs485_4GBaud;

                        toolStripStatusLabel1.Text = "读取成功";
                    }
                }
                else if (responseResult == ModbusRespeonseResult.Writen)
                {
                    if ((ModbusMaster.CmdRecord.Address >= RelayConfig.RegHeadAddress) &&
                        (ModbusMaster.CmdRecord.Address <= RelayConfig.RegTailAddress))
                    {
                        if (formRelayConfiguration != null)
                        {
                            if (!formRelayConfiguration.IsDisposed)
                            {
                                formRelayConfiguration.timer1.Stop();
                                formRelayConfiguration.toolStripStatusLabel1.Text = "写入成功";
                            }
                        }
                    }
                    else if ((ModbusMaster.CmdRecord.Address >= SensorConfig.RWHeadAddress) &&
                             (ModbusMaster.CmdRecord.Address <= SensorConfig.RWTailAddress))
                    {
                        if (formSensorConfiguration != null)
                        {
                            if (!formSensorConfiguration.IsDisposed)
                            {
                                formSensorConfiguration.timer1.Stop();
                                formSensorConfiguration.toolStripStatusLabel1.Text = "写入成功";
                            }
                        }
                    }
                    else if ((ModbusMaster.CmdRecord.Address >= SystemConfig.HeadAddress) &&
                             (ModbusMaster.CmdRecord.Address <= SystemConfig.TailAddress))
                    {
                        toolStripStatusLabel1.Text = "写入成功";
                    }
                }

                if (ModbusCmdTime.CompareTo(new DateTime(2000, 1, 1, 0, 0, 0)) != 0)
                {
                    TimeSpan ts = DateTime.Now - ModbusCmdTime;
                    if (ts.Milliseconds > MODBUS_RESPONSE_TIME_MAX_MM)
                    {
                        ModbusCmdTime = new DateTime(2000, 1, 1, 0, 0, 0);

                        toolStripStatusLabel1.Text = "响应超时";
                    }
                }
            }));
        }