原创 物联网系统中空开产品定时和延时功能的实现方案

2024-10-10 14:22 77 0 分类: 物联网


01

概述


空气开关,又名空气断路器,是断路器的一种。是一种只要电路中电流超过额定电流就会自动断开的开关。空气开关是低压配电网络和电力拖动系统中非常重要的一种电器,它集控制和多种保护功能于一身。除能完成接触和分断电路外,尚能对电路或电气设备发生的短路、严重过载及欠电压等进行保护,同时也可以用于不频繁地启动电动机。

4G网络无线空气开关是一种结合了现代通信技术的断路器,它通过4G网络实现了无线远程控制功能,使得用户可以通过手机或其他智能设备对电路进行控制,包括开启、关闭以及监控电路的状态。这种空气开关不仅提供了远程控制的便利,还增加了电路的安全性和管理的灵活性。

4G空气开关的主要特点包括:

  • 远程控制‌:用户可以通过4G网络,随时随地通过手机APP或其他智能设备对电路进行控制,无需近距离操作。
  • 实时监控‌:能够实时监控电路的状态,包括电流、电压等参数,确保电路安全运行。
  • 故障诊断‌:通过4G网络传输的数据,可以及时发现电路故障,提前预警,避免事故发生。
  • 多种保护功能‌:具备短路保护、过载保护、失压保护等多种保护功能,确保电路和设备的安全。


02

4G空气开关功能


当未来某个时刻需要空气开关进行分闸或者合闸,通过手动来控制可以达到目的,但是,可能会遇到操作不及时等问题。因此,空气开关都会提供定时功能,只需要设置好定时,到了时间,空气开关会响应相应的设置动作,合闸或者分闸。延时主要场景是,按照实际需求,需要合闸1小时,2小时等情况。

1 定时

设置一个定时器,定时器定时时间范围1分钟到24小时,超时后会合闸或者分闸

2 延时

设置一个定时器,超时后,会执行延时超时相应动作


03

组件的使用


1 Gitee链接地址

Demo位于amaziot_bloom_os_sdk\sample\libraries\8.4_timer_delay

Gitee源码地址:https://gitee.com/ning./hongdou

Github源码地址:https://github.com/ayumid/hongdou

编译指令:.\build.bat -l .\amaziot_bloom_os_sdk\sample\libraries\8.4_timer_delay

2 组件功能介绍

本组件实现空开产品中的定时,和延时功能,并进行相应的后续操作。

定时和延时本质是一样的,服务器提供未来某个时刻或者延时到未来某个时刻,都涉及当前时刻,未来时刻,间隔三个参数,因此实现两种功能使用下面相同的api。服务器不同的参数可以转换后调用本组件的API。

3 代码讲解

1 lib_am_ty_sw_timer_delay_timer_init

功能:该函数用于,初始化定时,延时任务,和相关资源。

参数:无

返回值:无

示例:

C
lib_am_ty_sw_timer_delay_timer_init();

2 lib_am_ty_sw_timer_delay_timer_task

功能:该函数用于,定时,延时任务

参数:无

返回值:无

示例:

C
ret = OSATaskCreate(&lib_am_ty_sw_timer_delay_timer_task_ref, lats_timer_delay_timer_task_stack, LATS_TASK_TIMER_TASK_STACK_SIZE, 120, "timer_delay_timer_task", lib_am_ty_sw_timer_delay_timer_task, NULL);

3 lib_am_ty_sw_timer_refresh

功能:该函数用于,检查数组中的定时,是否超时,需要动作。

参数:无

返回值:无

示例:

C
lib_am_ty_sw_timer_refresh();

4 lib_am_ty_sw_timer_delay_timer_cbk

功能:该函数用于,定时器超时回调函数。

参数:无

返回值:无

示例:

C
OSATimerStart(lib_am_ty_sw_timer_delay_timer_ref, 200, 200, lib_am_ty_sw_timer_delay_timer_cbk, 0);

4 Demo实战

4.1 创建一个Demo

复制8.3_interlocking示例工程,到同一个文件夹下,修改文件名为8.4_timer_delay,如图:

4.2 修改makefile

增加文件组件所在目录头文件路径,和源文件路径,如图:

4.3 增加头文件

使用代码编辑器,将新建的工程文件加入代码编辑器中,打开main.c,修改main.c,加入am.h等头文件,如图:

4.4 修改代码

在Phase2Inits_exit 创建一个任务,如图:

4.5 宏定义介绍

  • sample_td_uart_printf

输出日志到DEBUG 串口,日志比较少,可以输出到这个串口,如果日志比较多,需要输出到usb口,以免不必要的问题出现

  • sample_td_catstudio_printf

输出日志到USB 串口,使用catstudio查看,catstudio查看日志需要更新对应版本mdb.txt文件,软件打开filtter过滤日志,只查看用户输出的日志

  • SAMPLE_TD_TASK_STACK_SIZE

栈空间宏定义

4.6 全局变量介绍

  • sample_td_task_stack

任务栈空间,本例使用数组实现,用户在做项目时,可以预先估算下当先任务需要的大致栈空间,OS没有提供可以查看栈空间使用情况的API

  • sample_td_task_ref

任务指针

4.7 函数介绍

  • Phase1Inits_enter

底层初始化,本例空

  • Phase1Inits_exit

底层初始化,本例空

  • Phase2Inits_enter

底层初始化,本例空

  • Phase2Inits_exit

创建主任务,初始化消息队列,定时器,任务等。

代码片段:

C
int ret;

ret = OSATaskCreate(&sample_td_task_ref, sample_td_task_stack, SAMPLE_TD_TASK_STACK_SIZE, 120, "sample_td_task", sample_td_task, NULL);
ASSERT(ret == OS_SUCCESS);

sample_td_uart_printf("Phase2Inits_exit\n");

  • td_wait_network_ready

驻网等待,定时器需要联网获取时间后才可以开始。

代码片段:

C
static void td_wait_network_ready(void)
{
int count = 0;
int ready = 0;

while (!ready)
{
if (getCeregReady(isMasterSim0() ? IND_REQ_HANDLE : IND_REQ_HANDLE_1))
{
ready = 1;
}
sample_td_uart_printf("wait_network_ready: %d s", count++);
if (count > 300)
PM812_SW_RESET();

OSATaskSleep(200);
}
}

  • td_open

打开某一路的输出。

代码片段:

C
static void td_open(UINT8 channel, UINT8 type)
{
sample_td_uart_printf("channel %d %d open", channel, type);
}

  • td_close

关闭某一路的输出。

代码片段:

C
static void td_close(UINT8 channel, UINT8 type)
{
sample_td_uart_printf("channel %d %d close", channel, type);
}

  • sample_td_task

延时测试主任务,定义了三个延时,10,30s,60s。

代码片段:

C
static void sample_td_task(void *ptr)
{
UINT32 timestamp = 0;

//等待网络连接
td_wait_network_ready();
//根据当前时间,设置,10s,30s,1分钟三个定时器
//服务器下发未来的某个时刻,可以将下发的时刻改为时间戳赋值即可
timestamp = utils_utc8_2_timestamp();
sample_td_uart_printf("%s(%d) now:%ld", __FUNCTION__, __LINE__, timestamp);
am_ty_sw_td[0].timestamp = timestamp + 10;
am_ty_sw_td[0].id = 1;
am_ty_sw_td[0].chl = 1;
am_ty_sw_td[0].t = 1;
am_ty_sw_td[0].open = &td_open;
am_ty_sw_td[1].timestamp = timestamp + 30;
am_ty_sw_td[1].id = 2;
am_ty_sw_td[1].chl = 1;
am_ty_sw_td[1].t = 0;
am_ty_sw_td[1].open = &td_close;
am_ty_sw_td[2].timestamp = timestamp + 60;
am_ty_sw_td[2].id = 3;
am_ty_sw_td[2].chl = 1;
am_ty_sw_td[2].t = 1;
am_ty_sw_td[2].open = &td_open;
//初始化定时器任务和资源
lib_am_ty_sw_timer_delay_timer_init();

while(1)
{
sample_td_sleep(1);
}
}

4.8 编译

在SDK根目录打开命令行,输入命令.\build.bat -l .\amaziot_bloom_os_sdk\sample\libraries\8.4_timer_delay\


4.9 生成固件

参考入门中开发工具,生成工具。

4.10 测试

测试步骤:

  • 参考编译教程,和文档开头的编译指令,进行编译
  • 按照编译教程选择对应的选项
  • 烧录

4.11 固件

上电后,debug串口会打印出延时后对应响应,用户可以按照自己的业务逻辑处理;

本文章源自奇迹物联开源的物联网应用知识库Cellular IoT Wiki,更多技术干货欢迎关注收藏Wiki:Cellular IoT Wiki 知识库(https://rckrv97mzx.feishu.cn/wiki/wikcnBvAC9WOkEYG5CLqGwm6PHf)

注:本文部分内容来源于网络,如有侵权,请及时联系我们。

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
0
关闭 站长推荐上一条 /3 下一条