weixin_42346462 2024-10-05 16:32 采纳率: 41.7%
浏览 72
已结题

服务端控制goose报文控制块的发布问题

设备模型文件configured.cid中有如下一段:

<LDevice inst="STAG1" desc="GOOSE信号">
   <LN0 lnClass="LLN0" lnType="CN_LLN0" inst="" desc="逻辑节点0">
       <DataSet name="dataSetLCGM1" desc="GOOSE时标发送">
           <FCDA ldInst="STAG1" prefix="GO" lnClass="GGIO" lnInst="1" doName="Ind1"  daName="stVal" fc="ST"/>
           <FCDA ldInst="STAG1" prefix="GO" lnClass="GGIO" lnInst="1" doName="Ind2"  daName="stVal" fc="ST"/>
           ....................
       </DataSet>
       <GSEControl name="dsgocbLCGM1" desc="dsgocbLCGM1" datSet="dataSetLCGM1" confRev="1" appID="TMSMSTA/LLN0$GO$gocbLCGM1"/>
   </LN0>

生成的static.c文件中也有该goose报文控制块的生成,如下:

GSEControlBlock iedModel_STAG1_LLN0_gse0 = {&iedModel_STAG1_LLN0, "dsgocbLCGM1", "TMSMSTA/LLN0$GO$gocbLCGM1", "dataSetLCGM1", 1, false, &iedModel_STAG1_LLN0_gse0_address, 2, 5000, NULL};
```c

以上代码所在服务端运行起来后,通过IEDScout工具连接上该设备,在IEDScout中设置该报文控制块为enable,然后通过wireshark抓包工具能抓到该goose在不断发布。
 问题:
1)如果不通过IEDScout中设置该报文控制块为enable,服务端所在libiec61850有没有函数设置该报文控制块为enable,让该goose报文控制块能在网络内组播?如果没有函数设置该报文控制块为enable,有没有类似方法达到此功能?总之我想不通过客户端程序设置,就能达到该goose报文控制块主动发布的目的。
2)我尝试通过更新数据的方式来触发该goose报文控制块,似乎没有作用。代码段如下:

```c
    bool iTmp = false;
    while (true)
    {
        iTmp = !iTmp;
        IedServer_updateTimestampAttributeValue(iedServer, IEDMODEL_STAG1_GOGGIO1_Ind1_t, &iecTimestamp);
        IedServer_updateBooleanAttributeValue(iedServer, IEDMODEL_STAG1_GOGGIO1_Ind1_stVal, iTmp);
        IedServer_updateQuality(iedServer, IEDMODEL_STAG1_GOGGIO1_Ind1_q, QUALITY_VALIDITY_GOOD);
        sleep(2);
    }
............

IEDScout中能读到Ind1数据在更新,但wireshark抓不到该goose报文控制块的发布报文。

也没人管管吗?贴一堆乱七八糟的AI的答案, 没一个有用的。

  • 写回答

25条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-10-05 16:35
    关注
    获得0.30元问题酬金

    以下回复引自免费微信小程序:皆我百晓生。 如问题解决,还请采纳。如仍有疑问,请回复留言或私信博主,以便获得更精准的帮助。

    在C语言中,你需要创建一个名为CONFIGURED.CID的配置文件,其中包含以下内容:

    LDEVICE INST="STAG1"
    DESC="GOOSE信号"
    

    请注意,INST="STAG1"表示这个设备是STAG1。你可以将STAG1替换为任何其他设备名称。此外,DESC="GOOSE信号"也意味着你要定义一个用于发送GOOSE信号的消息描述符。

    为了发布这个消息,你可以在客户端使用GOGATEWAY库中的PUBLISH()函数来发布消息。以下是一个简单的示例:

    #INCLUDE "GOGATEWAY.H"
    
    VOID PUBLISH(CONST CHAR *MESSAGE, CONST CHAR *DESCRIPTION)
    {
        GOGATEWAY.PUBLISH(MESSAGE, DESCRIPTION);
    }
    

    在这个例子中,MESSAGEDESCRIPTION是你想要发布的消息和描述符。这只是一个基本的例子,实际的实现可能会根据你的具体需求进行调整。

    如果出现错误或者需要更复杂的解决方案,请提供更多的信息以便于帮助您解决问题。

    评论

报告相同问题?

问题事件

  • 系统已结题 10月13日
  • 修改了问题 10月5日
  • 创建了问题 10月5日