#ifndef __MODBUS_COMMON_H__ #define __MODBUS_COMMON_H__ #include "st_sys.h" #define MODBUS_ENCODER_RTU 1 #define MODBUS_ENCODER_ASCII 0 //数据域定制结构体 typedef struct { //所属的命令,可以是1\2\3\4,不同命令会有位宽需求,所以注册的时候需要自己保证 //0x01是线圈,响应01、02、05、0F命令 //0x03是数值,响应03、04、06、10命令 //0xFE是系统自定义读写缓冲 unsigned char data_type; unsigned short address; //开始地址 unsigned short number; //大小 unsigned char * buffer; //数据缓冲地址 void * next; } modbus_dataarea_t; //通用主站命令结构 typedef struct modbus_master_cmd { char id; //命令ID char cmd; //发送的命令 char dir; //方向0,表示读,1表示写 unsigned short address; //地址 unsigned short number; //长度 unsigned char * value; //对于读操作,是数值,对于写操作是要发送的值 int respone_timeout; //响应超时时间 char cmdcode; //命令编号 void (* on_respone)(struct modbus_master_cmd * cmd, unsigned char * respone, int length); //回调函数 } modbus_master_cmd_t; //周期命令结构 typedef struct modbus_master_period_cmd { modbus_master_cmd_t cmd; //命令信息 sw_timer_t timer; //命令周期定时器 int period; //设置周期 struct modbus_master_period_cmd * next;//下一条命令 }modbus_master_period_cmd_t; //周期命令结构 typedef struct modbus_master_once_cmd { modbus_master_cmd_t cmd; //命令信息 char token; //是否有效 struct modbus_master_once_cmd * next; //下一条命令 }modbus_master_once_cmd_t; //主站信息结构体 typedef struct modbus_master { char step; //步数 char encoder_type; //编码类型,0是RTU,1是ASCII char retry; //重次次数 char current_try_time; //当前尝试次数 int short one_byte_time;//每个字节耗费的时间,单位us int short interval;//命令间隔 int wait_respone_time; //等待响应的时间,自动计算 unsigned short send_count;//发送计数; unsigned short receive_count;//接收计数; modbus_master_cmd_t current_cmd; //当前正在等待的命令 sw_timer_t timer; //检测超时所用的定时器 modbus_master_once_cmd_t * once_cmd_list; //单次命令列表 modbus_master_period_cmd_t * period_cmd_list; //周期命令列表 }modbus_master_t; //从站信息结构体 typedef struct modbus_slave { unsigned char id; //该从站的ID号信息 modbus_dataarea_t * data_area_list; //绑定的可读取数据区域 void (*on_comm)(unsigned char,unsigned char cmd,unsigned short address, unsigned short number); //命令的回调函数 }modbus_slave_t; #endif