Столкнулся с ЛИР-915. Вот код чтения относительной координаты:И вот картина по времени (ПЛК160, RS232, 115200, ЛИР в «двоично-десятичном» режиме); D0 — запросы:Код: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
lir915_loaded.png
Любопытно, что ЛИР отвечает гораздо быстрее, если датчик стоит примерно на нуле:
lir915_idle.png




Ответить с цитированием