fm_ccjy/Board/Src/mf.c

75 lines
1.9 KiB
C

#include "mf.h"
/*
*发送:[硬件地址][03][起始地址高][起始地址低][总寄存器数高][总寄存器数低][CRC低][CRC高]
*返回:[硬件地址][03][字节数][寄存器0高][寄存器0低][寄存器1高][寄存器1低][寄存器n高][寄存器n低][CRC低][CRC高]
*/
void read_mf(uint8_t local_addr, uint16_t start_addr, uint16_t read_len)
{
uint8_t tx_buf[20] = {0},tx_len = 0;
uint16_t CRC_Num = 0;
tx_buf[tx_len ++] = local_addr;
tx_buf[tx_len ++] = Read_Hold;
tx_buf[tx_len ++] = (uint8_t)(start_addr >> 8);
tx_buf[tx_len ++] = (uint8_t)(start_addr & 0xFF);
tx_buf[tx_len ++] = (uint8_t)(read_len >> 8);
tx_buf[tx_len ++] = (uint8_t)(read_len & 0xFF);
CRC_Num = ModbusCRC16(tx_buf,tx_len);
tx_buf[tx_len ++] = (uint8_t)(CRC_Num & 0xFF);
tx_buf[tx_len ++] = (uint8_t)(CRC_Num >> 8);
usart6_send(tx_buf,tx_len);
}
/*
*发送:[硬件地址][06][寄存器地址高][寄存器地址低][寄存器值高][寄存器值低][CRC低][CRC高]
*返回:[硬件地址][06][寄存器地址高][寄存器地址低][寄存器值高][寄存器值低][CRC低][CRC高]
*/
void write_mf(uint8_t local_addr, uint16_t reg_addr, uint16_t write_data)
{
uint8_t tx_buf[20] = {0},tx_len = 0;
uint16_t CRC_Num = 0;
tx_buf[tx_len ++] = local_addr;
tx_buf[tx_len ++] = Write_Single;
tx_buf[tx_len ++] = (uint8_t)(reg_addr >> 8);
tx_buf[tx_len ++] = (uint8_t)(reg_addr & 0xFF);
tx_buf[tx_len ++] = (uint8_t)(write_data >> 8);
tx_buf[tx_len ++] = (uint8_t)(write_data & 0xFF);
CRC_Num = ModbusCRC16(tx_buf,tx_len);
tx_buf[tx_len ++] = (uint8_t)(CRC_Num & 0xFF);
tx_buf[tx_len ++] = (uint8_t)(CRC_Num >> 8);
usart6_send(tx_buf,tx_len);
}
//读mf4700瞬时流量
void read_mf4700_flow(void)
{
read_mf(MF4700_ADDR,MF4700_Ins_Flow_Addr,2);
}
//读mf5600瞬时流量
void read_mf5000_flow(void)
{
read_mf(MF5000_ADDR,MF5000_Ins_Flow_Addr,2);
}
//mf4700自动校零
void mf4700_zero(void)
{
write_mf(MF4700_ADDR,MF4700_Auto_Zero_Addr,General_Data);
}
//mf5600自动校零
void mf5000_zero(void)
{
write_mf(MF5000_ADDR,MF5000_Auto_Zero_Addr,General_Data);
}