2015-04-07 20:16:15 +02:00
|
|
|
/****************************************************************************
|
|
|
|
* apps/include/modbus/mbport.h
|
|
|
|
*
|
2015-04-08 00:48:09 +02:00
|
|
|
* FreeModbus Library: A portable Modbus implementation for Modbus ASCII/RTU.
|
2012-07-21 15:35:35 +02:00
|
|
|
* Copyright (c) 2006 Christian Walter <wolti@sil.at>
|
|
|
|
* All rights reserved.
|
|
|
|
*
|
|
|
|
* Redistribution and use in source and binary forms, with or without
|
|
|
|
* modification, are permitted provided that the following conditions
|
|
|
|
* are met:
|
|
|
|
* 1. Redistributions of source code must retain the above copyright
|
|
|
|
* notice, this list of conditions and the following disclaimer.
|
|
|
|
* 2. Redistributions in binary form must reproduce the above copyright
|
|
|
|
* notice, this list of conditions and the following disclaimer in the
|
|
|
|
* documentation and/or other materials provided with the distribution.
|
|
|
|
* 3. The name of the author may not be used to endorse or promote products
|
|
|
|
* derived from this software without specific prior written permission.
|
|
|
|
*
|
|
|
|
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
|
|
|
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
|
|
|
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
|
|
|
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
|
|
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
|
|
|
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
|
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
|
|
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
|
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
|
|
|
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
|
|
*
|
2015-04-07 20:16:15 +02:00
|
|
|
****************************************************************************/
|
2012-07-21 15:35:35 +02:00
|
|
|
|
2015-04-07 20:16:15 +02:00
|
|
|
#ifndef __APPS_INCLUDE_MODBUS_MBPORT_H
|
|
|
|
#define __APPS_INCLUDE_MODBUS_MBPORT_H
|
|
|
|
|
|
|
|
/****************************************************************************
|
|
|
|
* Included Files
|
|
|
|
****************************************************************************/
|
2012-07-21 15:35:35 +02:00
|
|
|
|
2012-07-21 23:23:18 +02:00
|
|
|
#include <stdint.h>
|
|
|
|
#include <stdbool.h>
|
2021-04-04 21:15:35 +02:00
|
|
|
#include <termios.h>
|
2012-07-21 23:23:18 +02:00
|
|
|
|
2015-04-07 20:16:15 +02:00
|
|
|
/****************************************************************************
|
|
|
|
* Public Types
|
|
|
|
****************************************************************************/
|
|
|
|
|
2012-07-21 15:35:35 +02:00
|
|
|
#ifdef __cplusplus
|
2015-09-03 15:00:39 +02:00
|
|
|
extern "C"
|
|
|
|
{
|
2012-07-21 15:35:35 +02:00
|
|
|
#endif
|
|
|
|
|
|
|
|
typedef enum
|
|
|
|
{
|
2015-04-07 20:16:15 +02:00
|
|
|
EV_READY, /* Startup finished. */
|
|
|
|
EV_FRAME_RECEIVED, /* Frame received. */
|
|
|
|
EV_EXECUTE, /* Execute function. */
|
|
|
|
EV_FRAME_SENT /* Frame sent. */
|
2012-07-21 15:35:35 +02:00
|
|
|
} eMBEventType;
|
|
|
|
|
2015-04-11 17:37:31 +02:00
|
|
|
typedef enum
|
|
|
|
{
|
|
|
|
EV_MASTER_READY = 1<<0, /* Startup finished. */
|
|
|
|
EV_MASTER_FRAME_RECEIVED = 1<<1, /* Frame received. */
|
|
|
|
EV_MASTER_EXECUTE = 1<<2, /* Execute function. */
|
|
|
|
EV_MASTER_FRAME_SENT = 1<<3, /* Frame sent. */
|
|
|
|
EV_MASTER_ERROR_PROCESS = 1<<4, /* Frame error process. */
|
2016-11-03 14:54:32 +01:00
|
|
|
EV_MASTER_PROCESS_SUCCESS = 1<<5, /* Request process success. */
|
2015-04-11 17:37:31 +02:00
|
|
|
EV_MASTER_ERROR_RESPOND_TIMEOUT = 1<<6, /* Request respond timeout. */
|
|
|
|
EV_MASTER_ERROR_RECEIVE_DATA = 1<<7, /* Request receive data error. */
|
|
|
|
EV_MASTER_ERROR_EXECUTE_FUNCTION = 1<<8 /* Request execute function error. */
|
|
|
|
} eMBMasterEventType;
|
|
|
|
|
|
|
|
typedef enum
|
|
|
|
{
|
|
|
|
EV_ERROR_RESPOND_TIMEOUT, /* Slave respond timeout. */
|
2015-06-13 03:17:42 +02:00
|
|
|
EV_ERROR_RECEIVE_DATA, /* Receive frame data error. */
|
2015-04-11 17:37:31 +02:00
|
|
|
EV_ERROR_EXECUTE_FUNCTION /* Execute function error. */
|
|
|
|
} eMBMasterErrorEventType;
|
|
|
|
|
2015-04-07 20:16:15 +02:00
|
|
|
/* Parity used for characters in serial mode.
|
2012-07-21 15:35:35 +02:00
|
|
|
*
|
|
|
|
* The parity which should be applied to the characters sent over the serial
|
|
|
|
* link. Please note that this values are actually passed to the porting
|
|
|
|
* layer and therefore not all parity modes might be available.
|
|
|
|
*/
|
2015-04-07 20:16:15 +02:00
|
|
|
|
2012-07-21 15:35:35 +02:00
|
|
|
typedef enum
|
|
|
|
{
|
2015-04-07 20:16:15 +02:00
|
|
|
MB_PAR_NONE, /* No parity. */
|
|
|
|
MB_PAR_ODD, /* Odd parity. */
|
|
|
|
MB_PAR_EVEN /* Even parity. */
|
2012-07-21 15:35:35 +02:00
|
|
|
} eMBParity;
|
|
|
|
|
2015-04-07 20:16:15 +02:00
|
|
|
/****************************************************************************
|
|
|
|
* Public Data
|
|
|
|
****************************************************************************/
|
2012-07-21 15:35:35 +02:00
|
|
|
|
2015-04-07 20:16:15 +02:00
|
|
|
/* Callback function for the porting layer when a new byte is available.
|
2012-07-21 15:35:35 +02:00
|
|
|
*
|
|
|
|
* Depending upon the mode this callback function is used by the RTU or
|
|
|
|
* ASCII transmission layers. In any case a call to xMBPortSerialGetByte()
|
|
|
|
* must immediately return a new character.
|
|
|
|
*
|
2015-04-07 20:16:15 +02:00
|
|
|
* Return true if a event was posted to the queue because a new byte was
|
|
|
|
* received. The port implementation should wake up the tasks which are
|
|
|
|
* currently blocked on the eventqueue.
|
2012-07-21 15:35:35 +02:00
|
|
|
*/
|
|
|
|
|
2015-04-11 17:37:31 +02:00
|
|
|
extern bool(*pxMBFrameCBByteReceived)(void);
|
|
|
|
extern bool(*pxMBFrameCBTransmitterEmpty)(void);
|
|
|
|
extern bool(*pxMBPortCBTimerExpired)(void);
|
|
|
|
|
|
|
|
extern bool(*pxMBMasterFrameCBByteReceived)(void);
|
|
|
|
extern bool(*pxMBMasterFrameCBTransmitterEmpty)(void);
|
|
|
|
extern bool(*pxMBMasterPortCBTimerExpired)(void);
|
2012-07-21 15:35:35 +02:00
|
|
|
|
2015-04-07 20:16:15 +02:00
|
|
|
/****************************************************************************
|
|
|
|
* Public Function Prototypes
|
|
|
|
****************************************************************************/
|
2012-07-21 15:35:35 +02:00
|
|
|
|
2015-04-07 20:16:15 +02:00
|
|
|
/* Supporting functions */
|
2012-07-21 15:35:35 +02:00
|
|
|
|
2015-04-07 20:16:15 +02:00
|
|
|
bool xMBPortEventInit(void);
|
|
|
|
bool xMBPortEventPost(eMBEventType eEvent);
|
2015-04-11 17:37:31 +02:00
|
|
|
bool xMBPortEventGet(eMBEventType *eEvent);
|
|
|
|
|
|
|
|
bool xMBMasterPortEventInit(void);
|
|
|
|
bool xMBMasterPortEventPost(eMBMasterEventType eEvent);
|
|
|
|
bool xMBMasterPortEventGet(eMBMasterEventType * eEvent);
|
|
|
|
void vMBMasterOsResInit(void);
|
|
|
|
bool xMBMasterRunResTake(int32_t time);
|
|
|
|
void vMBMasterRunResRelease(void);
|
2012-07-21 15:35:35 +02:00
|
|
|
|
2015-04-07 20:16:15 +02:00
|
|
|
/* Serial port functions */
|
2012-07-21 15:35:35 +02:00
|
|
|
|
2015-04-07 20:16:15 +02:00
|
|
|
bool xMBPortSerialInit(uint8_t ucPort, speed_t ulBaudRate,
|
|
|
|
uint8_t ucDataBits, eMBParity eParity);
|
|
|
|
void vMBPortClose(void);
|
|
|
|
void xMBPortSerialClose(void);
|
|
|
|
void vMBPortSerialEnable(bool xRxEnable, bool xTxEnable);
|
|
|
|
bool xMBPortSerialGetByte(int8_t * pucByte);
|
|
|
|
bool xMBPortSerialPutByte(int8_t ucByte);
|
|
|
|
|
2015-04-11 17:37:31 +02:00
|
|
|
bool xMBMasterPortSerialInit(uint8_t ucPort, speed_t ulBaudRate,
|
|
|
|
uint8_t ucDataBits, eMBParity eParity);
|
|
|
|
void vMBMasterPortClose(void);
|
|
|
|
void xMBMasterPortSerialClose(void);
|
|
|
|
void vMBMasterPortSerialEnable(bool xRxEnable, bool xTxEnable);
|
|
|
|
bool xMBMasterPortSerialGetByte(int8_t * pucByte);
|
|
|
|
bool xMBMasterPortSerialPutByte(int8_t ucByte);
|
|
|
|
|
2015-04-07 20:16:15 +02:00
|
|
|
/* Timers functions */
|
2012-07-21 15:35:35 +02:00
|
|
|
|
2015-04-07 20:16:15 +02:00
|
|
|
bool xMBPortTimersInit(uint16_t usTimeOut50us);
|
|
|
|
void xMBPortTimersClose(void);
|
|
|
|
void vMBPortTimersEnable(void);
|
|
|
|
void vMBPortTimersDisable(void);
|
|
|
|
void vMBPortTimersDelay(uint16_t usTimeOutMS);
|
|
|
|
|
2015-04-11 17:37:31 +02:00
|
|
|
bool xMBMasterPortTimersInit(uint16_t usTimeOut50us);
|
|
|
|
void xMBMasterPortTimersClose(void);
|
|
|
|
void vMBMasterPortTimersT35Enable(void);
|
|
|
|
void vMBMasterPortTimersConvertDelayEnable(void);
|
|
|
|
void vMBMasterPortTimersRespondTimeoutEnable(void);
|
|
|
|
void vMBMasterPortTimersDisable(void);
|
|
|
|
|
|
|
|
/* Callback for the master error process */
|
|
|
|
|
|
|
|
void vMBMasterErrorCBRespondTimeout(uint8_t ucDestAddress, const uint8_t *pucPDUData,
|
|
|
|
uint16_t ucPDULength);
|
|
|
|
void vMBMasterErrorCBReceiveData(uint8_t ucDestAddress, const uint8_t *pucPDUData,
|
|
|
|
uint16_t ucPDULength);
|
|
|
|
void vMBMasterErrorCBExecuteFunction(uint8_t ucDestAddress, const uint8_t *pucPDUData,
|
|
|
|
uint16_t ucPDULength);
|
2016-11-03 14:54:32 +01:00
|
|
|
void vMBMasterCBRequestSuccess(void);
|
2015-04-11 17:37:31 +02:00
|
|
|
|
2015-04-07 23:57:52 +02:00
|
|
|
#ifdef CONFIG_MB_TCP_ENABLED
|
2015-04-07 20:16:15 +02:00
|
|
|
/* TCP port function */
|
|
|
|
|
|
|
|
bool xMBTCPPortInit(uint16_t usTCPPort);
|
|
|
|
#ifdef CONFIG_MB_HAVE_CLOSE
|
|
|
|
void vMBTCPPortClose(void);
|
|
|
|
#endif
|
|
|
|
void vMBTCPPortDisable(void);
|
|
|
|
bool xMBTCPPortGetRequest(uint8_t **ppucMBTCPFrame, uint16_t * usTCPLength);
|
|
|
|
bool xMBTCPPortSendResponse(const uint8_t *pucMBTCPFrame, uint16_t usTCPLength);
|
2015-04-07 23:57:52 +02:00
|
|
|
#endif
|
2012-07-21 15:35:35 +02:00
|
|
|
|
|
|
|
#ifdef __cplusplus
|
2015-09-03 15:00:39 +02:00
|
|
|
}
|
2012-07-21 15:35:35 +02:00
|
|
|
#endif
|
2015-04-07 20:16:15 +02:00
|
|
|
|
|
|
|
#endif /* __APPS_INCLUDE_MODBUS_MBPORT_H */
|