И еще впрос коллеги: есть ли возможность базу данных SQLite перенести на SD-карту?
Вид для печати
И еще впрос коллеги: есть ли возможность базу данных SQLite перенести на SD-карту?
Добрый день. Прошу помощи в реализации алгоритма.
При появлении положительного сигнала, нужно выдать один положительный импульс.
А, при исчезновении положительного сигнала, нужно тоже выдать один положительный импульс
Ставил я их ) видимо импульс проходит настолько быстро, что не заметно. Поставлю tof и посмотрю. Спасибо
Доброе утро.
Прошу помощи по организации структур и правильному расположению.
есть набор данных:
---- Эти по идее должны быть persistent
rTempSetPoint
rTempHysteresis
rTempAlarmLimitHi
rTempAlarmLimitLo
----- А вот эти меняются
xAlarmOutOfRange
----- причём вот эту структуру очень удобно привязывать к физическому сходу, сразу объявляя 3 поля
ANALOG_SENSOR_VALUE
rValue REAL Измеренное значение
uiCycleTime UINT Циклическое время
eStatus ANALOG_SENSOR_ERRORS Код статуса входа
Сначала демал сделать:
TYPE TEMP_POINT EXTENDS ANALOG_SENSOR_VALUE :
STRUCT
rTempSetPoint
rTempHysteresis
rTempAlarmLimitHi
rTempAlarmLimitLo
xAlarmOutOfRange
END_STRUCT
END_TYPE
1) Но потом не понял можно ли как то из получившейся расширенной структуры вытащить структуру ANALOG_SENSOR_VALUE для привязки к физическим аналоговым входам. Чтобы не каждому каналу прописывать отдельную переменную, а сразу к 3, как это можно сделать если объявлять ANALOG_SENSOR_VALUE
2) Как лучше поступать с уставкой, гистерезисом и верхним/нижним пределом для каждого датчика?
Разделить на 2 отдельные структуры и запихать одну в персист? или объявлять в коде один раз?
Можно ли в персист сразу выдавать элементам структуры изначальные значения?
Откуда вы берёте вообще входы? С какого модуля ? Сколько модулей?
Чтобы потом поместить их в структуру
ANALOG_SENSOR_VALUE
rValue REAL Измеренное значение
uiCycleTime UINT Циклическое время
eStatus ANALOG_SENSOR_ERRORS Код статуса входа
Здравствуйте коллеги, вопрос такой: на ПЛК210 на дискретных входах висят сигналы(у меня аварийные), мне их нужно протестировать, как они в программе работают. Сигналы на TRUE, если я их фиксирую на FALSE, то через случайное время от 2 до 20 секунд они переходят на TRUE и потом опять на FALSE. Подскажите это нормально? Наверное через какое то количество циклов происходит самопроизвольный переход?Вложение 72141
1) Нет, так не получится. В состав TEMP_POINT входят только поля ANALOG_SENSOR_VALUE, а не ее экземпляр.
2) Как вам удобнее. Вы лучше знаете особенности своей задачи - если в целом проект не особо большой, то можно оставить одну структуру и объявлять ее экземпляры как PERSISTENT. Задать начальные значения полям структуры в этом случае можно.
Входы с AI модулей MB210-101. Их в сети этого плк 5 штук. то есть до 40 сигналов. по факту скорее всего 27. Просто вентмашины на разных этажах поэтому отдельные модули.
Евгений, благодарю.
То есть при наличии всего 40 сигналов структуры можно целиком можно объявлять в Persistent, включая оперативные сигналы - заначения датчиков и ошибок?
но объявлять их можно только так
stPoolWaterTempSp: TEMP_POINT_SETTINGS; (*Уставка температуры воды в бассейне*)
stPoolWaterTempSp.rSetPoint: REAL :=28;
stPoolWaterTempSp.rHysteresys: REAL :=0.5;
stPoolWaterTempSp.rAlarmLimitHi: REAL :=30;
stPoolWaterTempSp.rAlarmLimitLo: REAL :=26;
"короткое" объявление работать не будет?
В PERSISTANT можно объявлять всё, что угодно, пока там хватает места (всего под RETAIN и PERSISTANT суммарно выделено чуть меньше 64 Кб).Цитата:
То есть при наличии всего 40 сигналов структуры можно целиком можно объявлять в Persistent, включая оперативные сигналы - заначения датчиков и ошибок?
Что вы называете "коротким" объявлением?Цитата:
"короткое" объявление работать не будет?
Может.
Пошагово добавлять в "пустой проект без сбоев" фрагменты вашего исходного проекта. После добавления каждого фрагмента - запускать проект и проверять, не проявится ли проблема. После проявления проблемы - проанализировать последний из добавленных фрагментов на наличие ошибок.
Спасибо.
Видимо перепутал с объявлениями массивов, когда поэлементно можно передавать начальные значения в строку, без необходимости писать каждый раз полное название структуры и элемента в ней.
Но не смог разобраться как передавать начальные значения
Сделал так:
Создал структуру:
Объявил её в PersistentVars и передал ей начальные значения:Код:TYPE CYCLE_TIMER :
STRUCT
xEnable: BOOL; (*Разрешение на работу*)
todStartTime: TOD; (*Время начала цикла*)
usiDuration: USINT; (*Длительность цикла*)
byDaysEnabled: BYTE; (*Дни включения цикла*)
usiDurationMin: USINT; (*Минимальная длительность цикла*)
usiDurationMax: USINT; (*Максимальная длительность цикла*)
tStopTime: TIME; (*Время окончания работы блока*)
END_STRUCT
END_TYPE
В итоге кодсис ругается:Код:stWaterSypplyTimer: CYCLE_TIMER; (**)
stWaterSypplyTimer.todStartTime: TOD :=TOD#1:00:00; (*Время начала цикла водоподготовки*)
stWaterSypplyTimer.usiDuration: USINT :=10; (*Длительность цикла водоподготовки в часах*)
stWaterSypplyTimer.xEnable: BOOL :=TRUE; (*Разрешение на работу цикла водоподготовки*)
stWaterSypplyTimer.byDaysEnabled: BYTE :=2#0111_1111; (*Дни включения цикла водоподготовки младший бит понедельник старший воскресенье*)
stWaterSypplyTimer.usiDurationMin: USINT :=1;
stWaterSypplyTimer.usiDurationMax: USINT :=22;
Не понимаю, как тогда правильно передавать начальные значения для элементов структуры?Код:------ Компиляция : Приложение: Device.Application -------
типизировать код...
[WARNING] PLC200: Менеджер библиотек [Device: Plc Logic: Application]: C0100: Библиотека CmpTargetVisu не добавлена в Менеджер библиотек, либо не найдено корректной лицензии
[WARNING] PLC200: PersistentVars [Device: Plc Logic: Application](Строка 34): C0373: Неиспользуемый путь экземпляра stPoolWaterTempSp.rSetPoint: переменная используется как плейсхолдер
[WARNING] PLC200: PersistentVars [Device: Plc Logic: Application](Строка 35): C0373: Неиспользуемый путь экземпляра stPoolWaterTempSp.rHysteresys: переменная используется как плейсхолдер
[WARNING] PLC200: PersistentVars [Device: Plc Logic: Application](Строка 36): C0373: Неиспользуемый путь экземпляра stPoolWaterTempSp.rAlarmLimitHi: переменная используется как плейсхолдер
[WARNING] PLC200: PersistentVars [Device: Plc Logic: Application](Строка 37): C0373: Неиспользуемый путь экземпляра stPoolWaterTempSp.rAlarmLimitLo: переменная используется как плейсхолдер
[WARNING] PLC200: PersistentVars [Device: Plc Logic: Application](Строка 6): C0373: Неиспользуемый путь экземпляра stWaterSypplyTimer.todStartTime: переменная используется как плейсхолдер
[WARNING] PLC200: PersistentVars [Device: Plc Logic: Application](Строка 7): C0373: Неиспользуемый путь экземпляра stWaterSypplyTimer.usiDuration: переменная используется как плейсхолдер
[WARNING] PLC200: PersistentVars [Device: Plc Logic: Application](Строка 8): C0373: Неиспользуемый путь экземпляра stWaterSypplyTimer.xEnable: переменная используется как плейсхолдер
[WARNING] PLC200: PersistentVars [Device: Plc Logic: Application](Строка 9): C0373: Неиспользуемый путь экземпляра stWaterSypplyTimer.byDaysEnabled: переменная используется как плейсхолдер
[WARNING] PLC200: PersistentVars [Device: Plc Logic: Application](Строка 10): C0373: Неиспользуемый путь экземпляра stWaterSypplyTimer.usiDurationMin: переменная используется как плейсхолдер
[WARNING] PLC200: PersistentVars [Device: Plc Logic: Application](Строка 11): C0373: Неиспользуемый путь экземпляра stWaterSypplyTimer.usiDurationMax: переменная используется как плейсхолдер
[WARNING] PLC200: PersistentVars [Device: Plc Logic: Application](Строка 21): C0373: Неиспользуемый путь экземпляра stPoolFilterBackwashTimer.xEnable: переменная используется как плейсхолдер
[WARNING] PLC200: PersistentVars [Device: Plc Logic: Application](Строка 22): C0373: Неиспользуемый путь экземпляра stPoolFilterBackwashTimer.todStartTime: переменная используется как плейсхолдер
[WARNING] PLC200: PersistentVars [Device: Plc Logic: Application](Строка 23): C0373: Неиспользуемый путь экземпляра stPoolFilterBackwashTimer.usiDuration: переменная используется как плейсхолдер
[WARNING] PLC200: PersistentVars [Device: Plc Logic: Application](Строка 24): C0373: Неиспользуемый путь экземпляра stPoolFilterBackwashTimer.byDaysEnabled: переменная используется как плейсхолдер
[WARNING] PLC200: PersistentVars [Device: Plc Logic: Application](Строка 25): C0373: Неиспользуемый путь экземпляра stPoolFilterBackwashTimer.usiDurationMin: переменная используется как плейсхолдер
[WARNING] PLC200: PersistentVars [Device: Plc Logic: Application](Строка 26): C0373: Неиспользуемый путь экземпляра stPoolFilterBackwashTimer.usiDurationMax: переменная используется как плейсхолдер
Заранее спасибо.
Можешь это сделать в коде программы...
If xxx=false then
...
xxx:=true
Endif
Вроде можно в самой структуре... Правда я не уверен.
Но если это возможно, то тогда не сможешь другой переменной с данной структурой присвоить другие значения по умолчанию.
А во вторых сто мешает создать pou, которая запускается один раз. Код тот же, только там свою pou втыкаешь, а в самой pou всё переменные по умолчанию пишешь. Но если надо именно persistent, то придётся и её воткнуть туда...
Благодарю, всё оказалось очень просто и выглядит крайне компактно и эстетично) как и хотел:
Код:VAR_GLOBAL PERSISTENT RETAIN
//generalVocationMode BOOL :=FALSE; (* Режим отпуска*)
stPoolWaterTempSp: TEMP_POINT_SETTINGS
:= (rSetPoint :=28, rSetPointMin :=20, rSetPointMax :=30, rAlarmLimitLo :=19, rAlarmLimitHi :=31, rHysteresys :=0.5);
stWaterSypplyTimer: CYCLE_TIMER
:= (xEnable := TRUE, todStartTime :=TOD#1:00:00, usiDuration :=10, usiDurationMin :=1, usiDurationMax :=22, byDaysEnabled :=2#0111_1111);
stPoolFilterBackwashTimer: CYCLE_TIMER
:= (xEnable :=TRUE, todStartTime :=TOD#11:00:00, usiDuration :=10, usiDurationMin :=1, usiDurationMax :=20, byDaysEnabled :=2#0100_0000);
poolCirculationPump1Enabled: BOOL :=TRUE; (*Разрешение на работу циркуляционного насоса бассейна №1*)
poolCirculationPump2Enabled: BOOL :=TRUE; (*Разрешение на работу циркуляционного насоса бассейна №2*)
END_VAR
Две переменные прошли на ура. а вот одна не сдаётся)
Код:[WARNING] PLC200: Менеджер библиотек [Device: Plc Logic: Application]: C0100: Библиотека CmpTargetVisu не добавлена в Менеджер библиотек, либо не найдено корректной лицензии
[ERROR] PLC200: PersistentVars [Device: Plc Logic: Application]: C0142: Локальная переменная с именем 'Dummy__stPoolWaterTempSp' уже задана в 'PersistentVars'
[ERROR] PLC200: PersistentVars [Device: Plc Logic: Application]: C0142: Локальная переменная с именем 'Dummy__stPoolWaterTempSp__rSetPoint' уже задана в 'PersistentVars'
Пришлите мне на почту или в телеграм ваш проект - посмотрим, в чем дело с третьей.
Upd. - помогла команда удаления пустых промежутков.
Вложение 72182
Вложение 72183
Простите, а что я делаю не так? :rolleyes:
Добрый день, подскажите пожалуйста, столкнулся с такой проблемой (КДС 3.5 sp17 язык CFC). При объявлении переменных, в том числе и автообъявление КДС зависает и в диспетчере устройств не отвечает Вложение 72186 приходится ждать от 1 до 5 минут. После того как развиснет, переменные объявляются без проблем и в любом количестве. Но как только я перехожу на холст, то опять зависает на 1-5 мин и после того как отвиснет на холсте можно делать что хочешь. Но как добавишь новый элемент и его надо объявить, все зависает и все зависания происходят повторно. Если ли какие то способы решить эту проблему?
Нашел похожую тему https://owen.ru/forum/showthread.php?t=35163 Неужели КДС не тянет, если делать программу на CFC с 200-300 блоками?
Скорее что-то поставилось криво, но может и не тянет. Вы бы параметры машины указали, а то может вы его на машину 90х годов ставите :-)
Добрый день.
На данный момент основной способ решения проблемы - это отказаться от программ с сотнями блоков на холсте и объединять их в функции и ФБ (тем самым уменьшив число элементов на одном "уровне абстракции" холста).
В будущем, возможно, будет проведена оптимизация редактора CFC с целью повышения его производительности.
Вложение 72187
Я создал 20шт ФБ, вроде стало лучше, но все равно подвисает. Потом решил эти 20шт ФБ в 1 запихнуть. Получился 1 ФБ с примерно 350 выходами и 150 входами. Заменил 20 на 1 и КДС вообще завис на мертво. Хорошо хоть создал копию перед этой авантюрой. Влияют ли как то блоки с большим количеством входов и/или выходов на производительность КДС? Просто по ощущениям, я количество блоков уменьшил, сделал блоки с большим количеством входов-выходов а программа на это реагирует еще хуже.
С таким количеством входов выходов у вас и будет подвисать, программу надо оптимизировать,
входы и выходы выводить только нужные, булевые сразу упаковывать в маски или вообще использовать глобальные переменные.
После глобальных изменений, всегда делайте очистить всё, компилировать всё.
И комп надо уже более мощный с большой оперативкой.
Рабочий ПК, ОЗУ 16Гб вроде как должно хватать. А вот почему происходят зависания только когда делаешь переключение? Например когда выстраиваешь связи между блоками все хорошо, а как только хочешь объявить переменную тут же зависает. Потом ты можешь объявлять сколько угодно переменных, но как только возвращаешься на холст где блоки то опять зависает
Здравствуйте. как решить такую проблему при подключении к ПЛК210 по кабелю usb в среде windows 7 все отлично соединение устанавливается , а на windows 10 нет соединения. Как решить данную проблему?