IEC61850平台库源代码

电力软件委托开发设计

智能通信处理机设计开发平台

IEC61850测试验证软件源代码

智能微机保护装置

智能电网核心技术供应商   智能电网开放技术实验室

SCADA系统源码   

组态软件源码      

继电保护开发平台 

继电保护源码 

FTU/DTU配电终端

上海研电电力科技有限公

变配电工程系统集成、方案设计、安装调试、委托开发与设计,技术转让及授权

开发平台和中间件产品

DNP开发中间件

DNP开发中间件

DNP开发中间件

0.00
0.00
  

DNP开发中间件

YPT-RD330-DNP-SDK

使用说明书

1.   应用开发依赖库

n   头文件IDNPApi.h

n   库文件:

linux: libidnpapis.so

windows: idnpapis.dll、idnpapis.lib

 

2.   基本使用方法

n   在自己的代码中包含头文件

n   项目中添加库引用

n   根据需要实现命令处理接口类,派生自IDNPCommandInterface

n   实例化IDNPSlaveService对象

n   调用Init方法初始化配置参数

n   调用Start方法

n   循环调用Run方法

n   数据变化时调用UpdateX方法更新数据(X表示遥测、遥信、电度对应的方法名字)

n   退出时,调用Stop方法

 

3.   API说明

3.1  配置项


          应用可以根据需要从配置文件、数据库中配置上面的这些参数,然后调用Init方法传递给协议栈;协议栈本身也会加载默认的配置文件IDNPSlaveConfig.cnf文件,可以直接在这个文件中配置上面的参数,此时不需要调用Init方法。配置文件的格式为:


一行一个配置项,分别表示:

        ip配置监听的IP地址,一把使用127.0.0.1,表示监听所有的网络接口

        port配置DNP服务的端口号,标准为20000

        log配置日志输出路径及文件名,绝对路径

        maxlog配置最大输出日志行,达到此行后删除日志重新输出

        ycnums配置设备的遥测数目

        yxnums配置设备的遥信数目

        ddnums配置设备的电度数目

        yknums配置设备的遥控数目

        ytnums配置设备的遥调数目

        utc配置时间戳是本地时间还是UTC时间

        masteraddr配置主站的地址

        slaveaddr配置本设备(子站)的地址

 

3.2  命令处理接口

        DNP协议栈收到来自主站的命令后,会调用应用注册的命令处理接口,应用必须派生实现IDNPCommandInterface接口,才能处理命令。接口说明如下:


        比如应用要处理遥控执行,需要在onYKExecute接口中处理,在这里根据index(遥控号)和val(遥控值,分合闸)发送到设备或者输出继电器。

 

3.3  数据处理接口

        应用采集到现场数据后,应调用相关的update方法更新数据,数据更新后,主站将立即收到数据。这些接口如下:


 

        比如应用要更新一个遥测值,则需要调用updateYCValue方法,index表示要更新的遥测号,从0开始,fval表示遥测值,flags表示数据的质量位,一般不用填写。

 

3.4  应用程序主要流程

        下面的代码演示了应用的主要通信处理流程;初始化完成后使用Start方法启动服务,然后在应用程序主循环中反复调用Run方法,并根据需要更新自己的遥测、遥信、电度数据。


 

4.   示例代码

 

#include

#include "IDNPApi.h"

 

class ICommandProcess:public IDNPCommandInterface

{

public:

       ICommandProcess()

       {

       }

      

       ~ICommandProcess()

       {

       }

      

       // 遥控选择通知接口 成功返回1 失败返回0

       // index:遥控号 val:遥控值

       virtual int onYKSelect(int index, int val)

       {

              std::cout << "onYKSelect:index=" << index << " val=" << val << std::endl;

              return 1;

       }

 

       // 遥控执行通知接口 成功返回1 失败返回0

       // index:遥控号 val:遥控值

       virtual int onYKExecute(int index, int val)

       {

              std::cout << "onYKExecute:index=" << index << " val=" << val << std::endl;

              return 1;

       }

      

       // 遥控取消通知接口 成功返回1 失败返回0

       // index:遥控号 val:遥控值

       virtual int onYKCancel(int index, int val)

       {

              std::cout << "onYKCancel:index=" << index << " val=" << val << std::endl;

              return 1;

       }

 

       // 遥调选择通知接口 成功返回1 失败返回0

       // index:遥调号 val:遥调值

       virtual int onYTSelect(int index, float val)

       {

              std::cout << "onYTSelect:index=" << index << " val=" << val << std::endl;

              return 1;

       }

 

       // 遥调执行通知接口 成功返回1 失败返回0

       // index:遥调号 val:遥调值

       virtual int onYTExecute(int index, float val)

       {

              std::cout << "onYTExecute:index=" << index << " val=" << val << std::endl;

              return 1;

       }

 

       // 对时接口 成功返回1 失败返回0

       // s:当前时钟秒 ms:当前时钟毫秒

       virtual int onSyncTime(time_t s, int ms)

       {

              std::cout << "onSyncTime:second=" << s << " ms=" << ms << std::endl;

              return 1;

       }

};

 

int main(int c, char** v)

{

       // 创建DNP服务对象

       IDNPSlaveService DNPSlave;

      

       // 注册命令处理器

       IDNPCommandInterface* p = new ICommandProcess();

       int ret = DNPSlave.Init(p);

      

       // 启动DNP服务

       ret = DNPSlave.Start();

      

       float fval = 0;

       int count = 0;

       // 输出日志

       DNPSlave.Log("Now start DNP Slave: %d", 1);

      

       // 主循环,反复调用Run方法,并按需跟新数据

       // 这里模拟更新了第一个遥测、第一个遥信、第一个电度

       while(1)

       {

              DNPSlave.Run();

              DNPSlave.Sleep(1000);

             

              fval += 1.1;

              DNPSlave.updateYCValue(0, fval, 1);

             

              int ival = count % 2;

              DNPSlave.updateYXValue(0, ival, 1);

             

              DNPSlave.updateDDValue(0, count, 1);

             

              int idpval = 1;

              if(ival)

              {

                     idpval = 2;

              }

              DNPSlave.updateDbYXValue(0, idpval, 0,0,1);

              DNPSlave.Log("Loop count = %dn", count);

              count++;

       }

       // 停止DNP服务

       ret = DNPSlave.Stop();

       delete p;

      

       return 0;

}