Есть СПК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 и всё!


Ответить с цитированием
