/// <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)); }
/// <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( ); }
/// <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 { } }
/// <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)); } }
/// <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)); }
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))); }
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))); }
/// <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))); }
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))); }
/// <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; } } }
/// <summary> /// 检查当前接收的字节数据是否正确的 /// </summary> /// <param name="rBytes"></param> /// <returns></returns> protected override bool CheckReceiveBytes(byte[] rBytes) { return(SoftCRC16.CheckCRC16(rBytes)); }