Вход

Просмотр полной версии : Не активен флаг xNewRequest блока MB_SerialSlave при прослушке сети Modbus RTU.



SatanaXIII
11.06.2026, 09:46
Господа, помогите разобраться в вопросе. Есть два устройства Овен ПЛК100 K.L (Slave) и панель Овен ИП320 (Master), общающиеся по сети Modbus RTU. Естественно никаких исходников программ на них нет.
Прослушал сниффером сеть, подобрал настройки (скорость, четность, все дела).
Интересующие меня данные имеют вид:
Tx: 02 03 00 1E 00 02 A4 3E
Rx: 02 03 04 F8 2F 00 04 C8 59
Если подключаюсь взамен панели ИП320 ноутбуком с MasterOPC, то все прекрасно работает, качество связи хорошее, пакеты не теряются, контрольные суммы все корректные.
Пробую к этой же сети, подключить панель СПК110 и настроить один ее порт для постоянной прослушки общения ПЛК100 и ИП320.


PROGRAM PLC_PRG
VAR
fbComControl: OCL.COM_Control;
fbMbSerialSlave: OCL.MB_SerialSlave;

awSlaveData: ARRAY [0..15] OF WORD;
awSpyData: ARRAY [0..10] OF WORD;
awNeedData: ARRAY [0..10] OF WORD;

xNewRequestCounter: UINT := 0;
END_VAR

//////////////////////////////////

fbComControl
(
xEnable := TRUE,
udiComPort := 2,
udiBaudrate := 9600,
udiByteSize := 8,
eParity := OCL.COM_PARITY.NONE,
eStopBit := OCL.COM_STOPBIT.ONE
);

fbMbSerialSlave
(
xEnable := fbComControl.xActive,
hCom := fbComControl.hCom,
usiSlaveId := 2,
pData := ADR(awSlaveData),
szSize := SIZEOF(awSlaveData),
xSpyMode := TRUE,
pSpyData := ADR(awSpyData),
szSpyData := SIZEOF(awSpyData),

);

IF fbMbSerialSlave.xNewRequest THEN
xNewRequestCounter := xNewRequestCounter + 1;

IF fbMbSerialSlave.stRequestInfo.usiSlaveId = 2 AND
fbMbSerialSlave.stRequestInfo.eFuncCode = OCL.MB_FC.READ_HOLDING_REGISTERS AND
fbMbSerialSlave.stRequestInfo.uiDataAddr = 16#1E
THEN

awNeedData := awSpyData;
awNeedData[0] := awSpyData[0];
awNeedData[1] := awSpyData[1];
END_IF
END_IF
После запуска приложения флаг xNewRequest не взводится, так и остается равным FALSE. А точнее, в пяти процентах случаев, он пару раз взводится и зависает - счетчик xNewRequestCounter показывает 2.
Но если я подключаюсь еще и ноутбуком с MasterOPC в ту же сеть (то есть в сети находятся четыре устройства: ПЛК100, ИП320, СПК110 и ноутбук), то есть в сети получается два мастера, то счетчик xNewRequestCounter начинает работать. В сети при этом естественно появляются коллизии, но сам факт интересный.

Что пробовал делать:
1) Менял fbMbSerialSlave.usiSlaveIdна 1, 2, 255, произвольное значение.
2) Менять местами провода A и B.
3) Изменять размеры буферов awSpyData и awSlaveData.
4) Выставлять в настройках задачи MainTask, где крутится обработка ком порта, приоритет в 0 и интервал в 5, включать сторожевой таймер.

Версия таргета СПК110 3.5.14.30.
Версия библиотеки OwenCommunication 3.5.11.7.

Евгений Кислов
11.06.2026, 20:11
Добрый день.
Свяжитесь, пожалуйста, со мной в понедельник утром (см. контакты в подписи).
Подготовьте удаленный доступ.