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())); }
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); }
/// <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); }
/// <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); }
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()); }
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()); }
protected abstract byte[] BuildHeaderFromDataFrame(byte[] dataFrame, byte slaveId, ModBusFunction function);
protected abstract byte[] BuildReadFrame(byte slaveId, int addr, int numberOfRegister, ModBusFunction function);
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)); }
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)); }
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)); }