MCPcopy Create free account
hub / github.com/4-20ma/ModbusMaster / ModbusMasterTransaction

Method ModbusMasterTransaction

src/ModbusMaster.cpp:600–876  ·  view source on GitHub ↗

_____PRIVATE FUNCTIONS____________________________________________________ */ Modbus transaction engine. Sequence: - assemble Modbus Request Application Data Unit (ADU), based on particular function called - transmit request over selected serial port - wait for/retrieve response - evaluate/disassemble response - return status (success/exception) @param u8MBFunction Modbus function (

Source from the content-addressed store, hash-verified

598@return 0 on success; exception number on failure
599*/
600uint8_t ModbusMaster::ModbusMasterTransaction(uint8_t u8MBFunction)
601{
602 uint8_t u8ModbusADU[256];
603 uint8_t u8ModbusADUSize = 0;
604 uint8_t i, u8Qty;
605 uint16_t u16CRC;
606 uint32_t u32StartTime;
607 uint8_t u8BytesLeft = 8;
608 uint8_t u8MBStatus = ku8MBSuccess;
609
610 // assemble Modbus Request Application Data Unit
611 u8ModbusADU[u8ModbusADUSize++] = _u8MBSlave;
612 u8ModbusADU[u8ModbusADUSize++] = u8MBFunction;
613
614 switch(u8MBFunction)
615 {
616 case ku8MBReadCoils:
617 case ku8MBReadDiscreteInputs:
618 case ku8MBReadInputRegisters:
619 case ku8MBReadHoldingRegisters:
620 case ku8MBReadWriteMultipleRegisters:
621 u8ModbusADU[u8ModbusADUSize++] = highByte(_u16ReadAddress);
622 u8ModbusADU[u8ModbusADUSize++] = lowByte(_u16ReadAddress);
623 u8ModbusADU[u8ModbusADUSize++] = highByte(_u16ReadQty);
624 u8ModbusADU[u8ModbusADUSize++] = lowByte(_u16ReadQty);
625 break;
626 }
627
628 switch(u8MBFunction)
629 {
630 case ku8MBWriteSingleCoil:
631 case ku8MBMaskWriteRegister:
632 case ku8MBWriteMultipleCoils:
633 case ku8MBWriteSingleRegister:
634 case ku8MBWriteMultipleRegisters:
635 case ku8MBReadWriteMultipleRegisters:
636 u8ModbusADU[u8ModbusADUSize++] = highByte(_u16WriteAddress);
637 u8ModbusADU[u8ModbusADUSize++] = lowByte(_u16WriteAddress);
638 break;
639 }
640
641 switch(u8MBFunction)
642 {
643 case ku8MBWriteSingleCoil:
644 u8ModbusADU[u8ModbusADUSize++] = highByte(_u16WriteQty);
645 u8ModbusADU[u8ModbusADUSize++] = lowByte(_u16WriteQty);
646 break;
647
648 case ku8MBWriteSingleRegister:
649 u8ModbusADU[u8ModbusADUSize++] = highByte(_u16TransmitBuffer[0]);
650 u8ModbusADU[u8ModbusADUSize++] = lowByte(_u16TransmitBuffer[0]);
651 break;
652
653 case ku8MBWriteMultipleCoils:
654 u8ModbusADU[u8ModbusADUSize++] = highByte(_u16WriteQty);
655 u8ModbusADU[u8ModbusADUSize++] = lowByte(_u16WriteQty);
656 u8Qty = (_u16WriteQty % 8) ? ((_u16WriteQty >> 3) + 1) : (_u16WriteQty >> 3);
657 u8ModbusADU[u8ModbusADUSize++] = u8Qty;

Callers

nothing calls this directly

Calls 2

crc16_updateFunction · 0.85
availableMethod · 0.80

Tested by

no test coverage detected