iicsys / pypmu

pyPMU - Python implementation of the IEEE C37.118 synchrophasor standard
BSD 3-Clause "New" or "Revised" License
60 stars 46 forks source link

Timestamp issues #7

Open RadevicI opened 6 years ago

RadevicI commented 6 years ago

Hi to all,

In order to test the performance of the algorithm running in my PMU prototype, I decided to use your pyPMU model to enable connection between the sensor and local PDC in the lab. In case when the reporting rate is set to be 50 frames/s, the data are being sent each 20 ms (50 Hz systems). Therefore, fraction of second is getting the values equal to 0, 20000, 40000, .... 900000,...0 etc. It has been noticed that each time when timestamp of 0 fraction of second is sent, PDC received the frasec of the system time (time.time()) instead of 0.

The problem is solved by modifying the frame.py in def set_time:

Instead of:

    t = time()  # Get current timestamp

   if soc:
         self.set_soc(soc)
    else:
        self.set_soc(int(t))  # Get current timestamp##

    if frasec:
        if isinstance(frasec, collections.Sequence):
            self.set_frasec(*frasec)
        else:
            self.set_frasec(frasec)  # Just set fraction of second and use default values for other arguments.
    else:
         Calculate fraction of second (after decimal point) using only first 7 digits to avoid
         overflow (24 bit number).
        self.set_frasec(int((((repr((t % 1))).split("."))[1])[0:6]))

This code is written:

    if soc :
        self.set_soc(soc)
        if isinstance(frasec, collections.Sequence):
                self.set_frasec(*frasec)
        else:
                self.set_frasec(frasec)
    else:
        t = time()  # Get current timestamp
        self.set_soc(int(t))  # Get current timestamp
        self.set_frasec(int((((repr((t % 1))).split("."))[1])[0:6]))

BR,

Isidora

sstevan commented 6 years ago

Hello @RadevicI,

Thanks for reporting this issue.

The thing is that if frasec: resolves as False if frasec is zero.

We will fix this issue by checking if frasec is not None: (and if soc is not None:). Methods set_soc() and set_frasec() will validate values.

So it will look like this:

        t = time()  # Get current timestamp

        if soc is not None:
            self.set_soc(soc)
        else:
            self.set_soc(int(t))  # Get current timestamp

        if frasec is not None:
            if isinstance(frasec, collections.Sequence):
                self.set_frasec(*frasec)
            else:
                self.set_frasec(frasec)  # Just set fraction of second and use default values for other arguments.
        else:
            # Calculate fraction of second (after decimal point) using only first 7 digits to avoid
            # overflow (24 bit number).
            self.set_frasec(int((((repr((t % 1))).split("."))[1])[0:6]))