■IEC61850平台库源代码
■电力软件委托开发设计
■智能通信处理机设计开发平台
■IEC61850测试验证软件源代码
■智能微机保护装置
智能电网核心技术供应商 智能电网开放技术实验室
■SCADA系统源码
■组态软件源码
■继电保护开发平台
■继电保护源码
■FTU/DTU配电终端
上海研电电力科技有限公司
变配电工程系统集成、方案设计、安装调试、委托开发与设计,技术转让及授权
开发平台和中间件产品
DNP开发中间件
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;
}
地址:中国上海市闵行区浦江镇恒南路1328号莘闵留学生科技创业园1号楼307室
电话:13818785789 18702188020 18601791287 021-34793998
传真:021-34793997