blob: 8c72e16ef6d6b1f546e85b709cda2aafc35eb111 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2012 - 2023 AIT, fortiss GmbH, Davor Cihlar
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0.
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Filip Andren, Alois Zoitl - initial API and implementation and/or initial documentation
* Davor Cihlar - multiple FBs sharing a single Modbus connection
*******************************************************************************/
#ifndef MODBUSCOMLAYER_H_
#define MODBUSCOMLAYER_H_
#include <vector>
#include <forte_config.h>
#include "modbusioblock.h"
#include "modbusenums.h"
#include "comlayer.h"
#include <stdint.h>
class CModbusConnection;
class CIEC_ANY;
namespace forte {
namespace com_infra {
class CModbusComLayer : public CComLayer{
public:
CModbusComLayer(CComLayer* paUpperLayer, CBaseCommFB* paComFB);
~CModbusComLayer() override;
EComResponse sendData(void *paData, unsigned int paSize) override; // top interface, called from top
EComResponse recvData(const void *paData, unsigned int paSize) override;
EComResponse processInterrupt() override;
private:
struct STcpParams {
char mIp[15];
unsigned int mPort;
};
struct SRtuParams {
char mDevice[256];
int mBaud;
char mParity;
int mDataBit;
int mStopBit;
EModbusFlowControl mFlowControl;
};
struct SAddrRange {
EModbusFunction mFunction;
unsigned int mStartAddress;
unsigned int mNrAddresses;
};
struct SCommonParams {
unsigned int mNrPolls;
unsigned int mNrSends;
long mPollFrequency;
unsigned int mSlaveId;
SAddrRange mRead[100];
SAddrRange mSend[100];
unsigned int mResponseTimeout;
unsigned int mByteTimeout;
};
struct SConnection {
char mIdString[256];
unsigned int mUseCount;
CModbusConnection *mConnection;
};
template<typename T>
T convertFBOutput(TForteByte *paDataArray, unsigned int paDataSize);
unsigned int convertDataInput(void *paInData, unsigned int paDataSize, void *paConvertedData);
EComResponse openConnection(char *paLayerParameter) override;
void closeConnection() override;
EModbusFunction decodeFunction(const char* paParam, int *strIndex, EModbusFunction paDefaultFunction=eHoldingRegister);
int processClientParams(const char* paLayerParams, STcpParams* paTcpParams, SRtuParams* paRtuParams, SCommonParams* paCommonParams, char* paIdString);
int findNextStartAddress(const char* paString, int paStartIndex);
int findNextStopAddress(const char* paString, int paStartIndex);
bool isIp(const char* paIp);
CModbusConnection* getClientConnection(const char* paIdString);
void putConnection(CModbusConnection *paModbusConn);
EComResponse mInterruptResp;
CModbusConnection *mModbusConnection;
TForteByte mRecvBuffer[cgIPLayerRecvBufferSize];
unsigned int mBufFillSize;
CModbusIOBlock m_IOBlock;
static std::vector<SConnection> smConnections;
};
}
}
#endif /* MODBUSCOMLAYER_H_ */