diff --git a/IO_Modbus.cpp b/IO_Modbus.cpp index 17e0878..6ff0ce0 100644 --- a/IO_Modbus.cpp +++ b/IO_Modbus.cpp @@ -276,11 +276,11 @@ void Modbus::setTimeout(unsigned long timeout) { -ModbusRTUMasterError Modbus::readCoils(uint8_t id, uint16_t startAddress, char buf[], uint16_t quantity) { +ModbusRTUMasterError Modbus::readCoils(uint8_t id, uint16_t startAddress, int buf[], uint16_t quantity) { return _readValues(id, 1, startAddress, buf, quantity); } -ModbusRTUMasterError Modbus::readDiscreteInputs(uint8_t id, uint16_t startAddress, char buf[], uint16_t quantity) { +ModbusRTUMasterError Modbus::readDiscreteInputs(uint8_t id, uint16_t startAddress, int buf[], uint16_t quantity) { return _readValues(id, 2, startAddress, buf, quantity); } @@ -294,7 +294,7 @@ ModbusRTUMasterError Modbus::readInputRegisters(uint8_t id, uint16_t startAddres -ModbusRTUMasterError Modbus::writeSingleCoil(uint8_t id, uint16_t address, char value) { +ModbusRTUMasterError Modbus::writeSingleCoil(uint8_t id, uint16_t address, int value) { return _writeSingleValue(id, 5, address, ((value) ? 0xFF00 : 0x0000)); } @@ -304,7 +304,7 @@ ModbusRTUMasterError Modbus::writeSingleHoldingRegister(uint8_t id, uint16_t add -ModbusRTUMasterError Modbus::writeMultipleCoils(uint8_t id, uint16_t startAddress, char buf[], uint16_t quantity) { +ModbusRTUMasterError Modbus::writeMultipleCoils(uint8_t id, uint16_t startAddress, int buf[], uint16_t quantity) { const uint8_t functionCode = 15; if (id > 247) return MODBUS_RTU_MASTER_INVALID_ID; if (!buf) return MODBUS_RTU_MASTER_INVALID_BUFFER; @@ -379,7 +379,7 @@ uint8_t Modbus::getExceptionResponse() { -ModbusRTUMasterError Modbus::_readValues(uint8_t id, uint8_t functionCode, uint16_t startAddress, char buf[], uint16_t quantity) { +ModbusRTUMasterError Modbus::_readValues(uint8_t id, uint8_t functionCode, uint16_t startAddress, int buf[], uint16_t quantity) { if (id < 1 || id > 247) return MODBUS_RTU_MASTER_INVALID_ID; if (!buf) return MODBUS_RTU_MASTER_INVALID_BUFFER; if (quantity == 0 || quantity > 2000) return MODBUS_RTU_MASTER_INVALID_QUANTITY; @@ -402,7 +402,7 @@ ModbusRTUMasterError Modbus::_readValues(uint8_t id, uint8_t functionCode, uint1 if (adu.getDataLen() != (1 + byteCount)) return MODBUS_RTU_MASTER_UNEXPECTED_LENGTH; if (adu.data[0] != byteCount) return MODBUS_RTU_MASTER_UNEXPECTED_BYTE_COUNT; for (uint16_t i = 0; i < quantity; i++) { - buf[i] = (char) bitRead(adu.data[1 + (i >> 3)], i & 7); + buf[i] = (int) bitRead(adu.data[1 + (i >> 3)], i & 7)? 1:0; } return MODBUS_RTU_MASTER_SUCCESS; } @@ -527,13 +527,13 @@ void Modbus::_loop(unsigned long currentMicros) { if (error == 0) DIAG(F("ModbusHR: T%d Success!"), _currentNode->getNodeID()); #endif if (error != 0 && error != 3) flagOK = false; - error = writeMultipleCoils(_currentNode->getNodeID(), 0, (char*) _currentNode->coils, _currentNode->getNumCoils()); + error = writeMultipleCoils(_currentNode->getNodeID(), 0, (int*) _currentNode->coils, _currentNode->getNumCoils()); if (error != 0 && error != 3) DIAG(F("ModbusMC: T%d F%d N%d %s"), _currentNode->getNodeID(), 0, _currentNode->getNumCoils(), errorStrings[error]); #ifdef DIAG_IO if (error == 0) DIAG(F("ModbusMC: T%d Success!"), _currentNode->getNodeID()); #endif if (error != 0 && error != 3) flagOK = false; - error = readDiscreteInputs(_currentNode->getNodeID(), 0, (char*) _currentNode->discreteInputs, _currentNode->getNumDiscreteInputs()); + error = readDiscreteInputs(_currentNode->getNodeID(), 0, (int*) _currentNode->discreteInputs, _currentNode->getNumDiscreteInputs()); if (error != 0 && error != 3) DIAG(F("ModbusDI: T%d F%d N%d %s"), _currentNode->getNodeID(), 0, _currentNode->getNumDiscreteInputs(), errorStrings[error]); #ifdef DIAG_IO if (error == 0) DIAG(F("ModbusDI: T%d Success!"), _currentNode->getNodeID()); diff --git a/IO_Modbus.h b/IO_Modbus.h index 55fba17..5539808 100644 --- a/IO_Modbus.h +++ b/IO_Modbus.h @@ -168,10 +168,10 @@ public: if (checkNoOverlap(firstVpin, nPins)) new Modbusnode(firstVpin, nPins, busNo, nodeID, numCoils, numDiscreteInputs, numHoldingRegisters, numInputRegisters); } Modbusnode(VPIN firstVpin, int nPins, uint8_t busNo, uint8_t nodeID, uint8_t numCoils, uint8_t numDiscreteInputs, uint8_t numHoldingRegisters, uint8_t numInputRegisters); - char *coils[1968]; - char *discreteInputs[2000]; - uint16_t *holdingRegisters[123]; - uint16_t *inputRegisters[125]; + int *coils[100]; + int *discreteInputs[100]; + uint16_t *holdingRegisters[100]; + uint16_t *inputRegisters[100]; uint8_t getNodeID() { return _nodeID; @@ -215,8 +215,8 @@ public: void _write(VPIN vpin, int value) override { // Update current state for this device, in preparation the bus transmission uint16_t pin = vpin - _firstVpin - _numDiscreteInputs; - if (value == 1) coils[pin] = (char*) 0x1; - if (value == 0) coils[pin] = (char*) 0x0; + if (value == 1) coils[pin] = (int*) 0x1; + if (value == 0) coils[pin] = (int*) 0x0; } int _readAnalogue(VPIN vpin) { @@ -309,7 +309,7 @@ private: unsigned long _byteTransmitTime; // time in us for transmission of one byte static Modbus *_busList; // linked list of defined bus instances - ModbusRTUMasterError _readValues(uint8_t id, uint8_t functionCode, uint16_t startAddress, char buf[], uint16_t quantity); + ModbusRTUMasterError _readValues(uint8_t id, uint8_t functionCode, uint16_t startAddress, int buf[], uint16_t quantity); ModbusRTUMasterError _readValues(uint8_t id, uint8_t functionCode, uint16_t startAddress, uint16_t buf[], uint16_t quantity); ModbusRTUMasterError _writeSingleValue(uint8_t id, uint8_t functionCode, uint16_t address, uint16_t value); public: @@ -340,14 +340,14 @@ public: #endif } ModbusRTUMasterError _translateCommError(ModbusRTUCommError commError); - ModbusRTUMasterError readCoils(uint8_t id, uint16_t startAddress, char buf[], uint16_t quantity); - ModbusRTUMasterError readDiscreteInputs(uint8_t id, uint16_t startAddress, char buf[], uint16_t quantity); + ModbusRTUMasterError readCoils(uint8_t id, uint16_t startAddress, int buf[], uint16_t quantity); + ModbusRTUMasterError readDiscreteInputs(uint8_t id, uint16_t startAddress, int buf[], uint16_t quantity); ModbusRTUMasterError readHoldingRegisters(uint8_t id, uint16_t startAddress, uint16_t buf[], uint16_t quantity); ModbusRTUMasterError readInputRegisters(uint8_t id, uint16_t startAddress, uint16_t buf[], uint16_t quantity); - ModbusRTUMasterError writeSingleCoil(uint8_t id, uint16_t address, char value); + ModbusRTUMasterError writeSingleCoil(uint8_t id, uint16_t address, int value); ModbusRTUMasterError writeSingleHoldingRegister(uint8_t id, uint16_t address, uint16_t value); - ModbusRTUMasterError writeMultipleCoils(uint8_t id, uint16_t startAddress, char buf[], uint16_t quantity); + ModbusRTUMasterError writeMultipleCoils(uint8_t id, uint16_t startAddress, int buf[], uint16_t quantity); ModbusRTUMasterError writeMultipleHoldingRegisters(uint8_t id, uint16_t startAddress, uint16_t buf[], uint16_t quantity); // Loop function (overriding IODevice::_loop(unsigned long)) void _loop(unsigned long currentMicros) override;