Подскажите еще, почему синтаксис функции Reads -
Reads(PortName, SlaveID, DeviceRegType, Adr, Length, &ArrVar);
в руководстве пользователя, требует взятия адреса переменной массива, а функция Writes -
Writes(PortName, SlaveID, DeviceRegType, Adr, Length, ArrVar);
не требует?

Ведь они объявлены одинаково:

typedef BOOL (*MacroFReads)(int comID, int staID, int objType, int add1, int regs, void* pRegs);
typedef BOOL (*MacroFWrites)(int comID, int staID, int objType, int add1, int regs, void* pRegs);

struct MACRO_CALL_BACK
{
WORD* pPSW;
BYTE* pPSB;
MacroFRead pRead;
MacroFReads pReads;
MacroFWrite pWrite;
MacroFWrites pWrites;

..................
}Macro;

#define Reads (Macro.pReads)
#define Write (Macro.pWrite)

Имя массива это же указатель на первый его элемент, т.е. содержит адрес первого элемента массива,
а при вызове Reads получается передается адрес этого указателя.

Можно вызывать Reads вот так:

WORD arrReadModbusRtu[62];
Reads(PLC,1,MODBUS_RTU_REG_4X,0,62,arrReadModbusRtu);