mirror of
https://github.com/DCC-EX/CommandStation-EX.git
synced 2024-12-24 13:21:23 +01:00
hardware test shows VPINs are off by one
This commit is contained in:
parent
ad70456341
commit
6551ce7b50
@ -253,7 +253,7 @@ void ModbusRTUComm::writeAdu(ModbusADU& adu) {
|
|||||||
if (_rePin != VPIN_NONE) ArduinoPins::fastWriteDigital(_rePin, HIGH);
|
if (_rePin != VPIN_NONE) ArduinoPins::fastWriteDigital(_rePin, HIGH);
|
||||||
_serial.write(adu.rtu, adu.getRtuLen());
|
_serial.write(adu.rtu, adu.getRtuLen());
|
||||||
_serial.flush();
|
_serial.flush();
|
||||||
//delayMicroseconds(_postDelay);
|
delayMicroseconds(_postDelay);
|
||||||
if (_dePin != VPIN_NONE) ArduinoPins::fastWriteDigital(_dePin, LOW);
|
if (_dePin != VPIN_NONE) ArduinoPins::fastWriteDigital(_dePin, LOW);
|
||||||
if (_rePin != VPIN_NONE) ArduinoPins::fastWriteDigital(_rePin, LOW);
|
if (_rePin != VPIN_NONE) ArduinoPins::fastWriteDigital(_rePin, LOW);
|
||||||
}
|
}
|
||||||
@ -515,11 +515,10 @@ 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" };
|
||||||
|
|
||||||
bool flagOK = false;
|
bool flagOK = true;
|
||||||
#if defined(MODBUS_STM_OK) && defined(MODBUS_STM_FAIL) && defined(MODBUS_STM_TICK)
|
#if defined(MODBUS_STM_COMM)
|
||||||
ArduinoPins::fastWriteDigital(MODBUS_STM_TICK,HIGH);
|
ArduinoPins::fastWriteDigital(MODBUS_STM_COMM,HIGH);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
uint8_t error;
|
uint8_t error;
|
||||||
// send reads and writes, DIAG on errors other than 0 (Success), or 3 (Invalid Quantity)
|
// 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());
|
||||||
@ -527,35 +526,42 @@ void Modbus::_loop(unsigned long currentMicros) {
|
|||||||
#ifdef DIAG_IO
|
#ifdef DIAG_IO
|
||||||
if (error == 0) DIAG(F("ModbusHR: T%d Success!"), _currentNode->getNodeID());
|
if (error == 0) DIAG(F("ModbusHR: T%d Success!"), _currentNode->getNodeID());
|
||||||
#endif
|
#endif
|
||||||
if (error == 0 || error == 3) flagOK = true;
|
if (error != 0 && error != 3) flagOK = false;
|
||||||
error = writeMultipleCoils(_currentNode->getNodeID(), 0, (char*) _currentNode->coils, _currentNode->getNumCoils());
|
error = writeMultipleCoils(_currentNode->getNodeID(), 0, (char*) _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]);
|
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
|
#ifdef DIAG_IO
|
||||||
if (error == 0) DIAG(F("ModbusMC: T%d Success!"), _currentNode->getNodeID());
|
if (error == 0) DIAG(F("ModbusMC: T%d Success!"), _currentNode->getNodeID());
|
||||||
#endif
|
#endif
|
||||||
if (error == 0 || error == 3) flagOK = true;
|
if (error != 0 && error != 3) flagOK = false;
|
||||||
error = readDiscreteInputs(_currentNode->getNodeID(), 0, (char*) _currentNode->discreteInputs, _currentNode->getNumDiscreteInputs());
|
error = readDiscreteInputs(_currentNode->getNodeID(), 0, (char*) _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]);
|
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
|
#ifdef DIAG_IO
|
||||||
if (error == 0) DIAG(F("ModbusDI: T%d Success!"), _currentNode->getNodeID());
|
if (error == 0) DIAG(F("ModbusDI: T%d Success!"), _currentNode->getNodeID());
|
||||||
#endif
|
#endif
|
||||||
if (error == 0 || error == 3) flagOK = true;
|
if (error != 0 && error != 3) flagOK = false;
|
||||||
error = readInputRegisters(_currentNode->getNodeID(), 0, (uint16_t*) _currentNode->inputRegisters, _currentNode->getNumInputRegisters());
|
error = readInputRegisters(_currentNode->getNodeID(), 0, (uint16_t*) _currentNode->inputRegisters, _currentNode->getNumInputRegisters());
|
||||||
if (error != 0 && error != 3) 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
|
#ifdef DIAG_IO
|
||||||
if (error == 0) DIAG(F("ModbusIR: T%d Success!"), _currentNode->getNodeID());
|
if (error == 0) DIAG(F("ModbusIR: T%d Success!"), _currentNode->getNodeID());
|
||||||
#endif
|
#endif
|
||||||
if (error == 0 || error == 3) flagOK = true;
|
if (error != 0 && error != 3) flagOK = false;
|
||||||
|
|
||||||
#if defined(MODBUS_STM_OK) && defined(MODBUS_STM_FAIL) && defined(MODBUS_STM_TICK)
|
#if defined(MODBUS_STM_OK)
|
||||||
if (flagOK == true) {
|
if (flagOK == true) {
|
||||||
ArduinoPins::fastWriteDigital(MODBUS_STM_OK,HIGH);
|
ArduinoPins::fastWriteDigital(MODBUS_STM_OK,HIGH);
|
||||||
ArduinoPins::fastWriteDigital(MODBUS_STM_FAIL,LOW);
|
|
||||||
} else {
|
} else {
|
||||||
ArduinoPins::fastWriteDigital(MODBUS_STM_OK,LOW);
|
ArduinoPins::fastWriteDigital(MODBUS_STM_OK,LOW);
|
||||||
ArduinoPins::fastWriteDigital(MODBUS_STM_FAIL,HIGH);
|
|
||||||
}
|
}
|
||||||
ArduinoPins::fastWriteDigital(MODBUS_STM_TICK,LOW);
|
#endif
|
||||||
|
#if defined(MODBUS_STM_FAIL)
|
||||||
|
if (flagOK == false) {
|
||||||
|
ArduinoPins::fastWriteDigital(MODBUS_STM_FAIL,HIGH);
|
||||||
|
} else {
|
||||||
|
ArduinoPins::fastWriteDigital(MODBUS_STM_FAIL,LOW);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#if defined(MODBUS_STM_COMM)
|
||||||
|
ArduinoPins::fastWriteDigital(MODBUS_STM_COMM,LOW);
|
||||||
#endif
|
#endif
|
||||||
_currentNode = _currentNode->getNext();
|
_currentNode = _currentNode->getNext();
|
||||||
}
|
}
|
||||||
|
24
IO_Modbus.h
24
IO_Modbus.h
@ -219,10 +219,11 @@ public:
|
|||||||
// 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;
|
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;
|
||||||
if (value == 0) coils[pin] = (char*) 0x0;
|
if (value == 0) coils[pin] = (char*) 0x0;
|
||||||
//coils[pin] = value;
|
//coils[pin] = value;
|
||||||
|
}
|
||||||
else
|
else
|
||||||
coils[pin];
|
coils[pin];
|
||||||
}
|
}
|
||||||
@ -231,16 +232,16 @@ public:
|
|||||||
int _readAnalogue(VPIN vpin) override {
|
int _readAnalogue(VPIN vpin) override {
|
||||||
// Return acquired data value, e.g.
|
// Return acquired data value, e.g.
|
||||||
int pin = vpin - _firstVpin - _numDiscreteInputs - _numCoils;
|
int pin = vpin - _firstVpin - _numDiscreteInputs - _numCoils;
|
||||||
return (int) inputRegisters[pin];
|
return (int) inputRegisters[pin-1];
|
||||||
}
|
}
|
||||||
|
|
||||||
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 - _numCoils - _numInputRegisters;
|
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-1] = (uint16_t*) value;
|
||||||
else
|
else
|
||||||
holdingRegisters[pin];
|
holdingRegisters[pin-1];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -336,14 +337,19 @@ public:
|
|||||||
void _begin() override {
|
void _begin() override {
|
||||||
_serialD->begin(_baud, SERIAL_8N1);
|
_serialD->begin(_baud, SERIAL_8N1);
|
||||||
_rtuComm.begin(_baud, SERIAL_8N1);
|
_rtuComm.begin(_baud, SERIAL_8N1);
|
||||||
#if defined(MODBUS_STM_OK) && defined(MODBUS_STM_FAIL) && defined(MODBUS_STM_TICK)
|
#if defined(MODBUS_STM_OK)
|
||||||
pinMode(MODBUS_STM_OK, OUTPUT);
|
pinMode(MODBUS_STM_OK, OUTPUT);
|
||||||
pinMode(MODBUS_STM_FAIL, OUTPUT);
|
|
||||||
pinMode(MODBUS_STM_TICK, OUTPUT);
|
|
||||||
ArduinoPins::fastWriteDigital(MODBUS_STM_OK,LOW);
|
ArduinoPins::fastWriteDigital(MODBUS_STM_OK,LOW);
|
||||||
ArduinoPins::fastWriteDigital(MODBUS_STM_FAIL,LOW);
|
|
||||||
ArduinoPins::fastWriteDigital(MODBUS_STM_TICK,LOW);
|
|
||||||
#endif
|
#endif
|
||||||
|
#if defined(MODBUS_STM_FAIL)
|
||||||
|
pinMode(MODBUS_STM_FAIL, OUTPUT);
|
||||||
|
ArduinoPins::fastWriteDigital(MODBUS_STM_FAIL,LOW);
|
||||||
|
#endif
|
||||||
|
#if defined(MODBUS_STM_COMM)
|
||||||
|
pinMode(MODBUS_STM_COMM, OUTPUT);
|
||||||
|
ArduinoPins::fastWriteDigital(MODBUS_STM_COMM,LOW);
|
||||||
|
#endif
|
||||||
|
|
||||||
#if defined(DIAG_IO)
|
#if defined(DIAG_IO)
|
||||||
_display();
|
_display();
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
Reference in New Issue
Block a user