Если вам попал в руки контроллер ПР205, то вам не помешает предварительно прочитать этот пост и посмотреть это видео.
Мне предстоит для этого контроллера сделать программу управления приточной вентиляцией с управлением со скады по modbus TCP IP.
Надеялся воткнуть в него свой старый проект под ПР200, подредактировать, но простая смена целевой платформы не прошла (в сегнетике как правило проходит). ПИД регулятор старый (с автонастройкой) не подходит, свои особенности работы с экраном, давно не программировал - хотелось потренироваться. В итоге решил делать с нуля - все.
Кто смотрел видео, уже знает, что если редактирование переменной разрешено, то она энергонезависимая. Но если он не читал этот пост, то он не знает, что
- у этой переменной не вывешивается флаг - энергонезависимая
- эту переменную нельзя проинициализировать
- если в проекте есть энергонезависимые переменные с флагом, то даже просто их вывести на экран owenlogic не позволит.
То есть мне предстоит делать костыли (скажу по секрету - когда я делал костыли, чтобы обойти эти баги, в костылях я делал свои баги :))) )
Итак начнем.
У нас есть уставка - которая должна хранится в памяти контроллера, и эту уставку мы должны менять удаленно.
Вроде все просто, но нужно учесть, что для записи во флэш нужно время, и еще один момент, чтобы при включении контроллера не записались нулевые значения (типа со СКАДЫ). Внизу представлен макросик.
Рассмотрим как он работает.
Сначала кратко. Если со скады не пришло новое значение (отличное от нуля), то оставляем все как есть, если пришло, то удероживаем новое значение на выходе макроса какое-то время.
Теперь подробно.
При включении контроллера - в переменных from_scada и mem_scada сидят нули - на выход for_save посылается значение screen_sp_speed (сидит на входе in_PLC), далее с выхода for_save поступает на limiter6(обрезка, если вышли за пределы, смотрим рисунок "внешняя обвязка"), потом на запись в сетевую переменную show_sp_speed (отображение текущей уставки в скаде) и на screen_sp_speed (хранящаяся в контроллере).
Пришло новое значение scada_sp_speed отличное от нуля, оно сравнивается с предыдущим значением (mem_sp_speed), выход блока EQ(равно) падает в ноль, далее этот ноль через отрицание запускает TP (делает импульс), это импульс переключает блоки SEL, они они в свою очередь держат на выходах макроса , новые значения в течении этого импульса флэш перезаписывается, mem_sp_speed тоже перезаписывается, после окончания импульса, у нас записаны новые значения, макрос ожидает очередного изменения.
Вроде все работает, но у нас по прежнему нет инициализации после первой прошивки. И вот тут мы подошли к моему маленькому багу.
Сетевые переменные можно инициализировать новым значением. Я обрадовался, поставил в scada_sp_speed инициализацию. Вроде все работает, но при выключении, и новом включении - она опять записывает инициализацию :))). Так что сбросил инициализацию в ноль, пока приходится после прошивки ручками пробегаться по уставкам в контроллере. и выставлять. Благо их немного. Выкрутится, используя этот макрос, можно. (прямо сейчас пришла эта мысль) Нужно mem_sp_speed тоже сделать сетевой переменной, и инициализировать обе (screen_sp_speed, mem_sp_speed) одним значением. Тогда при включении они не будут затирать значение в ПЛК.