private ModbusRequest SendWrite(ModbusPackage package, ModbusFunctions functionCode, bool isInternal) { ModbusRequest request = null; if (package.CountVariables > 0) { request = new ModbusRequest(); request.IsInternal = isInternal; request.MBAPHeader.TransactionId = GetTransactionId(); request.MBAPHeader.Length = 0; request.MBAPHeader.UnitId = UnitId; request.PDU.FunctionCode = functionCode; List <byte> pdu = new List <byte>(); pdu.AddRange(BitConverter.GetBytes(Convert.ToUInt16(package.StartRegister)).Reverse()); pdu.AddRange(BitConverter.GetBytes(Convert.ToUInt16(package.CountRegisters)).Reverse()); switch (functionCode) { case ModbusFunctions.ForceSingleCoil: case ModbusFunctions.PresetSingleRegister: request.MBAPHeader.Length = 6; break; case ModbusFunctions.ForceMultipleCoils: case ModbusFunctions.PresetMultipleRegisters: pdu.Add(Convert.ToByte(package.SizeInBytes)); pdu.AddRange(package.GetData()); request.MBAPHeader.Length = (ushort)(pdu.Count + 2); break; } request.PDU.Data = pdu.ToArray(); } return(request); }
private void ModBus_OnReceiveNewResponse(object sender, ModbusFunctions function, object response) { string json = ""; switch (function) { case ModbusFunctions.ReadCoils: var rc = (ModBusReadCoilResponse)response; json = JsonConvert.SerializeObject(rc, Formatting.Indented); break; case ModbusFunctions.ReadInputs: var ri = (ModBusReadInputResponse)response; json = JsonConvert.SerializeObject(ri, Formatting.Indented); break; case ModbusFunctions.ReadHoldingRegisters: var rhr = (ModBusReadHoldingRegisterResponse)response; json = JsonConvert.SerializeObject(rhr, Formatting.Indented); break; case ModbusFunctions.ReadInputRegisters: var rir = (ModBusReadInputRegisterResponse)response; json = JsonConvert.SerializeObject(rir, Formatting.Indented); break; case ModbusFunctions.WriteSingleCoil: break; case ModbusFunctions.WriteSingleRegister: break; case ModbusFunctions.WriteMultipleCoils: break; case ModbusFunctions.WriteMultipleRegisters: break; case ModbusFunctions.ReadWriteMultipleRegisters: break; } this.Invoke(new MethodInvoker(() => { textBox1.Text = json; })); }
public ModbusRequest(ModbusFunctions functionCode, int startAddress, int quantityToRead) { this.startAddress = BitConverter.GetBytes(Convert.ToInt16(startAddress)); this.functionCode = (byte)functionCode; this.quantityToRead = BitConverter.GetBytes((short)quantityToRead); this.pdu = new byte[] { this.functionCode, this.startAddress[1], this.startAddress[0], this.quantityToRead[1], this.quantityToRead[0] }; }
private ModbusRequest SendRead(ModbusPackage package, ModbusFunctions functionCode, bool isInternal) { ModbusRequest request = null; if (package.CountVariables > 0) { request = new ModbusRequest(); request.IsInternal = isInternal; request.MBAPHeader.TransactionId = GetTransactionId(); request.MBAPHeader.Length = 6; request.MBAPHeader.UnitId = UnitId; request.PDU.FunctionCode = functionCode; request.PDU.Data = new byte[4]; ConvertingToBytes(package.StartRegister, request.PDU.Data, 0); ConvertingToBytes(package.CountRegisters, request.PDU.Data, 2); } return(request); }
private byte[] RtuMakeFunction4(ModBusReadRequest req, ModbusFunctions function) { var message = new byte[8]; message[0] = (byte)req.SlaveAddress; message[1] = (byte)function; message[2] = (byte)(req.StartAddress >> 8); message[3] = (byte)req.StartAddress; message[4] = (byte)(req.NumberOfPoints >> 8); message[5] = (byte)req.NumberOfPoints; var crc16 = ModbusUtility.ComputeCRC16(message, 0, message.Length - 2); message[message.Length - 2] = crc16[0]; message[message.Length - 1] = crc16[1]; return(message); }
private byte[] RtuMakeFunction5(ModBusSingleWriteRequest req, ModbusFunctions function) { var message = new byte[8]; message[0] = (byte)req.SlaveAddress; message[1] = (byte)function; message[2] = (byte)(req.StartAddress >> 8); message[3] = (byte)req.StartAddress; message[4] = (byte)(req.NewValue >> 8); message[5] = (byte)req.NewValue; var crc16 = ModbusUtility.ComputeCRC16(message, 0, message.Length - 2); message[message.Length - 2] = crc16[0]; message[message.Length - 1] = crc16[1]; return(message); }
private bool HardwareInterface_OnReceiceNewPacket(object sender, Packet packet) { if (packet.Data == null || packet.Data.Length < 7) { return(false); } if (packet.Data[0] == ':' && packet.Data[packet.Data.Length - 2] == 0x0D && packet.Data[packet.Data.Length - 1] == 0x0A) { //res.Mode = ModBusMode.ASCII; } else { ModbusFunctions function = (ModbusFunctions)packet.Data[1]; ModBusReadRequest req = null; if (function == ModbusFunctions.ReadCoils || function == ModbusFunctions.ReadHoldingRegisters || function == ModbusFunctions.ReadInputRegisters || function == ModbusFunctions.ReadInputs) { for (int i = 0; i < PendingReadRequestList.Count; i++) { ModBusReadRequest pr = PendingReadRequestList.GetAt(i); if (packet.SeqNum == pr.SeqNum) { req = pr; PendingReadRequestList.RemoveAt(i); break; } } if (req == null) { return(false); } } if (function == ModbusFunctions.ReadCoils) { var res = new ModBusReadCoilResponse() { Mode = ModBusMode.RTU, SlaveAddress = packet.Data[0], Function = function, ByteCount = packet.Data[2], StartAddress = req.StartAddress, }; res.Data = new byte[res.ByteCount]; for (int i = 0; i < res.ByteCount; i++) { res.Data[i] = packet.Data[i + 3]; } var crc16 = ModbusUtility.ComputeCRC16(packet.Data, 0, packet.Data.Length - 2); if (crc16[0] == packet.Data[packet.Data.Length - 2] && crc16[1] == packet.Data[packet.Data.Length - 1]) { OnReceiveNewResponse?.Invoke(this, function, res); } } else if (function == ModbusFunctions.ReadInputs) { var res = new ModBusReadInputResponse() { Mode = ModBusMode.RTU, SlaveAddress = packet.Data[0], Function = function, ByteCount = packet.Data[2], StartAddress = req.StartAddress, }; res.Data = new byte[res.ByteCount]; for (int i = 0; i < res.ByteCount; i++) { res.Data[i] = packet.Data[i + 3]; } var crc16 = ModbusUtility.ComputeCRC16(packet.Data, 0, packet.Data.Length - 2); if (crc16[0] == packet.Data[packet.Data.Length - 2] && crc16[1] == packet.Data[packet.Data.Length - 1]) { OnReceiveNewResponse?.Invoke(this, function, res); } } else if (function == ModbusFunctions.ReadHoldingRegisters) { var res = new ModBusReadHoldingRegisterResponse() { Mode = ModBusMode.RTU, SlaveAddress = packet.Data[0], Function = function, ByteCount = packet.Data[2], StartAddress = req.StartAddress, }; res.Data = new ushort[res.ByteCount / 2]; int n = 0; for (int i = 0; i < res.ByteCount; i += 2) { res.Data[n++] = (ushort)((packet.Data[i + 3] << 8) | (packet.Data[i + 4])); } var crc16 = ModbusUtility.ComputeCRC16(packet.Data, 0, packet.Data.Length - 2); if (crc16[0] == packet.Data[packet.Data.Length - 2] && crc16[1] == packet.Data[packet.Data.Length - 1]) { OnReceiveNewResponse?.Invoke(this, function, res); } } else if (function == ModbusFunctions.ReadInputs) { var res = new ModBusReadInputRegisterResponse() { Mode = ModBusMode.RTU, SlaveAddress = packet.Data[0], Function = function, ByteCount = packet.Data[2], StartAddress = req.StartAddress, }; res.Data = new ushort[res.ByteCount / 2]; int n = 0; for (int i = 0; i < res.ByteCount; i += 2) { res.Data[n++] = (ushort)((packet.Data[i + 3] << 8) | (packet.Data[i + 4])); } var crc16 = ModbusUtility.ComputeCRC16(packet.Data, 0, packet.Data.Length - 2); if (crc16[0] == packet.Data[packet.Data.Length - 2] && crc16[1] == packet.Data[packet.Data.Length - 1]) { OnReceiveNewResponse?.Invoke(this, function, res); } } else if (function == ModbusFunctions.WriteSingleCoil || function == ModbusFunctions.WriteSingleRegister) { var res = new ModBusWriteSingleResponse() { Mode = ModBusMode.RTU, SlaveAddress = packet.Data[0], Function = function, }; res.Address = (ushort)((packet.Data[2] << 8) | (packet.Data[3])); res.Value = (ushort)((packet.Data[4] << 8) | (packet.Data[4])); var crc16 = ModbusUtility.ComputeCRC16(packet.Data, 0, packet.Data.Length - 2); if (crc16[0] == packet.Data[packet.Data.Length - 2] && crc16[1] == packet.Data[packet.Data.Length - 1]) { OnReceiveNewResponse?.Invoke(this, function, res); } } } return(true); }
public bool CheckSupportOperation(ModbusFunctions functionCode) { bool result = false; return(result); }