Вход

Просмотр полной версии : Однократный опрос модулей Мх210 (через библиотеку)



Андрей_ТМЗ
06.06.2024, 12:39
Здравствуйте. Опрашиваю модули МВ210-101, МВ210-212 и запись в модули МУ210-402 с помощью библиотеки OWENCommunication. В чем суть проблемы: при загрузке проекта в контроллер, модули опрашиваются только один раз. Нет циклического опроса. При этом опрос проходит без ошибок, данные получаю. Опрос организовал согласно "CoDeSys V3.5. Настройка обмена по протоколу Modbus. Раздел 5.9.3" при небольших изменениях. Возможно я что-то не учел. Прошу помочь, так как в моем понимании все должно работать. Опрос модулей и запись в модули разделены на 3 POU. Привожу код опроса модулей МВ210-101.

PROGRAM Read_AI_All
VAR
// ФБ Открытие коммуникационного блока
fbTCPClient_AI1 : ocl.TCP_Client;
fbTCPClient_AI2 : ocl.TCP_Client;
fbTCPClient_AI3 : ocl.TCP_Client;
fbTCPClient_AI4 : ocl.TCP_Client;
fbTCPClient_AI5 : ocl.TCP_Client;
fbTCPClient_AI6 : ocl.TCP_Client;
fbTCPClient_AI7 : ocl.TCP_Client;
fbTCPClient_AI8 : ocl.TCP_Client;
fbTCPClient_AI9 : ocl.TCP_Client;
fbTCPClient_AI10 : ocl.TCP_Client;
fbTCPClient_AI11 : ocl.TCP_Client;
fbTCPClient_AI12 : ocl.TCP_Client;


// ФБ опроса модуля
fbMV210_101_AI1 : ocl.MB_TcpRequest; // МВ210-101 AI1 (каналы 1 - 8)
fbMV210_101_AI2 : ocl.MB_TcpRequest; // МВ210-101 AI2 (каналы 1 - 8)
fbMV210_101_AI3 : ocl.MB_TcpRequest; // МВ210-101 AI3 (каналы 1 - 8)
fbMV210_101_AI4 : ocl.MB_TcpRequest; // МВ210-101 AI4 (каналы 1 - 8)
fbMV210_101_AI5 : ocl.MB_TcpRequest; // МВ210-101 AI5 (каналы 1 - 8)
fbMV210_101_AI6 : ocl.MB_TcpRequest; // МВ210-101 AI6 (каналы 1 - 8)
fbMV210_101_AI7 : ocl.MB_TcpRequest; // МВ210-101 AI7 (каналы 1 - 8)
fbMV210_101_AI8 : ocl.MB_TcpRequest; // МВ210-101 AI8 (каналы 1 - 8)
fbMV210_101_AI9 : ocl.MB_TcpRequest; // МВ210-101 AI9 (каналы 1 - 8)
fbMV210_101_AI10 : ocl.MB_TcpRequest; // МВ210-101 AI10 (каналы 1 - 8)
fbMV210_101_AI11 : ocl.MB_TcpRequest; // МВ210-101 AI11 (каналы 1 - 8)
fbMV210_101_AI12 : ocl.MB_TcpRequest; // МВ210-101 AI12 (каналы 1 - 8)

// Данные с модулей МВ210-101
Read_AI1 : ARRAY [1..8] OF Read_AI; // Данные с модуля МВ210-101 AI1 (каналы 1 - 8)
Read_AI2 : ARRAY [1..8] OF Read_AI; // Данные с модуля МВ210-101 AI2 (каналы 1 - 8)
Read_AI3 : ARRAY [1..8] OF Read_AI; // Данные с модуля МВ210-101 AI3 (каналы 1 - 8)
Read_AI4 : ARRAY [1..8] OF Read_AI; // Данные с модуля МВ210-101 AI4 (каналы 1 - 8)
Read_AI5 : ARRAY [1..8] OF Read_AI; // Данные с модуля МВ210-101 AI5 (каналы 1 - 8)
Read_AI6 : ARRAY [1..8] OF Read_AI; // Данные с модуля МВ210-101 AI6 (каналы 1 - 8)
Read_AI7 : ARRAY [1..8] OF Read_AI; // Данные с модуля МВ210-101 AI7 (каналы 1 - 8)
Read_AI8 : ARRAY [1..8] OF Read_AI; // Данные с модуля МВ210-101 AI8 (каналы 1 - 8)
Read_AI9 : ARRAY [1..8] OF Read_AI; // Данные с модуля МВ210-101 AI9 (каналы 1 - 8)
Read_AI10 : ARRAY [1..8] OF Read_AI; // Данные с модуля МВ210-101 AI10 (каналы 1 - 8)
Read_AI11 : ARRAY [1..8] OF Read_AI; // Данные с модуля МВ210-101 AI11 (каналы 1 - 8)
Read_AI12 : ARRAY [1..8] OF Read_AI; // Данные с модуля МВ210-101 AI12 (каналы 1 - 8)


tTimeout_TCPClient : TIME := T#400MS;
tTimeOut_TCPRequest : TIME := T#400MS;
i : INT;
iAI_Number : INT := 1;
END_VAR



================================================== ==================

CASE iAI_Number OF

1: //Опрос модуля AI1


fbTCPClient_AI1
(
xEnable := TRUE,
tTimeOut := tTimeout_TCPClient,
sIPAddr := '192.168.51.4',
uiPort := 502
);

IF fbTCPClient_AI1.xActive THEN
fbMV210_101_AI1
(
xExecute := TRUE,
tTimeOut := tTimeOut_TCPRequest,
usiRetry := 3,
hConnection := fbTCPClient_AI1.hConnection,
xIsRtuOverTcpMode := FALSE,
usiUnitId := 255,
eFuncCode := OCL.MB_FC.READ_HOLDING_REGISTERS,
uiDataAddr := 4000,
uiDataCount := 24,
pData := ADR(Read_AI1),
szSize := SIZEOF(Read_AI1)
);

IF fbMV210_101_AI1.xDone THEN

A1_AI1_LT1_1 := Read_AI1[1].rValue;
A1_AI1_TT1_1_01 := Read_AI1[2].rValue;
A1_AI1_TT1_1_02 := Read_AI1[3].rValue;
A1_AI1_TT1_1_03 := Read_AI1[4].rValue;
A1_AI1_LT1_2 := Read_AI1[5].rValue;
A1_AI1_TT1_2_01 := Read_AI1[6].rValue;
A1_AI1_TT1_2_02 := Read_AI1[7].rValue;
A1_AI1_TT1_2_03 := Read_AI1[8].rValue;

// Сброс блока после выполнения
//fbMV210_101_AI1(xExecute := FALSE);
// Закрытие ТСР-соединения
//fbTCPClient_AI1(xEnable := FALSE);
//iAI_Number := 2;
//iAI_Number := 3;
END_IF
// Сброс блока после выполнения или в случае ошибки
IF fbMV210_101_AI1.xDone OR fbMV210_101_AI1.xError THEN
fbMV210_101_AI1.xExecute := FALSE;
//iAI_Number := 2;
iAI_Number := 3;
END_IF
END_IF
IF fbTCPClient_AI1.xError THEN

fbTCPClient_AI1(xEnable := FALSE);

//iAI_Number := 2;
iAI_Number := 3;
END_IF

//iAI_Number := 2;
//iAI_Number := 3;

2: // Опрос Модуля AI2

fbTCPClient_AI2
(
xEnable := TRUE,
tTimeOut := tTimeout_TCPClient,
sIPAddr := '192.168.51.5',
uiPort := 502
);

IF fbTCPClient_AI2.xActive THEN
fbMV210_101_AI2
(
xExecute := TRUE,
tTimeOut := tTimeOut_TCPRequest,
usiRetry := 3,
hConnection := fbTCPClient_AI2.hConnection,
xIsRtuOverTcpMode := FALSE,
usiUnitId := 255,
eFuncCode := OCL.MB_FC.READ_HOLDING_REGISTERS,
uiDataAddr := 4000,
uiDataCount := 24,
pData := ADR(Read_AI2),
szSize := SIZEOF(Read_AI2)
);

IF fbMV210_101_AI2.xDone THEN

A1_AI2_LT1_3 := Read_AI2[1].rValue;
A1_AI2_TT1_3_01 := Read_AI2[2].rValue;
A1_AI2_TT1_3_02 := Read_AI2[3].rValue;
A1_AI2_TT1_3_03 := Read_AI2[4].rValue;
RGS4.A1_AI2_LT1_4 := Read_AI2[5].rValue;
RGS4.A1_AI2_TT1_4_01 := Read_AI2[6].rValue;

// Сброс блока после выполнения
//fbMV210_101_AI2(xExecute := FALSE);
//fbTCPClient_AI2(xEnable := FALSE);
//iAI_Number := 3;
END_IF
// Сброс блока после выполнения или в случае ошибки
IF fbMV210_101_AI2.xDone OR fbMV210_101_AI2.xError THEN
fbMV210_101_AI2.xExecute := FALSE;
//iAI_Number := 3;
END_IF
END_IF
IF fbTCPClient_AI2.xError THEN

fbTCPClient_AI2(xEnable := FALSE);

//iAI_Number := 3;

END_IF

iAI_Number := 3;

3:

fbTCPClient_AI3
(
xEnable := TRUE,
tTimeOut := tTimeout_TCPClient,
sIPAddr := '192.168.51.6',
uiPort := 502
);

IF fbTCPClient_AI3.xActive THEN
fbMV210_101_AI3
(
xExecute := TRUE,
tTimeOut := tTimeOut_TCPRequest,
usiRetry := 3,
hConnection := fbTCPClient_AI3.hConnection,
xIsRtuOverTcpMode := FALSE,
usiUnitId := 255,
eFuncCode := OCL.MB_FC.READ_HOLDING_REGISTERS,
uiDataAddr := 4000,
uiDataCount := 24,
pData := ADR(Read_AI3),
szSize := SIZEOF(Read_AI3)
);

IF fbMV210_101_AI3.xDone THEN

NS1.A1_AI3_PIT_01 := Read_AI3[1].rValue;
NS2.A1_AI3_PIT_02 := Read_AI3[2].rValue;
NS2.A1_AI3_PIT_03 := Read_AI3[3].rValue;
NS2.A1_AI3_PIT_04 := Read_AI3[5].rValue;

// Сброс блока после выполнения
//fbMV210_101_AI3(xExecute := FALSE);
//iAI_Number := 4;
//fbTCPClient_AI3(xEnable := FALSE);
END_IF
// Сброс блока после выполнения или в случае ошибки
IF fbMV210_101_AI3.xDone OR fbMV210_101_AI3.xError THEN
fbMV210_101_AI3.xExecute := FALSE;
//iAI_Number := 4;
END_IF
END_IF
IF fbTCPClient_AI3.xError THEN

fbTCPClient_AI3(xEnable := FALSE);
//iAI_Number := 4;

END_IF

//iAI_Number := 4;
iAI_Number := 5;

4:

fbTCPClient_AI4
(
xEnable := TRUE,
tTimeOut := tTimeout_TCPClient,
sIPAddr := '192.168.51.7',
uiPort := 502
);

IF fbTCPClient_AI4.xActive THEN
fbMV210_101_AI4
(
xExecute := TRUE,
tTimeOut := tTimeOut_TCPRequest,
usiRetry := 3,
hConnection := fbTCPClient_AI4.hConnection,
xIsRtuOverTcpMode := FALSE,
usiUnitId := 255,
eFuncCode := OCL.MB_FC.READ_HOLDING_REGISTERS,
uiDataAddr := 4000,
uiDataCount := 24,
pData := ADR(Read_AI4),
szSize := SIZEOF(Read_AI4)
);

IF fbMV210_101_AI4.xDone THEN

NS1.A1_AI4_TT1_01 := Read_AI4[1].rValue;
NS1.A1_AI4_TT1_02 := Read_AI4[2].rValue;
NS1.A1_AI4_TT1_03 := Read_AI4[3].rValue;
NS1.A1_AI4_TT1_04 := Read_AI4[4].rValue;
A1_AI4_TT1_05 := Read_AI4[5].rValue;
A1_AI4_TT1_06 := Read_AI4[6].rValue;
A1_AI4_TT1_07 := Read_AI4[7].rValue;
A1_AI4_TT1_08 := Read_AI4[8].rValue;

// Сброс блока после выполнения
//fbMV210_101_AI4(xExecute := FALSE);
//iAI_Number := 5;
//fbTCPClient_AI3(xEnable := FALSE);
END_IF
// Сброс блока после выполнения или в случае ошибки
IF fbMV210_101_AI4.xDone OR fbMV210_101_AI4.xError THEN
fbMV210_101_AI4.xExecute := FALSE;
//iAI_Number := 5;
END_IF
END_IF
IF fbTCPClient_AI4.xError THEN

fbTCPClient_AI4(xEnable := FALSE);

//iAI_Number := 5;

END_IF

iAI_Number := 5;

5:

fbTCPClient_AI5
(
xEnable := TRUE,
tTimeOut := tTimeout_TCPClient,
sIPAddr := '192.168.51.8',
uiPort := 502
);

IF fbTCPClient_AI5.xActive THEN
fbMV210_101_AI5
(
xExecute := TRUE,
tTimeOut := tTimeOut_TCPRequest,
usiRetry := 3,
hConnection := fbTCPClient_AI5.hConnection,
xIsRtuOverTcpMode := FALSE,
usiUnitId := 255,
eFuncCode := OCL.MB_FC.READ_HOLDING_REGISTERS,
uiDataAddr := 4000,
uiDataCount := 24,
pData := ADR(Read_AI5),
szSize := SIZEOF(Read_AI5)
);

IF fbMV210_101_AI5.xDone THEN

A1_AI5_TT1_09 := Read_AI5[1].rValue;
A1_AI5_TT1_10 := Read_AI5[2].rValue;
NS2.A1_AI5_TT1_11 := Read_AI5[3].rValue;
NS2.A1_AI5_TT1_12 := Read_AI5[4].rValue;
NS2.A1_AI5_TT1_13 := Read_AI5[5].rValue;
NS2.A1_AI5_TT1_14 := Read_AI5[6].rValue;
NS2.A1_AI5_TT1_15 := Read_AI5[7].rValue;
NS2.A1_AI5_TT1_16 := Read_AI5[8].rValue;

// Сброс блока после выполнения
//fbMV210_101_AI5(xExecute := FALSE);
//iAI_Number := 6;
//fbTCPClient_AI3(xEnable := FALSE);
END_IF
// Сброс блока после выполнения или в случае ошибки
IF fbMV210_101_AI5.xDone OR fbMV210_101_AI5.xError THEN
fbMV210_101_AI5.xExecute := FALSE;
//iAI_Number := 6;
END_IF
END_IF
IF fbTCPClient_AI5.xError THEN

fbTCPClient_AI5(xEnable := FALSE);

//iAI_Number := 6;

END_IF

iAI_Number := 6;

6:

fbTCPClient_AI6
(
xEnable := TRUE,
tTimeOut := tTimeout_TCPClient,
sIPAddr := '192.168.51.9',
uiPort := 502
);

IF fbTCPClient_AI6.xActive THEN
fbMV210_101_AI6
(
xExecute := TRUE,
tTimeOut := tTimeOut_TCPRequest,
usiRetry := 3,
hConnection := fbTCPClient_AI6.hConnection,
xIsRtuOverTcpMode := FALSE,
usiUnitId := 255,
eFuncCode := OCL.MB_FC.READ_HOLDING_REGISTERS,
uiDataAddr := 4000,
uiDataCount := 24,
pData := ADR(Read_AI6),
szSize := SIZEOF(Read_AI6)
);

IF fbMV210_101_AI6.xDone THEN

Other.A1_AI6_TT1_18 := Read_AI6[1].rValue;
Other.A1_AI6_TT1_19 := Read_AI6[2].rValue;
//Other.A1_AI6_TT1_20 := Read_AI6[3].rValue;
A1_AI2_LT1_3 := Read_AI6[3].rValue;
A1_AI2_TT1_3_01 := Read_AI6[4].rValue;
A1_AI2_TT1_3_02 := Read_AI6[5].rValue;
A1_AI2_TT1_3_03 := Read_AI6[6].rValue;
A1_AI4_TT1_05 := Read_AI6[7].rValue;
A1_AI4_TT1_06 := Read_AI6[8].rValue;

// Сброс блока после выполнения
//fbMV210_101_AI6(xExecute := FALSE);
//iAI_Number := 7;
//fbTCPClient_AI3(xEnable := FALSE);
END_IF
// Сброс блока после выполнения или в случае ошибки
IF fbMV210_101_AI6.xDone OR fbMV210_101_AI6.xError THEN
fbMV210_101_AI6.xExecute := FALSE;
//iAI_Number := 7;
END_IF
END_IF
IF fbTCPClient_AI6.xError THEN

fbTCPClient_AI6(xEnable := FALSE);

//iAI_Number := 7;

END_IF

iAI_Number := 7;

7:

fbTCPClient_AI7
(
xEnable := TRUE,
tTimeOut := tTimeout_TCPClient,
sIPAddr := '192.168.51.10',
uiPort := 502
);

IF fbTCPClient_AI7.xActive THEN
fbMV210_101_AI7
(
xExecute := TRUE,
tTimeOut := tTimeOut_TCPRequest,
usiRetry := 3,
hConnection := fbTCPClient_AI7.hConnection,
xIsRtuOverTcpMode := FALSE,
usiUnitId := 255,
eFuncCode := OCL.MB_FC.READ_HOLDING_REGISTERS,
uiDataAddr := 4000,
uiDataCount := 24,
pData := ADR(Read_AI7),
szSize := SIZEOF(Read_AI7)
);

IF fbMV210_101_AI7.xDone THEN

Other.A1_AI7_TT2_01 := Read_AI7[1].rValue;
A1_AI7_TT2_02 := Read_AI7[2].rValue;
A1_AI7_TT2_03 := Read_AI7[3].rValue;
A1_AI7_TT2_04 := Read_AI7[4].rValue;
A1_AI4_TT1_07 := Read_AI7[5].rValue;
A1_AI4_TT1_08 := Read_AI7[6].rValue;
NS1.A1_AI4_TT1_01 := Read_AI7[7].rValue;
NS1.A1_AI4_TT1_02 := Read_AI7[8].rValue;

// Сброс блока после выполнения
//fbMV210_101_AI7(xExecute := FALSE);
//iAI_Number := 8;
//fbTCPClient_AI3(xEnable := FALSE);
END_IF
// Сброс блока после выполнения или в случае ошибки
IF fbMV210_101_AI7.xDone OR fbMV210_101_AI7.xError THEN
fbMV210_101_AI7.xExecute := FALSE;
//iAI_Number := 8;
END_IF
END_IF
IF fbTCPClient_AI7.xError THEN

fbTCPClient_AI7(xEnable := FALSE);

//iAI_Number := 8;

END_IF

iAI_Number := 8;

8:

fbTCPClient_AI8
(
xEnable := TRUE,
tTimeOut := tTimeout_TCPClient,
sIPAddr := '192.168.51.11',
uiPort := 502
);

IF fbTCPClient_AI8.xActive THEN
fbMV210_101_AI8
(
xExecute := TRUE,
tTimeOut := tTimeOut_TCPRequest,
usiRetry := 3,
hConnection := fbTCPClient_AI8.hConnection,
xIsRtuOverTcpMode := FALSE,
usiUnitId := 255,
eFuncCode := OCL.MB_FC.READ_HOLDING_REGISTERS,
uiDataAddr := 4000,
uiDataCount := 24,
pData := ADR(Read_AI8),
szSize := SIZEOF(Read_AI8)
);

IF fbMV210_101_AI8.xDone THEN

RGS4.A1_AI8_TT3_01 := Read_AI8[1].rValue;
A1_AI8_TT3_02 := Read_AI8[2].rValue;
A1_AI8_TT3_03 := Read_AI8[3].rValue;
A1_AI8_TT3_04 := Read_AI8[4].rValue;
Other.A1_AI8_TT3_05 := Read_AI8[5].rValue;

// Сброс блока после выполнения
//fbMV210_101_AI8(xExecute := FALSE);
//iAI_Number := 9;
//fbTCPClient_AI3(xEnable := FALSE);
END_IF
// Сброс блока после выполнения или в случае ошибки
IF fbMV210_101_AI8.xDone OR fbMV210_101_AI8.xError THEN
fbMV210_101_AI8.xExecute := FALSE;
//iAI_Number := 9;
END_IF
END_IF
IF fbTCPClient_AI8.xError THEN

fbTCPClient_AI8(xEnable := FALSE);

//iAI_Number := 9;

END_IF

iAI_Number := 9;

9:

fbTCPClient_AI9
(
xEnable := TRUE,
tTimeOut := tTimeout_TCPClient,
sIPAddr := '192.168.51.12',
uiPort := 502
);

IF fbTCPClient_AI9.xActive THEN
fbMV210_101_AI9
(
xExecute := TRUE,
tTimeOut := tTimeOut_TCPRequest,
usiRetry := 3,
hConnection := fbTCPClient_AI9.hConnection,
xIsRtuOverTcpMode := FALSE,
usiUnitId := 255,
eFuncCode := OCL.MB_FC.READ_HOLDING_REGISTERS,
uiDataAddr := 4000,
uiDataCount := 24,
pData := ADR(Read_AI9),
szSize := SIZEOF(Read_AI9)
);

IF fbMV210_101_AI9.xDone THEN

Other.A1_AI9_TT4_01 := Read_AI9[1].rValue;
Other.A1_AI9_TT4_02 := Read_AI9[2].rValue;
RGS4.A1_AI2_LT1_4 := Read_AI9[6].rValue;


// Сброс блока после выполнения
//fbMV210_101_AI9(xExecute := FALSE);
//iAI_Number := 10;
//fbTCPClient_AI3(xEnable := FALSE);
END_IF
// Сброс блока после выполнения или в случае ошибки
IF fbMV210_101_AI9.xDone OR fbMV210_101_AI9.xError THEN
fbMV210_101_AI9.xExecute := FALSE;
//iAI_Number := 10;
END_IF
END_IF
IF fbTCPClient_AI9.xError THEN

fbTCPClient_AI9(xEnable := FALSE);

//iAI_Number := 10;

END_IF

iAI_Number := 10;

10:

fbTCPClient_AI10
(
xEnable := TRUE,
tTimeOut := tTimeout_TCPClient,
sIPAddr := '192.168.51.13',
uiPort := 502
);

IF fbTCPClient_AI10.xActive THEN
fbMV210_101_AI10
(
xExecute := TRUE,
tTimeOut := tTimeOut_TCPRequest,
usiRetry := 3,
hConnection := fbTCPClient_AI10.hConnection,
xIsRtuOverTcpMode := FALSE,
usiUnitId := 255,
eFuncCode := OCL.MB_FC.READ_HOLDING_REGISTERS,
uiDataAddr := 4000,
uiDataCount := 24,
pData := ADR(Read_AI10),
szSize := SIZEOF(Read_AI10)
);

IF fbMV210_101_AI10.xDone THEN

Other.A1_AI10_TT1_21 := Read_AI10[1].rValue;
RGS4.A1_AI2_TT1_4_01 := Read_AI10[2].rValue;
NS1.A1_AI4_TT1_03 := Read_AI10[3].rValue;
NS1.A1_AI4_TT1_04 := Read_AI10[4].rValue;
Other.A1_AI10_TT1_25 := Read_AI10[5].rValue;
Other.A1_AI10_TT1_26 := Read_AI10[6].rValue;
Other.A1_AI10_TT1_27 := Read_AI10[7].rValue;

// Сброс блока после выполнения
//fbMV210_101_AI10(xExecute := FALSE);
//iAI_Number := 11;
//fbTCPClient_AI3(xEnable := FALSE);
END_IF
// Сброс блока после выполнения или в случае ошибки
IF fbMV210_101_AI10.xDone OR fbMV210_101_AI10.xError THEN
fbMV210_101_AI10.xExecute := FALSE;
//iAI_Number := 11;
END_IF
END_IF
IF fbTCPClient_AI10.xError THEN

fbTCPClient_AI10(xEnable := FALSE);

//iAI_Number := 11;

END_IF

//iAI_Number := 11;
iAI_Number := 1;

11:

fbTCPClient_AI11
(
xEnable := TRUE,
tTimeOut := tTimeout_TCPClient,
sIPAddr := '192.168.51.14',
uiPort := 502
);

IF fbTCPClient_AI11.xActive THEN
fbMV210_101_AI11
(
xExecute := TRUE,
tTimeOut := tTimeOut_TCPRequest,
usiRetry := 3,
hConnection := fbTCPClient_AI11.hConnection,
xIsRtuOverTcpMode := FALSE,
usiUnitId := 255,
eFuncCode := OCL.MB_FC.READ_HOLDING_REGISTERS,
uiDataAddr := 4000,
uiDataCount := 24,
pData := ADR(Read_AI11),
szSize := SIZEOF(Read_AI11)
);

IF fbMV210_101_AI11.xDone THEN



// Сброс блока после выполнения
//fbMV210_101_AI11(xExecute := FALSE);
//iAI_Number := 12;
//fbTCPClient_AI3(xEnable := FALSE);
END_IF
// Сброс блока после выполнения или в случае ошибки
IF fbMV210_101_AI11.xDone OR fbMV210_101_AI11.xError THEN
fbMV210_101_AI11.xExecute := FALSE;
//iAI_Number := 12;
END_IF
END_IF
IF fbTCPClient_AI11.xError THEN

fbTCPClient_AI11(xEnable := FALSE);

//iAI_Number := 12;

END_IF

iAI_Number := 12;

12:

fbTCPClient_AI12
(
xEnable := TRUE,
tTimeOut := tTimeout_TCPClient,
sIPAddr := '192.168.51.15',
uiPort := 502
);

IF fbTCPClient_AI12.xActive THEN
fbMV210_101_AI12
(
xExecute := TRUE,
tTimeOut := tTimeOut_TCPRequest,
usiRetry := 3,
hConnection := fbTCPClient_AI12.hConnection,
xIsRtuOverTcpMode := FALSE,
usiUnitId := 255,
eFuncCode := OCL.MB_FC.READ_HOLDING_REGISTERS,
uiDataAddr := 4000,
uiDataCount := 24,
pData := ADR(Read_AI12),
szSize := SIZEOF(Read_AI12)
);

IF fbMV210_101_AI12.xDone THEN



// Сброс блока после выполнения
//fbMV210_101_AI12(xExecute := FALSE);
//iAI_Number := 1;
//fbTCPClient_AI3(xEnable := FALSE);
END_IF
// Сброс блока после выполнения или в случае ошибки
IF fbMV210_101_AI12.xDone OR fbMV210_101_AI12.xError THEN
fbMV210_101_AI12.xExecute := FALSE;
//iAI_Number := 1;
END_IF
END_IF
IF fbTCPClient_AI12.xError THEN

fbTCPClient_AI12(xEnable := FALSE);

//iAI_Number := 1;

END_IF

iAI_Number := 1;

END_CASE

МихаилГл
06.06.2024, 12:53
Делайте напрямую через конфигурацию, и не надо никаких pou

Андрей_ТМЗ
06.06.2024, 12:56
Делайте напрямую через конфигурацию, и не надо никаких pou

Можно чуть подробнее?

МихаилГл
06.06.2024, 13:05
Можно чуть подробнее?

76329

Ну как то так...
Или вы хотите все программно, чтоб потом из нее же менять настройки?

1exan
06.06.2024, 13:10
Здравствуйте. Опрашиваю модули МВ210-101, МВ210-212 и запись в модули МУ210-402 с помощью библиотеки OWENCommunication. В чем суть проблемы: при загрузке проекта в контроллер, модули опрашиваются только один раз. Нет циклического опроса. При этом опрос проходит без ошибок, данные получаю. Опрос организовал согласно "CoDeSys V3.5. Настройка обмена по протоколу Modbus. Раздел 5.9.3" при небольших изменениях. Возможно я что-то не учел. Прошу помочь, так как в моем понимании все должно работать. Опрос модулей и запись в модули разделены на 3 POU. Привожу код опроса модулей МВ210-101.
...


Посмотрите этот момент:
После опроса первого модуля вы переключаетесь на третий, но не дожидаетесь окончания его опроса, пишете
...
iAI_Number := 3; ЭТО

3:

fbTCPClient_AI3
...
и скачете дальше по всем модулям опять до первого. Но третий модуль так и остаётся в работе

Андрей_ТМЗ
06.06.2024, 13:12
76329

Ну как то так...
Или вы хотите все программно, чтоб потом из нее же менять настройки?

Я использовал сначала приведенный вами способ. Но при наличии большого количества модулей (в общей сложности 25 модулей ввода/вывода) время опроса пришлось значительно увеличивать. После того, как потребовалось опрашивать приборы по не стандартному протоколу, из-за большого времени опроса данные не поступали. По совету Евгения реализовал на библиотеке, но есть вариант перейти на стандартный компонент.

МихаилГл
06.06.2024, 13:20
Посмотрите этот момент:
После опроса первого модуля вы переключаетесь на третий, но не дожидаетесь окончания его опроса, пишете
...
iAI_Number := 3; ЭТО

3:

fbTCPClient_AI3
...
и скачете дальше по всем модулям опять до первого. Но третий модуль так и остаётся в работе

Так вроде не должно так быть, case отрабатывает свое равенство, и дальше выходит... Или я уже забыл как case работает...

PS Вы правы, только после того как модуль выдаст окончание опроса...

PS2 Только это похоже не ускорит время опроса модулей...

Емельянов Кирилл
07.06.2024, 02:02
Я использовал сначала приведенный вами способ. Но при наличии большого количества модулей (в общей сложности 25 модулей ввода/вывода) время опроса пришлось значительно увеличивать. После того, как потребовалось опрашивать приборы по не стандартному протоколу, из-за большого времени опроса данные не поступали. По совету Евгения реализовал на библиотеке, но есть вариант перейти на стандартный компонент.

Можно ещё использовать триггер "Приложение" в стандартном компоненте. Преимущества: 1 - простая конфигурация, 2 - сложно накосячить, т.к. основной функционал обмена по сети выполняет непосредственно стандартный компонент, от вас требуется только дать команду на чтение канала и обработать ответ, 3 - частота опроса полностью под вашим контролем. С недавних пор для модбаса пользуюсь исключительно этим способом, очень удобно.

Николай Суриков
07.06.2024, 08:20
CASE iAI_Number OF

1: //Опрос модуля AI1


fbTCPClient_AI1
(
xEnable := TRUE,
tTimeOut := tTimeout_TCPClient,
sIPAddr := '192.168.51.4',
uiPort := 502
);

IF fbTCPClient_AI1.xActive THEN
fbMV210_101_AI1
(
xExecute := TRUE,
tTimeOut := tTimeOut_TCPRequest,
usiRetry := 3,
hConnection := fbTCPClient_AI1.hConnection,
xIsRtuOverTcpMode := FALSE,
usiUnitId := 255,
eFuncCode := OCL.MB_FC.READ_HOLDING_REGISTERS,
uiDataAddr := 4000,
uiDataCount := 24,
pData := ADR(Read_AI1),
szSize := SIZEOF(Read_AI1)
);

IF fbMV210_101_AI1.xDone OR fbMV210_101_AI1.xError THEN

A1_AI1_LT1_1 := Read_AI1[1].rValue;
A1_AI1_TT1_1_01 := Read_AI1[2].rValue;
A1_AI1_TT1_1_02 := Read_AI1[3].rValue;
A1_AI1_TT1_1_03 := Read_AI1[4].rValue;
A1_AI1_LT1_2 := Read_AI1[5].rValue;
A1_AI1_TT1_2_01 := Read_AI1[6].rValue;
A1_AI1_TT1_2_02 := Read_AI1[7].rValue;
A1_AI1_TT1_2_03 := Read_AI1[8].rValue;

// Сброс блока после выполнения
fbMV210_101_AI1(xExecute := FALSE);
// Закрытие ТСР-соединения
//fbTCPClient_AI1(xEnable := FALSE);
iAI_Number := 2;
//iAI_Number := 3;
END_IF
// Сброс блока после выполнения или в случае ошибки
//IF fbMV210_101_AI1.xDone OR fbMV210_101_AI1.xError THEN
// fbMV210_101_AI1(xExecute := FALSE);
// iAI_Number := 2;
//iAI_Number := 3;
//END_IF
END_IF
IF fbTCPClient_AI1.xError THEN

fbTCPClient_AI1(xEnable := FALSE);

iAI_Number := 2;
//iAI_Number := 3;
END_IF

//iAI_Number := 2;
//iAI_Number := 3;

2: // Опрос Модуля AI2

1. У вас выход из кейса выполнен сразу, надо дождаться или успешного опроса или ошибки.
2. Два IF с одинаковым условием, и запись переменных и сброс блока. Зачем?
3. Сброс блока надо выполнять его повторным вызовом, а не присвоение FALSE.

fbMV210_101_AI1(xExecute := FALSE); //правильно
fbMV210_101_AI1.xExecute := FALSE; //не правильно
это разные вещи и во втором случае блок при повторном вызове работать не будет, что у вас и происходит.

https://ftp.owen.ru/CoDeSys3/11_Documentation/03_3.5.11.5/CDSv3.5_Modbus_v3.2.pdf
стр. 162

Андрей_ТМЗ
07.06.2024, 10:57
Николай, Вы правы по поводу п3. Я уже нашел что ошибся, когда просто присвоил FALSE. И присваивание следующего шага вынес в самый конец предыдущего. Все работает пока хорошо. Спасибо всем за помощь.