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