bsp_ModBus.cpp D:/gitt/MicrochipFor32/bsp_Device/bsp_ModBus.cpp 浏览该文件的文档.00001 /*---------------------------------------------------------------------------------------------------- 00002 # 00003 # Copyright (c) 2022 Yuankang Liang(XerolySkinner) 00004 # 00005 # 本软件按原样提供,无任何明示或暗示 00006 # 在任何情况下,作者都不承担任何损害赔偿责任 00007 # 00008 # 使用的许可声明: 00009 # 1. 不得歪曲本软件的来源,你不能声称你编写了原始软件. 00010 # 2. 免费授予以任何目的,前提是版权声明出现在所有副本中. 00011 # 并且版权声明和许可声明同时出现. 00012 # 3. 你有使用,复制,修改,分发,和销售本软件的许可. 00013 # 4. 如果你在产品中使用,产品文档中的声明是赞赏的但不是必须的. 00014 # 5. 本通知不得从任何来源删除或更改. 00015 # 00016 # Yuankang Liang(XerolySkinner) 00017 # E-mail:zabbcccbbaz@163.com 00018 # QQ:2715099320 00019 # Mobile Phone:13005636215 00020 # 00021 # All rights reserved. 00022 */ 00023 00033 #pragma once 00035 //---------------------------------------------------------------------------------------------------- 00036 // 头文件 00037 #include "bsp_ModBus.h" 00038 #include "bsp_CRC.h" 00039 #include <stdio.h> 00040 #include <stdlib.h> 00042 //---------------------------------------------------------------------------------------------------- 00043 // 类函数 00050 void bsp_ModBus_Tx::ReadKeepReg(u16 address, u16 mem) { 00051 u8 dat[8]; 00052 u16 crc; 00053 dat[0] = ID; 00054 dat[1] = Fun_R_KeepReg; 00055 dat[2] = ((u8*)(&address))[1]; 00056 dat[3] = ((u8*)(&address))[0]; 00057 dat[4] = ((u8*)(&mem))[1]; 00058 dat[5] = ((u8*)(&mem))[0]; 00059 crc = CRC16_MODBUS(dat, 6); 00060 dat[6] = ((u8*)(&crc))[0]; 00061 dat[7] = ((u8*)(&crc))[1]; 00062 Transmit(dat,8);} 00063 //---------------------------------------------------------------------------------------------------- 00070 void bsp_ModBus_Tx::ReadInReg(u16 address, u16 mem) { 00071 u8 dat[8]; 00072 u16 crc; 00073 dat[0] = ID; 00074 dat[1] = Fun_R_InReg; 00075 dat[2] = ((u8*)(&address))[1]; 00076 dat[3] = ((u8*)(&address))[0]; 00077 dat[4] = ((u8*)(&mem))[1]; 00078 dat[5] = ((u8*)(&mem))[0]; 00079 crc = CRC16_MODBUS(dat,6); 00080 dat[6] = ((u8*)(&crc))[0]; 00081 dat[7] = ((u8*)(&crc))[1]; 00082 Transmit(dat, 8);} 00083 //---------------------------------------------------------------------------------------------------- 00090 void bsp_ModBus_Tx::WriteOneReg(u16 address, u16 var) { 00091 u8 dat[8]; 00092 u16 crc; 00093 dat[0] = ID; 00094 dat[1] = Fun_W_OneReg; 00095 dat[2] = ((u8*)(&address))[1]; 00096 dat[3] = ((u8*)(&address))[0]; 00097 dat[4] = ((u8*)(&var))[1]; 00098 dat[5] = ((u8*)(&var))[0]; 00099 crc = CRC16_MODBUS(dat, 6); 00100 dat[6] = ((u8*)(&crc))[0]; 00101 dat[7] = ((u8*)(&crc))[1]; 00102 Transmit(dat, 8);} 00103 //---------------------------------------------------------------------------------------------------- 00112 void bsp_ModBus_Tx::WriteRegs(u16 address,u16 mem,u16* var) { 00113 u8 bytes = 9 + mem * 2; 00114 u8* dat = (u8*)malloc(bytes); 00115 if (dat == NULL)return; 00116 u16 crc; 00117 dat[0] = ID; 00118 dat[1] = Fun_W_Regs; 00119 dat[2] = ((u8*)(&address))[1]; 00120 dat[3] = ((u8*)(&address))[0]; 00121 dat[4] = ((u8*)(&mem))[1]; 00122 dat[5] = ((u8*)(&mem))[0]; 00123 dat[6] = mem*2; 00124 // 填入数据 00125 for (u8 i = 0; i < mem; i++){ 00126 dat[7 + i*2] = ((u8*)var)[1+i*2]; 00127 dat[8 + i*2] = ((u8*)var)[0+i*2];} 00128 crc = CRC16_MODBUS(dat, bytes - 2); 00129 dat[bytes - 2] = ((u8*)(&crc))[0]; 00130 dat[bytes - 1] = ((u8*)(&crc))[1]; 00131 Transmit(dat, bytes); 00132 free(dat);} 00133 //---------------------------------------------------------------------------------------------------- 00142 void bsp_ModBus_Tx::WriteRegsVar(u16 address, u16 mem,...) { 00143 va_list table; 00144 va_start(table,mem); 00145 u16 vars; 00146 u8 bytes = 9 + mem * 2; 00147 u8* dat = (u8*)malloc(bytes); 00148 if (dat == NULL)return; 00149 u16 crc; 00150 dat[0] = ID; 00151 dat[1] = Fun_W_Regs; 00152 dat[2] = ((u8*)(&address))[1]; 00153 dat[3] = ((u8*)(&address))[0]; 00154 dat[4] = ((u8*)(&mem))[1]; 00155 dat[5] = ((u8*)(&mem))[0]; 00156 dat[6] = mem*2; 00157 // 填入数据 00158 for (u8 i = 0; i < mem; i++){ 00159 vars=va_arg(table, u32); 00160 dat[7 + i*2] = ((u8*)(&vars))[1]; 00161 dat[8 + i*2] = ((u8*)(&vars))[0];} 00162 crc = CRC16_MODBUS(dat, bytes - 2); 00163 dat[bytes - 2] = ((u8*)(&crc))[0]; 00164 dat[bytes - 1] = ((u8*)(&crc))[1]; 00165 Transmit(dat, bytes); 00166 free(dat); 00167 va_end(table);} 00168 //---------------------------------------------------------------------------------------------------- 00175 void bsp_ModBus_Tx::ReadOutCoil(u16 address, u16 mem) { 00176 u8 dat[8]; 00177 u16 crc; 00178 dat[0] = ID; 00179 dat[1] = Fun_R_OutCoil; 00180 dat[2] = ((u8*)(&address))[1]; 00181 dat[3] = ((u8*)(&address))[0]; 00182 dat[4] = ((u8*)(&mem))[1]; 00183 dat[5] = ((u8*)(&mem))[0]; 00184 crc = CRC16_MODBUS(dat, 6); 00185 dat[6] = ((u8*)(&crc))[0]; 00186 dat[7] = ((u8*)(&crc))[1]; 00187 Transmit(dat, 8);} 00188 //---------------------------------------------------------------------------------------------------- 00195 void bsp_ModBus_Tx::ReadInCoil(u16 address, u16 mem) { 00196 u8 dat[8]; 00197 u16 crc; 00198 dat[0] = ID; 00199 dat[1] = Fun_R_InCoil; 00200 dat[2] = ((u8*)(&address))[1]; 00201 dat[3] = ((u8*)(&address))[0]; 00202 dat[4] = ((u8*)(&mem))[1]; 00203 dat[5] = ((u8*)(&mem))[0]; 00204 crc = CRC16_MODBUS(dat, 6); 00205 dat[6] = ((u8*)(&crc))[0]; 00206 dat[7] = ((u8*)(&crc))[1]; 00207 Transmit(dat, 8);} 00208 //---------------------------------------------------------------------------------------------------- 00217 void bsp_ModBus_Tx::WriteOneCoil(u16 address, u16 state){ 00218 u8 dat[8]; 00219 u16 var = state ? 0xFF00 : 0x0000; 00220 u16 crc; 00221 dat[0] = ID; 00222 dat[1] = Fun_W_OneCoil; 00223 dat[2] = ((u8*)(&address))[1]; 00224 dat[3] = ((u8*)(&address))[0]; 00225 dat[4] = ((u8*)(&var))[1]; 00226 dat[5] = ((u8*)(&var))[0]; 00227 crc = CRC16_MODBUS(dat, 6); 00228 dat[6] = ((u8*)(&crc))[0]; 00229 dat[7] = ((u8*)(&crc))[1]; 00230 Transmit(dat, 8);} 00231 //---------------------------------------------------------------------------------------------------- 00240 void bsp_ModBus_Tx::WriteCoils(u16 address, u16 mem, u8* var) { 00241 u8 bytes = (mem / 8) + (mem % 8 != 0) + 9; 00242 u8* dat = (u8*)malloc(bytes); 00243 if (dat == NULL)return; 00244 u16 crc; 00245 dat[0] = ID; 00246 dat[1] = Fun_W_Coils; 00247 dat[2] = ((u8*)(&address))[1]; 00248 dat[3] = ((u8*)(&address))[0]; 00249 dat[4] = ((u8*)(&mem))[1]; 00250 dat[5] = ((u8*)(&mem))[0]; 00251 dat[6] = bytes - 9; 00252 // 填入数据 00253 for (u8 i = 0; i < bytes - 9; i++)dat[7 + i] = var[i]; 00254 crc = CRC16_MODBUS(dat, bytes - 2); 00255 dat[bytes - 2] = ((u8*)(&crc))[0]; 00256 dat[bytes - 1] = ((u8*)(&crc))[1]; 00257 Transmit(dat, bytes); 00258 free(dat);} 00259 //---------------------------------------------------------------------------------------------------- 00268 void bsp_ModBus_Tx::WriteCoilsVar(u16 address, u16 mem,...) { 00269 va_list table; 00270 va_start(table,mem); 00271 u8 var=0; 00272 u16 crc; 00273 u8 bytes = (mem / 8) + (mem % 8 != 0) + 9; 00274 u8* dat = (u8*)malloc(bytes); 00275 if (dat == NULL)return; 00276 dat[0] = ID; 00277 dat[1] = Fun_W_Coils; 00278 dat[2] = ((u8*)(&address))[1]; 00279 dat[3] = ((u8*)(&address))[0]; 00280 dat[4] = ((u8*)(&mem))[1]; 00281 dat[5] = ((u8*)(&mem))[0]; 00282 dat[6] = bytes - 9; 00283 // 填入管脚信息 00284 for(u16 i=0;i<mem;i++){ 00285 var=va_arg(table,u32); 00286 if(var) 00287 dat[7 + (i/8)]|=1<<(i%8); 00288 else 00289 dat[7 + (i/8)]&=~(1<<(i%8));} 00290 crc = CRC16_MODBUS(dat, bytes - 2); 00291 dat[bytes - 2] = ((u8*)(&crc))[0]; 00292 dat[bytes - 1] = ((u8*)(&crc))[1]; 00293 Transmit(dat, bytes); 00294 free(dat); 00295 va_end(table);} 00297 //---------------------------------------------------------------------------------------------------- 00298 // 类函数 00304 void bsp_ModBus_Rx::analysis(u8* dat) { 00305 u16 crc = 0; 00306 ID = dat[0]; 00307 Func = dat[1]; 00308 // 释放缓存内存 00309 free(OutCoilDat); 00310 free(InCoilDat); 00311 free(KeepRegDat); 00312 free(InRegDat); 00313 // CRC检验 00314 if (Func == Fun_R_OutCoil || 00315 Func == Fun_R_InCoil || 00316 Func == Fun_R_KeepReg || 00317 Func == Fun_R_InReg) { 00318 crc = CRC16_MODBUS(dat, dat[2] + 3); 00319 crcts = ( ((u8*)(&crc))[1] == dat[dat[2] + 3] && 00320 ((u8*)(&crc))[0] == dat[dat[2] + 4]);} 00321 switch (Func) { 00322 case Fun_R_OutCoil: 00323 // 输出线圈 00324 OutCoilMem = dat[2]; 00325 OutCoilDat = (u8*)malloc(OutCoilMem); 00326 if (OutCoilDat == NULL)break; 00327 for (u8 i = 0; i < OutCoilMem; i++) 00328 OutCoilDat[i] = dat[3 + i]; 00329 break; 00330 case Fun_R_InCoil: 00331 // 输入线圈 00332 InCoilMem = dat[2]; 00333 InCoilDat = (u8*)malloc(InCoilMem); 00334 if (InCoilDat == NULL)break; 00335 for (u8 i = 0; i < InCoilMem; i++) 00336 InCoilDat[i] = dat[3 + i]; 00337 break; 00338 case Fun_R_KeepReg: 00339 // 保持寄存器 00340 KeepRegMem = dat[2] / 2; 00341 KeepRegDat = (u16*)malloc(KeepRegMem * 2); 00342 if (KeepRegDat == NULL)break; 00343 for (u8 i = 0; i < KeepRegMem; i++) { 00344 ((u8*)KeepRegDat)[1 + i * 2] = dat[3 + i * 2]; 00345 ((u8*)KeepRegDat)[0 + i * 2] = dat[4 + i * 2];} 00346 break; 00347 case Fun_R_InReg: 00348 // 输入寄存器 00349 InRegMem = dat[2] / 2; 00350 InRegDat = (u16*)malloc(InRegMem * 2); 00351 if (InRegDat == NULL)break; 00352 for (u8 i = 0; i < InRegMem; i++) { 00353 ((u8*)InRegDat)[1 + i * 2] = dat[3 + i * 2]; 00354 ((u8*)InRegDat)[0 + i * 2] = dat[4 + i * 2];} 00355 break; 00356 default: 00357 // 写回显与其他 00358 break;}} 00360 //---------------------------------------------------------------------------------------------------- 00361 // 构造函数 00362 bsp_ModBus_Tx::bsp_ModBus_Tx(u8 ID) { 00363 bsp_ModBus_Tx::ID = ID;} 00364 //---------------------------------------------------------------------------------------------------- 00365 bsp_ModBus_Rx::bsp_ModBus_Rx(void) { 00366 KeepRegDat = NULL; 00367 InRegDat = NULL; 00368 OutCoilDat = NULL; 00369 InCoilDat = NULL;} 00370 //---------------------------------------------------------------------------------------------------- 00371 bsp_ModBus_Rx::~bsp_ModBus_Rx(void){ 00372 free(OutCoilDat); 00373 free(InCoilDat); 00374 free(KeepRegDat); 00375 free(InRegDat);}