PDA

Просмотр полной версии : Перестали опрашиваться модули ввода (СПК, Modbus_slave_COM_port). Прошу помощи!



westwind
10.08.2016, 20:00
Есть СПК207. CODESYS v3.5 SP5 Patch 5. На одном из портов висят модули: мв110-8а (2 шт) + мв110-8ас (1 шт) + 16ДН + 8ДФ + МУ110-8Р + МУ110-8И. Модули подключены как Modbus_slave_COM_port. (отказался от драйверов ОВЕН) и все каналы настроены руками:
25765

Мапятся каналы на экземпляр getATemp функционального блока :

FUNCTION_BLOCK getAnalogTemp_t
VAR_OUTPUT
BK5_int : INT;
BK6_int : INT;
BK7_int : INT;
BK8_int : INT;
BK9_int : INT;
BK31_int: INT;
BK24_int : INT;
OC_valve_boiler1_int : INT; //положение клапана рециркуляции котла
OC_valve_boiler2_int : INT;
OC_valve_boiler3_int : INT;
OC_valve_boiler4_int : INT;
OC_valve_dilute_int : INT;

A8_1_BP2 : convertion_t;
A8_2_BP3 : convertion_t;
A8_3_BP4 : convertion_t;
A8_4_BP9 : convertion_t;
A6_1_BP1 : convertion_t;
A6_2_BP8 : convertion_t;
A6_3_BK3 : convertion_t;
A6_4_BK4 : convertion_t;
A6_6_BK29 : convertion_t;
A6_7_BK25 : convertion_t;
A6_8_BK26 : convertion_t;

A9_1_BK1 : convertion_t;
A9_2_BK2 : convertion_t;
A9_3_BK12 : convertion_t;
A9_4_BK15 : convertion_t;
A9_5_BK18 : convertion_t;
A9_6_BK21 : convertion_t;
A9_7_BK23 : convertion_t;
A9_8_BK22 : convertion_t;

END_VAR

TYPE convertion_t :
UNION
wModbus : ARRAY [0..1] OF WORD;
rReal : REAL;
END_UNION
END_TYPE
----------------
ВСЁ РАБОТАЕТ - я вижу данные в отладке, я виду данные на визуализации.
Теперь я вношу изменения в экземпляр setATemp функционального блока:

FUNCTION_BLOCK setAnalogTemp_t
VAR_INPUT
chan5 : w2_t; //это пользовательский тип array [0..1] of WORD
chan6 : w2_t;
chan7 : w2_t;
chan8 : WORD;

END_VAR

Экземпляру этого блока присваивается значение и более он нигде не используется
setA(setAnalogTemp => setATemp);
Ни setA, ни setATemp никак не связаны ни с сетевым обменом, ни с блоком getATemp на который мапятся каналы модулей.

Проблема в том, что при изменении типа переменных в блоке setAnalogTemp_t с array [0..1] of WORD на WORD у меня фантастическим образом прекращается обмен с модулями ввода. Выглядит это так: в окне I/O Mapping в online в колонке Current values замирают последние значения и отображаются серым цветом.( это если вносить изменения через Online mode, если через Download all - то серые нули (говорим про аналоговые модули ввода)). Статус Modbus_slave_COM_port - работает, ошибок ни на уровне модбас, ни на уровне порта нет, модули моргают светодиодами связи.

Если только что поломаный код изменить как было - обмен с модулями восстанавливается. Но, если после поломки просто закоментировать весь код в PLC_PRG, поудалять половину глобальных объявлений - данных с модулей нет.
-----
Возможно (ну это единственное что приходит на ум), при изменении типа переменных в экземпляре setAnalogTemp_t изменяется объём ОЗУ под него выделяемый, смещаются в ОЗУ и остальные функциональные блоки в том числе и те, на который мапятся каналы модулей. Но Modbus_slave_COM_port почему-то продолжает писать в ОЗУ по старым адресам! (???). Звучит как бред, но другого объяснения я не придумал. Clean All + Rebuild не помогают!!! Тоесть, я после "поломки" комментирую весь исполняемый код, оставляю только конфигурацию. Делаю Clean All + Rebuild, перегружаю модули на всякий случай - ничего! Данные с каналов Modbus_slave_COM_port не пишутся в переменные. После этого, я оставляю один модуль ввода, разрываю связи (Reset mapping), создаю новые связи каналов с новыми переменными (устанавливаю колонку Mapping в Create new variable) - ничего!!! Загружаю сохранённый проект до внесения изменений - всё работает.

Что это за хрень?
Господа, прошу помочь, потому как проект не тестовый. В codesys я не большой специалист (есть опыт работы с AVR, ARM (C++) + прикладное ПО на С#)

Во вложении проект в состоянии "одна строчка до краха"... стоит изменить тип всех переменных в setATemp на WORD и всё!

Спорягин Кирилл
11.08.2016, 12:13
Скорее всего дело в выравнивании памяти.

westwind
11.08.2016, 14:24
Попутный вопрос к знатокам: как заставить codesys перекомпилировать и пересобрать всё заново? Есть ощущение, что Clean All + Rebuild не приводит к желаемому эффекту. (после "поломки", удаление кода и пересборка не помогает! А если взять "рабочую прошивку и удалить тот же код - работает)

Евгений Кислов
11.08.2016, 14:50
У меня на выложенном проекте в слейвах в принципе отображаются только нули серым цветом, индикаторы связи при этом зеленые.

Но причина этого мне понятна - на вкладке Соотнесение входов/выходов у параметра Всегда обновлять переменные стоит значение Установка родительского устройства. Как только я ставлю значение Включено 2 (всегда в задаче цикла шины), в слэйвах начинают отображаться корректные значения.

25776

Изменение типа переменных ФБ setAnalogTemp_t никак на это не влияет.

westwind
12.08.2016, 12:47
Евгений, я абсолютно упустил этот параметр из виду. Потому как обмен и так шёл, даже не обратил внимание. Чёрт...
Спасибо, сегодня на объекте протестирую. Скорее всего - вы нашли корень моих бед :)