分支数据监测终端代码框架梳理

传感器相关逻辑梳理

  TCBUS的注册巡检都在定时器中断与串口发送完成中断中进行,定时器在任务task _ service 中开启,虽然不用在任务中循环注册(由标志位和清除标志位控制),放在任务而不是初始化函数中的目的是为了时刻检测到标志位是否被置一(是否需要重新注册tcbus传感器),新协议中增加了搜索传感器的数据项,当接收到搜索传感器、分支终端上电或者检测到掉电再上电标识的情况下,标志位置使得AM2301A,DS18B20以及TCBUS传感器重新注册。
   超限事件的检测在定时器中断以及串口发送完成中断中处理(中断处理函数不能太过复杂,因此仅在中断中置事件发生标志位以及拉低事件上报引脚),为了快速识别到事件发生的标志位,记录事件的发生或结束时间,将识别标志位的函数放在任务中循环,一旦检测到标志位,立即记录事件数据;
   传感器更新函数放在任务里循环执行,目的在识别两种情况,第一种是分支终端上电,AM2301A,DS18B20,TCBUS传感器完成注册以后(注册完成标志置一),检测到该标志位,读取flash中存储的传感器档案信息;第二种是检测到主动搜索传感器标志后,重新注册传感器并更新传感器档案信息,最后存储到flash中;因此,若不发送搜索传感器报文,那么档案中的传感器类别一直是上一次搜索传感器时候存储的。

多任务调度

相关知识学习:https://wenku.baidu.com/view/3d8b7dc668eae009581b6bd97f1922791788be58.html
  分支数据监测终端的任务进程主要包括以下6个进程,进程优先级分为:系统任务以及用户任务。
在这里插入图片描述
  函数tpos_createTask()功能: 操作系统, 创建任务进程

OS_TCB *tpos_createTask(pTASK_CODE pTask,OS_STK *pStack,void *parameter,INT8S *taskName,INT8U taskProperty)

关于获取信号量知识点

  信号量(Semaphore)-- 相当一个信号灯,程序里是一个非负整数,表示状态。可以用来保护两个或多个关键代码段,这些关键代码段不能并发调用。在进入一个关键代码段之前,线程必须获取一个信号量。如果关键代码段中没有任何线程,那么线程会立即进入该框图中的那个部分。一旦该关键代码段完成了,那么该线程必须释放信号量。其它想进入该关键代码段的线程必须等待直到第一个线程释放信号量。为了完成这个过程,需要创建一个信号量,然后将Acquire Semaphore 以及Release Semaphore 分别放置在每个关键代码段的首末端。确认这些信号量引用的是初始创建的信号量。

任务线程1:task_service

tpos_createTask(task_service, stk_task_service + (sizeof (stk_task_service) / sizeof (OS_STK)), NULL, (INT8S *) "SYS_SERVICE", TPOS_TASKPROPERTY_SYS);
static void task_service(void *parameter)

在这里插入图片描述

task_service线程主要负责内容

  负责终端开机时AM2320以及DS18B20传感器的注册,以后在while循环中周期采集终端内部系统电压、温度,以及终端外部环境量信息(温湿度信息)以及遥信状态产生遥信事件、在终端运行过程中检测TCBUS是否短路及时进行短路保护措施,并实现在开始检测到过流后来不过流的情况下:再次注册TCBUS类传感器。

任务线程2:task_read_meter_rs485_1

tpos_createTask(task_read_meter_rs485_1, stk_task_read_meter_rs485_1 + (sizeof (stk_task_read_meter_rs485_1) / sizeof (OS_STK)), NULL, (INT8S *) "TASK_RS485_1", TPOS_TASKPROPERTY_USER);

在这里插入图片描述
  在主函数main中app_init_params();
  读取flash里面的搜表模式,默认模式将485 I 搜表模式配置为不搜表。

app_if_nor_flash_read(PAGE_ID_SEARCH_METER_MODE * MAX_PAGE_SIZE, buffer,4);
if(buffer[0]==0xBB) //设置模式
{
    
    
    CJQ_G_Var.search_meter_mode[PORT_IDX_RS485_1] = buffer[1+PORT_IDX_RS485_1];//485-1
    CJQ_G_Var.search_meter_mode[PORT_IDX_RS485_2] = buffer[1+PORT_IDX_RS485_2];//485-2
    CJQ_G_Var.search_meter_mode[PORT_IDX_RS485_3] = buffer[1+PORT_IDX_RS485_3];//485-3        
}
else //默认模式 //硬件485-1\485-3开启搜表//硬件485-2不搜表
{
    
    //由于工厂要求,刚开始全部不搜表,在参数设置后才搜表
    CJQ_G_Var.search_meter_mode[PORT_IDX_RS485_2] = 0;//485-1
    CJQ_G_Var.search_meter_mode[PORT_IDX_RS485_3] = 1;//485-3        
    CJQ_G_Var.search_meter_mode[PORT_IDX_RS485_1] = 0;//LORA模式开启搜表
}

task_read_meter_rs485_1线程主要负责内容

  负责终端复位以后更新终端的时钟、读取并载入flash里面存取的周期抄表任务,初始化485端口后进行搜表,在while中等待接收645以及698报文、实时检测温度越限事件。

任务线程3:do_task_tc_bus

#ifdef __TCBUS_VERSION__
    tpos_createTask(do_task_tc_bus, stk_task_tc_bus + (sizeof (stk_task_tc_bus) / sizeof (OS_STK)), NULL, (INT8S *) "TASK_TCBUS", TPOS_TASKPROPERTY_SYS); 
#endif

在这里插入图片描述

扫描二维码关注公众号,回复: 12563725 查看本文章

do_task_tc_bus线程主要负责内容

  负责TCBUS周期巡检门磁以及烟温事件,周期查询是否需要重新注册TCBUS,在每轮巡检结束时,如有接有TCBUS类温度传感器即检测环境量温度数据。

任务线程4:task_port_plc

tpos_createTask(task_port_plc, stk_task_plc + (sizeof (stk_task_plc) / sizeof (OS_STK)), NULL, (INT8S *) "TASK_PLC", TPOS_TASKPROPERTY_USER);

基本与485口的配置一致。

猜你喜欢

转载自blog.csdn.net/luopeng12345/article/details/110951906