As a developer, I have been burnt when comparing two different values that are actually 2 different data types (e.g. D0 > V0). The range of values are different, or even their resolutions are different (e.g. integer vs. real, V0 = R0).
For example,
D0 > V0
a SIGNED 32 BIT INTEGER (D0) has a range of -2Billion to +2Billion, but an UNSIGNED 16 BIT INTEGER (V) has a range of 0..65535 (i.e. D's can go negative or get large, but V's can't). Since the two elements' value ranges are not the same, the comparison result may not be what I expected. For example, if D0 has a value of -1, the D0 > V0 comparison will ALWAYS be FALSE, regardless of any value of V (0-65535).
As a developer, I must ask myself some questions. The first question, is this -1 value even possible for the D? If not, everything is good. If it CAN be negative, is the comparison result (FALSE) what I want? OR, could it be I should have used a SIGNED INTEGER for the Right Hand Side (e.g. N0 or D1, but not V0)? Or ? ? ?
There are other situations, like comparing a Timer Accumulator value (SIGNED 32 BIT INTEGER in MILLISECONDs) against a REAL constant that is in SECONDS, like
T0.Acc >= 3.5
This looks correct, thinking that the value units on both sides are SECONDs, but they are DIFFERENT (milliseconds vs. seconds). This is can easily be misunderstood because the STATUS of T0.Acc is formatted in Hours/Minutes/Seconds.milliseconds, so T0.Acc (integer in milliseconds) appears to be in seconds when doing status. This is definitely a situation where having a Program Check rule would have been helpful.
What say you? Would it be a nuisance, or would it be helpful? Feel free to answer the poll and/or comment!
As with ALL Program Check Warnings and Messages, you can IGNORE them judiciously at a rung, code-block, project, or global level (this new rule would be a MESSAGE BTW, not a warning).