//Public
 public ADU_FunctionRequest(PublicFunctionCodes functionCode, int address, object value) => Create(PDU.PDUType.Request, functionCode, address, value);
            //Protected
            protected void Create(PDUType type, PublicFunctionCodes functionCode, int startAddress, object value)
            {
                if (value.GetType() == typeof(short[]))
                {
                    short[] val = (short[])value;

                    Type = type;

                    Data.Add((byte)functionCode);

                    Data.Add(HighByte(startAddress));
                    Data.Add(LowByte(startAddress));

                    Data.Add(HighByte(val.Length));
                    Data.Add(LowByte(val.Length));

                    Data.Add((byte)(val.Length * 2));

                    for (int i = 0; i < val.Length; i++)
                    {
                        Data.Add(HighByte(val[i]));
                        Data.Add(LowByte(val[i]));
                    }
                }
                else if (value.GetType() == typeof(int[]))
                {
                    int[] val = (int[])value;

                    Type = type;

                    Data.Add((byte)functionCode);

                    Data.Add(HighByte(startAddress));
                    Data.Add(LowByte(startAddress));

                    Data.Add(HighByte(val.Length * 2));
                    Data.Add(LowByte(val.Length * 2));

                    Data.Add((byte)(val.Length * 4));

                    for (int i = 0; i < val.Length; i++)
                    {
                        Data.Add(HighByteHighWord(val[i]));
                        Data.Add(LowByteHighWord(val[i]));
                        Data.Add(HighByte(val[i]));
                        Data.Add(LowByte(val[i]));
                    }
                }
                else if (value.GetType() == typeof(float[]))
                {
                    float[] val = (float[])value;

                    Type = type;

                    Data.Add((byte)functionCode);

                    Data.Add(HighByte(startAddress));
                    Data.Add(LowByte(startAddress));

                    Data.Add(HighByte(val.Length * 2));
                    Data.Add(LowByte(val.Length * 2));

                    Data.Add((byte)(val.Length * 4));

                    for (int i = 0; i < val.Length; i++)
                    {
                        byte[] b = BitConverter.GetBytes(val[i]);
                        b = Reverse(b);
                        Data.AddRange(b);
                    }
                }
                else if (value.GetType() == typeof(int))
                {
                    Type = type;

                    Data.Add((byte)functionCode);

                    Data.Add(HighByte(startAddress));
                    Data.Add(LowByte(startAddress));

                    Data.Add(HighByte((int)value));
                    Data.Add(LowByte((int)value));
                }
                else if (value.GetType() == typeof(bool))
                {
                    Type = type;

                    Data.Add((byte)functionCode);

                    Data.Add(HighByte(startAddress));
                    Data.Add(LowByte(startAddress));

                    if ((bool)value)
                    {
                        Data.Add(0xFF);
                    }
                    else
                    {
                        Data.Add(0xFF);
                    }
                    Data.Add(0);
                }
            }