Пытаюсь из ПЛК110 прочитать счетчик Энергомера СЕ301 с помощью быстрого чтения.
Счетчик подключен к RS485-1. Использую SysLibCom.
Пытаюсь выполнить команду /?!<SOH>R1<STX>NAME()<ETX><BCC>
Код:
VAR
step, _step, count: DINT;
rx_buffer, tx_buffer: ARRAY [0..16] OF BYTE;
timeout: TON := (PT := T#2000ms);
BCCW: WORD;
BCCI: WORD;
BCC: WORD;
END_VAR
VAR CONSTANT
port: COMSETTINGS := (Port := 0, dwBaudRate := 9600, byStopBits:=1, byParity:=0);
END_VAR
CASE step OF
0: (* открвываем порт *)
IF SysComOpen(port.Port) = 0 THEN
step := step + 1;
END_IF
1: (* соединяемся *)
IF SysComSetSettings(port.Port, ADR(port)) = 0 THEN
step := step + 1;
END_IF
2: (* формируем строку запроса *)
tx_buffer[0] := 47; (*'/';*)
tx_buffer[1] := 63; (*'?';*)
tx_buffer[2] := 33; (*'!';*)
tx_buffer[3] := 1; (*SOH*)
tx_buffer[4] := 82; (*'R';*)
tx_buffer[5] := 49; (* '1'; *)
tx_buffer[6] := 2; (*STX*)
tx_buffer[7] := 49; (* '1'; *)
tx_buffer[8] := 48; (* '0'; *)
tx_buffer[9] := 48; (* '0'; *)
tx_buffer[10] := 49; (* '1'; *)
tx_buffer[11] := 40; (* '('; *)
tx_buffer[12] := 48; (* '0'; *)
tx_buffer[13] := 49; (* '1'; *)
tx_buffer[14] := 41; (* ')';*)
tx_buffer[15] := 3; (*ETX*)
(*считаем BCC*)
BCCW := 0;
FOR BCCI := 4 TO 15 BY 1 DO
BCCW := BCCW + tx_buffer[BCCI];
END_FOR;
BCC := BCCW MOD 128;
BCC.7 := 0;
tx_buffer[16] :=WORD_TO_BYTE(BCC);
count := 0;
step := step + 1;
3: (* отправляем запрос *)
count := count + SysComWrite(port.Port, ADR(tx_buffer) + count, 17 - count, 0);
IF count >= 17 THEN
count := 0;
step := step + 1;
END_IF
4: (*читаем ответ *)
count := count + SysComRead(port.Port, ADR(rx_buffer) + count, 17 - count, 0);
IF count >= 17 THEN
;
END_IF
END_CASE
При этом при первом включении счетчика и запуске программы выполняются шаги 0,1,2,3, а в 4-м ничего не читается count всегда = 0. Если остановить программу и запустить заново, не выключая счетчик, то зависает на шаге 0 (открытии порта).
В чем может быть проблема?




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