Солнечный заяц
25.02.2021, 13:44
Имеем:
Электрический котел с управлением на ПЛК73
+ Модуль измерения параметров электрической сети МЭ110 на RS-1
+ GSM-Модем ПМ01 на RS-2
все рядом, в одном щите.
Проблема:
Примерно через год эксплуатации потерялась связь с МЭ110. Обмен с модемом сохранился. Больше ничего о проблеме неизвестно. По данным пользователя, проблему удалось вылечить перезагрузкой контроллера с модулем МЭ110 (висят на одном автомате). Предположительно, завис интерфейс RS-1 на ПЛК. Усиливать помехозащищенность линии заказчик пока не хочет.
Предполагаемое решение:
Перезагрузка ПЛК73 по СМС-команде с модема.
Вопрос:
Как лучше реализовать перезагрузку? В библиотеках ничего похожего не нашел. При перезагрузке сторожевым таймером, не сохраняются измененные переменные в энергонезависимой памяти. Может быть есть возможность сохранить энергонезависимые переменные принудительно?
Всем добра:rolleyes:
Имеем:
Электрический котел с управлением на ПЛК73
+ Модуль измерения параметров электрической сети МЭ110 на RS-1
+ GSM-Модем ПМ01 на RS-2
все рядом, в одном щите.
Проблема:
Примерно через год эксплуатации потерялась связь с МЭ110. Обмен с модемом сохранился. Больше ничего о проблеме неизвестно. По данным пользователя, проблему удалось вылечить перезагрузкой контроллера с модулем МЭ110 (висят на одном автомате). Предположительно, завис интерфейс RS-1 на ПЛК. Усиливать помехозащищенность линии заказчик пока не хочет.
Предполагаемое решение:
Перезагрузка ПЛК73 по СМС-команде с модема.
Вопрос:
Как лучше реализовать перезагрузку? В библиотеках ничего похожего не нашел. При перезагрузке сторожевым таймером, не сохраняются измененные переменные в энергонезависимой памяти. Может быть есть возможность сохранить энергонезависимые переменные принудительно?
Всем добра:rolleyes:
А батарейка в ПЛК73 живая ?
Солнечный заяц
01.03.2021, 09:52
А батарейка в ПЛК73 живая ?
Да, батарейка живая. При отключении питания переменные сохраняются нормально.
Солнечный заяц
01.03.2021, 10:03
Хрень все это с перезагрузками. Т.к. обмен все одно через либы - копайте код, там косяк.
Или с МЭ проблемы - его и перезагружайте.
Да вроде в коде ломаться нечему. Может быть вы увидите слабые моменты.
VAR
phase_rs1: BYTE; (*фаза обмена по rs-485-1*)
OWEN_GET_REAL_1: OWEN_GET_REAL; (*блок чтения переменной типа REAL*)
Com_settings_1: comsettings := (Port:=0,dwBaudRate:=9600,byStopBits:=0,byParity:= 0,dwTimeout:=0,dwBufferSize:=0); (*настройки порта 2*)
COM_SERVICE_1: COM_SERVICE; (*Блок операций с портом*)
OWEN_SET_REAL_1: OWEN_SET_REAL; (*Блок записи переменной Real*)
Connection_Error_TON: TON; (*Таймер индикации обрыва связи*)
Connection_Error_TON_2: TON; (*Таймер индикации обрыва связи*)
OWEN_GET_DINT_1: OWEN_GET_DINT; (*блок чтения переменной типа DINT*)
OWEN_GET_DINT_2: OWEN_GET_DINT; (*блок чтения переменной типа DINT*)
END_VAR
CASE phase_rs1 OF
0:(*открываем порт*)
COM_SERVICE_1(Enable:=TRUE , Settings:=Com_settings_1 , Task:=OPEN_TSK );
IF COM_SERVICE_1.Ready THEN
phase_rs1:=phase_rs1+1;
END_IF
1: (*записываем коэффициент трансформации тока*)
OWEN_SET_REAL_1(
Enable:=TRUE ,
Addr:=16 ,
AddrLen:=8 ,
Name:='n.i' ,
Index:=16#FFFF ,
RealType:=float32 ,
Value:=Ktri ,
ComHandle:=Com_settings_1.Port ,
TimeOut:=T#100ms);
IF OWEN_SET_REAL_1.Complete THEN (*ответ пришел?*)
phase_rs1:=phase_rs1+1;
END_IF
2: (*читаем ток по фазе А*)
OWEN_GET_REAL_1(
Enable:=TRUE ,
Addr:=16 ,
AddrLen:=8 ,
Name:='in.i1' ,
Index:=16#FFFF ,
RealType:=float32 ,
ComHandle:=Com_settings_1.Port ,
TimeOut:=T#100ms );
IF OWEN_GET_REAL_1.Complete THEN (*ответ пришел?*)
IF OWEN_GET_REAL_1.Error=0 THEN (*нет ошибок?*)
Ia:=OWEN_GET_REAL_1.Value;
END_IF
phase_rs1:=phase_rs1+1;
END_IF
3: (*читаем ток по фазе В*)
OWEN_GET_REAL_1(
Enable:=TRUE ,
Addr:=16 ,
AddrLen:=8 ,
Name:='in.i2' ,
Index:=16#FFFF ,
RealType:=float32 ,
ComHandle:=Com_settings_1.Port ,
TimeOut:=T#100ms );
IF OWEN_GET_REAL_1.Complete THEN (*ответ пришел?*)
IF OWEN_GET_REAL_1.Error=0 THEN (*нет ошибок?*)
Ib:=OWEN_GET_REAL_1.Value;
END_IF
phase_rs1:=phase_rs1+1;
END_IF
4: (*читаем ток по фазе С*)
OWEN_GET_REAL_1(
Enable:=TRUE ,
Addr:=16 ,
AddrLen:=8 ,
Name:='in.i3' ,
Index:=16#FFFF ,
RealType:=float32 ,
ComHandle:=Com_settings_1.Port ,
TimeOut:=T#100ms );
IF OWEN_GET_REAL_1.Complete THEN (*ответ пришел?*)
IF OWEN_GET_REAL_1.Error=0 THEN (*нет ошибок?*)
Ic:=OWEN_GET_REAL_1.Value;
END_IF
phase_rs1:=phase_rs1+1;
END_IF
5: (*читаем режим работы*)
OWEN_GET_DINT_1(
Enable:=TRUE ,
Addr:=16 ,
AddrLen:=8 ,
Name:='Mode' ,
Index:=16#FFFF ,
IntType:=UINT_FRM ,
ComHandle:=Com_settings_1.Port ,
TimeOut:=T#100ms ,
Complete=> ,
Value=> ,
Error=> );
IF OWEN_GET_DINT_1.Complete THEN (*ответ пришел?*)
IF OWEN_GET_DINT_1.Error=0 THEN (*нет ошибок?*)
Phase_Rotation_Error := OWEN_GET_DINT_1.Value.14; (*читаем бит ошибки чередования фаз*)
END_IF
phase_rs1:=phase_rs1+1;
END_IF
6: (*записываем коэффициент трансформации напряжения*)
OWEN_SET_REAL_1(
Enable:=TRUE ,
Addr:=16 ,
AddrLen:=8 ,
Name:='n.u' ,
Index:=16#FFFF ,
RealType:=float32 ,
Value:=Ktru ,
ComHandle:=Com_settings_1.Port ,
TimeOut:=T#100ms);
IF OWEN_SET_REAL_1.Complete THEN (*ответ пришел?*)
phase_rs1:=phase_rs1+1;
END_IF
7: (*читаем напряжение по фазе А*)
OWEN_GET_REAL_1(
Enable:=TRUE ,
Addr:=16 ,
AddrLen:=8 ,
Name:='in.u1' ,
Index:=16#FFFF ,
RealType:=float32 ,
ComHandle:=Com_settings_1.Port ,
TimeOut:=T#100ms );
IF OWEN_GET_REAL_1.Complete THEN (*ответ пришел?*)
IF OWEN_GET_REAL_1.Error=0 THEN (*нет ошибок?*)
Ua:=OWEN_GET_REAL_1.Value;
END_IF
phase_rs1:=phase_rs1+1;
END_IF
8: (*читаем напряжение по фазе В*)
OWEN_GET_REAL_1(
Enable:=TRUE ,
Addr:=16 ,
AddrLen:=8 ,
Name:='in.u2' ,
Index:=16#FFFF ,
RealType:=float32 ,
ComHandle:=Com_settings_1.Port ,
TimeOut:=T#100ms );
IF OWEN_GET_REAL_1.Complete THEN (*ответ пришел?*)
IF OWEN_GET_REAL_1.Error=0 THEN (*нет ошибок?*)
Ub:=OWEN_GET_REAL_1.Value;
END_IF
phase_rs1:=phase_rs1+1;
END_IF
9: (*читаем напряжение по фазе С*)
OWEN_GET_REAL_1(
Enable:=TRUE ,
Addr:=16 ,
AddrLen:=8 ,
Name:='in.u3' ,
Index:=16#FFFF ,
RealType:=float32 ,
ComHandle:=Com_settings_1.Port ,
TimeOut:=T#100ms );
IF OWEN_GET_REAL_1.Complete THEN (*ответ пришел?*)
IF OWEN_GET_REAL_1.Error=0 THEN (*нет ошибок?*)
Uc:=OWEN_GET_REAL_1.Value;
END_IF
phase_rs1:=phase_rs1+1;
END_IF
10: (*читаем состояние дискретных входов модуля МК110-8Д.4Р*)
IF Configuration<>3 THEN (*если это не конфигурация 3, пропускаем этот опрос*)
phase_rs1:=phase_rs1+1; (*переходим к следующему опросу*)
RETURN; (*выходим из подпрограммы*)
END_IF
OWEN_GET_DINT_2(
Enable:=TRUE ,
Addr:=1 ,
AddrLen:=8 ,
Name:='r.Cn' ,
Index:=16#FFFF ,
IntType:=UINT_FRM ,
ComHandle:=Com_settings_1.Port ,
TimeOut:=T#100ms);
IF OWEN_GET_DINT_2.Complete THEN (*ответ пришел?*)
IF OWEN_GET_DINT_2.Error=0 THEN (*нет ошибок?*)
MK110_8D_4R_1_Inputs := OWEN_GET_DINT_2.Value; (*читаем бит ошибки чередования фаз*)
END_IF
phase_rs1:=phase_rs1+1;
END_IF
11:(*пишем дискретный выход в модуль МК110-8Д.4Р*)
IF Configuration<>3 THEN (*если это не конфигурация 3, пропускаем этот опрос*)
phase_rs1:=phase_rs1+1; (*переходим к следующему опросу*)
RETURN; (*выходим из подпрограммы*)
END_IF
OWEN_SET_REAL_1(
Enable:=TRUE ,
Addr:=1 ,
AddrLen:=8 ,
Name:='r.OE' ,
Index:=16#FFFF ,
RealType:=FLOAT24 ,
Value:=MK110_8D_4R_1_Output[1] ,
ComHandle:=Com_settings_1.Port ,
TimeOut:=T#100ms);
IF OWEN_SET_REAL_1.Complete THEN (*ответ пришел?*)
phase_rs1:=phase_rs1+1;
END_IF
12: (*пишем дискретный выход в модуль МК110-8Д.4Р*)
IF Configuration<>3 THEN (*если это не конфигурация 3, пропускаем этот опрос*)
phase_rs1:=phase_rs1+1; (*переходим к следующему опросу*)
RETURN; (*выходим из подпрограммы*)
END_IF
OWEN_SET_REAL_1(
Enable:=TRUE ,
Addr:=2 ,
AddrLen:=8 ,
Name:='r.OE' ,
Index:=16#FFFF ,
RealType:=FLOAT24 ,
Value:=MK110_8D_4R_1_Output[2] ,
ComHandle:=Com_settings_1.Port ,
TimeOut:=T#100ms);
IF OWEN_SET_REAL_1.Complete THEN (*ответ пришел?*)
phase_rs1:=phase_rs1+1;
END_IF
13:(*пишем дискретный выход в модуль МК110-8Д.4Р*)
IF Configuration<>3 THEN (*если это не конфигурация 3, пропускаем этот опрос*)
phase_rs1:=phase_rs1+1; (*переходим к следующему опросу*)
RETURN; (*выходим из подпрограммы*)
END_IF
OWEN_SET_REAL_1(
Enable:=TRUE ,
Addr:=3 ,
AddrLen:=8 ,
Name:='r.OE' ,
Index:=16#FFFF ,
RealType:=FLOAT24 ,
Value:=MK110_8D_4R_1_Output[3] ,
ComHandle:=Com_settings_1.Port ,
TimeOut:=T#100ms);
IF OWEN_SET_REAL_1.Complete THEN (*ответ пришел?*)
phase_rs1:=phase_rs1+1;
END_IF
14: (*пишем дискретный выход в модуль МК110-8Д.4Р*)
IF Configuration<>3 THEN (*если это не конфигурация 3, пропускаем этот опрос*)
phase_rs1:=phase_rs1+1; (*переходим к следующему опросу*)
RETURN; (*выходим из подпрограммы*)
END_IF
OWEN_SET_REAL_1(
Enable:=TRUE ,
Addr:=4 ,
AddrLen:=8 ,
Name:='r.OE' ,
Index:=16#FFFF ,
RealType:=FLOAT24 ,
Value:=MK110_8D_4R_1_Output[4] ,
ComHandle:=Com_settings_1.Port ,
TimeOut:=T#100ms);
IF OWEN_SET_REAL_1.Complete THEN (*ответ пришел?*)
phase_rs1:=phase_rs1+1;
END_IF
ELSE
phase_rs1:=1;
END_CASE
(*контроль связи*)
IF OWEN_GET_REAL_1.Complete THEN
Connection_Error_TON(IN:=OWEN_GET_REAL_1.Error<>0 , PT:=Modul_Timeout , Q=>Modul_Connection_Error );
END_IF
IF OWEN_GET_DINT_2.Complete THEN
Connection_Error_TON_2(IN:=OWEN_GET_DINT_2.Error<>0 , PT:=Modul_Timeout , Q=>MK110_8D_4R_1_Connection_Error );
END_IF
Солнечный заяц
01.03.2021, 17:09
Регулярный 1 и 6 всё время - норм ? они конфигурационные
Как говорится, "Практичность, важнее безупречности" )
Configuration <> 3 wtf ? полный код с окружением ?
Configuration устанавливается один раз при сборке щита, в зависимости от модификации. В нашем случае всегда Configuration<>3.
И рекомендую на старте закрывать порт (фича для 63/73) и переоткрывать при полном цикле таймаутов.
Полный цикл таймаутов, это сколько?
Powered by vBulletin® Version 4.2.3 Copyright © 2025 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot