diff --git a/Modbus-CAPL/include/CAPL/MakeConfig.can b/Modbus-CAPL/include/CAPL/MakeConfig.can index 85b4a9b..06ff150 100644 --- a/Modbus-CAPL/include/CAPL/MakeConfig.can +++ b/Modbus-CAPL/include/CAPL/MakeConfig.can @@ -247,6 +247,10 @@ void OnModbusReadRegistersFailed(enum ModbusRequestError error, enum ModbusExcep case NotSent: writeLineEx(0, 3, "Error while analyzing %s! The device was not available! Ignoring...", gIpsSorted[ips[ADi]].IP); break; + default: + writeLinEx(0, 3, "OnModbusReadRegistersFailed: Unknown error: %d", error); + OnModbusClientPanics(SwitchArgumentInvalid); + return; } gQueueAck.Clear(); // Clear all queues gQueuePending.Clear(); @@ -406,7 +410,7 @@ void GenSysvars() // Namespace Data PutString(" \n"); // InputRegisters - PutString(" \n"); // InputBits @@ -414,7 +418,7 @@ void GenSysvars() PutString(gIpsSorted[ipN].DeviceIOs.InputBits); PutString("\" />\n"); // OutputRegisters - PutString(" \n"); // OutputBits diff --git a/Modbus-CAPL/include/CAPL/PollingModbusClient.can b/Modbus-CAPL/include/CAPL/PollingModbusClient.can index be43cd1..42a7f7f 100644 --- a/Modbus-CAPL/include/CAPL/PollingModbusClient.can +++ b/Modbus-CAPL/include/CAPL/PollingModbusClient.can @@ -68,8 +68,8 @@ void OnModbusReadBitsFailed(enum ModbusRequestError error, enum ModbusException switch (error) { case Exception: - break; case Timeout: + case NotSent: break; case FinalTimeout: sysBeginVariableStructUpdate("%BUS_TYPE%%CHANNEL%::%NODE_NAME%::Data", "InputBits"); @@ -77,6 +77,10 @@ void OnModbusReadBitsFailed(enum ModbusRequestError error, enum ModbusException @sysvar::%BUS_TYPE%%CHANNEL%::%NODE_NAME%::Data::InputBits[i] = -1; sysEndVariableStructUpdate("%BUS_TYPE%%CHANNEL%::%NODE_NAME%::Data", "InputBits"); break; + default: + writeDbg(MbError, "OnModbusReadBitsFailed: Unkown error: %d", error); + OnModbusClientPanics(SwitchArgumentInvalid); + return; } } @@ -88,8 +92,8 @@ void OnModbusReadRegistersFailed(enum ModbusRequestError error, enum ModbusExcep switch (error) { case Exception: - break; case Timeout: + case NotSent: break; case FinalTimeout: sysBeginVariableStructUpdate("%BUS_TYPE%%CHANNEL%::%NODE_NAME%::Data", "InputRegisters"); @@ -97,6 +101,10 @@ void OnModbusReadRegistersFailed(enum ModbusRequestError error, enum ModbusExcep @sysvar::%BUS_TYPE%%CHANNEL%::%NODE_NAME%::Data::InputRegisters[i] = -1; sysEndVariableStructUpdate("%BUS_TYPE%%CHANNEL%::%NODE_NAME%::Data", "InputRegisters"); break; + default: + writeDbg(MbError, "OnModbusReadBitsFailed: Unkown error: %d", error); + OnModbusClientPanics(SwitchArgumentInvalid); + return; } } @@ -145,6 +153,11 @@ void OnModbusReadBitsSuccess(struct ModbusResReceiveBits mbres, byte bitStatus[] sysEndVariableStructUpdate("%BUS_TYPE%%CHANNEL%::%NODE_NAME%::Data", "InputBits"); break; + + default: + writeDbg(MbError, "OnModbusReadBitsSuccess: Unexpected function code: 0x%02X", mbreq.Header.FuncCode); + OnModbusClientPanics(FuncCodeIncorrect); + return; } } @@ -175,6 +188,11 @@ void OnModbusReadRegistersSuccess(struct ModbusResReceiveRegisters mbres, struct sysEndVariableStructUpdate("%BUS_TYPE%%CHANNEL%::%NODE_NAME%::Data", "InputRegisters"); break; + + default: + writeDbg(MbError, "OnModbusReadBitsSuccess: Unexpected function code: 0x%02X", mbreq.Header.FuncCode); + OnModbusClientPanics(FuncCodeIncorrect); + return; } } @@ -197,7 +215,7 @@ void OnModbusClientPanics(enum FatalErrors reason) switch(reason) { case ParsingBuffer: - writeLineEx(0, 4, "<%NODE_NAME%> Fatal Error while parsing the received buffer", reason); + writeLineEx(0, 4, "<%NODE_NAME%> Fatal Error while parsing the received buffer"); runError(1001, reason); break; case ModbusPackageWasSplit: @@ -205,22 +223,27 @@ void OnModbusClientPanics(enum FatalErrors reason) runError(1001, reason); break; case VendorIdUnknown: - writeLineEx(0, 4, "<%NODE_NAME%> Fatal Error: Vendor ID unknown", reason); + writeLineEx(0, 4, "<%NODE_NAME%> Fatal Error: Vendor ID unknown"); runError(1001, reason); break; case FuncCodeIncorrect: - writeLineEx(0, 4, "<%NODE_NAME%> Fatal Error: Function code is incorrect", reason); + writeLineEx(0, 4, "<%NODE_NAME%> Fatal Error: Function code is incorrect"); runError(1001, reason); break; case AddressFailure: - writeLineEx(0, 4, "<%NODE_NAME%> Fatal Error: Start address is incorrect", reason); + writeLineEx(0, 4, "<%NODE_NAME%> Fatal Error: Start address is incorrect"); runError(1001, reason); break; case ConnectionError: - writeLineEx(0, 4, "<%NODE_NAME%> Fatal Connection Error", reason); + writeLineEx(0, 4, "<%NODE_NAME%> Fatal Connection Error"); gtRead.Cancel(); break; + case SwitchArgumentInvalid: + writeLineEx(0, 4, "<%NODE_NAME%> Fatal Error: A argument of a switch statement is incorrect"); + runError(1001, reason); + break; } + stop(); } // ------------------------------------------------------------------------- diff --git a/Modbus-CAPL/include/CAPL/include/DeviceInformation.cin b/Modbus-CAPL/include/CAPL/include/DeviceInformation.cin index 1382662..7cd79e3 100644 --- a/Modbus-CAPL/include/CAPL/include/DeviceInformation.cin +++ b/Modbus-CAPL/include/CAPL/include/DeviceInformation.cin @@ -92,7 +92,7 @@ void DeviceInit(byte vendor) thisDev.Addr.Read.OutputRegisters = 0x0800; // B&R reading analog outputs start at 0x800 thisDev.Addr.Write.OutputBits = 0x0000; // B&R writing outputs start at 0x000 thisDev.Addr.Write.OutputRegisters = 0x0000; - thisDev.MaxBitCount = 0x4000; // B&R allows up to 16348 digital inputs + thisDev.MaxBitCount = 0x4000; // B&R allows up to 16384 digital inputs thisDev.MaxRegisterCount = 0x0800; // B&R allows up to 2048 analog inputs thisDev.ReceiveWindow = 1; // B&R can only handle 1 request at a time break; diff --git a/Modbus-CAPL/include/CAPL/include/ModbusClient.cin b/Modbus-CAPL/include/CAPL/include/ModbusClient.cin index 21f8767..709cd68 100644 --- a/Modbus-CAPL/include/CAPL/include/ModbusClient.cin +++ b/Modbus-CAPL/include/CAPL/include/ModbusClient.cin @@ -877,6 +877,10 @@ void _OnModbusReceive2Exceptions(byte exCode, struct ModbusApHeader mbap) case 0x80+ReadWriteRegisters: _OnModbusReceiveConfirmRegistersException(mbap, ex); break; + default: + writeDbg(MbError, "_OnModbusReceive2Exceptions: Got incorrect exception function code 0x%02X!", mbap.FuncCode); + OnModbusClientPanics(FuncCodeIncorrect); + break; } } @@ -919,7 +923,9 @@ void _OnModbusReceive2Success(byte buffer[], struct ModbusApHeader mbap, int off _OnModbusReceiveConfirmRegisters(mbuffer); break; default: - writeDbg(MbError, "OnModbusReceive2Success: We received funcCode 0x%X!?", mbap.FuncCode); + writeDbg(MbError, "_OnModbusReceive2Success: Received unexpected function code 0x%02X!", mbap.FuncCode); + OnModbusClientPanics(FuncCodeIncorrect); + break; } } @@ -1052,5 +1058,9 @@ void _ModbusSendTimerError(byte buffer[], enum ModbusRequestError reqError) case ReadWriteRegisters: OnModbusReadWriteRegistersFailed(reqError, None, mbap); break; + default: + writeDbg(MbError, "_ModbusSendTimerError: Unexpected function code 0x%02X!", mbap.FuncCode); + OnModbusClientPanics(FuncCodeIncorrect); + break; } } \ No newline at end of file diff --git a/Modbus-CAPL/include/CAPL/include/ModbusEil.cin b/Modbus-CAPL/include/CAPL/include/ModbusEil.cin index a551bdb..eb9d8b8 100644 --- a/Modbus-CAPL/include/CAPL/include/ModbusEil.cin +++ b/Modbus-CAPL/include/CAPL/include/ModbusEil.cin @@ -155,8 +155,16 @@ byte _ModbusSnd(byte buffer[], word length) } case OK: break; + case NULL: // Delay + case CONNECTING: + return 1; + case ERROR: + writeDbg(ConnError, "_ModbusSnd: Socket status is not OK!"); + OnModbusClientPanics(ConnectionError); + return 1; default: - writeDbg(ConnWarning, "_ModbusSnd: Socket status is not OK!); + writeDbg(ConnError, "_ModbusSnd: Unknown socket status: %d", gSocketState); + OnModbusClientPanics(SwitchArgumentInvalid); return 1; } diff --git a/Modbus-CAPL/include/CAPL/include/ModbusStructs.cin b/Modbus-CAPL/include/CAPL/include/ModbusStructs.cin index 7ddba46..08c2305 100644 --- a/Modbus-CAPL/include/CAPL/include/ModbusStructs.cin +++ b/Modbus-CAPL/include/CAPL/include/ModbusStructs.cin @@ -150,6 +150,7 @@ variables VendorIdUnknown, ConnectionError, FuncCodeIncorrect, - AddressFailure + AddressFailure, + SwitchArgumentInvalid }; } \ No newline at end of file diff --git a/Modbus-CAPL/include/CAPL/include/ModbusTcp.cin b/Modbus-CAPL/include/CAPL/include/ModbusTcp.cin index 42420a8..56710bd 100644 --- a/Modbus-CAPL/include/CAPL/include/ModbusTcp.cin +++ b/Modbus-CAPL/include/CAPL/include/ModbusTcp.cin @@ -183,23 +183,28 @@ word _ModbusSnd(byte buffer[], word length) { case CLOSED: // If the connection is closed _ModbusConnectTo(gRemoteIP, gRemotePort); // Try to (re)connect - if (gSocketState != OK) // If this didn't work + if (gSocketState < OK) // If this didn't work (state != OK) { - if (gSocketState != NULL) // not WSAE WOULD BLOCK + if (gSocketState < CONNECTING) { writeDbg(ConnError, "_ModbusSnd: Reconnecting failed!"); OnModbusClientPanics(ConnectionError); } - return 1; + return 1; // Abort sending in all cases } case OK: break; - case NULL: + case NULL: // Delay + case CONNECTING: return 1; - default: + case ERROR: writeDbg(ConnError, "_ModbusSnd: Socket status is not OK!"); OnModbusClientPanics(ConnectionError); return 1; + default: + writeDbg(ConnError, "_ModbusSnd: Unknown socket status: %d", gSocketState); + OnModbusClientPanics(SwitchArgumentInvalid); + return 1; } bin_to_strhex(buffer, str); diff --git a/Modbus-CAPL/include/CAPL/include/ModbusUdp.cin b/Modbus-CAPL/include/CAPL/include/ModbusUdp.cin index 123d434..32d653e 100644 --- a/Modbus-CAPL/include/CAPL/include/ModbusUdp.cin +++ b/Modbus-CAPL/include/CAPL/include/ModbusUdp.cin @@ -143,10 +143,17 @@ byte _ModbusSnd(byte buffer[], word length) } case OK: break; - default: - writeDbg(ConnError, "ModbusSnd: Socket status is not OK! Doing nothing."); + case NULL: // Delay + case CONNECTING: + return 1; + case ERROR: + writeDbg(ConnError, "_ModbusSnd: Socket status is not OK!"); OnModbusClientPanics(ConnectionError); return 1; + default: + writeDbg(ConnError, "_ModbusSnd: Unknown socket status: %d", gSocketState); + OnModbusClientPanics(SwitchArgumentInvalid); + return 1; } bin_to_strhex(buffer, str);