TerminalSlave485.h 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469
  1. #ifndef __TERMINALSLAVE485_H
  2. #define __TERMINALSLAVE485_H
  3. #include "stm32f7xx_hal.h"
  4. //////////////////////////////////////////////////////////////////////////////////
  5. #define USART_REC_LEN 600 //定义最大接收字节数 600 升级时一包数据256*2个数据
  6. #define EN_USART1_RX 1 //使能(1)/禁止(0)串口1接收
  7. #define FRAME_HEAD 0x3A //起始字符,英文状态下的“:”
  8. #define FRAME_END 0x0D0A
  9. //终端功能码定义
  10. #define Read_data 0x04 //读数据
  11. #define Read_para 0x03 //读参数
  12. #define Set_para 0x10 //设置参数
  13. #define Update 0x41 //升级
  14. #define Read_Version 0x2B //读取版本号
  15. #define Control_IO 0x0F //控制状态IO
  16. #define TEST_State 0x30 //测试通信状态
  17. #define Data_alibration 0x05//数据标定
  18. #define PlatformTransfer 0x06
  19. #define TERMINAL_CONTROL_CMD_RESPOND 0x30
  20. #define TERMINAL_CONTROL_GET_SENSOR_D1 0x91
  21. #define TERMINAL_CONTROL_GET_SENSOR_D2 0x92
  22. //李伟修改 20210610
  23. #define TERMINAL_CONTROL_CMD_REMOTE_CAL 0x39 //远程标定命令--根据5月份的远程标定会议文件进行修改。固定长度为64字节
  24. //李伟修改 20210702
  25. #define TERMINAL_CONTROL_Seal_By_ElecFence 0x38 //出电子围栏进行施封
  26. #define TERMINAL_CONTROL_GET_ELEC_SEAL_STATE 0x40 //李伟增加 20210610 电子铅封状态
  27. #define TERMINAL_CONTROL_GET_CABINET01_STATE 0x47 //李伟增加 20210610 1仓传感器数据
  28. #define TERMINAL_CONTROL_GET_CABINET02_STATE 0x48 //李伟增加 20210610 2仓传感器数据
  29. #define TERMINAL_CONTROL_GET_CABINET03_STATE 0x49 //李伟增加 20210610 3仓传感器数据
  30. #define TERMINAL_CONTROL_GET_CABINET04_STATE 0x4a //李伟增加 20210610 4仓传感器数据
  31. #define TERMINAL_CONTROL_GET_CABINET05_STATE 0x4b //李伟增加 20210610 5仓传感器数据
  32. #define TERMINAL_CONTROL_GET_CABINET06_STATE 0x4c //李伟增加 20210610 6仓传感器数据
  33. #define TERMINAL_CONTROL_GET_CABINET07_STATE 0x4d //李伟增加 20210610 7仓传感器数据
  34. #define TERMINAL_CONTROL_GET_CABINET08_STATE 0x4e //李伟增加 20210610 8仓传感器数据
  35. #define TERMINAL_CONTROL_GET_Store01_ALL_Sensor 0x93
  36. #define TERMINAL_CONTROL_GET_Store02_ALL_Sensor 0x94
  37. #define TERMINAL_CONTROL_GET_Store03_ALL_Sensor 0x95
  38. #define TERMINAL_CONTROL_GET_Store04_ALL_Sensor 0x96
  39. #define TERMINAL_CONTROL_GET_Store05_ALL_Sensor 0x97
  40. #define TERMINAL_CONTROL_GET_Store06_ALL_Sensor 0x98
  41. #define TERMINAL_CONTROL_GET_Store07_ALL_Sensor 0x99
  42. #define TERMINAL_CONTROL_GET_Store08_ALL_Sensor 0x9A
  43. #define TERMINAL_CONTROL_GET_Whole_Car_Sensor 0x9B
  44. #define LenthOf_Reply0x93 159 //1+6+148+2+2
  45. //取自国标的3条modbus命令
  46. #define JL_COMMON_CMD_ReadReg03 0x0003
  47. #define JL_COMMON_CMD_WriteReg06 0x0006
  48. #define JL_COMMON_CMD_WriteRegs10 0x0010
  49. #define Broadcast_data 0x10
  50. //usart Rx data
  51. typedef struct
  52. {
  53. uint8_t Frame_head;//帧头
  54. uint8_t Frame_addr;//外设地址
  55. uint8_t Frame_funcode;//功能码
  56. uint16_t Frame_message_id;//消息ID
  57. // u16 Frame_regaddr;//读取的寄存器
  58. // u16 Frame_regcnt;//读取寄存器的个数
  59. uint16_t Frame_length;//数据长度
  60. uint16_t Carbration_len;//标定数据长度
  61. uint16_t Carbration_sum;//标定数据总包
  62. uint16_t Carbration_child;//子包
  63. uint8_t *Frame_data;//数据区 后续不知道需不需要扩展
  64. uint16_t Frame_LRC;//校验
  65. uint16_t Frame_end;//结束符
  66. }Data_frame_TypeDef;
  67. extern Data_frame_TypeDef data_frame,Tx_data_frame;
  68. //typedef struct {
  69. // uint8_t ID ;//仓的ID 47 .。。
  70. // uint8_t length ;//数据总长度
  71. // uint8_t Communication_para[8];//通讯参数
  72. // uint8_t Genel_para[56];//常规参数
  73. //}All_para_TypeDef;
  74. //extern All_para_TypeDef All_para;
  75. typedef struct Oil_Data_frame
  76. {
  77. uint32_t Level_ADvalue; //油位高度AD值----更改为第1个温度数据
  78. //
  79. // uint32_t Level_temperature; //液体温度
  80. // uint32_t Temperature; //环境温度
  81. uint32_t Liquid_Temp; //液体温度---实际上为浮点数,u32格式传输,4字节 替换为第2个温度数据
  82. uint32_t EnvTemperature; //环境温度 ---实际上为浮点数,u32格式传输,4字节 替换为第3个温度数据
  83. //20201219李伟同龚天平、张毅商量后更改;将加油量替换为倾角数据
  84. uint32_t Add_oilvalue; //加油量---实际上为浮点数,u32格式传输,4字节
  85. ////20210227根据戴永峰的协议修改——原来漏油量的位置变更为倾角2
  86. uint32_t Dec_oilvalue; //漏油量---实际上为浮点数,u32格式传输,4字节
  87. ////油箱油量替换为定期上报的密度数据 李伟修改 20210301 同张毅商定后修改
  88. uint32_t Oil_boxvalue; //油箱油量------更改为密度数据,上位机平台要按照浮点数解析
  89. uint32_t LevelPercent_or_PressValue;//液位百分比或者压力值
  90. uint32_t Level_value; //液位高度---实际上为浮点数,u32格式传输,4字节
  91. }Oil_Data_frame ;
  92. typedef struct IO_Data_frame
  93. {
  94. uint8_t IO_emergencyflag; //重要数据标识 bit7 0/1
  95. uint8_t IO_allnum; //IO总数 m 1-255
  96. uint8_t IO_normaldata; //正常或者异常数据 0/1
  97. uint8_t IO_statenum; //IO状态组数 n(1~8) n=(m/32)+1
  98. uint32_t IO_state[8]; //IO状态 4*n
  99. uint32_t IO_normalstate[8]; //正常异常状态
  100. uint32_t Temp_IO_state[8]; //IO临时状态 4*n
  101. uint32_t Temp_IO_normalstate[8]; //正常异常临时状态
  102. uint8_t Updata_TempVar[8];
  103. uint32_t IO_unload_switch; //卸尽开关监测 有油位置1,无油位置0
  104. uint8_t IO_Discharge_state; //新版卸尽信号输入监测
  105. }IO_Data_frame ;
  106. //电子铅封数据帧
  107. typedef struct Seal_Data_frame
  108. {
  109. uint8_t Sealing_up_datetype;//上传数据类型 常规数据、解封施封等破封 0:默认 1:解封 2 :施封 3:破封
  110. uint8_t Sealing_emergencyflag; //重要数据标识 bit7 0/1
  111. uint8_t Sealing_type; //电子铅封数据类型
  112. uint16_t Sesling_All_num; //仓数量
  113. //1~n仓
  114. uint8_t Sesling_ID[8]; //仓号
  115. uint8_t Sealing_state_oiltype[8];//罐仓状态与油品
  116. uint8_t Sealing_Mode[8]; //铅封状态与装油模式
  117. uint8_t Sealing_IO_state[8]; //装油模式与阀门逻辑是否正常
  118. //1~n仓
  119. uint16_t Sealing_num;//解封仓数量
  120. uint8_t Sealing_num_id[8];//解封仓号
  121. uint8_t Sealing_Random_code[3];//解封码
  122. uint8_t Sealing_Ask_code[3];//匹配码
  123. uint8_t TerminalOnLineFlag;
  124. }Seal_Data_frame ;
  125. typedef struct Version_Data_frame
  126. {
  127. uint8_t *Version_comname; //公司名称 SHJL
  128. uint8_t *Version_allnum; //产品代码 02
  129. uint8_t *Version_normaldata; //硬件版本号
  130. uint8_t *Version_statenum; //软件版本号 99.33.22长度不超过8字节
  131. uint8_t *Version_state; //设备ID
  132. uint8_t *Version_normalstate; //客户代码
  133. }Version_Data_frame ;
  134. typedef struct IO_Data_Reg
  135. {
  136. uint16_t IO_Addr; //2字节外设地址 30寄存器
  137. uint16_t IO_bound; //2字节 波特率 31寄存器
  138. uint16_t IO_Parity; //2字节奇偶校验 32寄存器
  139. uint16_t Bacup; //预留
  140. }IO_Data_Reg ;
  141. extern uint8_t Oil_Data_Reg[64];
  142. extern uint8_t CarLicCodeArray[31][16];
  143. extern Oil_Data_frame Oil_Data;
  144. extern uint8_t Data_V20_From_Server[68];//来自平台的0x64数据帧
  145. extern struct All_para All_Para;
  146. typedef struct Calibration_data
  147. {
  148. uint16_t ID ;//仓的ID 47 .。。
  149. uint16_t All_pack;//总包数
  150. uint16_t Child_pack_len[10];//子包长度
  151. uint8_t Oil_Carlibration_data[500];//标定数据
  152. uint16_t Old_ID;//上一次的ID
  153. }Calibration_data;
  154. typedef struct Save_Calibration_Inof
  155. {
  156. uint8_t id[4];//仓号
  157. uint16_t ALL_pack[4];//总包数
  158. uint16_t Length[4];//总长度
  159. }Save_Calibration_Inof;
  160. typedef struct Update_data
  161. {
  162. uint16_t All_pack_no;//总包数
  163. uint16_t pack_no;//子包序号
  164. uint32_t Sum_all;//总校验和
  165. uint32_t Sum_pack;//子包校验和
  166. uint8_t *data;//数据
  167. }Update_data;
  168. typedef struct Return_data
  169. {
  170. uint8_t *data;
  171. uint16_t length;
  172. }Return_data;
  173. //Daiyf ??
  174. typedef struct _T2C_SetupData
  175. {
  176. uint16_t year;
  177. uint8_t month;
  178. uint8_t day;
  179. uint8_t hour;
  180. uint8_t minute;
  181. uint8_t second;
  182. uint8_t m_second;
  183. float longitude;
  184. float latitude;
  185. float Capacity_Vt;
  186. float Capacity_V20;
  187. float liquid_level;
  188. float temperature;
  189. float inclination_angle_x;
  190. float inclination_angle_y;
  191. float pressure;
  192. float density;
  193. float Reserved_parameters_1;
  194. float Reserved_parameters_2;
  195. float Reserved_parameters_3;
  196. float Reserved_parameters_4;
  197. }sT2C_SetupData;
  198. /*
  199. 前16字节为固定帧头,接下来8字节为保留待扩展,接下来8个参数32字节为整车模拟量信息(倾角、速度等),
  200. 最后为4仓的模拟量参数与校验信息。
  201. 总长度:16+8+32+4*4*11+4=236字节。(废除F3之后容量将会加倍,最大长度按照800字节设计)
  202. */
  203. //李伟修改 20210928 1-4,5-8仓模拟量数据
  204. typedef struct _T2C_MoniLiang_Data
  205. {
  206. uint8_t FrameHead[16];
  207. uint8_t ResData[8];
  208. float MoniLiang_DataOf_Car[8];
  209. float MoniLiang_DataOfCang_1to4[11*4];
  210. uint8_t chkLRC_Data[2];
  211. uint8_t chkCRCModbus_Data[2];
  212. }sT2C_MoniLiang_Data;
  213. typedef struct _T2C_ALL_Sensor_Data_Each_Cang
  214. {//每仓传感器
  215. uint8_t FrameHead[16];
  216. uint32_t ElecSealState;
  217. uint32_t IO_Valve_Data_Every_Cang[21];
  218. float MoniLiang_Data_Every_Cang[19];
  219. uint8_t chkCRCModbus_Data[2];
  220. }sT2C_ALL_Sensor_Data_Each_Cang;
  221. typedef struct _T2C_ALL_Sensor_Data_WholeCar
  222. {//整车传感器数据 倾角 备电等
  223. uint8_t FrameHead[16];
  224. float tiltXYZ[3];
  225. uint32_t BeiDian_State_OnOff;//备电开关状态
  226. float BeiDianDianLiang;
  227. uint32_t YouQiHuiShou_State_OnOff;//开关状态
  228. uint32_t YouQiHuiShou_State_Photo;//光电状态
  229. uint32_t ResPara[13];//备用参数
  230. uint8_t chkCRCModbus_Data[2];//暂未使用
  231. }sT2C_ALL_Sensor_Data_WholeCar;
  232. typedef struct _T2C_IO_Valve_Data //开关量数据---针对内蒙古项目
  233. {
  234. uint8_t FrameHead[16];
  235. uint8_t ResData[8];
  236. float IO_Valve_DataOf_Car[8];
  237. float IO_Valve_DataOfCang_1to4[11*4];
  238. uint8_t chkLRC_Data[2];
  239. uint8_t chkCRCModbus_Data[2];
  240. }sT2C_IO_Valve_Data;
  241. /* zhuzl 20211220 增加发送帧的结构定义*/
  242. #pragma pack (1)
  243. typedef struct _NEIMENG_FRAME
  244. {
  245. //uint8_t Frame_41;
  246. uint32_t Frame_Identification;
  247. uint16_t Frame_Len;
  248. uint16_t Serial_Num;
  249. uint16_t Total_Packages;
  250. uint16_t Current_Package;
  251. uint16_t Message_Num;
  252. uint32_t Version;
  253. uint8_t Frame_Head[16];
  254. uint8_t Time[6]; //年、月、日、时、分、秒
  255. uint8_t Is_Retransmit;
  256. uint8_t Reserver1;
  257. uint8_t Data[768];
  258. }sNEIMENG_FRAME;
  259. #pragma pack ()
  260. //zhuzl add end
  261. //李伟修改 20210610 远程标定命令结构体
  262. /*
  263. 总长度为64字节;后期自己研发终端可以扩大,预计1k字节可以实现。
  264. 帧头2字节0x 3901
  265. 地址码 4字节,比如0x95510001
  266. 功能码2字节 只能是0x0003、0x0006或者0x0010
  267. 寄存器起始地址2字节:合法范围为0x0000~0xffff
  268. 数据个数2字节:最多读取0xffff字节;实际取决于终端限制,目前为256字节
  269. 保留字4字节
  270. 有效载荷44字节
  271. 保留字2字节
  272. 校验2字节
  273. */
  274. typedef struct _T2C_RemoteCaliData
  275. {
  276. uint16_t FrameHead; //帧头 0-1
  277. uint32_t AddrExtModule; //4字节扩展地址 2--5
  278. uint16_t FunctionCode; //功能码2字节 只能是0x0003、0x0006或者0x0010 6--7
  279. uint16_t AddrRegStart; //寄存器起始地址2字节:合法范围为0x0000~0xffff 8--9
  280. uint16_t NumberOfRegs; //数据个数2字节:最多读取0xffff字节;实际取决于终端限制,目前为256字节 10--11
  281. uint32_t ReserveData001; //保留字4字节 12--15
  282. uint8_t PayLoadData[192]; //有效载荷具体有三种:44,或者76字节,或者108字节;字节 16--59
  283. uint16_t ReserveData002; //保留字2字节 60--61
  284. uint16_t CheckSum; //校验2字节 62--63
  285. }sT2C_RemoteCaliDat;
  286. typedef struct _T2C_SealByElec_Fence
  287. {
  288. uint8_t FrameHead; //帧头 0-1
  289. uint8_t FrmLength; //数据长度
  290. uint8_t FunctionCode; //功能码1字节 只能是0x03
  291. uint8_t TypeOf_Seal;//离开油库 离开加油站 速度达到xx
  292. uint8_t Array_res000[56]; //数据个数2字节:最多读取0xffff字节;实际取决于终端限制,目前为256字节 10--11
  293. //李伟修改 20211208
  294. uint8_t TpyeOfUnSeal; //解封类型 01=正常解封 02=强制解封
  295. uint8_t Array_NumOfCab_To_UnSeal[8];//
  296. }sT2C_SealByElec_Fence;
  297. extern sT2C_SetupData *pT2C_SetupData;
  298. extern sT2C_SetupData T2C_SetupData[8];
  299. extern sT2C_MoniLiang_Data T2C_MoniLiang_Data_Cang1to4,T2C_MoniLiang_Data_Cang5to8;
  300. extern sT2C_MoniLiang_Data *pT2C_MoniLiang_Data;
  301. extern sT2C_SetupData *pT2C_SetupData_Con2Server;
  302. extern sT2C_SealByElec_Fence *pT2C_SealByElec_Fence;
  303. extern sT2C_SealByElec_Fence T2C_SealByElec_Fence001;
  304. extern sT2C_ALL_Sensor_Data_Each_Cang* pT2C_ALL_Sensor_Data;
  305. extern sT2C_ALL_Sensor_Data_Each_Cang T2C_ALL_Sensor_Data01,T2C_ALL_Sensor_Data02,T2C_ALL_Sensor_Data03,T2C_ALL_Sensor_Data04;
  306. extern sT2C_ALL_Sensor_Data_Each_Cang T2C_ALL_Sensor_Data05,T2C_ALL_Sensor_Data06,T2C_ALL_Sensor_Data07,T2C_ALL_Sensor_Data08;
  307. extern sT2C_ALL_Sensor_Data_WholeCar* pT2C_ALL_Sensor_WholeCar;
  308. extern sT2C_ALL_Sensor_Data_WholeCar T2C_ALL_Sensor_WholeCar01;
  309. typedef struct Data_From_Server_0x6401
  310. {
  311. int16_t Year ;//
  312. int16_t Month;//
  313. int16_t Date;//
  314. int16_t Hour;//
  315. int16_t Minute;//
  316. int16_t Second;
  317. float Longi;
  318. float Lati;
  319. float Vt;
  320. float V20;
  321. float Yewei;
  322. float Temper;
  323. float QingjiaoX;
  324. float QingjiaoY;
  325. float Pressure;
  326. float Density;
  327. float res001;
  328. float res002;
  329. uint8_t res001_u8;//控制屏幕显示本地计算的数据还是来自服务器的数据,比如Vt,V20等
  330. uint8_t res002_u8;
  331. uint8_t res003_u8;
  332. uint8_t res004_u8;
  333. }Data_From_Server_0x6401;
  334. extern Data_From_Server_0x6401 Data_From_Server_0x6401_001;
  335. extern char Version[30];
  336. extern uint8_t Oil_Carlibration_data[500];
  337. extern uint8_t UP_date_flag ;
  338. //extern uint8_t USART_RX_BUF[USART_REC_LEN]; //接收缓冲,最大USART_REC_LEN个字节.末字节为换行符
  339. extern struct Save_Calibration_Inof Save_Calibration_inof;
  340. extern Seal_Data_frame Sealing_Data;
  341. extern IO_Data_frame IO_Date;
  342. extern Data_From_Server_0x6401 Data_From_Server_0x6401_00;
  343. extern uint8_t CarLicensePlate[64];
  344. extern uint32_t addr_ext_controllBoard;
  345. //如果想串口中断接收,请不要注释以下宏定义
  346. void uart_init1(uint32_t bound);
  347. void Data_analysis(void);
  348. uint8_t * Oil_Tx_Readvalue(uint8_t exaddr,uint16_t ID,uint16_t length);
  349. Return_data * IO_Tx_Readvalue(uint16_t ID,uint16_t length);//读取IO阀门开关的应答;
  350. //u8 * Version_Tx_Readvalue(u16 ID,u16 length);
  351. Return_data * Version_Tx_Readvalue(uint16_t ID,uint16_t length);
  352. Return_data * Oil_Tx_Readpara(uint16_t ID,uint16_t length);
  353. uint8_t * IO_Tx_Readpara(uint16_t ID,uint16_t length);//读取寄存器的参数值
  354. uint8_t Set_Io_Paravalue(uint16_t ID,uint16_t length1,uint8_t * data);
  355. uint8_t Set_Oil_Paravalue(uint16_t ID,uint16_t length1,uint8_t * data);
  356. void Tx_data_to_ask(Data_frame_TypeDef temp_data);
  357. uint8_t Set_Carlibration_data(uint16_t ID,uint8_t pack,uint16_t length1,uint8_t*data);
  358. //Return_data * Read_Carlibration_data(u16 ID,u8 pack);
  359. Return_data * Read_Carlibration_data(uint16_t ID,uint8_t pack,uint16_t length);
  360. Return_data * Seal_Tx_Readvalue(uint16_t ID,uint16_t length);//读取电子铅封的应答
  361. uint8_t Get_Ask_code_value(uint16_t ID,uint16_t length1,uint8_t*data);//获取平台下发的解封码
  362. uint8_t Cang_ID(uint16_t ID);
  363. void WriteCarLicensePlate(void); //保存车牌号
  364. void TerminalSlave485_Send_Data(uint8_t *buf,uint16_t len);
  365. void TerminalSlave485_TX_Set(uint8_t en);
  366. void TestUsart1_Receive(void);
  367. //int Process_CMD_0x30(void);//温度、密度等调试数据下发
  368. int Process_CMD_0x30_ManualFix(void);//电子围栏自动施封
  369. int Process_CMD_0x38_AutoSeal_By_ElecFence(void);//电子围栏自动施封
  370. int Process_CMD_0x39_RemoteCali(uint8_t dataMode);//远程标定
  371. void FormatEachStoreData(uint8_t storeNum);
  372. void FormatWholeCarData(void);
  373. #endif