116 lines
3.9 KiB
C
Executable File
116 lines
3.9 KiB
C
Executable File
/****************************************************************************
|
|
|
|
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_PROTO_MODBUS_H
|
|
#define IOT_PROTO_MODBUS_H
|
|
|
|
#include "iot_proto_common.h"
|
|
|
|
#if PLC_SUPPORT_STA_ROLE
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
#pragma pack(push) // save the pack status
|
|
#pragma pack(1) // 1 byte align
|
|
|
|
#define HALF_NO 0
|
|
#define HALF_YES 1
|
|
#define OVERFLOW 2
|
|
#define LEFT_8BIT 256
|
|
|
|
#define MODBUS_CMD_01_READ_COIL_STATUS 0x01
|
|
#define MODBUS_CMD_02_READ_INPUT_STATUS 0x02
|
|
#define MODBUS_CMD_03_READ_HOLD_REG 0x03
|
|
#define MODBUS_CMD_04_READ_INPUT_REG 0x04
|
|
#define MODBUS_CMD_05_ENFORCE_COIL 0x05
|
|
#define MODBUS_CMD_06_PRESET_REG 0x06
|
|
#define MODBUS_CMD_0F_ENFORCE_MULTIPLE_COIL 0x0F
|
|
#define MODBUS_CMD_10_PRESET_MULTIPLE_REG 0x10
|
|
|
|
#define MODBUS_CMD_LEN_NO_DATA 6
|
|
|
|
#define MODBUS_CMD_01_04_ACK_LEN 5
|
|
#define MODBUS_CMD_0F_10_ACK_LEN 9
|
|
|
|
#define MODBUS_CMD_01_04_ACK_LEN_NO_CRC 3
|
|
#define MODBUS_CMD_0F_10_ACK_LEN_NO_CRC 7
|
|
|
|
#define MODBUS_MIN_LEN 5
|
|
|
|
#define MATCH 1
|
|
#define NO_MATCH 0
|
|
|
|
/* value of resv set to 1 means modbus frame */
|
|
#define MODBUS_RESV0_RESV 0x01
|
|
|
|
typedef struct _modbus_head_01_10 {
|
|
uint8_t addr;
|
|
uint8_t cmd;
|
|
/* these bytes are useful, but not be used in our fuction */
|
|
uint8_t no_use[4];
|
|
uint8_t crc_l;
|
|
uint8_t crc_h;
|
|
} modbus_head_01_to_10;
|
|
|
|
typedef struct _modbus_head_01_04_with_len {
|
|
uint8_t addr;
|
|
uint8_t cmd;
|
|
uint8_t len;
|
|
uint8_t data[0];
|
|
} modbus_head_01_04_with_len;
|
|
|
|
typedef struct _modbus_head_0f_10_with_len {
|
|
uint8_t addr;
|
|
uint8_t cmd;
|
|
uint8_t addr_l;
|
|
uint8_t addr_h;
|
|
uint8_t reg_num_l;
|
|
uint8_t reg_num_h;
|
|
uint8_t data_len;
|
|
uint8_t data[0];
|
|
} modbus_head_0f_10_with_len;
|
|
|
|
/**
|
|
* @brief iot_proto_modbus_format_check() - To pickup modbus frames from a
|
|
buffer
|
|
* @param recv_data: point to the buffer data
|
|
* @param pdata: point to the array which will reseive the ge frames
|
|
* @param ret_size: point to the data number of a frames
|
|
* @ge_len_out: point to the ge length if it exist
|
|
* @param retval: how many frames
|
|
*/
|
|
uint8_t iot_proto_modbus_format_check(mcu_data_handle_t *recv_data,
|
|
uint8_t *pdata, uint16_t *ret_size, uint16_t *ge_len);
|
|
|
|
/**
|
|
* @brief iot_proto_modbus_frm_format_check() check the data is modbus frame
|
|
* or not.
|
|
* @param data: point to the data
|
|
* @param data: len of the data
|
|
* @param retval: 0:modbus frame,others:not modbus frame
|
|
*/
|
|
uint8_t iot_proto_modbus_frm_format_check(uint8_t *data, uint16_t len);
|
|
|
|
#pragma pack(pop)
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif /* PLC_SUPPORT_STA_ROLE */
|
|
|
|
#endif /* end IOT_PROTO_MODBUS_H */ |