C与Python之间的变量交换

2024-09-26 17:55:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我最近读了很多关于它的文章,但是对于一个问题我不能再多说了。它是关于从C脚本到python3.x的变量交换

对于C脚本: 我正在评估IEC61850-9-2采样值(SV),并使用libiec61850c库(https://github.com/mz-automation/libiec61850),它解释协议。SV每周期发送80个样本(正弦),这意味着每0.25毫秒就有一个新样本到达,需要处理。所以我的剧本必须要快。在

目前我使用下面的C脚本,它评估协议并打印示例。 我希望这是可以理解的,我的意见是充分的:

#include "hal_thread.h"
#include <signal.h>
#include <stdio.h>
#include "sv_subscriber.h"
#include <unistd.h>

static bool running = true;
int sample_rate = 80;
double sample[2]=  { 0.0 };

void sigint_handler(int signalId)
{
    running = 0;
}

/* Callback handler for received SV messages */
static void svUpdateListener (SVSubscriber subscriber, void* parameter, SVSubscriber_ASDU asdu)
{    
        double val1, val2, val3 = 0;
        /* read the INT32 Voltage Values on Byte Number 32 , 40 and 48*/
        val1 = (double)SVSubscriber_ASDU_getINT32(asdu, 32)/100;
        val2 = (double)SVSubscriber_ASDU_getINT32(asdu, 40)/100;
        val3 = (double)SVSubscriber_ASDU_getINT32(asdu, 48)/100;

        sample[0] = val1;
        sample[1] = val2;
        sample[2] = val2;

        printf("[%f , %f , %f ]\n", val1, val2, val3);
}

int main(){

    /* Creating a SV Receiver and setting Interface to Eth0 */
    SVReceiver receiver = SVReceiver_create();        
    SVReceiver_setInterfaceId(receiver, "eth0");

    /* Creating a SV Subscriber, which listens to SV Messages with APPID 4000h */
    SVSubscriber subscriber = SVSubscriber_create(NULL, 0x4000);

    /* Install a callback handler for the subscriber */
    SVSubscriber_setListener(subscriber, svUpdateListener, NULL);

    /* Connect the subscriber to the receiver */
    SVReceiver_addSubscriber(receiver, subscriber);

    /* Start listening to SV messages - starts a new receiver background thread */
    SVReceiver_start(receiver);

    /* Listens to Strg + C Keyboard Interruptions */
    signal(SIGINT, sigint_handler);

    /* Endless loop until Keyboard Tnterruption */
    while (running){}

    /* Stop listening to SV messages */
    SVReceiver_stop(receiver);

    /* Cleanup and free resources */
    SVReceiver_destroy(receiver);

}

现在我想将这些值传递给Python进行进一步分析,并将它们保存为Numpy数组。我通过启动C脚本来解决这个问题子流程.popen读取C脚本的sdtout并将其转换为numpy数组。不幸的是,这个变量太慢了,特别是因为我们可能希望以后每个周期增加到256个样本。在

Python:

^{pr2}$

因此,有没有一种更有效的方法来发送Python的度量?我已经读过一些关于ctypes的文章,但是callbackhandlerssvupdatelistener(在新的示例到达时触发)是根据libiec61850的一个没有返回的void函数。因此不能将值返回给Python,或者? 赛顿能解决这个问题吗?在


Tags: tosample脚本includehandlersubscriberdoublereceiver

热门问题