199 lines
		
	
	
		
			6.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			199 lines
		
	
	
		
			6.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| 
								 | 
							
								/****************************************************************************
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Copyright(c) 2019 by Aerospace C.Power (Chongqing) Microelectronics. ALL RIGHTS RESERVED.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								This Information is proprietary to Aerospace C.Power (Chongqing) Microelectronics and MAY NOT
							 | 
						||
| 
								 | 
							
								be copied by any method or incorporated into another program without
							 | 
						||
| 
								 | 
							
								the express written consent of Aerospace C.Power. This Information or any portion
							 | 
						||
| 
								 | 
							
								thereof remains the property of Aerospace C.Power. The Information contained herein
							 | 
						||
| 
								 | 
							
								is believed to be accurate and Aerospace C.Power assumes no responsibility or
							 | 
						||
| 
								 | 
							
								liability for its use in any way and conveys no license or title under
							 | 
						||
| 
								 | 
							
								any patent or copyright and makes no representation or warranty that this
							 | 
						||
| 
								 | 
							
								Information is free from patent or copyright infringement.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								****************************************************************************/
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifndef _IOT_MODBUS_TASK_H_
							 | 
						||
| 
								 | 
							
								#define _IOT_MODBUS_TASK_H_
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include "iot_task_api.h"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifdef __cplusplus
							 | 
						||
| 
								 | 
							
								extern "C" {
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#if PLC_SUPPORT_CCO_ROLE
							 | 
						||
| 
								 | 
							
								#define IOT_MODBUS_RT_TABLE_SUPPORT          1
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/** Message type defination: */
							 | 
						||
| 
								 | 
							
								#define IOT_MODBUS_TASK_MT_UART              1 /** message from uart. */
							 | 
						||
| 
								 | 
							
								#define IOT_MODBUS_TASK_MT_TIMER             2 /** message from timer. */
							 | 
						||
| 
								 | 
							
								#define IOT_MODBUS_TASK_MT_INTERNAL          3 /** message from modbus-task. */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* message id for IOT_MODBUS_TASK_MT_TIMER */
							 | 
						||
| 
								 | 
							
								#define IOT_MODBUS_TASK_MSG_ID_TMR_GE_START_MONITOR   (1)
							 | 
						||
| 
								 | 
							
								#define IOT_MODBUS_TASK_MSG_ID_TMR_UART_MB_TIMEOUT    (2)
							 | 
						||
| 
								 | 
							
								#define IOT_MODBUS_TASK_MSG_ID_CMD_HANDLE             (3)
							 | 
						||
| 
								 | 
							
								#if IOT_MODBUS_RT_TABLE_SUPPORT
							 | 
						||
| 
								 | 
							
								#define IOT_MODBUS_TASK_MSG_ID_TMR_RT_UPDATE_TIMEOUT  (4)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* rout table update period, 20S */
							 | 
						||
| 
								 | 
							
								#define IOT_MODBUS_TASK_RT_TIMER_PERIOD   (20*1000) /* units:ms */
							 | 
						||
| 
								 | 
							
								/* iot mac address hash table handle */
							 | 
						||
| 
								 | 
							
								typedef void *iot_modbus_addr_rout_table_h;
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								#define IOT_MODBUS_MSG_ID_TMR_MB_EXT_RESP_TIMEOUT     (5)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#define IOT_MODBUS_TASK_ID                          IOT_MODBUS_MID
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* stack size of task */
							 | 
						||
| 
								 | 
							
								#if (IOT_PSRAM_ENABLE)
							 | 
						||
| 
								 | 
							
								#define IOT_MODBUS_TASK_TASK_STACK_SIZE             (2048)
							 | 
						||
| 
								 | 
							
								#else
							 | 
						||
| 
								 | 
							
								#define IOT_MODBUS_TASK_TASK_STACK_SIZE             (512)
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#define IOT_MODBUS_TASK_PROTO_TASK_PRIO             (6)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* number of messages pending in queue. */
							 | 
						||
| 
								 | 
							
								#if (IOT_PSRAM_ENABLE)
							 | 
						||
| 
								 | 
							
								#define IOT_MODBUS_TASK_TASK_POOL_SIZE              (128)
							 | 
						||
| 
								 | 
							
								#else
							 | 
						||
| 
								 | 
							
								#define IOT_MODBUS_TASK_TASK_POOL_SIZE              (32)
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#define IOT_MODBUS_TASK_GE_START_TIMER_PERIOD       (100) /* units:ms */
							 | 
						||
| 
								 | 
							
								/* should greater than IOT_UART_NO_FMT_TIMEOUT(default 100ms) */
							 | 
						||
| 
								 | 
							
								#define IOT_MODBUS_TASK_UART_MB_TIMER_PERIOD        (120) /* units:ms */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#define IOT_FN160_TYPE_MODBUS                       (0x01)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* define uart recv buffer. */
							 | 
						||
| 
								 | 
							
								#define IOT_MODBUS_MAX_BUF_SIZE             (1024)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#pragma pack(push)  /* save the pack status */
							 | 
						||
| 
								 | 
							
								#pragma pack(1)     /* 1 byte align         */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								typedef struct _iot_mb_task_t {
							 | 
						||
| 
								 | 
							
								    /* task handle */
							 | 
						||
| 
								 | 
							
								    iot_task_h          task;
							 | 
						||
| 
								 | 
							
								    /* uart handle */
							 | 
						||
| 
								 | 
							
								    iot_uart_h          uart_h;
							 | 
						||
| 
								 | 
							
								    /* timer handle */
							 | 
						||
| 
								 | 
							
								    timer_id_t          ge_start_timer;
							 | 
						||
| 
								 | 
							
								    timer_id_t          uart_timer;
							 | 
						||
| 
								 | 
							
								    timer_id_t          rt_update_timer;
							 | 
						||
| 
								 | 
							
								    timer_id_t          mb_ext_resp_timer;
							 | 
						||
| 
								 | 
							
								    /* local mac address. */
							 | 
						||
| 
								 | 
							
								    uint8_t             local_mac[IOT_MAC_ADDR_LEN];
							 | 
						||
| 
								 | 
							
								#if PLC_SUPPORT_STA_ROLE
							 | 
						||
| 
								 | 
							
								    /* dest cco mac */
							 | 
						||
| 
								 | 
							
								    uint8_t             dest_cco_mac[IOT_MAC_ADDR_LEN];
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								    /* local device slave address for modbus */
							 | 
						||
| 
								 | 
							
								    uint8_t             slave_addr;
							 | 
						||
| 
								 | 
							
								    /* buf to save uart modbus data */
							 | 
						||
| 
								 | 
							
								    uint8_t             uart_mb_buf[IOT_MODBUS_MAX_BUF_SIZE];
							 | 
						||
| 
								 | 
							
								    /* uart modbus len */
							 | 
						||
| 
								 | 
							
								    uint32_t            uart_mb_len;
							 | 
						||
| 
								 | 
							
								    /* buf to save ge modbus data */
							 | 
						||
| 
								 | 
							
								    uint8_t             ge_mb_buf[IOT_MODBUS_MAX_BUF_SIZE];
							 | 
						||
| 
								 | 
							
								    /* ge modbus len */
							 | 
						||
| 
								 | 
							
								    uint32_t            ge_mb_len;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#if IOT_MODBUS_RT_TABLE_SUPPORT
							 | 
						||
| 
								 | 
							
								    /* route table */
							 | 
						||
| 
								 | 
							
								    iot_modbus_addr_rout_table_h rt_table;
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								} iot_mb_task_t;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								typedef struct _ge_fn160_appdata_mb_t {
							 | 
						||
| 
								 | 
							
								    uint8_t type;               /* trans proto type */
							 | 
						||
| 
								 | 
							
								    uint8_t src_mac[IOT_MAC_ADDR_LEN];
							 | 
						||
| 
								 | 
							
								    uint8_t frame_total : 4,    /* total frames */
							 | 
						||
| 
								 | 
							
								            frame_idx   : 4;    /* index current frame */
							 | 
						||
| 
								 | 
							
								    uint8_t data[0];            /* modbus raw data */
							 | 
						||
| 
								 | 
							
								} ge_fn160_appdata_mb_t;
							 | 
						||
| 
								 | 
							
								#pragma pack(pop)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/** modbus func code:
							 | 
						||
| 
								 | 
							
								## bit access
							 | 
						||
| 
								 | 
							
								0x02(2)         Read Input Discrete
							 | 
						||
| 
								 | 
							
								0x01(1)         Read Coils
							 | 
						||
| 
								 | 
							
								0x05(5)         Write Single Coil
							 | 
						||
| 
								 | 
							
								0x0F(15)        Write Multiple Coils
							 | 
						||
| 
								 | 
							
								## 16 bits access
							 | 
						||
| 
								 | 
							
								0x04(4)         Read Input Register
							 | 
						||
| 
								 | 
							
								0x03(3)         Read Multiple Registers
							 | 
						||
| 
								 | 
							
								0x06(6)         Write Single Register
							 | 
						||
| 
								 | 
							
								0x10(16)        Write Multiple Registers
							 | 
						||
| 
								 | 
							
								0x17(23)        Read/Write Multiple Registers
							 | 
						||
| 
								 | 
							
								0x16(22)        Mask Write Register
							 | 
						||
| 
								 | 
							
								## error function code
							 | 
						||
| 
								 | 
							
								the msb is 1 when above function code is error.
							 | 
						||
| 
								 | 
							
								*/
							 | 
						||
| 
								 | 
							
								typedef  struct _iot_mb_data_check_t {
							 | 
						||
| 
								 | 
							
								     uint8_t func_code;     /* modbus function code */
							 | 
						||
| 
								 | 
							
								     uint8_t min_len;       /* modbus min len */
							 | 
						||
| 
								 | 
							
								     uint8_t not_fix_len;   /* 0:use min_len;1:use min_len+append data len */
							 | 
						||
| 
								 | 
							
								     uint8_t byte_count_idx;/* append data len index */
							 | 
						||
| 
								 | 
							
								} iot_mb_data_check_t;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * @brief iot_modbus_rtu_crc16() - Compute the MODBUS RTU CRC
							 | 
						||
| 
								 | 
							
								 * @param buf:  the pointer of data.
							 | 
						||
| 
								 | 
							
								 * @param len : data length.
							 | 
						||
| 
								 | 
							
								 * @return    : crc16 of the modbus rtu.
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								uint16_t iot_modbus_rtu_crc16(uint8_t *buf, uint32_t len);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * @brief iot_modbus_fn160_appdata_pack() - pack fn160 appdata.
							 | 
						||
| 
								 | 
							
								 * @param mb_data: the pointer of data.
							 | 
						||
| 
								 | 
							
								 * @param mb_len : data length.
							 | 
						||
| 
								 | 
							
								 * @return    :  the packed data of fn160 appdata.
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								iot_pkt_t *iot_modbus_fn160_appdata_pack(uint8_t *mb_data, uint32_t mb_len,
							 | 
						||
| 
								 | 
							
								    uint32_t curr_idx, uint32_t total_idx);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * @brief iot_mb_task_post_uart_cmd() - recveived command from uart, send to
							 | 
						||
| 
								 | 
							
								 *                                       common proto
							 | 
						||
| 
								 | 
							
								 * @param data: command data.
							 | 
						||
| 
								 | 
							
								 * @param len : command data length.
							 | 
						||
| 
								 | 
							
								 * @param param : other param.
							 | 
						||
| 
								 | 
							
								 * @return    : ERR_OK   - send successfully.
							 | 
						||
| 
								 | 
							
								 *              ERR_FAIL - send failed.
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								uint8_t iot_mb_task_post_uart_cmd(uint8_t * data, uint16_t len, uint32_t param);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * @brief iot_mb_task_msg_post() - port pkt data.
							 | 
						||
| 
								 | 
							
								 * @param msg_type: message type.
							 | 
						||
| 
								 | 
							
								 * @param msg_id  : message id.
							 | 
						||
| 
								 | 
							
								 * @param data    : iot_pkt data will be post.
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								void iot_mb_task_msg_post(uint16_t msg_type, uint16_t msg_id, iot_pkt_t *data);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * @brief iot_mb_task_msg_post_to_uart() - send data to uart port.
							 | 
						||
| 
								 | 
							
								 * @param p_pkt_frame: pointer of pkt frame data buffer.
							 | 
						||
| 
								 | 
							
								 * @return ERR_OK
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								uint32_t iot_mb_task_msg_post_to_uart(iot_uart_h uart_h, iot_pkt_t *p_pkt_frame);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * @brief app_modbus_task_entry() - ge modbus app.
							 | 
						||
| 
								 | 
							
								 * @param none.
							 | 
						||
| 
								 | 
							
								 * @return: ERR_OK - successfully.
							 | 
						||
| 
								 | 
							
								 *   ERR_FAIL -      failed.
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								uint32_t app_modbus_task_entry(void);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifdef __cplusplus
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#endif /* _IOT_MODBUS_TASK_H_ */
							 |