/// 处理状态数据包 public static void ProcessWorkGraphStatusPackage(byte[] data) { try { var iotDataWorkGraphStatus = new IotDataWorkGraphStatus { DateTime = DateTime.Now, WellId = 0, ModbusAddress = (byte)BytesConvertHelper.ConvertByteArrayToInt8(data, 0), BatteryVoltage = BytesConvertHelper.ConvertByteArrayToInt16(data, 11) / 1000.0, WellStatus = BytesConvertHelper.ConvertByteArrayToInt16(data, 13), Temperature = BytesConvertHelper.ConvertByteArrayToInt16(data, 15) / 100.0, Humidity = BytesConvertHelper.ConvertByteArrayToInt16(data, 17) / 100.0, Stroke = BytesConvertHelper.ConvertByteArrayToInt16(data, 19) / 100.0, Displacement = BytesConvertHelper.ConvertByteArrayToInt16(data, 21) / 100.0 }; var connectionFactory = HostContext.TryResolve <IDbConnectionFactory>(); var dbFac = connectionFactory.OpenDbConnection(); var list = dbFac.Select <IotOilWell>(x => x.ModbusAddress == data[0]); if (!list.IsEmpty()) { iotDataWorkGraphStatus.WellId = list[0].WellId; DataWriter.WorkGraphStatusQueue.Enqueue(iotDataWorkGraphStatus); } Logger.Info(iotDataWorkGraphStatus.Dump()); } catch (Exception e) { Console.WriteLine(e); throw; } }
//public static void PaddingPacket(ref byte[] buffer) //{ // var bufferList = buffer.ToList(); // var tempList = new List<byte>(); // foreach (var item in bufferList) // { // tempList.Add(item); // if (item == Pack_SYN_A) // { // tempList.Add((byte)Pack_Padding); // } // } // buffer = tempList.ToArray(); //} /* * 功能: 添加一个8位数据到缓冲区 * 参数: * 返回值: */ public static UInt32 AppendUInt8Data(ref byte[] buffer, UInt32 bufferLength, byte u8Data) { var ktls = buffer.ToList(); ktls.AddRange(BytesConvertHelper.ConvertUInt8ToByteArray(u8Data)); buffer = ktls.ToArray(); return(1); }
public static UInt32 AppendInt16Data(ref byte[] buffer, UInt32 bufferLength, Int16 s16Data) { var ktls = buffer.ToList(); ktls.AddRange(BytesConvertHelper.ConvertInt16ToByteArray(s16Data)); buffer = ktls.ToArray(); return(2); }
public static byte[] PacketTestWorkGraphDataPackage(byte slaveId) { const byte periodPointCount = 135; var buffer = new byte[0]; // Zigbee短地址,即Modbus设备地址 AppendByte(ref buffer, slaveId); //功能码 AppendByte(ref buffer, MB_FUNC_SLAVE_WORKGRAPH_DATA); //RTU设备编号 AppendBytes(ref buffer, BytesConvertHelper.ConvertInt32ToByteArray(0x13FFFF00 + slaveId)); //长度,先占位,后面填充 AppendBytes(ref buffer, BytesConvertHelper.ConvertInt16ToByteArray(11 + 135 * 4)); //采样点数 PointCount AppendByte(ref buffer, periodPointCount); //采样间隔 SampleInterval*100 AppendBytes(ref buffer, BytesConvertHelper.ConvertInt16ToByteArray((short)(1562))); ////以下为数据部分 ////////////////////////////////////////////////////////////////// //以数据填充开始 ////////////////////////////////////////////////////////////////// for (var i = 0; i < periodPointCount; i++) { AppendBytes(ref buffer, BytesConvertHelper.ConvertInt16ToByteArray(ForceBuffer[i])); } for (var i = 0; i < periodPointCount; i++) { AppendBytes(ref buffer, BytesConvertHelper.ConvertInt16ToByteArray(ForceBuffer[i])); } ////////////////////////////////////////////////////////////////// //数据填充结束 ////////////////////////////////////////////////////////////////// ////数据部分结束 ////以下为包尾固定部分 //计算并保存CRC AppendBytes(ref buffer, buffer.CRC16()); //包头标志 InsertByte(ref buffer, 0, Pack_SYN_C); InsertByte(ref buffer, 0, Pack_SYN_B); InsertByte(ref buffer, 0, Pack_SYN_A); //包尾标志 AppendByte(ref buffer, Pack_STOP_A); AppendByte(ref buffer, Pack_STOP_B); AppendByte(ref buffer, Pack_STOP_C); return(buffer); }
//处理功图包 public static void ProcessWorkGraphPackage(byte[] data) { try { var iotDataOilWellIndicatorDiagram = new IotDataOilWellIndicatorDiagram { DateTime = DateTime.Now, Count = (int?)BytesConvertHelper.ConvertByteArrayToInt8(data, 8), Interval = BytesConvertHelper.ConvertByteArrayToInt16(data, 9) / 100.0, D = new List <double>(), L = new List <double>() }; var count = (int)iotDataOilWellIndicatorDiagram.Count; var deviceId = (byte)1; var offset = (ushort)((deviceId - 1) * 550); MyModbusServer.Server.SetHoldingRegister(deviceId, (ushort)(31550 + offset + 3), (ushort)count); MyModbusServer.Server.SetHoldingRegister(deviceId, (ushort)(31550 + offset + 4), (ushort)(iotDataOilWellIndicatorDiagram.Interval * 100)); for (var i = 0; i < count; i++) { iotDataOilWellIndicatorDiagram.L.Add(BytesConvertHelper.ConvertByteArrayToInt16(data, 11 + 2 * i)); MyModbusServer.Server.SetHoldingRegister(deviceId, (ushort)(31550 + offset + i), (ushort)(iotDataOilWellIndicatorDiagram.Interval * 100)); } for (var i = 0; i < count; i++) { iotDataOilWellIndicatorDiagram.D.Add(BytesConvertHelper.ConvertByteArrayToInt16(data, 11 + 2 * count + 2 * i)); MyModbusServer.Server.SetHoldingRegister(deviceId, (ushort)(31550 + offset + 262 + i), (ushort)(iotDataOilWellIndicatorDiagram.Interval * 100)); } var connectionFactory = HostContext.TryResolve <IDbConnectionFactory>(); var dbFac = connectionFactory.OpenDbConnection(); var list = dbFac.Select <IotOilWell>(x => x.ModbusAddress == data[0]); if (!list.IsEmpty()) { iotDataOilWellIndicatorDiagram.WellId = list[0].WellId; DataWriter.WorkGraphDataQueue.Enqueue(iotDataOilWellIndicatorDiagram); } Logger.Info(iotDataOilWellIndicatorDiagram.Dump()); } catch (Exception e) { Console.WriteLine(e); throw; } }
/// 生成时间同步包 public static byte[] PacketTimeSyncPackage(byte slaveId, ushort refStrokeFrequency, ushort refStrokeLength) { var buffer = new byte[0]; // Zigbee短地址,即Modbus设备地址 AppendByte(ref buffer, slaveId); //功能码 AppendByte(ref buffer, MB_FUNC_MASTER_TIMESYNC); var dt = DateTime.Now; AppendBytes(ref buffer, BytesConvertHelper.ConvertUInt16ToByteArray((ushort)dt.Year)); AppendByte(ref buffer, (byte)dt.Month); AppendByte(ref buffer, (byte)dt.Day); AppendByte(ref buffer, (byte)dt.Hour); AppendByte(ref buffer, (byte)dt.Minute); AppendByte(ref buffer, (byte)dt.Second); //是否下发了新的冲次和冲程 AppendByte(ref buffer, 1); //参考冲次 AppendBytes(ref buffer, BytesConvertHelper.ConvertUInt16ToByteArray(refStrokeFrequency)); //参考冲程 AppendBytes(ref buffer, BytesConvertHelper.ConvertUInt16ToByteArray(refStrokeLength)); //计算并保存CRC AppendBytes(ref buffer, BitConverter.IsLittleEndian ? buffer.CRC16() : buffer.CRC16().Reverse().ToArray()); //包头标志 InsertByte(ref buffer, 0, Pack_SYN_C); InsertByte(ref buffer, 0, Pack_SYN_B); InsertByte(ref buffer, 0, Pack_SYN_A); //包尾标志 AppendByte(ref buffer, Pack_STOP_A); AppendByte(ref buffer, Pack_STOP_B); AppendByte(ref buffer, Pack_STOP_C); return(buffer); }