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