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);}