Air724+HC32L176做的电能集中器——JSY-1039单相4G集中器

很多朋友在很多地方都听到过**集中器,但是对集中器还没有隔概念,那么什么是集中器呢?
问:什么是集中器
集中器(concentrator device)是连接终端、计算机或通信设备的中心连接点设备。它成为电缆汇合的中心点。在若干终端密集区内,通常为减少通信线路,先把终端接到集中器,然后再经过高速线路将集中器连接到计算机的通信控制器,因此,集中器也是共享线路和提高线路利用率的一种有效设备。

本设备就是一个小型的集中器,可以和JSY-1030以及和深圳市健思研科技有限公司大部分产品衔接组成网络
在这里插入图片描述
本设备下行通过RS485读取其他数据采集设备汇总后通过上行4G定时上报至服务器,服务器亦可主动获取数据信息。设备多用于配电箱,工业领域、民用领域都可使用。细分领域到路灯照明系统、汽车充电站、机房节能系统、球场灯控管理系统。

小型配电箱
在这里插入图片描述

接下来开始讲解如何使用华大单片机HC32L176如何控制合宙4G模块Air724
Air724使用AT指令模式,那么需要先配置HC32串口

void App_Uart2PortCfg(void)
{
    GPIO_General_MODE_SET(AirKeyCom, 0x11);
    Gpio_SetIO(AirKeyCom);
    GPIO_General_MODE_SET(AIR724_nRst_Pro, AIR724_nRst_Pin, 0x10);
    GPIO_General_MODE_SET(AIR724_Tx_Pro, AIR724_Tx_Pin, 0x10);
    Gpio_SetAfMode(AIR724_Tx_Pro, AIR724_Tx_Pin, GpioAf1);
    GPIO_General_MODE_SET(AIR724_Rx_Pro, AIR724_Rx_Pin, 0x00);
    Gpio_SetAfMode(AIR724_Rx_Pro, AIR724_Rx_Pin, GpioAf1);
}
void App_Uart2Cfg(void)
{

    stc_uart_cfg_t stcCfg;
    // stc_uart_baud_t stcBaud;
    DDL_ZERO_STRUCT(stcCfg);
    Sysctrl_SetPeripheralGate(SysctrlPeripheralUart1, TRUE); ///
    ///< UART Init
    stcCfg.enRunMode = UartMskMode1;
    stcCfg.enStopBit = UartMsk1bit;
    stcCfg.enMmdorCk = UartMskDataOrAddr;
    stcCfg.stcBaud.u32Baud = 115200;
    stcCfg.stcBaud.enClkDiv = UartMsk8Or16Div;
    stcCfg.stcBaud.u32Pclk = Sysctrl_GetPClkFreq();
    Uart_Init(AIR724_UART, &stcCfg);

    Uart_ClrStatus(AIR724_UART, UartRC);
    Uart_ClrStatus(AIR724_UART, UartTC);
    Uart_EnableIrq(AIR724_UART, UartRxIrq);
    EnableNvic(UART1_3_IRQn, IrqLevel1, TRUE);
}

接下来开始配置Air724,在上电是最好控制模块硬件复位一次,复位后连续发送AT\r\n获取OK指令后

typedef struct
{
    char *tData;
    char *rData;
    u16 TimeOut;
    u16 WaitTime;
    u8 Cycle;
    u8 Flag;

} AIR724_CmdDef;
AIR724_CmdDef AIR724_Cmd[] = {

    {"AT\r\n", "OK", 500, 100, 10, 1},                // AT 测试通讯是否正常
    {"AT&F\r\n", "OK", 1000, 1000, 3, 1},             //恢复出厂设置
    {"ATE1&W+CREG=2;&W\r\n", "OK", 1000, 100, 3, 1},  //关闭回显
    {"AT+CPIN?\r\n", "+CPIN: READY", 500, 10, 20, 1}, //查询SIM卡是否正常
    {"AT+CSQ\r\n", "+CSQ: 0,0", 500, 10, 60, 0},      //查询信号强度
    {"AT+CGATT?\r\n", "+CGATT: 1", 500, 10, 60, 1},   //
    {"AT+CREG?\r\n", "+CREG:", 500, 10, 30, 1},       //查询模组是否注册GSM网络
    {"AT+CGREG?\r\n", "+CGREG: 0,1", 500, 10, 3, 1},  //查询模组是否注册上GPRS网络
    {"AT+CIPHEAD=1\r\n", "OK", 1000, 10, 3, 1},       //设置接收到消息时显示IP头,格式为:"+IPD,data length:"
    {"AT+CIPSHUT\r\n", "OK", 1000, 300, 3, 1},        //关闭移动场景
    {"AT+CSTT=CMNET\r\n", "OK", 1000, 100, 3, 1},     //
    {"AT+CIICR\r\n", "OK", 10000, 200, 3, 1},         //激活移动场景
    {"AT+CIFSR\r\n", "OK", 1000, 50, 10, 0},          //查询本机IP地址
    {"AT+CIFSR=?\r\n", "OK", 1000, 100, 10, 1},       //
};

如果得到的应答都正确,那么就表示模块已经可以正常连接到服务器了


```c
/**
 * @name:
 * @msg: 设置服务器IP和端口号
 * @param {*}
 * @return {*}
 */
const u8 DeviceMessage[] = {0x03, 0x39, 0x15, 0x00, 0x19, 0x00, 0xFA, 0x00, 0x64, 0x10, 0x01, 0xB0, 0x01, 0x10, 0x01};
u8 AIR724_SetIPPort(void)
{
    u8 result = 0xff;
    // u16 rlen=0;
    switch (AIR724_Workflow.Setp)
    {
    case 0: //获取本地IP地
        result = AIR724_ReloadingReadAT("AT+CIFSR\r\n", (char *)m4G.LocalIP, 1000, 3, 1);
        break;
    case 1:
        result = AIR724_ReloadingReadAT("AT+CGSN\r\n", (char *)m4G.M.u.IMEI, 500, 3, 1);
        m4G.M.u.IMEI[15] = 0;
        break;
    case 2:
        result = AIR724_ReloadingReadAT("AT+CCID\r\n", (char *)m4G.M.u.CCID, 1000, 3, 1);
        break;
    case 3:
        result = GetCREG();
        break;
    case 4:
        result = GetCSQ();
        break;
    case 5:
        result = AIR724_ReloadingWriteAT("AT+CIPCLOSE\r\n", "1234", 1000, 3, 0);
        break;
    case 6:
        memset((char *)m4G.TxData, 0, sizeof(m4G.TxData));
        sprintf((char *)m4G.TxData, "AT+CIPSTART=TCP,%d.%d.%d.%d,%d\r\n", m4G.M.u.ServerIP[0], m4G.M.u.ServerIP[1], m4G.M.u.ServerIP[2], m4G.M.u.ServerIP[3], m4G.M.u.Port[1] | m4G.M.u.Port[0] << 8);
        result = AIR724_ReloadingWriteAT((char *)m4G.TxData, "CONNECT OK", 10000, 3, 1);
        break;

    case 7:
        result = AIR724_ReloadingReadAT("AT+CIPHEAD=1\r\n", "OK", 1000, 3, 1);
        break;
    case 8: //登录
        sprintf((char *)m4G.account, "admin");
        sprintf((char *)m4G.password, "123456");
        StrTruncate(m4G.account, m4G.TxData, 0, 0, 8);
        StrTruncate(m4G.password, m4G.TxData, 0, 8, 8);
        if (AIR724_SendAndRecServerCom(0x1000, 16, m4G.TxData) == OK)
        {
            if ((AIR_Receive.u.D_FunC[0] << 8 | AIR_Receive.u.D_FunC[1]) == 0x1000 && AIR_Receive.u.DataField[0] == 0x00)
            {
                AIR724_Workflow.Setp++;
                break;
            }
        }
        break;
    case 9: //注册
        if (AIR724_SendAndRecServerCom(0x1001, 15, (u8 *)DeviceMessage) == OK)
        {
            if ((AIR_Receive.u.D_FunC[0] << 8 | AIR_Receive.u.D_FunC[1]) == 0x1001 && AIR_Receive.u.DataField[0] == 0x00)
            {
                AIR724_Workflow.Setp++;
                break;
            }
        }
        break;
    case 10: //获取时间
        if (AIR724_SendAndRecServerCom(0x1005, 6, (u8 *)m4G.Time.T) == OK)
        {
            if ((AIR_Receive.u.D_FunC[0] << 8 | AIR_Receive.u.D_FunC[1]) == 0x1005)
            {
                AIR724_Workflow.Setp++;
                StrTruncate(AIR_Receive.u.DataField, m4G.Time.T, 0, 0, 6);
                App_RtcSetTime();
                break;
            }
        }
        break;
    case 11:
        SetAirRunStep(WORK, 0);
        break;
    default:
        AIR724_Workflow.Setp = 0;
        break;
    }
    // Modbus_HoldRegCpy(ModbusPar.aModbusData, 0, 0x0200 * 2, sizeof(m4G.M.Data));
    switch (result)
    {
    case OK:
        DDL_ZERO_STRUCT(AIR724_UART_MARK.TX);
        AIR724_Workflow.WaitFlag = RESET;
        AIR724_Workflow.SendFlag = RESET;
        AIR724_Workflow.Setp++;
        break;
    case No_ops:
        break;
    case AIR_Error:
        SetAirRunStep(FAULT, 0);
        return FAULT; //转到故障
    case Wait_Timeout:
				SetAirRunStep(FAULT, 0);
        return FAULT; //转到故障
        break;
    default:
        break;
    }
    // Modbus_HoldRegCpy(m4G.M.Data, 0, 0x0200 * 2, 60);
    return WORK;
}

连接到服务器后就可以正常接收数据了,需要按照协议进行通讯
在这里插入图片描述
这里使用C#临时搭建个TCP服务器,后续会出一篇新帖讲述如何搭建TCP服务器
在这里插入图片描述
PC上位机临时测试软件
在这里插入图片描述
在这里插入图片描述
设备参数
1)电压量程:100V、220V等可选

2)电流量程:100A,外接开口互感器型号可选

3)信号处理:采用专用测量芯片,24位AD采用

4)过载能力:1.2倍量程可持续;瞬间(<20mS)电流5倍,电压1.2倍量程不损坏

5)输入阻抗:电压通道>1KΩ/V;电流通道≤100mΩ

测量输出数据

电压、电流、功率、正向电能、反向电流、漏电流、功率因素、频率等多个电参量,

测量精度

电压、电流、电量:±1.0%,有功电度1级
在这里插入图片描述

隔离

RS-485接口与供电电源、电压输入、电流输出之间相互隔离;隔离耐压2000VAC

电源

1)可选100V、220V、电压线路100V~220V

2)AC220V供电时,峰值电压不得超过265V;典型功耗:≤2W

工作环境

1)工作温度:-20~+70℃;存放温度:-40~+75℃。

2)相对湿度:5~95%,无结露(在40℃下)。

3)海拔高度:0~3000米

4)环境:无爆破、腐蚀气体及导电尘埃,无显著摇动、振动和冲击的场所。

温度漂移

≤100ppm/℃

安装方式

2P导轨式安装

需要获取程序软件代码可联系QQ:450152268技术交流,全部产品可定制。

版权声明:本文为CSDN博主「HCC_Joy」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/huang9406/article/details/122867672

生成海报
点赞 0

HCC_Joy

我还没有学会写个人说明!

暂无评论

发表评论

相关推荐

基于8051单片机实现电子时钟+数字秒表设计

概述 电子时钟是一种利用数字电路来显示秒、分、时的计时装置,与传统的机械钟相比,它具有走时准确、显 示直观、无机械传动装置等优点,因而得到广泛应用。随着人们生活环境的不断改善和美化,在许

基于Arduino的显示测量环境数据设计

题目: 基于Arduino的显示测量环境数据设计 目录 基于Arduino的显示测量环境数据设计... 3 第一章 课题任务... 4 1.1课题任务... 4 1.2任务分工... 4 1.3设计条件... 4 第