From 0403165da5e91cc8019bb1fe9b81e43cd54a3683 Mon Sep 17 00:00:00 2001 From: Jonny007-MKD Date: Sun, 20 Jul 2014 10:47:21 +0000 Subject: [PATCH] Added idle Modbus client --- Modbus-CAPL/include/CAPL/IdleModbusClient.can | 128 ++++++++++++++++++ 1 file changed, 128 insertions(+) create mode 100644 Modbus-CAPL/include/CAPL/IdleModbusClient.can diff --git a/Modbus-CAPL/include/CAPL/IdleModbusClient.can b/Modbus-CAPL/include/CAPL/IdleModbusClient.can new file mode 100644 index 0000000..7949da5 --- /dev/null +++ b/Modbus-CAPL/include/CAPL/IdleModbusClient.can @@ -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); +} \ No newline at end of file