Exemplo n.º 1
0
        /// <summary>
        /// 检查当前的Modbus-Rtu响应是否是正确的
        /// </summary>
        /// <param name="send">发送的数据信息</param>
        /// <returns>带是否成功的结果数据</returns>
        protected virtual OperateResult <byte[]> CheckModbusTcpResponse(byte[] send)
        {
            // 核心交互
            OperateResult <byte[]> result = ReadBase(send);

            if (!result.IsSuccess)
            {
                return(result);
            }

            // 长度校验
            if (result.Content.Length < 5)
            {
                return(new OperateResult <byte[]>(StringResources.Language.ReceiveDataLengthTooShort + "5"));
            }

            // 检查crc
            if (!SoftCRC16.CheckCRC16(result.Content))
            {
                return(new OperateResult <byte[]>(StringResources.Language.ModbusCRCCheckFailed));
            }

            // 发生了错误
            if ((send[1] + 0x80) == result.Content[1])
            {
                return(new OperateResult <byte[]>(result.Content[2], ModbusInfo.GetDescriptionByErrorCode(result.Content[2])));
            }

            // 移除CRC校验
            byte[] buffer = new byte[result.Content.Length - 2];
            Array.Copy(result.Content, 0, buffer, 0, buffer.Length);
            return(OperateResult.CreateSuccessResult(buffer));
        }
Exemplo n.º 2
0
        /// <summary>
        /// 重写的数据接收方法,需要连续接收,直到CRC校验成功或是超时,接收时间会比较久
        /// </summary>
        /// <param name="sender">串口对象</param>
        /// <param name="e">串口的数据对象</param>
        protected override void SP_ReadData_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            while (true)
            {
                Thread.Sleep(40);

                try
                {
                    if (SP_ReadData.BytesToRead < 1)
                    {
                        continue;
                    }
                    // 继续接收数据
                    receiveCount += SP_ReadData.Read(buffer, receiveCount, SP_ReadData.BytesToRead);

                    // CRC校验成功及退出
                    byte[] data = new byte[receiveCount];
                    Array.Copy(buffer, 0, data, 0, receiveCount);
                    if (SoftCRC16.CheckCRC16(data))
                    {
                        break;
                    }
                }
                catch (Exception ex)
                {
                    isComError  = true;
                    ComErrorMsg = ex.Message;
                    break;
                }
            }
            resetEvent.Set( );
        }
Exemplo n.º 3
0
        /// <summary>
        /// socket发送
        /// </summary>
        /// <param name="msg"></param>
        void send(string msg)
        {
            writeListBox("发送内容:" + msg);
            try
            {
                //byte[] buffer = new byte[1024 * 1024 * 3];
                //buffer = Encoding.UTF8.GetBytes(msg)

                /**
                 *
                 * 接触网
                 * SocketDateStruct data = new SocketDateStruct();
                 * data.devId = "ID133";
                 * data.temperature = -12;
                 * data.valueB = 11;
                 * data.accelerationX = 33;
                 * data.accelerationY = 44;
                 * data.accelerationZ = 55;
                 * data.pitchAngle = 180;
                 * data.rollAngle = 120;
                 * data.headingAngle = 90;
                 * //data.isAlarm = 1;
                 * //byte[] sendStruct = MarshalHelper.StructToBytes(data);
                 * //byte[] mybtye = SoftCRC16.CRC16(sendStruct);
                 * //socketSend.Send(mybtye);
                 *
                 * byte[] zhaiTeacherDate = new byte[] { 0x00, 0x0D, 0xC9, 0x42, 0x01, 0x47, 0x7F, 0xEF, 0x00, 0x00, 0x03, 0xB2, 0xCF, 0x00, 0x3B, 0x00, 0x79, 0x00, 0x5C, 0x00, 0x20, 0xF9, 0x24, 0x3D, 0x00, 0x00, 0x00, 0xF2, 0xFF };
                 * byte[] mybtye = SoftCRC16.CRC16(zhaiTeacherDate);
                 * socketSend.Send(mybtye);
                 */
                //byte[] zhaiTeacherDate = new byte[] { 0x00, 0x0D};
                //byte[] mybtye = SoftCRC16.CRC16(zhaiTeacherDate);
                //socketSend.Send(mybtye);

                //Array.Copy(sendStruct, sendStruct.Length, mybtye,0,  mybtye.Length);
                //发送数据
                //byte[] sendData = new byte[sendStruct.Length + 2];

                //sendData[sendData.Length - 1] = DataCheck(sendData);

                //Agv测试
                R_CarStatus r_CarStatus = new R_CarStatus();
                r_CarStatus.AgvCarId  = "123";
                r_CarStatus.CarAction = 1;
                r_CarStatus.CarState  = 1;
                r_CarStatus.PositionX = 12.01f;

                byte[] sendStruct = MarshalHelper.StructToBytes(r_CarStatus);
                sendStruct[0] = 255;
                sendStruct[1] = 3;
                sendStruct[2] = 0;
                sendStruct[5] = 49;
                byte[] mybtye = SoftCRC16.CRC16(sendStruct);
                socketSend.Send(mybtye);
            }
            catch { }
        }
Exemplo n.º 4
0
        /// <summary>
        /// 检查当前的Modbus-Tcp响应是否是正确的
        /// </summary>
        /// <param name="send">发送的数据信息</param>
        /// <returns>带是否成功的结果数据</returns>
        private OperateResult <byte[]> CheckModbusTcpResponse(byte[] send)
        {
            OperateResult <byte[]> result = ReadBase(send);

            if (!result.IsSuccess)
            {
                return(result);
            }

            if (result.Content.Length < 5)
            {
                return(new OperateResult <byte[]>( )
                {
                    IsSuccess = false,
                    Message = "接收数据长度不能小于5",
                });
            }

            if (!SoftCRC16.CheckCRC16(result.Content))
            {
                return(new OperateResult <byte[]>( )
                {
                    IsSuccess = false,
                    Message = "CRC校验失败",
                });
            }

            if ((send[1] + 0x80) == result.Content[1])
            {
                // 发生了错误
                return(new OperateResult <byte[]>( )
                {
                    IsSuccess = false,
                    Message = ModbusInfo.GetDescriptionByErrorCode(result.Content[2]),
                    ErrorCode = result.Content[2],
                });
            }
            else
            {
                // 移除CRC校验
                byte[] buffer = new byte[result.Content.Length - 2];
                Array.Copy(result.Content, 0, buffer, 0, buffer.Length);
                return(OperateResult.CreateSuccessResult(buffer));
            }
        }
Exemplo n.º 5
0
        /// <summary>
        /// 检查当前的Modbus-Rtu响应是否是正确的
        /// </summary>
        /// <param name="send">发送的数据信息</param>
        /// <returns>带是否成功的结果数据</returns>
        protected virtual OperateResult <byte[]> CheckModbusTcpResponse(byte[] send)
        {
            // 核心交互
            OperateResult <byte[]> result = ReadBase(send);

            if (!result.IsSuccess)
            {
                return(result);
            }

            // 长度校验
            if (result.Content.Length < 5)
            {
                return new OperateResult <byte[]>( )
                       {
                           IsSuccess = false, Message = "接收数据长度不能小于5"
                       }
            }
            ;

            // 检查crc
            if (!SoftCRC16.CheckCRC16(result.Content))
            {
                return new OperateResult <byte[]>( )
                       {
                           Message = "CRC校验失败"
                       }
            }
            ;

            // 发生了错误
            if ((send[1] + 0x80) == result.Content[1])
            {
                return new OperateResult <byte[]>( )
                       {
                           ErrorCode = result.Content[2], Message = ModbusInfo.GetDescriptionByErrorCode(result.Content[2])
                       }
            }
            ;

            // 移除CRC校验
            byte[] buffer = new byte[result.Content.Length - 2];
            Array.Copy(result.Content, 0, buffer, 0, buffer.Length);
            return(OperateResult.CreateSuccessResult(buffer));
        }
Exemplo n.º 6
0
        private OperateResult <byte[]> BuildWriteOneRegisterCommand(string address, byte[] data)
        {
            OperateResult <int> analysis = AnalysisAddress(address);

            if (!analysis.IsSuccess)
            {
                return(OperateResult.CreateFailedResult <byte[]>(analysis));
            }

            byte[] buffer = new byte[6];
            buffer[0] = station;
            buffer[1] = ModbusInfo.WriteOneRegister;
            buffer[2] = (byte)(analysis.Content / 256);
            buffer[3] = (byte)(analysis.Content % 256);
            buffer[4] = data[1];
            buffer[5] = data[0];

            return(OperateResult.CreateSuccessResult(SoftCRC16.CRC16(buffer)));
        }
Exemplo n.º 7
0
        private OperateResult <byte[]> BuildWriteOneCoilCommand(string address, bool value)
        {
            OperateResult <int> analysis = AnalysisAddress(address);

            if (!analysis.IsSuccess)
            {
                return(OperateResult.CreateFailedResult <byte[]>(analysis));
            }

            byte[] buffer = new byte[6];
            buffer[0] = station;
            buffer[1] = ModbusInfo.WriteOneCoil;
            buffer[2] = (byte)(analysis.Content / 256);
            buffer[3] = (byte)(analysis.Content % 256);
            buffer[4] = (byte)(value ? 0xFF : 0x00);
            buffer[5] = 0x00;

            return(OperateResult.CreateSuccessResult(SoftCRC16.CRC16(buffer)));
        }
Exemplo n.º 8
0
        /// <summary>
        /// 读取数据的基础指令,需要指定指令码,地址,长度
        /// </summary>
        /// <param name="code"></param>
        /// <param name="address"></param>
        /// <param name="count"></param>
        /// <returns></returns>
        private OperateResult <byte[]> BuildReadCommandBase(byte code, string address, ushort count)
        {
            OperateResult <int> analysis = AnalysisAddress(address);

            if (!analysis.IsSuccess)
            {
                return(OperateResult.CreateFailedResult <byte[]>(analysis));
            }

            byte[] buffer = new byte[6];
            buffer[0] = station;
            buffer[1] = code;
            buffer[2] = (byte)(analysis.Content / 256);
            buffer[3] = (byte)(analysis.Content % 256);
            buffer[4] = (byte)(count / 256);
            buffer[5] = (byte)(count % 256);

            return(OperateResult.CreateSuccessResult(SoftCRC16.CRC16(buffer)));
        }
Exemplo n.º 9
0
        private OperateResult <byte[]> BuildWriteCoilCommand(string address, bool[] values)
        {
            byte[] data = SoftBasic.BoolArrayToByte(values);

            OperateResult <int> analysis = AnalysisAddress(address);

            if (!analysis.IsSuccess)
            {
                return(OperateResult.CreateFailedResult <byte[]>(analysis));
            }

            byte[] buffer = new byte[7 + data.Length];
            buffer[0] = station;
            buffer[1] = ModbusInfo.WriteCoil;
            buffer[2] = (byte)(analysis.Content / 256);
            buffer[3] = (byte)(analysis.Content % 256);
            buffer[4] = (byte)(values.Length / 256);
            buffer[5] = (byte)(values.Length % 256);

            buffer[6] = (byte)(data.Length);
            data.CopyTo(buffer, 7);

            return(OperateResult.CreateSuccessResult(SoftCRC16.CRC16(buffer)));
        }
Exemplo n.º 10
0
        /// <summary>

        /// 接收客户端发来的信息,客户端套接字对象

        /// </summary>

        /// <param name="socketclientpara"></param>

        private void recv(object socketclientpara)

        {
            Socket socketServer = socketclientpara as Socket;



            while (true)

            {
                //创建字节数组接收客户端的数据 返回值length表示接收了多少字节的数据,根据结构体计算出来长度大小

                byte[] arrServerRecMsg = new byte[Marshal.SizeOf(typeof(SocketDateStruct)) + 2];

                //将接收到的信息存入到内存缓冲区,并返回其字节数组的长度

                try

                {
                    int length = socketServer.Receive(arrServerRecMsg);

                    byte[] dataValue = new byte[Marshal.SizeOf(typeof(SocketDateStruct))]; //数据用于crc
                    Array.Copy(arrServerRecMsg, 0, dataValue, 0, length - 2);

                    byte[] myCRC = SoftCRC16.CRC16(dataValue);

                    if (myCRC[myCRC.Length - 1] == arrServerRecMsg[myCRC.Length - 1] && myCRC[myCRC.Length - 2] == arrServerRecMsg[myCRC.Length - 2])   //验证CRC高位和地位是否相等
                    {
                        SocketDateStruct socketDateStruct = new SocketDateStruct();
                        socketDateStruct = MarshalHelper.BytesToStruct <SocketDateStruct>(arrServerRecMsg);

                        string strStruct = socketDateStruct.devId + ";" + socketDateStruct.Temperature.ToString() + ";" + socketDateStruct.Humidity.ToString() +
                                           ";" + socketDateStruct.Distance.ToString() + ";" + socketDateStruct.XAxisAcceleration.ToString() +
                                           ";" + socketDateStruct.YAxisAcceleration.ToString() + ";" + socketDateStruct.ZAxisAcceleration.ToString() +
                                           ";" + socketDateStruct.PitchAngle.ToString() + ";" + socketDateStruct.RollAngle.ToString() + ";" + socketDateStruct.CourseAngle.ToString();

                        writeListBox("接收到了一条消息:结构体数据->" + strStruct);
                    }
                    else
                    {
                        writeListBox("接收到了一条消息:收到的数据CRC错误");
                    }
                    string strData2 = BitConverter.ToString(arrServerRecMsg);  //只把接收到的数据(0 - length)进行转化
                    writeListBox("接收到了一条消息:原始的byte->" + strData2);

                    //将机器接受到的字节数组转换为人可以读懂的字符串

                    //string strSRecMsg = Encoding.UTF8.GetString(arrServerRecMsg, 0, length);
                    string strSRecMsg = "12345";



                    //将发送的字符串信息附加到文本框txtMsg上

                    writeListBox("\r\n[客户端:" + socketServer.RemoteEndPoint + " 时间:" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:fff") + "]\r\n" + strSRecMsg);



                    //Thread.Sleep(3000);

                    //socketServer.Send(Encoding.UTF8.GetBytes("[" + socketServer.RemoteEndPoint + "]:"+strSRecMsg));

                    //发送客户端数据

                    if (ClientConnectionItems.Count > 0)

                    {
                        foreach (var socketTemp in ClientConnectionItems)

                        {
                            socketTemp.Value.Send(Encoding.UTF8.GetBytes("[" + socketServer.RemoteEndPoint + "]:" + strSRecMsg));
                        }
                    }
                }

                catch (Exception)

                {
                    ClientConnectionItems.Remove(socketServer.RemoteEndPoint.ToString());

                    //提示套接字监听异常

                    writeListBox("\r\n[客户端\"" + socketServer.RemoteEndPoint + "\"已经中断连接! 客户端数量:" + ClientConnectionItems.Count + "]");

                    //关闭之前accept出来的和客户端进行通信的套接字

                    socketServer.Close();

                    break;
                }
            }
        }
Exemplo n.º 11
0
 /// <summary>
 /// 检查当前接收的字节数据是否正确的
 /// </summary>
 /// <param name="rBytes"></param>
 /// <returns></returns>
 protected override bool CheckReceiveBytes(byte[] rBytes)
 {
     return(SoftCRC16.CheckCRC16(rBytes));
 }