Hi all,

for those of you who haven’t already looked into how we do the parsing of raw 
protocol payload to PlcValues:

['"IEC61131_BOOL"' BOOL
    [reserved uint 7 '0x00']
    [simple   bit    value]
]


  *   The case condition decides when a case is executed (obviously) (in above 
example … the dataProtocolId equals the string “IEC61131_BOOL”)
  *   In contrast to the other types, the Name of the type decides which type 
of PlcValue will be created (In above example, we’ll create a PlcBOOL)
  *   For most types, the conversion is trivial and simply the variable named 
“value” will be used to initialize the PlcValue

Now with temporal types, it gets a lot messier:

>From S7:
['"IEC61131_DATE_AND_TIME"' DATE_AND_TIME
    [simple uint 16 year]
    [simple uint 8  month]
    [simple uint 8  day]
    [simple uint 8  dayOfWeek]
    [simple uint 8  hour]
    [simple uint 8  minutes]
    [simple uint 8  seconds]
    [simple uint 32 nanos]
]

Here we simply not only recognize “value” but also all of the above special 
variables and depending on which are available, we choose different 
constructors for the PlcValue.
Now I will be extending these with a number of new ones as iIt seems every 
protocol sort of defines them differently … some as “ms since epoch”, some 
“nanosecond since epoch”, some use some completely different reference-date 
(1900-01-01).
With some we could probably live with general “millisecondsSinceEpoch” and do 
the offset by using a virtual field that adds or subtracts a constant value … 
so something like this:

>From ADS:

['DATE_AND_TIME' DATE_AND_TIME
    [simple uint 32 secondsSinceEpoch]
]

If some driver would have a different base, this would become:

['DATE_AND_TIME' DATE_AND_TIME
    [simple uint 32 mySecondsSinceSomething]

    [virtual uint 32 secondsSinceEpoch `mySecondsSinceSomething + {seconds 
between epoch and “something”}`]
]

Just thought I’d share this … Java is already quite mature with this respect … 
go still needs a bit of love here.

Chris

Reply via email to