Added idle Modbus client
This commit is contained in:
		
							parent
							
								
									5e4c348fc1
								
							
						
					
					
						commit
						0403165da5
					
				
					 1 changed files with 128 additions and 0 deletions
				
			
		
							
								
								
									
										128
									
								
								Modbus-CAPL/include/CAPL/IdleModbusClient.can
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										128
									
								
								Modbus-CAPL/include/CAPL/IdleModbusClient.can
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,128 @@
 | 
				
			||||||
 | 
					/*@!Encoding:1252*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// This file is a Modbus Client that only performs queries in 'on start'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					includes
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						#include "include\ModbusUdp.cin"			// Use UDP as Layer 4
 | 
				
			||||||
 | 
						#include "include\ModbusClient.cin"			// Use Modbus as Application Layer
 | 
				
			||||||
 | 
						#include "include\DeviceInformation.cin"	// Handle several vendors differently
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					variables
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					on preStart
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						writeClear(0);					// Clear write window in CANoe
 | 
				
			||||||
 | 
						setStartdelay(10);				// Wait for Ethernet device to be ready
 | 
				
			||||||
 | 
						OutputDebugLevel = Error;		// The debug level (messages in write window)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Connect to Modbus server, read the status of output registers and bits and start the cyclic timer
 | 
				
			||||||
 | 
					on start
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						char ip[16];
 | 
				
			||||||
 | 
						sysGetVariableString("%BUS_TYPE%%CHANNEL%::%NODE_NAME%::Config", "IP", ip, elCount(ip));							// Get IP address of device from sysvars config
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						DeviceInit(@sysvar::%BUS_TYPE%%CHANNEL%::%NODE_NAME%::Info::Vendor);												// Set all device specific parameters (Wago / B&R)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						writeDbg(MbInfo, "Connecting to %s:%d", ip, @sysvar::Config::Modbus::Port);
 | 
				
			||||||
 | 
						ModbusInit(ip, @sysvar::Config::Modbus::Port, @sysvar::Config::Modbus::RequestTimeout, @sysvar::Config::Modbus::MaxTransmissionCount);	// Connect to device. Opens socket and connection or what ever
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (gSocketState < CONNECTING)	// We are not connecting and not connected
 | 
				
			||||||
 | 
							return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						//ModbusReadRegisters(0x1083, 1);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Stop all transactions and close connection
 | 
				
			||||||
 | 
					on preStop
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						ModbusEnd();
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Modbus events ----------------------------------------------------------------------
 | 
				
			||||||
 | 
					/// 	All these events will be called by functions out of ModbusClientCommon.cin
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// -- Modbus Failures -----------------------------------------------------------------
 | 
				
			||||||
 | 
					/// 	Several reasons are possible:
 | 
				
			||||||
 | 
					/// 	error == Timeout:		The packet will be resent
 | 
				
			||||||
 | 
					/// 	error == FinalTimeout:	The packet will not be resent
 | 
				
			||||||
 | 
					/// 	error == Exception:		The client responded with an exception (which again can have several reasons, see enum ModbusException)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// This method gets called when an error occured while trying to read some bits (ModbusReadBits())
 | 
				
			||||||
 | 
					void OnModbusReadBitsFailed(enum ModbusRequestError error, enum ModbusException ex, struct ModbusApHeader mbap){}
 | 
				
			||||||
 | 
					// This method gets called when an error occured while trying to read some registers (ModbusReadRegisters())
 | 
				
			||||||
 | 
					void OnModbusReadRegistersFailed(enum ModbusRequestError error, enum ModbusException ex, struct ModbusApHeader mbap){}
 | 
				
			||||||
 | 
					// This method gets called when an error occured while trying to set a bit (ModbusWriteBit())
 | 
				
			||||||
 | 
					void OnModbusWriteBitFailed(enum ModbusRequestError error, enum ModbusException ex, struct ModbusApHeader mbap){}
 | 
				
			||||||
 | 
					// This method gets called when an error occured while trying to set a register (ModbusWriteRegister())
 | 
				
			||||||
 | 
					void OnModbusWriteRegisterFailed(enum ModbusRequestError error, enum ModbusException ex, struct ModbusApHeader mbap){}
 | 
				
			||||||
 | 
					// This method gets called when an error occured while trying to apply a mask on a register (ModbusWriteMask())
 | 
				
			||||||
 | 
					void OnModbusWriteMasksFailed(enum ModbusRequestError error, enum ModbusException ex, struct ModbusApHeader mbap){}
 | 
				
			||||||
 | 
					// This method gets called when an error occured while trying to read and write registers (ModbusReadWriteRegisters())
 | 
				
			||||||
 | 
					void OnModbusReadWriteRegistersFailed(enum ModbusRequestError error, enum ModbusException ex, struct ModbusApHeader mbap){}
 | 
				
			||||||
 | 
					// This method gets called when an error occured while trying to set multiple bits (ModbusWriteBits())
 | 
				
			||||||
 | 
					void OnModbusWriteBitsFailed(enum ModbusRequestError error, enum ModbusException ex, struct ModbusApHeader mbap){}
 | 
				
			||||||
 | 
					// This method gets called when an error occured while trying to set multiple registers (ModbusWriteRegisters())
 | 
				
			||||||
 | 
					void OnModbusWriteRegistersFailed(enum ModbusRequestError error, enum ModbusException ex, struct ModbusApHeader mbap){}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// -- Modbus Success ------------------------------------------------------------------
 | 
				
			||||||
 | 
					/// 	These functions get called when a device responds that a request was fulfilled successfully
 | 
				
			||||||
 | 
					/// 	Normally the Reponse as well the Request will be handed over
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// This method gets called when some bits were read successfully. See 'bitStatus' for their values and 'mbreq.Address' for their start address
 | 
				
			||||||
 | 
					void OnModbusReadBitsSuccess(struct ModbusResReceiveBits mbres, byte bitStatus[], struct ModbusReqRead mbreq){}
 | 
				
			||||||
 | 
					// This method gets called when some bits were read successfully. See 'mbres.Data' for their values and 'mbreq.Address' for their start address
 | 
				
			||||||
 | 
					void OnModbusReadRegistersSuccess(struct ModbusResReceiveRegisters mbres, struct ModbusReqRead mbreq)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						writeLineEx(0, 1, "<%NODE_NAME%> 0x%04X = 0x%04X (%d)", mbreq.Address, mbres.Data[0], mbres.Data[0]);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					// This method gets called when a bit was set successfully.
 | 
				
			||||||
 | 
					void OnModbusWriteBitSuccess(struct ModbusResConfirmSingle mbres){}
 | 
				
			||||||
 | 
					// This method gets called when a register was set successsfully.
 | 
				
			||||||
 | 
					void OnModbusWriteRegisterSuccess(struct ModbusResConfirmSingle mbres){}
 | 
				
			||||||
 | 
					// This method gets called when multiple bits were set successfully.
 | 
				
			||||||
 | 
					void OnModbusWriteBitsSuccess(struct ModbusResConfirmMultiple mbres){}
 | 
				
			||||||
 | 
					// This method gets called when multiple registers were set successfully.
 | 
				
			||||||
 | 
					void OnModbusWriteRegistersSuccess(struct ModbusResConfirmMultiple mbres){}
 | 
				
			||||||
 | 
					// This method gets called when a mask was applied successfully.
 | 
				
			||||||
 | 
					void OnModbusWriteMasksSuccess(struct ModbusResConfirmMasks mbres){}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// This method gets called when the Modbus Client panics (saying a fatal error occured).
 | 
				
			||||||
 | 
					// It will pass as argument what happened. Please see the log (increase debug level in preStart) for more details.
 | 
				
			||||||
 | 
					void OnModbusClientPanics(enum FatalErrors reason)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						switch(reason)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							case ParsingBuffer:
 | 
				
			||||||
 | 
								writeLineEx(0, 4, "<%NODE_NAME%> Fatal Error while parsing the received buffer");
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
							case ModbusPackageWasSplit:
 | 
				
			||||||
 | 
								writeLineEx(0, 4, "<%NODE_NAME%> Fatal Error while parsing the received buffer: The Modbus package was split", reason);
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
							case VendorIdUnknown:
 | 
				
			||||||
 | 
								writeLineEx(0, 4, "<%NODE_NAME%> Fatal Error: Vendor ID unknown");
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
							case FuncCodeIncorrect:
 | 
				
			||||||
 | 
								writeLineEx(0, 4, "<%NODE_NAME%> Fatal Error: Function code is incorrect");
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
							case AddressFailure:
 | 
				
			||||||
 | 
								writeLineEx(0, 4, "<%NODE_NAME%> Fatal Error: Start address is incorrect");
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
							case ConnectionError:
 | 
				
			||||||
 | 
								writeLineEx(0, 4, "<%NODE_NAME%> Fatal Connection Error");
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
							case SwitchArgumentInvalid:
 | 
				
			||||||
 | 
								writeLineEx(0, 4, "<%NODE_NAME%> Fatal Error: A argument of a switch statement is incorrect");
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						stop();
 | 
				
			||||||
 | 
						runError(1001, reason);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
		Loading…
	
		Reference in a new issue