-
однако я буфер совершенно не трогаю, и точно в нем ничего не меняю. более того, функция отлично работает при чтении с мв110, частотника Delta Vfd, но только не с плк63. см. предидущий пост.
Различие в параметрах обращения к разным устройствам одной и той же функцией только в сетевом адресе, и номере регистра.
Ответ от слэйва ПЛК63 имеется, такой как надо, но почему-то возникает ошибка таймаута у мастера, хоть лоб разбей, словно биты, посылаемые в ответ слэйвом ПЛК63, чем-то отличаются от битов, посылаемых в ответ другими устройствами. И уж совсем непонятно, что при опросе слэйва через программу терринг модбас слэйв опрашивается без ошибки таймаута (ответ всегда был нормальный).
Может быть это связано с диапазоном адресов регисторов? Например при обращении к МВ110 регист 51, к частотнику 8449, 8448, а при обращении к ПЛК63 - 332-511??
-
значит происходит таймаут. а вот почему?
код бы все разъяснил, а то приходится задавать "идиотские" вопросы и строить предположения.
Какие настройки задержки ответа в slave?
-
Дело в том, что частотник отвечает вообще без задержки. Для этого я его посадил на порт ПЛК63 (1 - 232) через АС3-М-220. Даже если устройства имеют задержку 1 мс, ответ читается нормально.
В программе ненужные места позакомментировал (рабочий вариант, прошу прощения за нагромождение всякой всячины), чтение происходит при значении в CASE ukazatel=2; при ukazatel=1 ничего не делается.
CASE_MAX=3, поэтому досчитав до трех программа натыкается на пустую строку для ukazatel=3, этим обеспечивается псылка запроса только один раз, чтобы я мог проследить на компьютере запрос/ответ. Для примера программа производит единожды опрос МВ110 с адресом 01, маски входов - регистр 51. Все отлично. Но стоит поставить адрес 08, регистр 333 - это ПЛК63 слэйв - как возникает ошибка таймаута.
При чтении МВ110:
000001 17:26:42.800 3A :
000002 17:26:42.800 30 0
000003 17:26:42.816 31 1
000004 17:26:42.816 30 0
000005 17:26:42.816 33 3
000006 17:26:42.816 30 0
000007 17:26:42.816 30 0
000008 17:26:42.816 33 3
000009 17:26:42.816 33 3
000010 17:26:42.816 30 0
000011 17:26:42.816 30 0
000012 17:26:42.816 30 0
000013 17:26:42.816 31 1
000014 17:26:42.816 43 C
000015 17:26:42.816 38 8
000016 17:26:42.832 0D .
000017 17:26:42.832 0A .
000018 17:26:42.832 3A :
000019 17:26:42.832 30 0
000020 17:26:42.832 31 1
000021 17:26:42.832 30 0
000022 17:26:42.832 33 30 30
000023 17:26:42.832 32 2
000024 17:26:42.832 32 2
000025 17:26:42.832 30 0
000026 17:26:42.832 34 4
000027 17:26:42.832 30 0
000028 17:26:42.832 39 9
000029 17:26:42.847 41 A
000030 17:26:42.847 0D .
000031 17:26:42.847 0A .
запрос-ответ нормальные, все работает.
Подставляю адрес 08, регистр 333 - это ПЛК63 слэйв
2:
IF enabl=FALSE AND enabl2=FALSE
THEN
adres:=08;
registr:=333 ;
colreg:=1;
COM_Port_NUM:=1;
enabl:=TRUE;
END_IF
Получаю:
000001 17:31:42.751 3A :
000002 17:31:42.751 30 0
000003 17:31:42.751 38 8
000004 17:31:42.751 30 0
000005 17:31:42.751 33 3
000006 17:31:42.751 30 0
000007 17:31:42.751 31 1
000008 17:31:42.751 34 4
000009 17:31:42.751 44 D
000010 17:31:42.751 30 0
000011 17:31:42.767 30 0
000012 17:31:42.767 30 0
000013 17:31:42.767 31 1
000014 17:31:42.767 41 A
000015 17:31:42.767 36 6
000016 17:31:42.767 0D .
000017 17:31:42.767 0A .
000018 17:31:42.798 3A :
000019 17:31:42.798 30 0
000020 17:31:42.798 38 8
000021 17:31:42.798 30 0
000022 17:31:42.798 33 3
000023 17:31:42.798 30 0
000024 17:31:42.814 32 2
000025 17:31:42.814 30 0
000026 17:31:42.814 30 0
000027 17:31:42.814 30 0
000028 17:31:42.814 31 1
000029 17:31:42.814 46 F
000030 17:31:42.814 33 3
000031 17:31:42.814 0D .
000032 17:31:42.814 0A .
В итоге функция выдала ошибку таймаута.
14D - это 333 в десятичной
Через терринг модбас спрашиваю:
Request
:0803014D0001A6
Response
:0803020001F3
Все нормально, ошибки нет.
И в том и в другом случае - ответы верные, но терринг модбас не дает ошибки таймауте, а функция ПЛК - дает.
Голову сломал уже, не пойму почему?
-
Вложений: 1
-
Привожу работающий пример записи (чтение не делал) 63 -> 63
Код:
PROGRAM SendOutdoor
VAR
SendModbus1: MB_WR_REGS;
SendModbus2: MB_WR_SNG_REG;
ES: BOOL:= TRUE;
TimeOut: TIME:= T#50ms;
Buffer: ARRAY[0..255] OF BYTE;
OutdoorPtr: POINTER TO BYTE;
ErrorSend1: ARRAY[2..5] OF BYTE;
ErrorSend2: ARRAY[2..5] OF BYTE;
Temp: BOOL:= TRUE;
Addr: BYTE:= 2;
EndSendStored: BOOL;
HavePause:TON;
END_VAR
IF ComPortState = 2 THEN
IF Temp THEN
IF ES THEN
OutdoorPtr:= ADR(Outdoor);
Buffer[1]:= OutdoorPtr^;
OutdoorPtr:= OutdoorPtr+1;
Buffer[0]:= OutdoorPtr^;
OutdoorPtr:= OutdoorPtr+1;
Buffer[3]:= OutdoorPtr^;
OutdoorPtr:= OutdoorPtr+1;
Buffer[2]:= OutdoorPtr^;
END_IF
SendModbus1(
Enable:= ES,
Mode:= MB_RTU,
DevAddr:= Addr,
FirstAddr:= 148,
Quantity:= 2,
ComHandle:= Settings.Port,
TimeOut:= Timeout,
Buffer:= Buffer);
ES:= FALSE;
IF SendModbus1.Complete THEN
EndSendStored:=TRUE;
ErrorSend1[Addr]:= SendModbus1.Exception;
END_IF
HavePause(IN:= EndSendStored,PT:=T#250ms);
IF HavePause.Q THEN
ES:= TRUE;
EndSendStored:= FALSE;
Addr:= Addr+1;
END_IF
IF Addr = 6 THEN
Addr:= 2;
Temp:= FALSE;
END_IF
ELSE
SendModbus2(
Enable:= ES,
Mode:= MB_RTU,
DevAddr:= Addr,
RegAddr:= 346,
Value:= BOOL_TO_WORD(Summer)+1,
ComHandle:= Settings.Port,
TimeOut:= Timeout);
ES:= FALSE;
IF SendModbus2.Complete THEN
EndSendStored:=TRUE;
ErrorSend2[Addr]:= SendModbus2.Exception;
END_IF
HavePause(IN:= EndSendStored,PT:=T#250ms);
IF HavePause.Q THEN
ES:= TRUE;
EndSendStored:= FALSE;
Addr:= Addr+1;
END_IF
IF Addr = 6 THEN
Addr:= 2;
Temp:= TRUE;
END_IF
END_IF
END_IF
После вызова ф-ии надо сбросить Enable, чтобы тать ей работать.
Проверку выходных переменных стОит делать так, иначе у меня были проблемы.
-
с записью вроде проблем нет. флаг разрешения необязательно убирать сразу после вызова функции, у меня и с установленным флагом все работает, убираю только когда функция завершила работу.
-
тем не менее снимите - чтобы начать отсчет тайм-аута(?).
-
Итак 798-767=31. Уже 31 миллисекунда между последним байтом запроса и 1-м байтом ответа.
А общая пауза между концом запроса и концом ответа составляет
814-767=47 мс.
+ задержки в мастере.
Соответственно повторяю вопрос, какая задержка между запросом и ответом выставлена в slave? В ПЛК63, который работает как slave!
-
Прошу прощения что сразу не ответил на ваш вопрос. 30ms.
-
Вложений: 1
программа для слэйва в приложении. слэйв общается как мастер с двумя модулями мв110 и частотником через порт 232 и преобразователь ас3-м (внутренний интерфейс шкафа автоматизации). через 485 - с мастером (внешний интерфейс).
пробовал уменьшать/увеличивать задержку слэйва, и время таймаута мастера. результат тотже.