M340 ModbusRTU пример

Модератор: SaniOK

Re: M340 ModbusRTU пример

Сообщение M340 » 27 окт 2016, 08:04

Недавно столкнулся с таким нюансом. Если в проекте работа только с функцией 3 ModbusRTU, то все нормально. Аналогично с функцией 4. Но если пытаюсь в одном проекте работать и с 4, и с 3 функциями, то через время контроллер перестает работать по Модбасу вообще, при этом остальное (Эзернет, входы/выходы) работает нормально. И не помогает ничего, даже холодный рестарт и перезаливка программы. Только перезаливка абсолютно другой прошивкой, с неподходящей конфигурацией модулей, реанимирует. В настройках ничего не нашел, то ли искал плохо, то ли баг Шнайдера.
M340
 
Сообщений: 23
Зарегистрирован: 29 янв 2015, 11:11
Откуда: Кировоград
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0

Re: M340 ModbusRTU пример

Сообщение san » 27 окт 2016, 08:22

Может не дожидались ответа? Бит активности использовали?
Для реанимации можно было попробовать использовать функцию CANCEL
Аватар пользователя
san
 
Сообщений: 883
Зарегистрирован: 05 мар 2012, 11:59
Откуда: Киев, Национальный университет пищевых технологий, каф.ИАСУ
Благодарил (а): 0 раз.
Поблагодарили: 2 раз.
Пункты репутации: 21

Re: M340 ModbusRTU пример

Сообщение M340 » 27 окт 2016, 08:39

san писал(а):Может не дожидались ответа? Бит активности использовали?
Для реанимации можно было попробовать использовать функцию CANCEL

Все вроде по "классике" от san:

(* инициализация при холодном и горячем рестартах *)
if %s0 or %s1 then
i_obmena:=0;
modbus_svoboden:=true;
i_buf:=0;
end_if;

if modbus_svoboden then

if i_obmena>18 or i_obmena<0 then i_obmena:=0; end_if;
modbus_svoboden:=false;
inc(i_obmena);

(* чтение из *)
if i_obmena=1 then
READ_VAR (ADR := ADDM('0.0.1.2'), OBJ := '%MW', NUM:=1500, NB:=32, GEST:=para, RECP => bufer_obmena_modbus);
END_IF;

.....


(* чтение из *)
if i_obmena=18 then
READ_VAR (ADR := ADDM('0.0.1.15'), OBJ := '%MW', NUM:=3760, NB:=20, GEST:=para, RECP => bufer_obmena_modbus);
END_IF;



start_transaction:=true;
end_if;

if not(para[0].0) and not(modbus_svoboden) then modbus_svoboden:=true; end_if;

if start_transaction and not para[0].0 then
if para[1]<>0 then bed_obmen_modbus();
else poterja_svjazi:=false; good_obmen_modbus();
end_if;
start_transaction:=false;
end_if;
M340
 
Сообщений: 23
Зарегистрирован: 29 янв 2015, 11:11
Откуда: Кировоград
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0

Re: M340 ModbusRTU пример

Сообщение Огородников Сергей » 28 окт 2016, 00:41

1.Для всех функций используются одинаковые массивы GEST и RECP. В приведённом примере PARA везде одинаковы.
Пробовали для каждой функции свои?
Размеры буфера для первого и второго вызова отличаются, например, и т.д.

2. А успевает ли сработать условие:

if not(para[0].0) and not(modbus_svoboden) then
modbus_svoboden:=true;
end_if; ?

Или каждый цикл начинает вызываться очередной вызов READ_VAR, что и приводит к проблеме?
Огородников Сергей
 
Сообщений: 134
Зарегистрирован: 29 июн 2013, 02:25
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 4

Re: M340 ModbusRTU пример

Сообщение M340 » 28 окт 2016, 08:32

Огородников Сергей писал(а):1.Для всех функций используются одинаковые массивы GEST и RECP. В приведённом примере PARA везде одинаковы.
Пробовали для каждой функции свои?
Размеры буфера для первого и второго вызова отличаются, например, и т.д.

2. А успевает ли сработать условие:

if not(para[0].0) and not(modbus_svoboden) then
modbus_svoboden:=true;
end_if; ?

Или каждый цикл начинает вызываться очередной вызов READ_VAR, что и приводит к проблеме?

Буферы GEST и RECP не могут быть другими, их даже определять не надо. Соответственно PARA это ARRAY[0..3] OF INT, т.к. GEST имеет такой тип.
Очередное чтение или запись инициируется только когда modbus_svoboden=true, т.е. это копия Activity Bit (0-й бит 0-го слова GEST). Он выставляется самим контроллером (микроперационкой) в 1 при старте функции, и возвращается в 0 при окончании обработки. т.е. после окончания предыдущего обмена. Таким образом коммуникационные функции вызываются не одновременно.
P.S. У меня есть проекты, где по 80-100 обменов, проблем (тьфу-тьфу-тьфу) нет, годами работает в непрерывном производстве. И количество слов в обмене варьируется от единиц до тридцати двух.
Проблема явно в сочетании 3 и 4 функций Модбаса в одном проекте. Если только 3 функция, или только 4-я, то работает без проблем. Работает ли у кого-нибудь это вместе? Можно увидеть пример?
M340
 
Сообщений: 23
Зарегистрирован: 29 янв 2015, 11:11
Откуда: Кировоград
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0

Re: M340 ModbusRTU пример

Сообщение ves » 29 окт 2017, 16:23

Пытаюсь освоить Modbus но при компиляции выдает ошибку - [MUST]} : Object analyze failure. Все сделал как в примере. Ссылается на блок Read var и Write var. Подскажите куда смотреть? На сайте шнайдера ответа не нашлось.
ves
 
Сообщений: 1
Зарегистрирован: 29 окт 2017, 16:21
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0

Re: M340 ModbusRTU пример

Сообщение san » 29 окт 2017, 16:40

Приложите скриншоты конфигурации и программы.
Аватар пользователя
san
 
Сообщений: 883
Зарегистрирован: 05 мар 2012, 11:59
Откуда: Киев, Национальный университет пищевых технологий, каф.ИАСУ
Благодарил (а): 0 раз.
Поблагодарили: 2 раз.
Пункты репутации: 21

Пред.

Вернуться в Высокоуровневые системы автоматизации - M340, M580, Premium, Quantum и Unity

Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1

cron