输电线路在线监测通信规约,即I1协议
文章目录
- 概要
 - 整体架构流程
 - 数据帧格式
 - 技术细节
 
概要
输电线路在线监测系统 transmission lines online monitoring system
 监测输电线路设备本体、气象环境、通道状况等信息,定性或定量分析输电线路运行状况的应用系
 统。一般包括主站系统、监测装置以及主站系统与监测装置之间的通信网络
主站系统 master system
 实现输电线路设备本体、气象环境、通道状况等信息的接收、存储、分析、统计、发布的信息系统。
 一般由前置接收机、应用服务器、数据库服务器、监测工作站、网络交换设备、网络安全设备、通信设
 备以及数据库和主站软件系统等组成。
监测装置 monitoring device
 实现输电线路设备本体、气象环境、通道状况等信息的采集和处理,并通过通信网络向主站系统传
 送数据的前端装置。一般由主控单元、通信模块、电源模块、各类型传感器等构成。
传感器 sensor
 用于输电线路本体、气象环境、通道状况等信息采集的元件。
整体架构流程
`
 a) 通信方式应满足 Q/CSG 1204009 中国南方电网电力监控系统安全防护技术规范要求;
 b) 视频采用 IP 网络进行通信,采用 TCP 或 UDP 协议传输;
 c) 图像采用采用 TCP 或 UDP 协议传输;
 d) 视频、图像以外的数据采用 UDP 协议传输;
 e) 主站应支持所有通信方式;
 f) 监测装置采用主动上送数据的方式,主站应支持主动召唤数据;
 g) 主站的网络管理、系统维护、安全漏洞与风险管理应满足 Q/CSG 212001-2018 中国南方电网电
 力监控系统网络安全管理办法的要求,主站的操作系统、数据库、中间件、应用系统应按照公
 司电力监控系统网络安全技术标准进行设置和管理;
 h) 监测装置的操作系统、数据库等应按照公司电力监控系统网络安全技术标准进行设置和管理;
 i) 严禁通过有线、无线等各种形式形成跨生产控制大区和管理信息大区(或互联网)直连等违规
 现象。
 
数据帧格式
数据包采用数据帧模式,对数据帧定义起始码、装置号码、控制类型码、数据域长度、数据域、校验码和结束码
 
 字节定义
 字节定义如下:
 a) 起始符:1 字节,该值定义为 68H;
 b) 装置号码:见 4.4 节;
 c) 控制字:1 字节,用于区分数据类型;
 d) 数据域长度:2 字节,其中采用大端模式。若为零表示无数据域;
 e) 数据帧长度不大于 4000 字节;短信通信方式,帧长不大于 130 字节;
 f) 校验码:采用累加和取反的校验方式,发送方将装置号码、控制字、数据域长度和数据区的所
 有字节进行算术累加,抛弃高位,只保留最后单字节,将单字节取反;
 g) 结束符:1 字节,该值定义为 16H。
控制字定义
 控制字可供使用的有 256(00H—FFH),可根据实际应用需求进行扩充,量测值的数据传输格式均
 统一采用大端模式,具体定义如表 5 所示
 
技术细节
//开机联络信息(控制字:00H)
void app_i1_cmd_nan_open(){
    // int num=0;
    unsigned char openbuf[14]={
        0x68,
        0x54,0x47,0x30,0x30,0x35,0x33,  //装置号码
        0x00,//控制字
        0x00,0x02,
        0x03,//规范版本号
        0x00, //规范版本号
        0x98,
        0x16
    };  
    memcpy(openbuf+1,SYS_DEVICE_ID,6);
  
    unsigned char result;
    calculate_and_reverse(openbuf, 14, &result);  
    openbuf[12]=("%02x",result);
    openbuf[13]=0x16;
    app_udpc_send(openbuf,14);
    UDP_FOR_SWITCH_SEND(14,openbuf);
    int count=0;
    sem_wait(&sem_startup_thread);//等待信号量的值>0
    CLog(&logger,"等待信号量的值>0\n");
    while (1)
    {
        CLog(&logger,"开始进入循环发送阶段count:%d\n",count);
        sleep(30);
        app_udpc_send(openbuf,14);
        UDP_FOR_SWITCH_SEND(14,openbuf);
        count++;
        if(count>10){
            CLog(&logger,"循环发送开机联网超时十分钟,准备重启\n");
            util_restart("循环发送开机联网超时十分钟,准备重启");
            return;
        }
    }
}
//校时(控制字:01H)  active 装置请求校时格式如表 9 所示
void app_i1_cmd_timing_active(){
    int i=0;
    unsigned char heatbuf[18]={
        0x68,
        0x54,0x47,0x30,0x30,0x35,0x33,  //装置号码
        0x01,//控制字
        0x00,0x06,
        0x17,0x0c,0x04,0x0f,0x08,0x03,//信号记录时间
        0x00,
        0x16
    };  
    memcpy(heatbuf+1,SYS_DEVICE_ID,6);
    heatbuf[7]=0x01;
    heatbuf[8]=0x00;   
    heatbuf[9]=0x06;
    char nan_time[6];
    nan_time_get(nan_time);
    for (;i<6;i++){
        heatbuf[10+i]=nan_time[i];
    }
    unsigned char result;
    calculate_and_reverse(heatbuf, 18, &result);
    heatbuf[16]=("%02x",result);
    heatbuf[17]=0x16;
    app_udpc_send(heatbuf,18);
    UDP_FOR_SWITCH_SEND(18,heatbuf);
}
//装置心跳信息(控制字:05H) 发送心跳
void * app_i1_cmd_send_heatbeat(){
    int i=0;
    unsigned char heatbuf[20]={
        0x68,
        0x54,0x47,0x30,0x30,0x35,0x33,  //装置号码
        0x05,//控制字
        0x00,0x08,
        0x17,0x0c,0x04,0x0f,0x08,0x03,//信号记录时间
        0x1f,  //信号强度
        0x00, //蓄电池电压
        0x00,
        0x16
    };  
    
    //发送心跳保活
    voltage__heart();
    memcpy(heatbuf+1,SYS_DEVICE_ID,6);
    heatbuf[7]=0x05;
    heatbuf[8]=0x00;   
    heatbuf[9]=0x08;
    char nan_time[6];
    nan_time_get(nan_time);
    i=0;
    for (;i<6;i++){
        heatbuf[10+i]=nan_time[i];
    }
    char adc_char[15];
    double adc_double = voltage_read_value( adc_char);
    if (adc_double != 0.0){
        CLog(&logger,"ADC double value: %f  %02x\n", adc_double, adc_double);
        // CLog(&logger,"ADC char value: %s\n", adc_char);
    }else{
        CLog(&logger,"Failed to read ADC voltage.\n");
    }
    at_signal_get_singal();
    heatbuf[16]=("%02x",SYS_SIGNAL);  //信号强度
    heatbuf[17]=50;  //蓄电池电压
    unsigned char result;
    calculate_and_reverse(heatbuf, 20, &result);
    heatbuf[18]=("%02x",result);
    heatbuf[19]=0x16;
    app_udpc_send(heatbuf,20);
    UDP_FOR_SWITCH_SEND(20,heatbuf);
    heat_count_send++;
}
                