/// <summary> /// Gets the default number of command elements depending on the element type. /// </summary> public virtual int GetDefElemCnt(ElemType elemType) { return(ModbusUtils.GetQuantity(elemType)); }
/// <summary> /// Инициализировать PDU запроса, рассчитать длину ответа /// </summary> public override void InitReqPDU() { if (Multiple) { // формирование PDU для команды WriteMultipleCoils или WriteMultipleRegisters int quantity; // quantity of registers int dataLength; // data length in bytes if (TableType == TableType.Coils) { quantity = ElemCnt; dataLength = (ElemCnt % 8 == 0) ? ElemCnt / 8 : ElemCnt / 8 + 1; } else { quantity = ElemCnt * ModbusUtils.GetQuantity(ElemType); dataLength = quantity * 2; } ReqPDU = new byte[6 + dataLength]; ReqPDU[0] = FuncCode; ReqPDU[1] = (byte)(Address / 256); ReqPDU[2] = (byte)(Address % 256); ReqPDU[3] = (byte)(quantity / 256); ReqPDU[4] = (byte)(quantity % 256); ReqPDU[5] = (byte)dataLength; ModbusUtils.ApplyByteOrder(Data, 0, ReqPDU, 6, dataLength, ByteOrder, false); // установка длины ответа RespPduLen = 5; } else { // формирование PDU для команды WriteSingleCoil или WriteSingleRegister int dataLength = TableType == TableType.Coils ? 2 : ModbusUtils.GetDataLength(ElemType); ReqPDU = new byte[3 + dataLength]; ReqPDU[0] = FuncCode; ReqPDU[1] = (byte)(Address / 256); ReqPDU[2] = (byte)(Address % 256); if (TableType == TableType.Coils) { ReqPDU[3] = Value > 0 ? (byte)0xFF : (byte)0x00; ReqPDU[4] = 0x00; } else { byte[] data = dataLength == 2 ? new byte[] // standard Modbus { (byte)(Value / 256), (byte)(Value % 256) } : Data; ModbusUtils.ApplyByteOrder(data, 0, ReqPDU, 3, dataLength, ByteOrder, false); } // установка длины ответа RespPduLen = ReqPDU.Length; // echo } }