Пример #1
0
 /// <summary>
 /// Gets the default number of command elements depending on the element type.
 /// </summary>
 public virtual int GetDefElemCnt(ElemType elemType)
 {
     return(ModbusUtils.GetQuantity(elemType));
 }
Пример #2
0
        /// <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
            }
        }