文档章节

qqqq

l
 layty888
发布于 2016/10/15 11:54
字数 1739
阅读 12
收藏 0

权限

  • 厂外不允许设置表号

 

IEC62056-21 通信

  • 通信加密算法

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    void Ptr_Iec21_PasswordEncryption(int8_t *psw_1,int8_t *psw_2,uint8_t psw_len)

    {

        uint8_t i;

        int8_t temp[Password_length];

        for(i=0;i<psw_len;i+=2)

        {

            temp[i]=random_data[Password_length-1-i]-'0');       

            psw_2[i]='0'+(psw_1[i]-'0'+temp[i])%10;   

        }

        for(i=1;i<psw_len;i+=2)

        {

            temp[i]=(random_data[Password_length-1-i]-'0');       

            psw_2[i]='0'+(psw_1[i]-'0'+10-temp[i])%10;   

        }

    }

数据捕获(事件,结算,负荷)

数据结构

  • 管理信息,存储在EEPROM。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

/** M_LOADMINFO_T  负荷管理信息区 */

typedef struct

{

    uint32_t capPeriod;        /**< 4通道负荷记录的时间间隔,单位为分钟,高字节在前 */

    uint32_t maxEntries;       /**< 4通道负荷记录的最大入口数 */

    uint32_t usedEntries;      /**< 4目前已经使用的入口数 */

    uint32_t curPtrEntries;    /**< 4最新记录的指针编号 */

    uint32_t dataAddr;         /**< 4数据存储开始地址 */

    uint32_t obisAddr;         /**< 4捕获对象存储开始地址 */

    uint32_t recordSize;       /**< 4通道空间大小*/

    uint16_t entrySize;        /**< 2负荷数据记录通讯长度(包括数据长度和格式长度) */

    uint16_t dataSize;         /**< 2负荷数据记录的纯数据长度(存储器实际存储的长度) */

    uint8_t objectNum;         /**< 1负荷捕获对象的个数 */

    uint8_t sortMethod;        /**< 1负荷数据存储方式 */

}M_LOADMINFO_T;

#define M_LOADMINFO_T_LEN       (sizeof(M_LOADMINFO_T))

  • 捕获对象成员结构

1

2

3

4

5

6

7

8

9

10

11

/** 捕获对象成员识别结构体 */

typedef struct

{

    uint16_t ic;                /**< IC */

    M_OBISCODE_T obis;          /**< obis */

    uint8_t attrIndex;          /**< attr index 属性号 */

    uint16_t dataIndex;         /**< data index 用于权限控制和历史数据识别 */

    /* 低字节表示不同的权限 */

    /* 高字节表示历史数据访问,具体见历史数据访问编号宏定义 */

}M_CAPTURE_OBJS_T;

#define M_CAPTURE_OBJS_T_LEN   (sizeof(M_CAPTURE_OBJS_T))

负荷曲线数据存储

  • FLASH 存储地址

  • 所需扇区分析

                1.FLASH存储按扇区操作,只有在写头地址的时候先进行一次擦除,后续地址不擦除扇区

                2.所以当写到扇区尾的时候,如果写到第299条,那么原先扇区4的所有数据将被擦除.

               3.当要存储299条负荷曲线的时候,假如用4个扇区存储,当写到398条的时候,回写到扇区1,那么这时候扇区一直接被擦除,   

                 负荷曲线条数只有扇区2+3+4,不足299条,所以当数据存储需要X.y个扇区的时候,实际需要物理扇区为(X+2)个扇区。

               4.实际上,擦除一个扇区,擦除的信息最多为(扇区地址/每条大小+1),擦除扇区一,实际上将扇区2的第100条也擦除了。

               5.所以实际当使用299条负荷曲线的时候,需要5个扇区大小的空间。

  • 管理信息 maxEntries;   /**< 最大入口数,允许记录的最大条数+每个扇区所记录的条数*/

                        usedEntries;  /**< 目前已经使用的入口数,当写满后,一直就是最大值,不回0*/

                        curPtrEntries;/**< 最新记录的指针编号,写到maxEntries后回0*/

                        1.根据curptrEntries 确定需要写入的位置,当>=maxEntries,重新从0开始写, max=299+100.

                        2.根据1的规则,当usedEntries=299(用户所需)时,最少记录的条数 在第101~398条+第1条,=299条,

                                                                                                                  最多记录条数在第1~第399条,=399条,

                        3.用户根据usedEntries读取实际存储条数

 

 
  1. //通道内的最多成员个数
  2. #define CFG_LOAD_PROFILE_OBJECT_MAX_NUM 30
  3. //通道成员实际数据长度
  4. #define CFG_LOAD_PROFILE_CHANNEL1_RECORD_LEN (12 * 1 + 4 * 2)
  5. //记录通道的最多条数,1条包含所有捕获成员
  6. #define CFG_LOAD_PROFILE_CHANNEL1_RECORD_MAX_NUM 5000
  7. //捕获对象成员列表的最大长度,默认一个时间变量+其他电量
  8. #define CFG_LOAD_PROFILE_CHANNEL1_RECORD_MAX_LEN ((CFG_LOAD_PROFILE_OBJECT_MAX_NUM-1)*4+12)
  9. //数据存储需要的空间大小,不考虑扇区覆盖=最大条数*最大长度
  10. #define FLASH_LoadRecord1_Tmp (CFG_LOAD_PROFILE_CHANNEL1_RECORD_MAX_NUM * CFG_LOAD_PROFILE_CHANNEL1_RECORD_MAX_LEN)
  11. //表示每个扇区能存的负荷条数,包含不完整的负荷曲线(捕获对象数据在两个扇区),扇区擦除去除的捕获对象条数=扇区大小/成员大小+1
  12. #define FLASH_LoadRecord1_Sector_Cap (DRV_DF_SECTOR_CAP / CFG_LOAD_PROFILE_CHANNEL1_RECORD_LEN + 1)
  13. //实际保存负荷曲线的物理扇区大小,X=X+2,多余的2个扇区防止扇区覆盖
  14. #define FLASH_LoadRecord1_SIZE ((FLASH_LoadRecord1_Tmp / DRV_DF_SECTOR_CAP + 2) * DRV_DF_SECTOR_CAP)
  • 初始化管理信息

     

     
    1. M_LOADMINFO_T ReadOnly_t m_loadminfo[CFG_LOAD_PROFILE_MAX_NUM] =
    2. {
    3. {CFG_LOAD_PROFILE_CHANNEL1_CAPTURE_PERIOD,//捕获周期
    4. //最大入口数=
    5. (CFG_LOAD_PROFILE_CHANNEL1_RECORD_MAX_NUM + FLASH_LoadRecord1_Sector_Cap),
    6. 0,//已经使用的入口数
    7. 0,//当前指针编号
    8. DEF_Addr_LoadRecord1,//数据地址
    9. E2P_SG_LOAD_OBJECT_1,//对象地址
    10. DEF_Size_LoadRecord1,//空间大小
    11. CFG_LOAD_PROFILE_CHANNEL1_RECORD_ENTRY_LEN,//每条记录通讯长度
    12. CFG_LOAD_PROFILE_CHANNEL1_RECORD_LEN,//每条记录纯数据长度
    13. Lib_Array_Number(m_load_object),//捕获对象的个数
    14. FLASH_LoadRecord1_Sector_Cap},//数据存储方式
    15. }

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

    块读负荷曲线

 

 

负荷曲线程序流程

 

 

 

3.1 计量那块加上是代数和还是绝对值  3.2应加上需量重计方式(反向是否计入正向)  3.3瞬时量应加上平均电压、平均电流、平均功率等说明  3.6.1结算处理方法d处要加上或校时 4.1加上负荷曲线容量描述、选择性访问描述   4.4背光时间需指明 4.6编程功能波兰表是支持的,基础市场应是支持    4.7.1需增加停电显示不动多长时间灭屏

chengxueli(程雪利-电力仪表表计一部海外测试主管) 15:53:53

这些也对照看一下,是上一版本提出来的意见,刚发的有的好像已经增加

 

 

工厂协议解析

1.*判断当前通道状态为接收中才允许解析

   *判断接收缓冲区不为空

2.*寻找帧头标志 0x68,寻找帧起始符0x68(第二个),判断帧尾0x16

   *确保 有效数据在 接收指针范围内(start(0x68)-->end(0x16)) < 接收缓冲区的指针长度

   *校验和判断

3.地址域处理

4.控制域判断

5.帧序列判断(当前是第几帧)  g_Ptr_Cal_Data.frame_num=当前第几帧

                                                      g_Ptr_Cal_Data.frame_status=FIR RIN

 

6.多帧读举例                           

                                                        g_Ptr_Cal_Data.buff_num = 1;

                                                        g_Ptr_Cal_Data.total_num = g_Disp_Data.dispKeyNum;,单帧的时候为0

                                                       、、 g_curMylist_output.toEntry = g_Ptr_Cal_Data.frame_num;  结束编号

 

 

typedef struct

{

    uint8_t start_point;                        /* 有效帧起始位置 */

    uint8_t end_point;                          /* 有效帧结束位置 */    

    uint8_t obis_data_start;                    /* OBIS数据开始地址 */

    uint8_t addr_data_len;                      /* 地址域长度 */

    uint8_t data_len;                           /* 通信帧的数据内容长度 */ 

    uint8_t tx_len;                             /* 已准备发送的数据长度 */

    

    /* 以下变量要通过超时清零 */

    /* 多帧通信使用的变量 */   

    uint8_t buff_num;                           /* 数据缓存能够存放的最大数据条数,现默认为1 */

    uint16_t read_finish_num;                   /* 已读取的数据条数 */ 

    uint16_t total_num;                         /* Eeprom 数据的总条数 */ 

    uint8_t frame_status;                       /* 是否处于多帧状态 */

    uint8_t frame_num;                          /* 当前是第几帧 */ 

       

    uint8_t comm_flag;                          /* 通讯标志 */

    uint8_t current_channel;                    /* 当前通道 */

    uint32_t timer;                             /* 通讯定时器 */

} G_PTR_CAL_DATA_T;

//重复

    if (g_Ptr_Cal_Data.addr_data_len != 0)

    {

        g_Ptr_Cal_Data.obis_data_start = g_Ptr_Cal_Data.addr_data_len + 1;

    }

//g_curCaptureObis.dataIndex = CFG_METER_ACCESS_RIGHTS_NUM - 1;权限

 //21 查了两边       g_curMylist_output.obisListPtr = App_ObisListLookup(g_curCaptureObis.obis);  /* 查表 */

 

读写 obis 重复 可删减    

2.if(g_Ptr_Cal_Data.read_finish_num >= g_Ptr_Cal_Data.total_num)  这里应该判断 g_curMylist_output.toEntry

 

 

 


 

 

 

 

 

 

 

 

 

 

 

 

 

 

© 著作权归作者所有

上一篇: ceshi
下一篇: ceshi
l
粉丝 0
博文 2
码字总数 1859
作品 0
宁波
私信 提问
一次利用nginx漏洞的木马事件

导读: 服务器突然负载比平常高出了50%,经过长时间分析发现原来是黑客利用nginx的一个漏洞,通过图片上传了含有代码的图片,然后调用图片使用post传入代码,生成一个含有推广链接代码的php...

史帝文
2016/11/05
124
0
qqqq

qqq

Arvin_Fox
2015/12/15
1
0
Android PopupWindow简单使用

Android开发会用到各种类型的弹框,我现在常用的就是MaterialDialog和Dialog,但有些时候Dialog不能满足项目的需求,这时候用PopupWindow效果会更好些。 1、初始化PopupWindow对象...

深情不及酒伴
2017/06/09
0
0
在ORACLE中利用存储过程实现异构数据表之间的数据传输【DEMO】

昨天,在公司,有位同事要在oracle中做一个数据传输工作,两个表的字段大部分是相同的,不同的是主键,还有几个带索引的字段,我看他半天没搞定,于是心想,就帮他一把吧。 但是,我也不可能...

御风林海
2013/06/01
100
0
Thinkphp日常记录

1.验证码刷新 <img src=http://localhost/QQQQ/index.php/Home/User/index onClick="this.src=this.src+'?'+Math.random()"/>; 2.图片上传: $Upload = new Upload(); $res = $Upload->uplo......

相见江南aaa
2016/05/17
13
0

没有更多内容

加载失败,请刷新页面

加载更多

视频如何加水印?

很多视频制作者的视频都被他人盗用过,为了防止自己的劳动成果被他人窃取,给视频加水印对于视频制作者来说,是一件非常重要的事情。那么下面分享一个手机给视频加水印的方法,一起来看看吧!...

白米稀饭2019
25分钟前
5
0
004-Envelop-基于Blockstack的文件传输dapp

本篇文章主要介绍基于Blockstack的文件传输工具; ####A-链接地址 官网地址:https://envelop.app/ Github地址:https://github.com/envelop-app ####B-特性: 1: Share private files easil...

Riverzhou
28分钟前
6
0
SpringCloud——声明式调用Feign

Feign声明式调用 一、Feign简介 使用Ribbon和RestTemplate消费服务的时候,有一个最麻烦的点在于,每次都要拼接URL,组织参数,所以有了Feign声明式调用,Feign的首要目标是将Java HTTP客户端...

devils_os
34分钟前
7
0
《JAVA核心知识》学习笔记 (22. 数据结构)

22.1.1. 栈(stack) 栈( stack)是限制插入和删除只能在一个位置上进行的表,该位置是表的末端,叫做栈顶 (top)。它是后进先出(LIFO)的。对栈的基本操作只有 push(进栈)和 pop(出栈...

Shingfi
39分钟前
6
0
你对AJAX认知有多少(1)?

AJAX(一) AJAX技术对于前段或者后端工程师来说,都是必不可缺的 那我们这几期都来细细品味一下AJAX的相关知识,直接上干货喽~ 1、什么是AJAX,为什么要使用Ajax(请谈一下你对Ajax的认识) 什么...

理性思考
47分钟前
14
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部