_____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 (
| 598 | @return 0 on success; exception number on failure |
| 599 | */ |
| 600 | uint8_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; |
nothing calls this directly
no test coverage detected