I want to multiply a TIME
variable by an integer. Documentation says that you can use * with TIME
variables but when I try:
CYCLE_TIME : TIME := T#5MS;
CYCLE_TIME_OFFSET : TIME := CYCLE_TIME * 2;
Or
CYCLE_TIME : TIME := T#5MS;
CYCLE_TIME_OFFSET : TIME := CYCLE_TIME * TO_TIME(2);
Or
CYCLE_TIME : TIME := T#5MS;
CYCLE_TIME_OFFSET : TIME := (CYCLE_TIME * T#2MS);
I get an error I don't understand:
Can I multiply time by an integer, if so, how?
While codesys does support TIME multiplication, strangely it seems to not support it at compile time (in the definition). For example:
t1: TIME := T#5MS;
multiplier: UDINT := 2;
t2: TIME := t1 * multiplier;
Gives C0073: Cannot multiply multiple operands of type 'TIME'
, while
t1: TIME := T#5MS;
multiplier: UDINT := 2;
t3: TIME := MUL(t1, multiplier);
Gives C0007: Expression expected instead of 'MUL'
.
Using any of the two above at runtime works as expected:
If you absolutely must multiply TIME in the definition phase, then you can always cast TIME to UDINT/DWORD (TIME <=> UDINT/DWORD, where 1 equals to 1 millisecond, so 12345 is 12 seconds and 345 milliseconds), do whatever operations you want, and then cast it back to TIME:
t6: TIME := UDINT_TO_TIME(TIME_TO_UDINT(t1) * multiplier);