Example #1
0
        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);
        }
Example #2
0
        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;
            }));
        }
Example #3
0
        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]
            };
        }
Example #4
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);
        }
Example #5
0
        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);
        }
Example #6
0
        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);
        }
Example #7
0
        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);
        }
Example #8
0
        public bool CheckSupportOperation(ModbusFunctions functionCode)
        {
            bool result = false;

            return(result);
        }