Пример #1
0
        private async Task <ModBusFrameReturn> RequestFrame(byte slaveId, ModBusFunction function)
        {
            var readFrame = await ReadFrame();

            await Monitor.NotifyTelegram(TelegramDirection.Input, slaveId.ToString(), "MASTER", Utils.ByteArrayToString(readFrame), null);

            if (readFrame == null || readFrame.Length == 0)
            {
                return(new ModBusFrameReturn(ModBusRequestStatus.InvalidDataRead, null));
            }
            if (slaveId != readFrame[0])
            {
                return(new ModBusFrameReturn(ModBusRequestStatus.InvalidSlaveAnswered, null));
            }
            var retFunction = readFrame[1];

            if ((byte)function != retFunction)
            {
                if (retFunction >= 0x80)
                {
                    return(new ModBusExceptionReturn((ModBusExceptionCode)readFrame[2]));
                }
                return(new ModBusFrameReturn(ModBusRequestStatus.InvalidReturnFunction, null));
            }
            return(new ModBusFrameReturn(ModBusRequestStatus.Success, readFrame.ToList()));
        }
Пример #2
0
        public byte[] Serialize(ModBusFunction functionCode, byte slaveId)
        {
            var data = new byte[3];

            data[0] = slaveId;
            data[1] = (byte)(functionCode + 0x80);
            data[2] = (byte)_code;
            return(data);
        }
Пример #3
0
        /// <summary>
        /// 读
        /// </summary>
        /// <param name="slaveid"></param>
        /// <param name="function"></param>
        /// <param name="addr"></param>
        /// <param name="readnum"></param>
        /// <returns></returns>
        public static byte[] ModBusRead(int slaveid, ModBusFunction function, int addr, int readnum)
        {
            var modbus = new byte[8];

            modbus[0] = (byte)slaveid;        //从站:06
            modbus[1] = (byte)function;       //功能码:05
            modbus[2] = (byte)(addr >> 8);    //读取的起始地址
            modbus[3] = (byte)addr;
            modbus[4] = (byte)(readnum >> 8); //读取的个数
            modbus[5] = (byte)readnum;
            modbus[6] = CrcChecking(modbus, 0, 6)[0];
            modbus[7] = CrcChecking(modbus, 0, 6)[1];
            var a = HexByteToHexStr(modbus);

            return(modbus);
        }
Пример #4
0
        /// <summary>
        /// 写
        /// </summary>
        /// <param name="slaveid"></param>
        /// <param name="function"></param>
        /// <param name="addr"></param>
        /// <param name="coildata"></param>
        /// <returns></returns>
        public static byte[] ModBusWrite(int slaveid, ModBusFunction function, int addr, bool coildata)
        {
            var modbus = new byte[8];

            modbus[0] = (byte)slaveid;                      //从站:06
            modbus[1] = (byte)function;                     //功能码:05
            modbus[2] = (byte)(addr >> 8);                  //写入的起始地址
            modbus[3] = (byte)addr;
            modbus[4] = coildata ? (byte)0xFF : (byte)0x00; //写入的值:状态ON:FF 00(本函数只用于开闭状态量)
            modbus[5] = 0x00;
            modbus[6] = CrcChecking(modbus, 0, 6)[0];
            modbus[7] = CrcChecking(modbus, 0, 6)[1];
            var a = HexByteToHexStr(modbus);

            return(modbus);
        }
Пример #5
0
        protected override byte[] BuildReadFrame(byte slaveId, int addr, int numberOfRegister, ModBusFunction function)
        {
            _transactionId++;

            var headerFrame = BuildHeaderFromDataFrame(new byte[] {}, slaveId, function);
            var dataFrame   = new List <byte>();

            dataFrame.AddRange(headerFrame);
            dataFrame.Add((byte)function);

            dataFrame.Add(Utils.ShiftRight(addr, 8));
            dataFrame.Add((byte)(addr & 0x00FF));
            dataFrame.Add(Utils.ShiftRight(numberOfRegister, 8));
            dataFrame.Add((byte)(numberOfRegister & 0x00FF));

            return(dataFrame.ToArray());
        }
Пример #6
0
        protected override byte[] BuildHeaderFromDataFrame(byte[] dataFrame, byte slaveId, ModBusFunction function)
        {
            _transactionId++;
            var frame = new List <byte>
            {
                Utils.ShiftRight(_transactionId, 8),
                (byte)(_transactionId & 0x00FF),
                0,
                0,
                0,
                0,
                slaveId
            };


            //length will be set later
            //length will be set later

            frame.AddRange(dataFrame);

            var length = GetRequestLength(frame.ToArray());

            frame[4] = Utils.ShiftRight(length, 8);
            frame[5] = (byte)(length & 0x00FF);

            return(frame.ToArray());
        }
Пример #7
0
 protected abstract byte[] BuildHeaderFromDataFrame(byte[] dataFrame, byte slaveId, ModBusFunction function);
Пример #8
0
 protected abstract byte[] BuildReadFrame(byte slaveId, int addr, int numberOfRegister, ModBusFunction function);
Пример #9
0
        private async Task <ModBusFrameReturn> GetFrame(byte slaveId, ushort addr, int numberOfRegisters, ModBusFunction function)
        {
            var frame  = BuildReadFrame(slaveId, addr, numberOfRegisters, function);
            var length = GetRequestLength(frame);

            frame[4] = Utils.ShiftRight(length, 8);
            frame[5] = (byte)(length & 0x00FF);

            await Monitor.NotifyTelegram(TelegramDirection.Output, "MASTER", slaveId.ToString(), Utils.ByteArrayToString(frame), $"GetFrame Addr: {addr} number{numberOfRegisters} function {function}");

            await WriteFrame(frame);


            return(await RequestFrame(slaveId, function));
        }
Пример #10
0
        private async Task <ModBusReturn> ReadRegisters(byte slaveId, ushort addr, int numberOfRegisters, ModBusFunction function)
        {
            var readFrame = await GetFrame(slaveId, addr, numberOfRegisters, function);

            if (readFrame.ModBusRequestStatus != ModBusRequestStatus.Success)
            {
                return(readFrame);
            }

            var data      = new List <ushort>();
            var dataShort = new List <ushort>();

            var requestRegisters = readFrame.Data[2];

            for (int i = 0; i < requestRegisters; i += 2)
            {
                var value = Utils.GetUShort(readFrame.Data[3 + i], readFrame.Data[3 + i + 1]);
                data.Add(value);
                dataShort.Add(value);
            }

            return(new ModBusRegisterValueReturn(ModBusRequestStatus.Success, data, dataShort));
        }
Пример #11
0
        private async Task <ModBusReturn> ReadCoils(byte slaveId, ushort addr, int numberOfRegisters, ModBusFunction function)
        {
            var readFrame = await GetFrame(slaveId, addr, numberOfRegisters, function);

            if (readFrame.ModBusRequestStatus != ModBusRequestStatus.Success)
            {
                return(new ModBusReturn(readFrame.ModBusRequestStatus));
            }
            var requestRegisters = readFrame.Data[2];

            var offset     = 3;
            var offsetEnd  = offset + requestRegisters;
            var bitsRead   = 0;
            var bitsToRead = numberOfRegisters;
            var data       = new List <bool>();
            var dataShort  = new List <ushort>();

            for (var i = offset; i < offsetEnd; i++)
            {
                /* Shift reg hi_byte to temp */
                var temp = readFrame.Data[i];

                for (var bit = 0x00; bit < bitsToRead; bit++)
                {
                    if (bit == 8)
                    {
                        break;
                    }
                    bitsRead++;
                    var value = Utils.IsBitSet(temp, (byte)bit);
                    data.Add(value);
                    dataShort.Add(value ? (ushort)1 : (ushort)0);
                }

                bitsToRead -= bitsRead;
            }

            return(new ModBusIoStateValueReturn(ModBusRequestStatus.Success, data, dataShort));
        }