377 lines
11 KiB
C++
377 lines
11 KiB
C++
|
|
/*----------------------------------------------------------------------------------------------------
|
|||
|
|
#
|
|||
|
|
# Copyright (c) 2022 Yuankang Liang(XerolySkinner)
|
|||
|
|
#
|
|||
|
|
# <09><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ԭ<EFBFBD><D4AD><EFBFBD>ṩ,<2C><><EFBFBD>κ<EFBFBD><CEBA><EFBFBD>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD>ʾ
|
|||
|
|
# <09><><EFBFBD>κ<EFBFBD><CEBA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD>߶<EFBFBD><DFB6><EFBFBD><EFBFBD>е<EFBFBD><D0B5>κ<EFBFBD><CEBA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>⳥<EFBFBD><E2B3A5><EFBFBD><EFBFBD>
|
|||
|
|
#
|
|||
|
|
# ʹ<>õ<EFBFBD><C3B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
|
|||
|
|
# 1. <09><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ,<2C>㲻<EFBFBD><E3B2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><D0B4>ԭʼ<D4AD><CABC><EFBFBD><EFBFBD>.
|
|||
|
|
# 2. <09><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>κ<EFBFBD>Ŀ<EFBFBD><C4BF>,ǰ<><C7B0><EFBFBD>ǰ<EFBFBD>Ȩ<EFBFBD><C8A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>и<EFBFBD><D0B8><EFBFBD><EFBFBD><EFBFBD>.
|
|||
|
|
# <09><><EFBFBD>Ұ<EFBFBD>Ȩ<EFBFBD><C8A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͬʱ<CDAC><CAB1><EFBFBD><EFBFBD>.
|
|||
|
|
# 3. <09><><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9>,<2C><><EFBFBD><EFBFBD>,<2C><EFBFBD>,<2C>ַ<EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD>۱<EFBFBD><DBB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
|||
|
|
# 4. <09><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD>Ʒ<EFBFBD><C6B7>ʹ<EFBFBD><CAB9>,<2C><>Ʒ<EFBFBD>ĵ<EFBFBD><C4B5>е<EFBFBD><D0B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>͵ĵ<CDB5><C4B5><EFBFBD><EFBFBD>DZ<EFBFBD><C7B1><EFBFBD><EFBFBD><EFBFBD>.
|
|||
|
|
# 5. <09><>֪ͨ<CDA8><D6AA><EFBFBD>ô<EFBFBD><C3B4>κ<EFBFBD><CEBA><EFBFBD>Դɾ<D4B4><C9BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
|||
|
|
#
|
|||
|
|
# Yuankang Liang(XerolySkinner)
|
|||
|
|
# E-mail:zabbcccbbaz@163.com
|
|||
|
|
# QQ:2715099320
|
|||
|
|
# Mobile Phone:13005636215
|
|||
|
|
#
|
|||
|
|
# All rights reserved.
|
|||
|
|
*/
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @file bsp_ModBus.cpp
|
|||
|
|
* @brief ModBusͨ<EFBFBD>ź<EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
* @mainpage <EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD>Ϣ
|
|||
|
|
* @author Yuankang Liang(XerolySkinner)
|
|||
|
|
* @email zabbcccbbaz@163.com
|
|||
|
|
* @version V1.0.0
|
|||
|
|
* @date 2022-11-21 17:09
|
|||
|
|
*/
|
|||
|
|
#pragma once
|
|||
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////////
|
|||
|
|
//----------------------------------------------------------------------------------------------------
|
|||
|
|
// ͷ<>ļ<EFBFBD>
|
|||
|
|
#include "bsp_ModBus.h"
|
|||
|
|
#include "bsp_CRC.h"
|
|||
|
|
#include <stdio.h>
|
|||
|
|
#include <stdlib.h>
|
|||
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////////
|
|||
|
|
//----------------------------------------------------------------------------------------------------
|
|||
|
|
// <09>ຯ<EFBFBD><E0BAAF>
|
|||
|
|
/**
|
|||
|
|
* @brief <EFBFBD><EFBFBD><EFBFBD>Ͷ<EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD>
|
|||
|
|
* @param address <EFBFBD><EFBFBD>ȡ<EFBFBD>ĵ<EFBFBD>ַ
|
|||
|
|
* @param mem <EFBFBD><EFBFBD>ȡ<EFBFBD>ĸ<EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
* @return <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
|
|||
|
|
*/
|
|||
|
|
void bsp_ModBus_Tx::ReadKeepReg(u16 address, u16 mem) {
|
|||
|
|
u8 dat[8];
|
|||
|
|
u16 crc;
|
|||
|
|
dat[0] = ID;
|
|||
|
|
dat[1] = Fun_R_KeepReg;
|
|||
|
|
dat[2] = ((u8*)(&address))[1];
|
|||
|
|
dat[3] = ((u8*)(&address))[0];
|
|||
|
|
dat[4] = ((u8*)(&mem))[1];
|
|||
|
|
dat[5] = ((u8*)(&mem))[0];
|
|||
|
|
crc = CRC16_MODBUS(dat, 6);
|
|||
|
|
dat[6] = ((u8*)(&crc))[0];
|
|||
|
|
dat[7] = ((u8*)(&crc))[1];
|
|||
|
|
Transmit(dat,8);}
|
|||
|
|
//----------------------------------------------------------------------------------------------------
|
|||
|
|
/**
|
|||
|
|
* @brief <EFBFBD><EFBFBD><EFBFBD>Ͷ<EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD>
|
|||
|
|
* @param address <EFBFBD><EFBFBD>ȡ<EFBFBD>ĵ<EFBFBD>ַ
|
|||
|
|
* @param mem <EFBFBD><EFBFBD>ȡ<EFBFBD>ĸ<EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
* @return <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
|
|||
|
|
*/
|
|||
|
|
void bsp_ModBus_Tx::ReadInReg(u16 address, u16 mem) {
|
|||
|
|
u8 dat[8];
|
|||
|
|
u16 crc;
|
|||
|
|
dat[0] = ID;
|
|||
|
|
dat[1] = Fun_R_InReg;
|
|||
|
|
dat[2] = ((u8*)(&address))[1];
|
|||
|
|
dat[3] = ((u8*)(&address))[0];
|
|||
|
|
dat[4] = ((u8*)(&mem))[1];
|
|||
|
|
dat[5] = ((u8*)(&mem))[0];
|
|||
|
|
crc = CRC16_MODBUS(dat,6);
|
|||
|
|
dat[6] = ((u8*)(&crc))[0];
|
|||
|
|
dat[7] = ((u8*)(&crc))[1];
|
|||
|
|
Transmit(dat, 8);}
|
|||
|
|
//----------------------------------------------------------------------------------------------------
|
|||
|
|
/**
|
|||
|
|
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD>дһ<EFBFBD><EFBFBD><EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD>
|
|||
|
|
* @param address д<EFBFBD><EFBFBD><EFBFBD>ĵ<EFBFBD>ַ
|
|||
|
|
* @param var д<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
|
|||
|
|
* @return <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
|
|||
|
|
*/
|
|||
|
|
void bsp_ModBus_Tx::WriteOneReg(u16 address, u16 var) {
|
|||
|
|
u8 dat[8];
|
|||
|
|
u16 crc;
|
|||
|
|
dat[0] = ID;
|
|||
|
|
dat[1] = Fun_W_OneReg;
|
|||
|
|
dat[2] = ((u8*)(&address))[1];
|
|||
|
|
dat[3] = ((u8*)(&address))[0];
|
|||
|
|
dat[4] = ((u8*)(&var))[1];
|
|||
|
|
dat[5] = ((u8*)(&var))[0];
|
|||
|
|
crc = CRC16_MODBUS(dat, 6);
|
|||
|
|
dat[6] = ((u8*)(&crc))[0];
|
|||
|
|
dat[7] = ((u8*)(&crc))[1];
|
|||
|
|
Transmit(dat, 8);}
|
|||
|
|
//----------------------------------------------------------------------------------------------------
|
|||
|
|
/**
|
|||
|
|
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD>
|
|||
|
|
* @param address д<EFBFBD><EFBFBD><EFBFBD>ĵ<EFBFBD>ַ
|
|||
|
|
* @param mem д<EFBFBD><EFBFBD><EFBFBD>ĸ<EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
* @param *var <EFBFBD><EFBFBD>д<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵĻ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
* @return <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
|
|||
|
|
* @note <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD>Ž<EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><EFBFBD>WriteRegsVar
|
|||
|
|
*/
|
|||
|
|
void bsp_ModBus_Tx::WriteRegs(u16 address,u16 mem,u16* var) {
|
|||
|
|
u8 bytes = 9 + mem * 2;
|
|||
|
|
u8* dat = (u8*)malloc(bytes);
|
|||
|
|
if (dat == NULL)return;
|
|||
|
|
u16 crc;
|
|||
|
|
dat[0] = ID;
|
|||
|
|
dat[1] = Fun_W_Regs;
|
|||
|
|
dat[2] = ((u8*)(&address))[1];
|
|||
|
|
dat[3] = ((u8*)(&address))[0];
|
|||
|
|
dat[4] = ((u8*)(&mem))[1];
|
|||
|
|
dat[5] = ((u8*)(&mem))[0];
|
|||
|
|
dat[6] = mem*2;
|
|||
|
|
// <09><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
for (u8 i = 0; i < mem; i++){
|
|||
|
|
dat[7 + i*2] = ((u8*)var)[1+i*2];
|
|||
|
|
dat[8 + i*2] = ((u8*)var)[0+i*2];}
|
|||
|
|
crc = CRC16_MODBUS(dat, bytes - 2);
|
|||
|
|
dat[bytes - 2] = ((u8*)(&crc))[0];
|
|||
|
|
dat[bytes - 1] = ((u8*)(&crc))[1];
|
|||
|
|
Transmit(dat, bytes);
|
|||
|
|
free(dat);}
|
|||
|
|
//----------------------------------------------------------------------------------------------------
|
|||
|
|
/**
|
|||
|
|
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD>
|
|||
|
|
* @param address д<EFBFBD><EFBFBD><EFBFBD>ĵ<EFBFBD>ַ
|
|||
|
|
* @param mem д<EFBFBD><EFBFBD><EFBFBD>ĸ<EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
* @param var д<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>mem<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˴<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
* @return <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
|
|||
|
|
*/
|
|||
|
|
void bsp_ModBus_Tx::WriteRegsVar(u16 address, u16 mem,...) {
|
|||
|
|
va_list table;
|
|||
|
|
va_start(table,mem);
|
|||
|
|
u16 vars;
|
|||
|
|
u8 bytes = 9 + mem * 2;
|
|||
|
|
u8* dat = (u8*)malloc(bytes);
|
|||
|
|
if (dat == NULL)return;
|
|||
|
|
u16 crc;
|
|||
|
|
dat[0] = ID;
|
|||
|
|
dat[1] = Fun_W_Regs;
|
|||
|
|
dat[2] = ((u8*)(&address))[1];
|
|||
|
|
dat[3] = ((u8*)(&address))[0];
|
|||
|
|
dat[4] = ((u8*)(&mem))[1];
|
|||
|
|
dat[5] = ((u8*)(&mem))[0];
|
|||
|
|
dat[6] = mem*2;
|
|||
|
|
// <09><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
for (u8 i = 0; i < mem; i++){
|
|||
|
|
vars=va_arg(table, u32);
|
|||
|
|
dat[7 + i*2] = ((u8*)(&vars))[1];
|
|||
|
|
dat[8 + i*2] = ((u8*)(&vars))[0];}
|
|||
|
|
crc = CRC16_MODBUS(dat, bytes - 2);
|
|||
|
|
dat[bytes - 2] = ((u8*)(&crc))[0];
|
|||
|
|
dat[bytes - 1] = ((u8*)(&crc))[1];
|
|||
|
|
Transmit(dat, bytes);
|
|||
|
|
free(dat);
|
|||
|
|
va_end(table);}
|
|||
|
|
//----------------------------------------------------------------------------------------------------
|
|||
|
|
/**
|
|||
|
|
* @brief <EFBFBD><EFBFBD><EFBFBD>Ͷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ȧ<EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD>
|
|||
|
|
* @param address <EFBFBD><EFBFBD>ȡ<EFBFBD>ĵ<EFBFBD>ַ
|
|||
|
|
* @param mem <EFBFBD><EFBFBD>ȡ<EFBFBD>ĸ<EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
* @return <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
|
|||
|
|
*/
|
|||
|
|
void bsp_ModBus_Tx::ReadOutCoil(u16 address, u16 mem) {
|
|||
|
|
u8 dat[8];
|
|||
|
|
u16 crc;
|
|||
|
|
dat[0] = ID;
|
|||
|
|
dat[1] = Fun_R_OutCoil;
|
|||
|
|
dat[2] = ((u8*)(&address))[1];
|
|||
|
|
dat[3] = ((u8*)(&address))[0];
|
|||
|
|
dat[4] = ((u8*)(&mem))[1];
|
|||
|
|
dat[5] = ((u8*)(&mem))[0];
|
|||
|
|
crc = CRC16_MODBUS(dat, 6);
|
|||
|
|
dat[6] = ((u8*)(&crc))[0];
|
|||
|
|
dat[7] = ((u8*)(&crc))[1];
|
|||
|
|
Transmit(dat, 8);}
|
|||
|
|
//----------------------------------------------------------------------------------------------------
|
|||
|
|
/**
|
|||
|
|
* @brief <EFBFBD><EFBFBD><EFBFBD>Ͷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ȧ<EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD>
|
|||
|
|
* @param address <EFBFBD><EFBFBD>ȡ<EFBFBD>ĵ<EFBFBD>ַ
|
|||
|
|
* @param mem <EFBFBD><EFBFBD>ȡ<EFBFBD>ĸ<EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
* @return <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
|
|||
|
|
*/
|
|||
|
|
void bsp_ModBus_Tx::ReadInCoil(u16 address, u16 mem) {
|
|||
|
|
u8 dat[8];
|
|||
|
|
u16 crc;
|
|||
|
|
dat[0] = ID;
|
|||
|
|
dat[1] = Fun_R_InCoil;
|
|||
|
|
dat[2] = ((u8*)(&address))[1];
|
|||
|
|
dat[3] = ((u8*)(&address))[0];
|
|||
|
|
dat[4] = ((u8*)(&mem))[1];
|
|||
|
|
dat[5] = ((u8*)(&mem))[0];
|
|||
|
|
crc = CRC16_MODBUS(dat, 6);
|
|||
|
|
dat[6] = ((u8*)(&crc))[0];
|
|||
|
|
dat[7] = ((u8*)(&crc))[1];
|
|||
|
|
Transmit(dat, 8);}
|
|||
|
|
//----------------------------------------------------------------------------------------------------
|
|||
|
|
/**
|
|||
|
|
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ȧ<EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD>
|
|||
|
|
* @param address д<EFBFBD><EFBFBD><EFBFBD>ĵ<EFBFBD>ַ
|
|||
|
|
* @param state д<EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬
|
|||
|
|
* 0:<EFBFBD><EFBFBD>λ
|
|||
|
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>:<EFBFBD><EFBFBD>λ
|
|||
|
|
* @return <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
|
|||
|
|
*/
|
|||
|
|
void bsp_ModBus_Tx::WriteOneCoil(u16 address, u16 state){
|
|||
|
|
u8 dat[8];
|
|||
|
|
u16 var = state ? 0xFF00 : 0x0000;
|
|||
|
|
u16 crc;
|
|||
|
|
dat[0] = ID;
|
|||
|
|
dat[1] = Fun_W_OneCoil;
|
|||
|
|
dat[2] = ((u8*)(&address))[1];
|
|||
|
|
dat[3] = ((u8*)(&address))[0];
|
|||
|
|
dat[4] = ((u8*)(&var))[1];
|
|||
|
|
dat[5] = ((u8*)(&var))[0];
|
|||
|
|
crc = CRC16_MODBUS(dat, 6);
|
|||
|
|
dat[6] = ((u8*)(&crc))[0];
|
|||
|
|
dat[7] = ((u8*)(&crc))[1];
|
|||
|
|
Transmit(dat, 8);}
|
|||
|
|
//----------------------------------------------------------------------------------------------------
|
|||
|
|
/**
|
|||
|
|
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ȧ<EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD>
|
|||
|
|
* @param address д<EFBFBD><EFBFBD><EFBFBD>ĵ<EFBFBD>ַ
|
|||
|
|
* @param mem д<EFBFBD><EFBFBD><EFBFBD>ĸ<EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
* @param *var <EFBFBD><EFBFBD>д<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵĻ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
* @return <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
|
|||
|
|
* @note <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD>Ž<EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><EFBFBD>WriteCoilsVar
|
|||
|
|
*/
|
|||
|
|
void bsp_ModBus_Tx::WriteCoils(u16 address, u16 mem, u8* var) {
|
|||
|
|
u8 bytes = (mem / 8) + (mem % 8 != 0) + 9;
|
|||
|
|
u8* dat = (u8*)malloc(bytes);
|
|||
|
|
if (dat == NULL)return;
|
|||
|
|
u16 crc;
|
|||
|
|
dat[0] = ID;
|
|||
|
|
dat[1] = Fun_W_Coils;
|
|||
|
|
dat[2] = ((u8*)(&address))[1];
|
|||
|
|
dat[3] = ((u8*)(&address))[0];
|
|||
|
|
dat[4] = ((u8*)(&mem))[1];
|
|||
|
|
dat[5] = ((u8*)(&mem))[0];
|
|||
|
|
dat[6] = bytes - 9;
|
|||
|
|
// <09><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
for (u8 i = 0; i < bytes - 9; i++)dat[7 + i] = var[i];
|
|||
|
|
crc = CRC16_MODBUS(dat, bytes - 2);
|
|||
|
|
dat[bytes - 2] = ((u8*)(&crc))[0];
|
|||
|
|
dat[bytes - 1] = ((u8*)(&crc))[1];
|
|||
|
|
Transmit(dat, bytes);
|
|||
|
|
free(dat);}
|
|||
|
|
//----------------------------------------------------------------------------------------------------
|
|||
|
|
/**
|
|||
|
|
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ȧ<EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD>
|
|||
|
|
* @param address д<EFBFBD><EFBFBD><EFBFBD>ĵ<EFBFBD>ַ
|
|||
|
|
* @param mem д<EFBFBD><EFBFBD><EFBFBD>ĸ<EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
* @param var д<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>mem<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˴<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
* @return <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
|
|||
|
|
*/
|
|||
|
|
void bsp_ModBus_Tx::WriteCoilsVar(u16 address, u16 mem,...) {
|
|||
|
|
va_list table;
|
|||
|
|
va_start(table,mem);
|
|||
|
|
u8 var=0;
|
|||
|
|
u16 crc;
|
|||
|
|
u8 bytes = (mem / 8) + (mem % 8 != 0) + 9;
|
|||
|
|
u8* dat = (u8*)malloc(bytes);
|
|||
|
|
if (dat == NULL)return;
|
|||
|
|
dat[0] = ID;
|
|||
|
|
dat[1] = Fun_W_Coils;
|
|||
|
|
dat[2] = ((u8*)(&address))[1];
|
|||
|
|
dat[3] = ((u8*)(&address))[0];
|
|||
|
|
dat[4] = ((u8*)(&mem))[1];
|
|||
|
|
dat[5] = ((u8*)(&mem))[0];
|
|||
|
|
dat[6] = bytes - 9;
|
|||
|
|
// <09><><EFBFBD><EFBFBD><EFBFBD>ܽ<EFBFBD><DCBD><EFBFBD>Ϣ
|
|||
|
|
for(u16 i=0;i<mem;i++){
|
|||
|
|
var=va_arg(table,u32);
|
|||
|
|
if(var)
|
|||
|
|
dat[7 + (i/8)]|=1<<(i%8);
|
|||
|
|
else
|
|||
|
|
dat[7 + (i/8)]&=~(1<<(i%8));}
|
|||
|
|
crc = CRC16_MODBUS(dat, bytes - 2);
|
|||
|
|
dat[bytes - 2] = ((u8*)(&crc))[0];
|
|||
|
|
dat[bytes - 1] = ((u8*)(&crc))[1];
|
|||
|
|
Transmit(dat, bytes);
|
|||
|
|
free(dat);
|
|||
|
|
va_end(table);}
|
|||
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////////
|
|||
|
|
//----------------------------------------------------------------------------------------------------
|
|||
|
|
// <09>ຯ<EFBFBD><E0BAAF>
|
|||
|
|
/**
|
|||
|
|
* @brief <EFBFBD><EFBFBD>ModBusЭ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
* @param *dat <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ļ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
* @return <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
|
|||
|
|
*/
|
|||
|
|
void bsp_ModBus_Rx::analysis(u8* dat) {
|
|||
|
|
u16 crc = 0;
|
|||
|
|
ID = dat[0];
|
|||
|
|
Func = dat[1];
|
|||
|
|
// <09>ͷŻ<CDB7><C5BB><EFBFBD><EFBFBD>ڴ<EFBFBD>
|
|||
|
|
free(OutCoilDat);
|
|||
|
|
free(InCoilDat);
|
|||
|
|
free(KeepRegDat);
|
|||
|
|
free(InRegDat);
|
|||
|
|
// CRC<52><43><EFBFBD><EFBFBD>
|
|||
|
|
if (Func == Fun_R_OutCoil ||
|
|||
|
|
Func == Fun_R_InCoil ||
|
|||
|
|
Func == Fun_R_KeepReg ||
|
|||
|
|
Func == Fun_R_InReg) {
|
|||
|
|
crc = CRC16_MODBUS(dat, dat[2] + 3);
|
|||
|
|
crcts = ( ((u8*)(&crc))[1] == dat[dat[2] + 3] &&
|
|||
|
|
((u8*)(&crc))[0] == dat[dat[2] + 4]);}
|
|||
|
|
switch (Func) {
|
|||
|
|
case Fun_R_OutCoil:
|
|||
|
|
// <09><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ȧ
|
|||
|
|
OutCoilMem = dat[2];
|
|||
|
|
OutCoilDat = (u8*)malloc(OutCoilMem);
|
|||
|
|
if (OutCoilDat == NULL)break;
|
|||
|
|
for (u8 i = 0; i < OutCoilMem; i++)
|
|||
|
|
OutCoilDat[i] = dat[3 + i];
|
|||
|
|
break;
|
|||
|
|
case Fun_R_InCoil:
|
|||
|
|
// <09><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ȧ
|
|||
|
|
InCoilMem = dat[2];
|
|||
|
|
InCoilDat = (u8*)malloc(InCoilMem);
|
|||
|
|
if (InCoilDat == NULL)break;
|
|||
|
|
for (u8 i = 0; i < InCoilMem; i++)
|
|||
|
|
InCoilDat[i] = dat[3 + i];
|
|||
|
|
break;
|
|||
|
|
case Fun_R_KeepReg:
|
|||
|
|
// <09><><EFBFBD>ּĴ<D6BC><C4B4><EFBFBD>
|
|||
|
|
KeepRegMem = dat[2] / 2;
|
|||
|
|
KeepRegDat = (u16*)malloc(KeepRegMem * 2);
|
|||
|
|
if (KeepRegDat == NULL)break;
|
|||
|
|
for (u8 i = 0; i < KeepRegMem; i++) {
|
|||
|
|
((u8*)KeepRegDat)[1 + i * 2] = dat[3 + i * 2];
|
|||
|
|
((u8*)KeepRegDat)[0 + i * 2] = dat[4 + i * 2];}
|
|||
|
|
break;
|
|||
|
|
case Fun_R_InReg:
|
|||
|
|
// <09><><EFBFBD><EFBFBD><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD>
|
|||
|
|
InRegMem = dat[2] / 2;
|
|||
|
|
InRegDat = (u16*)malloc(InRegMem * 2);
|
|||
|
|
if (InRegDat == NULL)break;
|
|||
|
|
for (u8 i = 0; i < InRegMem; i++) {
|
|||
|
|
((u8*)InRegDat)[1 + i * 2] = dat[3 + i * 2];
|
|||
|
|
((u8*)InRegDat)[0 + i * 2] = dat[4 + i * 2];}
|
|||
|
|
break;
|
|||
|
|
default:
|
|||
|
|
// д<><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
break;}}
|
|||
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////////
|
|||
|
|
//----------------------------------------------------------------------------------------------------
|
|||
|
|
// <09><><EFBFBD>캯<EFBFBD><ECBAAF>
|
|||
|
|
bsp_ModBus_Tx::bsp_ModBus_Tx(u8 ID) {
|
|||
|
|
bsp_ModBus_Tx::ID = ID;}
|
|||
|
|
//----------------------------------------------------------------------------------------------------
|
|||
|
|
bsp_ModBus_Rx::bsp_ModBus_Rx(void) {
|
|||
|
|
KeepRegDat = NULL;
|
|||
|
|
InRegDat = NULL;
|
|||
|
|
OutCoilDat = NULL;
|
|||
|
|
InCoilDat = NULL;}
|
|||
|
|
//----------------------------------------------------------------------------------------------------
|
|||
|
|
bsp_ModBus_Rx::~bsp_ModBus_Rx(void){
|
|||
|
|
free(OutCoilDat);
|
|||
|
|
free(InCoilDat);
|
|||
|
|
free(KeepRegDat);
|
|||
|
|
free(InRegDat);}
|
|||
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////////
|