mirror of
https://github.com/DCC-EX/CommandStation-EX.git
synced 2024-12-25 05:31:24 +01:00
cleaning up IO_Modbus
This commit is contained in:
parent
d0bbdae714
commit
6df1774f17
@ -487,32 +487,19 @@ Modbus::Modbus(uint8_t busNo, HardwareSerial &serial, unsigned long baud, uint16
|
|||||||
_serialD = &serial;
|
_serialD = &serial;
|
||||||
_txPin = txPin;
|
_txPin = txPin;
|
||||||
_rtuComm.setTimeout(500);
|
_rtuComm.setTimeout(500);
|
||||||
|
|
||||||
|
|
||||||
_busNo = busNo;
|
_busNo = busNo;
|
||||||
_cycleTime = cycleTimeMS * 1000UL; // convert from milliseconds to microseconds.
|
_cycleTime = cycleTimeMS * 1000UL; // convert from milliseconds to microseconds.
|
||||||
//if (_transmitEnablePin != VPIN_NONE) {
|
|
||||||
//pinMode(_transmitEnablePin, OUTPUT);
|
|
||||||
//ArduinoPins::fastWriteDigital(_transmitEnablePin, 0); // transmitter initially off
|
|
||||||
//}
|
|
||||||
|
|
||||||
//_serial->begin(baud);
|
|
||||||
//_modbusmaster.begin(baud);
|
|
||||||
//DIAG(F("ModbusInit: %d %d"), _transmitEnablePin, _baud);
|
|
||||||
// Add device to HAL device chain
|
// Add device to HAL device chain
|
||||||
|
|
||||||
IODevice::addDevice(this);
|
IODevice::addDevice(this);
|
||||||
|
|
||||||
// Add bus to CMRIbus chain.
|
// Add bus to Modbus chain.
|
||||||
_nextBus = _busList;
|
_nextBus = _busList;
|
||||||
_busList = this;
|
_busList = this;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Main loop function for Modbus.
|
// Main loop function for Modbus.
|
||||||
// Work through list of nodes. For each node, in separate loop entries
|
// Work through list of nodes. For each node, in separate loop entries
|
||||||
// send initialisation message (once only); then send
|
|
||||||
// output message; then send prompt for input data, and
|
|
||||||
// process any response data received.
|
|
||||||
// When the slot time has finished, move on to the next device.
|
// When the slot time has finished, move on to the next device.
|
||||||
void Modbus::_loop(unsigned long currentMicros) {
|
void Modbus::_loop(unsigned long currentMicros) {
|
||||||
_currentMicros = currentMicros;
|
_currentMicros = currentMicros;
|
||||||
@ -521,7 +508,7 @@ void Modbus::_loop(unsigned long currentMicros) {
|
|||||||
_currentNode = _nodeListStart;
|
_currentNode = _nodeListStart;
|
||||||
|
|
||||||
}
|
}
|
||||||
//DIAG(F("Modbus Loop: %d : %d :: %d"), _currentMicros, _cycleStartTime, _currentNode);
|
|
||||||
if (_currentMicros - _cycleStartTime < _cycleTime) return;
|
if (_currentMicros - _cycleStartTime < _cycleTime) return;
|
||||||
_cycleStartTime = _currentMicros;
|
_cycleStartTime = _currentMicros;
|
||||||
if (_currentNode == NULL) return;
|
if (_currentNode == NULL) return;
|
||||||
@ -529,21 +516,29 @@ void Modbus::_loop(unsigned long currentMicros) {
|
|||||||
const char* errorStrings[16] = { "success", "invalid id", "invalid buffer", "invalid quantity", "response timeout", "frame error", "crc error", "unknown comm error", "unexpected id", "exception response", "unexpected function code", "unexpected response length", "unexpected byte count", "unexpected address", "unexpected value", "unexpected quantity" };
|
const char* errorStrings[16] = { "success", "invalid id", "invalid buffer", "invalid quantity", "response timeout", "frame error", "crc error", "unknown comm error", "unexpected id", "exception response", "unexpected function code", "unexpected response length", "unexpected byte count", "unexpected address", "unexpected value", "unexpected quantity" };
|
||||||
|
|
||||||
uint8_t error;
|
uint8_t error;
|
||||||
|
// send reads and writes, DIAG on errors other than 0 (Success), or 3 (Invalid Quantity)
|
||||||
error = writeMultipleHoldingRegisters(_currentNode->getNodeID(), 0, (uint16_t*) _currentNode->holdingRegisters, _currentNode->getNumHoldingRegisters());
|
error = writeMultipleHoldingRegisters(_currentNode->getNodeID(), 0, (uint16_t*) _currentNode->holdingRegisters, _currentNode->getNumHoldingRegisters());
|
||||||
DIAG(F("ModbusHR: T%d F%d N%d %s"), _currentNode->getNodeID(), 0, _currentNode->getNumHoldingRegisters(), errorStrings[error]);
|
if (error != 0 || error != 3) DIAG(F("ModbusHR: T%d F%d N%d %s"), _currentNode->getNodeID(), 0, _currentNode->getNumHoldingRegisters(), errorStrings[error]);
|
||||||
|
#ifdef DIAG_IO
|
||||||
|
if (error == 0) DIAG(F("ModbusHR: T%d Success!"), _currentNode->getNodeID());
|
||||||
|
#endif
|
||||||
error = writeMultipleCoils(_currentNode->getNodeID(), 0, (char*) _currentNode->coils, _currentNode->getNumCoils());
|
error = writeMultipleCoils(_currentNode->getNodeID(), 0, (char*) _currentNode->coils, _currentNode->getNumCoils());
|
||||||
DIAG(F("ModbusMC: T%d F%d N%d %s"), _currentNode->getNodeID(), 0, _currentNode->getNumCoils(), errorStrings[error]);
|
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
|
||||||
error = readDiscreteInputs(_currentNode->getNodeID(), 0, (char*) _currentNode->discreteInputs, _currentNode->getNumDiscreteInputs());
|
error = readDiscreteInputs(_currentNode->getNodeID(), 0, (char*) _currentNode->discreteInputs, _currentNode->getNumDiscreteInputs());
|
||||||
DIAG(F("ModbusDI: T%d F%d N%d %s"), _currentNode->getNodeID(), 0, _currentNode->getNumDiscreteInputs(), errorStrings[error]);
|
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());
|
||||||
|
#endif
|
||||||
error = readInputRegisters(_currentNode->getNodeID(), 0, (uint16_t*) _currentNode->inputRegisters, _currentNode->getNumInputRegisters());
|
error = readInputRegisters(_currentNode->getNodeID(), 0, (uint16_t*) _currentNode->inputRegisters, _currentNode->getNumInputRegisters());
|
||||||
DIAG(F("ModbusIR: T%d F%d N%d %s"), _currentNode->getNodeID(), 0, _currentNode->getNumInputRegisters(), errorStrings[error]);
|
if (error != 0 || error != 3) DIAG(F("ModbusIR: T%d F%d N%d %s"), _currentNode->getNodeID(), 0, _currentNode->getNumInputRegisters(), errorStrings[error]);
|
||||||
|
#ifdef DIAG_IO
|
||||||
|
if (error == 0) DIAG(F("ModbusIR: T%d Success!"), _currentNode->getNodeID());
|
||||||
|
#endif
|
||||||
|
|
||||||
_currentNode = _currentNode->getNext();
|
_currentNode = _currentNode->getNext();
|
||||||
//delayUntil(_currentMicros + _cycleTime * 1000UL);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Link to chain of Modbus instances
|
// Link to chain of Modbus instances
|
||||||
|
66
IO_Modbus.h
66
IO_Modbus.h
@ -229,15 +229,10 @@ public:
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int _readAnalogue(VPIN vpin) override {
|
|
||||||
// Return acquired data value, e.g.
|
|
||||||
int pin = vpin - _firstVpin - _numDiscreteInputs;
|
|
||||||
return (int) inputRegisters[pin];
|
|
||||||
}
|
|
||||||
|
|
||||||
void _write(VPIN vpin, int value) override {
|
void _write(VPIN vpin, int value) override {
|
||||||
// Update current state for this device, in preparation the bus transmission
|
// Update current state for this device, in preparation the bus transmission
|
||||||
uint16_t pin = vpin - _firstVpin - _numDiscreteInputs - _numInputRegisters;
|
uint16_t pin = vpin - _firstVpin - _numDiscreteInputs;
|
||||||
if (pin < _numCoils) {
|
if (pin < _numCoils) {
|
||||||
if (value)
|
if (value)
|
||||||
if (value == 1) coils[pin] = (char*) 0x1;
|
if (value == 1) coils[pin] = (char*) 0x1;
|
||||||
@ -248,8 +243,14 @@ public:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int _readAnalogue(VPIN vpin) override {
|
||||||
|
// Return acquired data value, e.g.
|
||||||
|
int pin = vpin - _firstVpin - _numDiscreteInputs - _numCoils;
|
||||||
|
return (int) inputRegisters[pin];
|
||||||
|
}
|
||||||
|
|
||||||
void _writeAnalogue(VPIN vpin, int value, uint8_t param1=0, uint16_t param2=0) override {
|
void _writeAnalogue(VPIN vpin, int value, uint8_t param1=0, uint16_t param2=0) override {
|
||||||
uint16_t pin = vpin - _firstVpin - _numDiscreteInputs - _numInputRegisters - _numCoils;
|
uint16_t pin = vpin - _firstVpin - _numDiscreteInputs - _numCoils - _numInputRegisters;
|
||||||
if (pin < _numHoldingRegisters) {
|
if (pin < _numHoldingRegisters) {
|
||||||
if (value)
|
if (value)
|
||||||
holdingRegisters[pin] = (uint16_t*) value;
|
holdingRegisters[pin] = (uint16_t*) value;
|
||||||
@ -258,18 +259,50 @@ public:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
char getType() {
|
|
||||||
return _type;
|
|
||||||
}
|
|
||||||
|
|
||||||
uint8_t getBusNumber() {
|
uint8_t getBusNumber() {
|
||||||
return _busNo;
|
return _busNo;
|
||||||
}
|
}
|
||||||
|
uint8_t getNumBinaryInputsVPINsMin() {
|
||||||
|
if (_numDiscreteInputs > 0) return _firstVpin;
|
||||||
|
else return 0;
|
||||||
|
}
|
||||||
|
uint8_t getNumBinaryInputsVPINsMax() {
|
||||||
|
if (_numDiscreteInputs > 0) return _firstVpin+_numDiscreteInputs-1;
|
||||||
|
else return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t getNumBinaryOutputsVPINsMin() {
|
||||||
|
if (_numCoils > 0) return _firstVpin+_numDiscreteInputs;
|
||||||
|
else return 0;
|
||||||
|
}
|
||||||
|
uint8_t getNumBinaryOutputsVPINsMax() {
|
||||||
|
if (_numCoils > 0) return _firstVpin+_numDiscreteInputs+_numCoils-1;
|
||||||
|
else return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t getNumAnalogInputsVPINsMin() {
|
||||||
|
if (_numInputRegisters > 0) return _firstVpin+_numDiscreteInputs+_numCoils;
|
||||||
|
else return 0;
|
||||||
|
}
|
||||||
|
uint8_t getNumAnalogInputsVPINsMax() {
|
||||||
|
if (_numInputRegisters > 0) return _firstVpin+_numDiscreteInputs+_numCoils+_numInputRegisters-1;
|
||||||
|
else return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t getNumAnalogOutputsVPINsMin() {
|
||||||
|
if (_numHoldingRegisters > 0) return _firstVpin+_numDiscreteInputs+_numCoils+_numInputRegisters;
|
||||||
|
else return 0;
|
||||||
|
}
|
||||||
|
uint8_t getNumAnalogOutputsVPINsMax() {
|
||||||
|
if (_numHoldingRegisters > 0) return _firstVpin+_numDiscreteInputs+_numCoils+_numInputRegisters+_numHoldingRegisters-1;
|
||||||
|
else return 0;
|
||||||
|
}
|
||||||
void _display() override {
|
void _display() override {
|
||||||
DIAG(F("Modbusnode configured on bus:%d nodeID:%d VPINs:%u-%u (in) %u-%u (out)"),
|
DIAG(F("Modbusnode configured on bus:%d nodeID:%d VPINs:%u-%u (B In) %u-%u (B Out) %u-%u (A In) %u-%u (A Out)"),
|
||||||
_busNo, _nodeID, _firstVpin, _firstVpin+_numDiscreteInputs-1,
|
_busNo, _nodeID, getNumBinaryInputsVPINsMin(), getNumBinaryInputsVPINsMax(),
|
||||||
_firstVpin+_numDiscreteInputs, _firstVpin+_numDiscreteInputs+_numCoils-1);
|
getNumBinaryOutputsVPINsMin(), getNumBinaryOutputsVPINsMax(),
|
||||||
|
getNumAnalogInputsVPINsMin(), getNumAnalogInputsVPINsMax(),
|
||||||
|
getNumAnalogOutputsVPINsMin(), getNumAnalogOutputsVPINsMax());
|
||||||
}
|
}
|
||||||
|
|
||||||
};
|
};
|
||||||
@ -313,17 +346,12 @@ public:
|
|||||||
new Modbus(busNo, serial, baud, cycleTimeMS, txPin);
|
new Modbus(busNo, serial, baud, cycleTimeMS, txPin);
|
||||||
}
|
}
|
||||||
HardwareSerial *_serialD;
|
HardwareSerial *_serialD;
|
||||||
//ModbusRTUMaster *_modbusmaster;
|
|
||||||
ModbusRTUComm _rtuComm;
|
ModbusRTUComm _rtuComm;
|
||||||
// Device-specific initialisation
|
// Device-specific initialisation
|
||||||
void _begin() override {
|
void _begin() override {
|
||||||
//ModbusRTUMaster _modbusmaster(*_serialD, _transmitEnablePin, -1);
|
|
||||||
_serialD->begin(_baud, SERIAL_8N1);
|
_serialD->begin(_baud, SERIAL_8N1);
|
||||||
//ModbusRTUMaster _modbusmaster(*_serialD, _txPin, -1);
|
|
||||||
_rtuComm.begin(_baud, SERIAL_8N1);
|
_rtuComm.begin(_baud, SERIAL_8N1);
|
||||||
|
|
||||||
//_serialD->println("test");
|
|
||||||
|
|
||||||
#if defined(DIAG_IO)
|
#if defined(DIAG_IO)
|
||||||
_display();
|
_display();
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
Reference in New Issue
Block a user