Столкнулся с ЛИР-915. Вот код чтения относительной координаты:
Код:
VAR    step, _step, count: DINT;
    timeout: TON := (PT := T#300ms);
	request: ARRAY [0..1] OF BYTE := 51, 1;
	rsp: ARRAY [0..5] OF BYTE;
	pos: DINT;
	rpt: BOOL;
END_VAR
VAR CONSTANT
    port: COMSETTINGS := (Port := COM1, dwBaudRate := 115200, dwBufferSize := 1);
END_VAR

REPEAT
	rpt := FALSE;


	CASE step OF


	    0:
	        IF SysComOpen(port.Port) = 0 = SysComSetSettings(port.Port, ADR(port)) THEN
	            step := step + 1;
	        END_IF
		1:
			step := step + 1;


		2:
			count := count + SysComWrite(port.Port, ADR(request) + count, SIZEOF(request) - count, 0);
			IF count >= 2 THEN
				step := step + 1;
				rpt := TRUE;
			END_IF


		3:
			count := count + SysComRead(port.Port, ADR(rsp) + count, SIZEOF(rsp) - count, 0);
			IF count >= 6 THEN
				IF rsp[0] = 10 AND rsp[5] = 11 THEN


					pos :=
						SHR(rsp[4], 4) * 10000000 + (rsp[4] AND 15) * 1000000 +
						SHR(rsp[3], 4) * 100000 + (rsp[3] AND 15) * 10000 +
						SHR(rsp[2], 4) * 1000 + (rsp[2] AND 15) * 100 +
						SHR(rsp[1], 4) * 10 + (rsp[1] AND 15);




					IF SHR(rsp[4], 4) = 9 THEN
						pos := pos - 100000000;


					END_IF


					step := 2;
					rpt := TRUE;
				END_IF
			END_IF


	END_CASE


	timeout(IN := step = _step);
	IF timeout.Q THEN
		(* Discard input to resync *)
		SysComRead(port.Port, ADR(rsp), SIZEOF(rsp), 0);
		step := 1;
	END_IF


	IF step <> _step THEN
		count := 0;
		_step := step;
	END_IF


UNTIL NOT rpt END_REPEAT
И вот картина по времени (ПЛК160, RS232, 115200, ЛИР в «двоично-десятичном» режиме); D0 — запросы:

lir915_loaded.png

Любопытно, что ЛИР отвечает гораздо быстрее, если датчик стоит примерно на нуле:

lir915_idle.png